/*------------------------------------------------------------------------- * * dict_int.c * Text search dictionary for integers * * Copyright (c) 2007-2012, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/dict_int/dict_int.c * *------------------------------------------------------------------------- */ #include "postgres.h" #include "knl/knl_variable.h" #include "commands/defrem.h" #include "tsearch/ts_public.h" PG_MODULE_MAGIC; typedef struct { int maxlen; bool rejectlong; } DictInt; PG_FUNCTION_INFO_V1(dintdict_init); extern "C" Datum dintdict_init(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(dintdict_lexize); extern "C" Datum dintdict_lexize(PG_FUNCTION_ARGS); Datum dintdict_init(PG_FUNCTION_ARGS) { List* dictoptions = (List*)PG_GETARG_POINTER(0); DictInt* d = NULL; ListCell* l = NULL; d = (DictInt*)palloc0(sizeof(DictInt)); d->maxlen = 6; d->rejectlong = false; foreach (l, dictoptions) { DefElem* defel = (DefElem*)lfirst(l); if (pg_strcasecmp(defel->defname, "MAXLEN") == 0) { d->maxlen = atoi(defGetString(defel)); } else if (pg_strcasecmp(defel->defname, "REJECTLONG") == 0) { d->rejectlong = 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); char* txt = pnstrdup(in, PG_GETARG_INT32(2)); TSLexeme* res = (TSLexeme*)palloc0(sizeof(TSLexeme) * 2); res[1].lexeme = NULL; if (PG_GETARG_INT32(2) > 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); }