mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 10:30:33 +03:00 
			
		
		
		
	It seems potentially useful to label our shared libraries with version information, now that a facility exists for retrieving that. This patch labels them with the PG_VERSION string. There was some discussion about using semantic versioning conventions, but that doesn't seem terribly helpful for modules with no SQL-level presence; and for those that do have SQL objects, we typically expect them to support multiple revisions of the SQL definitions, so it'd still not be very helpful. I did not label any of src/test/modules/. It seems unnecessary since we don't install those, and besides there ought to be someplace that still provides test coverage for the original PG_MODULE_MAGIC macro. Author: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/dd4d1b59-d0fe-49d5-b28f-1e463b68fa32@gmail.com
		
			
				
	
	
		
			120 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*-------------------------------------------------------------------------
 | |
|  *
 | |
|  * dict_int.c
 | |
|  *	  Text search dictionary for integers
 | |
|  *
 | |
|  * Copyright (c) 2007-2025, PostgreSQL Global Development Group
 | |
|  *
 | |
|  * IDENTIFICATION
 | |
|  *	  contrib/dict_int/dict_int.c
 | |
|  *
 | |
|  *-------------------------------------------------------------------------
 | |
|  */
 | |
| #include "postgres.h"
 | |
| 
 | |
| #include "commands/defrem.h"
 | |
| #include "tsearch/ts_public.h"
 | |
| 
 | |
| PG_MODULE_MAGIC_EXT(
 | |
| 					.name = "dict_int",
 | |
| 					.version = PG_VERSION
 | |
| );
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
| 	int			maxlen;
 | |
| 	bool		rejectlong;
 | |
| 	bool		absval;
 | |
| } DictInt;
 | |
| 
 | |
| 
 | |
| PG_FUNCTION_INFO_V1(dintdict_init);
 | |
| PG_FUNCTION_INFO_V1(dintdict_lexize);
 | |
| 
 | |
| Datum
 | |
| dintdict_init(PG_FUNCTION_ARGS)
 | |
| {
 | |
| 	List	   *dictoptions = (List *) PG_GETARG_POINTER(0);
 | |
| 	DictInt    *d;
 | |
| 	ListCell   *l;
 | |
| 
 | |
| 	d = (DictInt *) palloc0(sizeof(DictInt));
 | |
| 	d->maxlen = 6;
 | |
| 	d->rejectlong = false;
 | |
| 	d->absval = false;
 | |
| 
 | |
| 	foreach(l, dictoptions)
 | |
| 	{
 | |
| 		DefElem    *defel = (DefElem *) lfirst(l);
 | |
| 
 | |
| 		if (strcmp(defel->defname, "maxlen") == 0)
 | |
| 		{
 | |
| 			d->maxlen = atoi(defGetString(defel));
 | |
| 
 | |
| 			if (d->maxlen < 1)
 | |
| 				ereport(ERROR,
 | |
| 						(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 | |
| 						 errmsg("maxlen value has to be >= 1")));
 | |
| 		}
 | |
| 		else if (strcmp(defel->defname, "rejectlong") == 0)
 | |
| 		{
 | |
| 			d->rejectlong = defGetBoolean(defel);
 | |
| 		}
 | |
| 		else if (strcmp(defel->defname, "absval") == 0)
 | |
| 		{
 | |
| 			d->absval = defGetBoolean(defel);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			ereport(ERROR,
 | |
| 					(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 | |
| 					 errmsg("unrecognized intdict parameter: \"%s\"",
 | |
| 							defel->defname)));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	PG_RETURN_POINTER(d);
 | |
| }
 | |
| 
 | |
| Datum
 | |
| dintdict_lexize(PG_FUNCTION_ARGS)
 | |
| {
 | |
| 	DictInt    *d = (DictInt *) PG_GETARG_POINTER(0);
 | |
| 	char	   *in = (char *) PG_GETARG_POINTER(1);
 | |
| 	int			len = PG_GETARG_INT32(2);
 | |
| 	char	   *txt;
 | |
| 	TSLexeme   *res = palloc0(sizeof(TSLexeme) * 2);
 | |
| 
 | |
| 	res[1].lexeme = NULL;
 | |
| 
 | |
| 	if (d->absval && (in[0] == '+' || in[0] == '-'))
 | |
| 	{
 | |
| 		len--;
 | |
| 		txt = pnstrdup(in + 1, len);
 | |
| 	}
 | |
| 	else
 | |
| 		txt = pnstrdup(in, len);
 | |
| 
 | |
| 	if (len > d->maxlen)
 | |
| 	{
 | |
| 		if (d->rejectlong)
 | |
| 		{
 | |
| 			/* reject by returning void array */
 | |
| 			pfree(txt);
 | |
| 			res[0].lexeme = NULL;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			/* trim integer */
 | |
| 			txt[d->maxlen] = '\0';
 | |
| 			res[0].lexeme = txt;
 | |
| 		}
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		res[0].lexeme = txt;
 | |
| 	}
 | |
| 
 | |
| 	PG_RETURN_POINTER(res);
 | |
| }
 |