diff options
Diffstat (limited to 'contrib/dict_int/dict_int.c')
-rw-r--r-- | contrib/dict_int/dict_int.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/contrib/dict_int/dict_int.c b/contrib/dict_int/dict_int.c new file mode 100644 index 00000000000..85d45491ccb --- /dev/null +++ b/contrib/dict_int/dict_int.c @@ -0,0 +1,99 @@ +/*------------------------------------------------------------------------- + * + * dict_int.c + * Text search dictionary for integers + * + * Copyright (c) 2007, PostgreSQL Global Development Group + * + * IDENTIFICATION + * $PostgreSQL: pgsql/contrib/dict_int/dict_int.c,v 1.1 2007/10/15 21:36:50 tgl Exp $ + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "commands/defrem.h" +#include "fmgr.h" +#include "tsearch/ts_public.h" + +PG_MODULE_MAGIC; + + +typedef struct { + int maxlen; + bool rejectlong; +} DictInt; + + +PG_FUNCTION_INFO_V1(dintdict_init); +Datum dintdict_init(PG_FUNCTION_ARGS); + +PG_FUNCTION_INFO_V1(dintdict_lexize); +Datum dintdict_lexize(PG_FUNCTION_ARGS); + +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; + + 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=palloc(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); +} |