openGauss-server/contrib/dict_int/dict_int.cpp

83 lines
2.1 KiB
C++

/*-------------------------------------------------------------------------
*
* 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);
}