mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Add sample text search dictionary templates and parsers, to replace the
hard-to-maintain textual examples currently in the SGML docs. From Sergey Karpov.
This commit is contained in:
99
contrib/dict_int/dict_int.c
Normal file
99
contrib/dict_int/dict_int.c
Normal file
@ -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);
|
||||
}
|
Reference in New Issue
Block a user