Kouhei Sutou
null+****@clear*****
Sun Apr 5 16:03:04 JST 2015
Kouhei Sutou 2015-04-05 16:03:04 +0900 (Sun, 05 Apr 2015) New Revision: 5edeff7e141e9fa46f034103dff92c1773c31d05 https://github.com/pgroonga/pgroonga/commit/5edeff7e141e9fa46f034103dff92c1773c31d05 Message: Stop to use support function Internal API is more portable because support function needs install SQL change. Removed files: pgroonga_types.c Modified files: Makefile pgroonga.c pgroonga.h pgroonga.sql Modified: Makefile (+1 -1) =================================================================== --- Makefile 2015-04-01 00:13:15 +0900 (fd672ac) +++ Makefile 2015-04-05 16:03:04 +0900 (b9770c8) @@ -1,5 +1,5 @@ MODULE_big = pgroonga -SRCS = pgroonga.c pgroonga_types.c +SRCS = pgroonga.c OBJS = $(SRCS:.c=.o) EXTENSION = pgroonga EXTENSION_VERSION = \ Modified: pgroonga.c (+152 -22) =================================================================== --- pgroonga.c 2015-04-01 00:13:15 +0900 (9b1cbe0) +++ pgroonga.c 2015-04-05 16:03:04 +0900 (cf734d6) @@ -20,11 +20,13 @@ #include <utils/builtins.h> #include <utils/lsyscache.h> #include <utils/selfuncs.h> +#include <utils/timestamp.h> #include <utils/typcache.h> #include <groonga.h> #include <stdlib.h> +#include <math.h> #define VARCHARARRAYOID 1015 @@ -467,25 +469,123 @@ PGrnGetType(Relation index, AttrNumber n, unsigned char *flags) } static void -PGrnGetValue(Relation index, AttrNumber n, grn_obj *buffer, Datum value) +PGrnConvertDatumArrayType(Datum datum, Oid typeID, grn_obj *buffer) { - FmgrInfo *function; + ArrayType *value = DatumGetArrayTypeP(datum); + int i, n; + + n = ARR_DIMS(value)[0]; + for (i = 1; i <= n; i++) + { + int weight = 0; + Datum elementDatum; + VarChar *element; + bool isNULL; + + elementDatum = array_ref(value, 1, &i, -1, -1, false, 'i', &isNULL); + if (isNULL) + continue; - function = index_getprocinfo(index, n + 1, PGrnGetValueProc); - FunctionCall3(function, - PointerGetDatum(ctx), PointerGetDatum(buffer), - value); + switch (typeID) + { + case VARCHARARRAYOID: + element = DatumGetVarCharPP(elementDatum); + grn_vector_add_element(ctx, buffer, + VARDATA_ANY(element), + VARSIZE_ANY_EXHDR(element), + weight, + buffer->header.domain); + break; + case TEXTARRAYOID: + element = DatumGetTextPP(elementDatum); + grn_vector_add_element(ctx, buffer, + VARDATA_ANY(element), + VARSIZE_ANY_EXHDR(element), + weight, + buffer->header.domain); + break; + } + } } static void -PGrnGetQuery(Relation index, AttrNumber n, grn_obj *buffer, Datum value) +PGrnConvertDatum(Datum datum, Oid typeID, grn_obj *buffer) { - FmgrInfo *function; - - function = index_getprocinfo(index, n + 1, PGrnGetQueryProc); - FunctionCall3(function, - PointerGetDatum(ctx), PointerGetDatum(buffer), - value); + switch (typeID) + { + case BOOLOID: + GRN_BOOL_SET(ctx, buffer, DatumGetBool(datum)); + break; + case INT2OID: + GRN_INT16_SET(ctx, buffer, DatumGetInt16(datum)); + break; + case INT4OID: + GRN_INT32_SET(ctx, buffer, DatumGetInt32(datum)); + break; + case INT8OID: + GRN_INT64_SET(ctx, buffer, DatumGetInt64(datum)); + break; + case FLOAT4OID: + GRN_FLOAT_SET(ctx, buffer, DatumGetFloat4(datum)); + break; + case FLOAT8OID: + GRN_FLOAT_SET(ctx, buffer, DatumGetFloat8(datum)); + break; + case TIMESTAMPOID: + case TIMESTAMPTZOID: + { + Timestamp value = DatumGetTimestamp(datum); + pg_time_t unixTime; + int32 usec; + + unixTime = timestamptz_to_time_t(value); +#ifdef HAVE_INT64_TIMESTAMP + usec = value % USECS_PER_SEC; +#else + { + double rawUsec; + modf(value, &rawUsec); + usec = rawUsec * USECS_PER_SEC; + if (usec < 0.0) + { + usec = -usec; + } + } +#endif + GRN_TIME_SET(ctx, buffer, GRN_TIME_PACK(unixTime, usec)); + break; + } + case TEXTOID: + case XMLOID: + { + text *value = DatumGetTextPP(datum); + GRN_TEXT_SET(ctx, buffer, + VARDATA_ANY(value), VARSIZE_ANY_EXHDR(value)); + break; + } + case VARCHAROID: + { + VarChar *value = DatumGetVarCharPP(datum); + GRN_TEXT_SET(ctx, buffer, + VARDATA_ANY(value), VARSIZE_ANY_EXHDR(value)); + break; + } +#ifdef NOT_USED + case POINTOID: + /* GRN_DB_TOKYO_GEO_POINT or GRN_DB_WGS84_GEO_POINT; */ + break; +#endif + case VARCHARARRAYOID: + case TEXTARRAYOID: + PGrnConvertDatumArrayType(datum, typeID, buffer); + break; + default: + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("pgroonga: unsupported datum type: %u", + typeID))); + break; + } } static grn_obj * @@ -1127,10 +1227,12 @@ PGrnInsert(grn_ctx *ctx, for (i = 0; i < desc->natts; i++) { grn_obj *dataColumn; - NameData *name = &(desc->attrs[i]->attname); + Form_pg_attribute attribute = desc->attrs[i]; + NameData *name; grn_id domain; unsigned char flags; + name = &(attribute->attname); if (isnull[i]) continue; @@ -1138,7 +1240,7 @@ PGrnInsert(grn_ctx *ctx, name->data, strlen(name->data)); domain = PGrnGetType(index, i, &flags); grn_obj_reinit(ctx, &buffer, domain, flags); - PGrnGetValue(index, i, &buffer, values[i]); + PGrnConvertDatum(values[i], attribute->atttypid, &buffer); grn_obj_set_value(ctx, dataColumn, id, &buffer, GRN_OBJ_SET); grn_obj_unlink(ctx, dataColumn); if (!PGrnCheck("pgroonga: failed to set column value")) { @@ -1318,6 +1420,7 @@ PGrnSearchBuildConditions(IndexScanDesc scan, for (i = 0; i < scan->numberOfKeys; i++) { ScanKey key = &(scan->keyData[i]); + Form_pg_attribute attribute; grn_bool isValidStrategy = GRN_TRUE; const char *targetColumnName; grn_obj *targetColumn; @@ -1328,11 +1431,13 @@ PGrnSearchBuildConditions(IndexScanDesc scan, if (key->sk_flags & SK_ISNULL) continue; + attribute = desc->attrs[key->sk_attno - 1]; + GRN_EXPR_CREATE_FOR_QUERY(ctx, so->sourcesTable, matchTarget, matchTargetVariable); GRN_PTR_PUT(ctx, &(data->matchTargets), matchTarget); - targetColumnName = desc->attrs[key->sk_attno - 1]->attname.data; + targetColumnName = attribute->attname.data; targetColumn = grn_obj_column(ctx, so->sourcesTable, targetColumnName, strlen(targetColumnName)); @@ -1345,7 +1450,19 @@ PGrnSearchBuildConditions(IndexScanDesc scan, domain = PGrnGetType(index, key->sk_attno - 1, NULL); grn_obj_reinit(ctx, &buffer, domain, flags); } - PGrnGetQuery(index, key->sk_attno - 1, &buffer, key->sk_argument); + { + Oid valueTypeID = attribute->atttypid; + switch (valueTypeID) + { + case VARCHARARRAYOID: + valueTypeID = VARCHAROID; + break; + case TEXTARRAYOID: + valueTypeID = TEXTOID; + break; + } + PGrnConvertDatum(key->sk_argument, valueTypeID, &buffer); + } switch (key->sk_strategy) { @@ -1575,20 +1692,26 @@ PGrnFillBorder(IndexScanDesc scan, int *flags) { Relation index = scan->indexRelation; + TupleDesc desc; PGrnScanOpaque so = (PGrnScanOpaque) scan->opaque; grn_obj *minBorderValue; grn_obj *maxBorderValue; int i; + desc = RelationGetDescr(index); + minBorderValue = &(so->minBorderValue); maxBorderValue = &(so->maxBorderValue); for (i = 0; i < scan->numberOfKeys; i++) { ScanKey key = &(scan->keyData[i]); AttrNumber attrNumber; + Form_pg_attribute attribute; grn_id domain; attrNumber = key->sk_attno - 1; + attribute = desc->attrs[attrNumber]; + domain = PGrnGetType(index, attrNumber, NULL); switch (key->sk_strategy) { @@ -1597,7 +1720,9 @@ PGrnFillBorder(IndexScanDesc scan, if (maxBorderValue->header.type != GRN_DB_VOID) { grn_obj_reinit(ctx, &buffer, domain, 0); - PGrnGetQuery(index, attrNumber, &buffer, key->sk_argument); + PGrnConvertDatum(key->sk_argument, + attribute->atttypid, + &buffer); if (!PGrnIsMeaningfullMaxBorderValue(maxBorderValue, &buffer, *flags, @@ -1607,7 +1732,9 @@ PGrnFillBorder(IndexScanDesc scan, } } grn_obj_reinit(ctx, maxBorderValue, domain, 0); - PGrnGetQuery(index, attrNumber, maxBorderValue, key->sk_argument); + PGrnConvertDatum(key->sk_argument, + attribute->atttypid, + maxBorderValue); *max = GRN_BULK_HEAD(maxBorderValue); *maxSize = GRN_BULK_VSIZE(maxBorderValue); *flags &= ~(GRN_CURSOR_LT | GRN_CURSOR_LE); @@ -1625,8 +1752,9 @@ PGrnFillBorder(IndexScanDesc scan, if (minBorderValue->header.type != GRN_DB_VOID) { grn_obj_reinit(ctx, &buffer, domain, 0); - PGrnGetQuery(index, attrNumber, &buffer, - key->sk_argument); + PGrnConvertDatum(key->sk_argument, + attribute->atttypid, + &buffer); if (!PGrnIsMeaningfullMinBorderValue(minBorderValue, &buffer, *flags, @@ -1636,7 +1764,9 @@ PGrnFillBorder(IndexScanDesc scan, } } grn_obj_reinit(ctx, minBorderValue, domain, 0); - PGrnGetQuery(index, attrNumber, minBorderValue, key->sk_argument); + PGrnConvertDatum(key->sk_argument, + attribute->atttypid, + minBorderValue); *min = GRN_BULK_HEAD(minBorderValue); *minSize = GRN_BULK_VSIZE(minBorderValue); *flags &= ~(GRN_CURSOR_GT | GRN_CURSOR_GE); Modified: pgroonga.h (+0 -19) =================================================================== --- pgroonga.h 2015-04-01 00:13:15 +0900 (3bd7b3d) +++ pgroonga.h 2015-04-05 16:03:04 +0900 (819829b) @@ -31,10 +31,6 @@ #define PGrnContainStrategyNumber 7 /* operator %% (@ in Groonga) */ #define PGrnQueryStrategyNumber 8 /* operator @@ (Groonga query) */ -/* Groonga support functions */ -#define PGrnGetValueProc 1 -#define PGrnGetQueryProc 2 - /* file and table names */ #define PGrnDatabaseBasename "pgrn" #define PGrnSourcesTableNamePrefix "Sources" @@ -44,7 +40,6 @@ #define PGrnLexiconNameFormat "Lexicon%u_%u" #define PGrnIndexColumnName "index" -/* in pgroonga.c */ extern void PGDLLEXPORT _PG_init(void); extern Datum PGDLLEXPORT pgroonga_score(PG_FUNCTION_ARGS); @@ -70,18 +65,4 @@ extern Datum PGDLLEXPORT pgroonga_vacuumcleanup(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_costestimate(PG_FUNCTION_ARGS); extern Datum PGDLLEXPORT pgroonga_options(PG_FUNCTION_ARGS); -/* in groonga_types.c */ -extern Datum PGDLLEXPORT pgroonga_get_text(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_get_text_array(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_get_varchar(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_get_varchar_array(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_get_bool(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_get_int2(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_get_int4(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_get_int8(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_get_float4(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_get_float8(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_get_timestamp(PG_FUNCTION_ARGS); -extern Datum PGDLLEXPORT pgroonga_get_timestamptz(PG_FUNCTION_ARGS); - #endif /* PPGROONGA_H */ Modified: pgroonga.sql (+14 -89) =================================================================== --- pgroonga.sql 2015-04-01 00:13:15 +0900 (3e06b1e) +++ pgroonga.sql 2015-04-05 16:03:04 +0900 (9a29cf5) @@ -165,60 +165,11 @@ CREATE FUNCTION pgroonga.options(internal) AS 'MODULE_PATHNAME', 'pgroonga_options' LANGUAGE C; -CREATE FUNCTION pgroonga.get_text(internal, internal, text) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_text' - LANGUAGE C; -CREATE FUNCTION pgroonga.get_text_array(internal, internal, text[]) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_text_array' - LANGUAGE C; -CREATE FUNCTION pgroonga.get_varchar(internal, internal, varchar) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_varchar' - LANGUAGE C; -CREATE FUNCTION pgroonga.get_varchar_array(internal, internal, varchar[]) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_varchar_array' - LANGUAGE C; -CREATE FUNCTION pgroonga.get_bool(internal, internal, bool) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_bool' - LANGUAGE C; -CREATE FUNCTION pgroonga.get_int2(internal, internal, int2) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_int2' - LANGUAGE C; -CREATE FUNCTION pgroonga.get_int4(internal, internal, int4) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_int4' - LANGUAGE C; -CREATE FUNCTION pgroonga.get_int8(internal, internal, int8) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_int8' - LANGUAGE C; -CREATE FUNCTION pgroonga.get_float4(internal, internal, float4) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_float4' - LANGUAGE C; -CREATE FUNCTION pgroonga.get_float8(internal, internal, float8) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_float8' - LANGUAGE C; -CREATE FUNCTION pgroonga.get_timestamp(internal, internal, timestamp) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_timestamp' - LANGUAGE C; -CREATE FUNCTION pgroonga.get_timestamptz(internal, internal, timestamptz) - RETURNS void - AS 'MODULE_PATHNAME', 'pgroonga_get_timestamptz' - LANGUAGE C; - DELETE FROM pg_catalog.pg_am WHERE amname = 'pgroonga'; INSERT INTO pg_catalog.pg_am VALUES( 'pgroonga', -- amname 8, -- amstrategies - 3, -- amsupport + 0, -- amsupport true, -- amcanorder true, -- amcanorderbyop true, -- amcanbackward @@ -252,25 +203,19 @@ CREATE OPERATOR CLASS pgroonga.text_full_text_search_ops DEFAULT FOR TYPE text USING pgroonga AS OPERATOR 6 pg_catalog.~~, OPERATOR 7 %%, - OPERATOR 8 @@, - FUNCTION 1 pgroonga.get_text(internal, internal, text), - FUNCTION 2 pgroonga.get_text(internal, internal, text); + OPERATOR 8 @@; CREATE OPERATOR CLASS pgroonga.text_array_full_text_search_ops DEFAULT FOR TYPE text[] USING pgroonga AS OPERATOR 7 %% (text[], text), - OPERATOR 8 @@ (text[], text), - FUNCTION 1 pgroonga.get_text_array(internal, internal, text[]), - FUNCTION 2 pgroonga.get_text(internal, internal, text); + OPERATOR 8 @@ (text[], text); CREATE OPERATOR CLASS pgroonga.varchar_full_text_search_ops FOR TYPE varchar USING pgroonga AS OPERATOR 7 %%, - OPERATOR 8 @@, - FUNCTION 1 pgroonga.get_varchar(internal, internal, varchar), - FUNCTION 2 pgroonga.get_varchar(internal, internal, varchar); + OPERATOR 8 @@; CREATE OPERATOR CLASS pgroonga.varchar_ops DEFAULT FOR TYPE varchar USING pgroonga AS @@ -278,17 +223,13 @@ CREATE OPERATOR CLASS pgroonga.varchar_ops DEFAULT FOR TYPE varchar OPERATOR 2 <= (text, text), OPERATOR 3 = (text, text), OPERATOR 4 >= (text, text), - OPERATOR 5 > (text, text), - FUNCTION 1 pgroonga.get_varchar(internal, internal, varchar), - FUNCTION 2 pgroonga.get_varchar(internal, internal, varchar); + OPERATOR 5 > (text, text); CREATE OPERATOR CLASS pgroonga.varchar_array_ops DEFAULT FOR TYPE varchar[] USING pgroonga AS - OPERATOR 7 %% (varchar[], varchar), - FUNCTION 1 pgroonga.get_varchar_array(internal, internal, varchar[]), - FUNCTION 2 pgroonga.get_varchar(internal, internal, varchar); + OPERATOR 7 %% (varchar[], varchar); CREATE OPERATOR CLASS pgroonga.bool_ops DEFAULT FOR TYPE bool USING pgroonga AS @@ -296,9 +237,7 @@ CREATE OPERATOR CLASS pgroonga.bool_ops DEFAULT FOR TYPE bool OPERATOR 2 <=, OPERATOR 3 =, OPERATOR 4 >=, - OPERATOR 5 >, - FUNCTION 1 pgroonga.get_bool(internal, internal, bool), - FUNCTION 2 pgroonga.get_bool(internal, internal, bool); + OPERATOR 5 >; CREATE OPERATOR CLASS pgroonga.int2_ops DEFAULT FOR TYPE int2 USING pgroonga AS @@ -306,9 +245,7 @@ CREATE OPERATOR CLASS pgroonga.int2_ops DEFAULT FOR TYPE int2 OPERATOR 2 <=, OPERATOR 3 =, OPERATOR 4 >=, - OPERATOR 5 >, - FUNCTION 1 pgroonga.get_int2(internal, internal, int2), - FUNCTION 2 pgroonga.get_int2(internal, internal, int2); + OPERATOR 5 >; CREATE OPERATOR CLASS pgroonga.int4_ops DEFAULT FOR TYPE int4 USING pgroonga AS @@ -316,9 +253,7 @@ CREATE OPERATOR CLASS pgroonga.int4_ops DEFAULT FOR TYPE int4 OPERATOR 2 <=, OPERATOR 3 =, OPERATOR 4 >=, - OPERATOR 5 >, - FUNCTION 1 pgroonga.get_int4(internal, internal, int4), - FUNCTION 2 pgroonga.get_int4(internal, internal, int4); + OPERATOR 5 >; CREATE OPERATOR CLASS pgroonga.int8_ops DEFAULT FOR TYPE int8 USING pgroonga AS @@ -326,9 +261,7 @@ CREATE OPERATOR CLASS pgroonga.int8_ops DEFAULT FOR TYPE int8 OPERATOR 2 <=, OPERATOR 3 =, OPERATOR 4 >=, - OPERATOR 5 >, - FUNCTION 1 pgroonga.get_int8(internal, internal, int8), - FUNCTION 2 pgroonga.get_int8(internal, internal, int8); + OPERATOR 5 >; CREATE OPERATOR CLASS pgroonga.float4_ops DEFAULT FOR TYPE float4 USING pgroonga AS @@ -336,9 +269,7 @@ CREATE OPERATOR CLASS pgroonga.float4_ops DEFAULT FOR TYPE float4 OPERATOR 2 <=, OPERATOR 3 =, OPERATOR 4 >=, - OPERATOR 5 >, - FUNCTION 1 pgroonga.get_float4(internal, internal, float4), - FUNCTION 2 pgroonga.get_float4(internal, internal, float4); + OPERATOR 5 >; CREATE OPERATOR CLASS pgroonga.float8_ops DEFAULT FOR TYPE float8 USING pgroonga AS @@ -346,9 +277,7 @@ CREATE OPERATOR CLASS pgroonga.float8_ops DEFAULT FOR TYPE float8 OPERATOR 2 <=, OPERATOR 3 =, OPERATOR 4 >=, - OPERATOR 5 >, - FUNCTION 1 pgroonga.get_float8(internal, internal, float8), - FUNCTION 2 pgroonga.get_float8(internal, internal, float8); + OPERATOR 5 >; CREATE OPERATOR CLASS pgroonga.timestamp_ops DEFAULT FOR TYPE timestamp USING pgroonga AS @@ -356,9 +285,7 @@ CREATE OPERATOR CLASS pgroonga.timestamp_ops DEFAULT FOR TYPE timestamp OPERATOR 2 <=, OPERATOR 3 =, OPERATOR 4 >=, - OPERATOR 5 >, - FUNCTION 1 pgroonga.get_timestamp(internal, internal, timestamp), - FUNCTION 2 pgroonga.get_timestamp(internal, internal, timestamp); + OPERATOR 5 >; CREATE OPERATOR CLASS pgroonga.timestamptz_ops DEFAULT FOR TYPE timestamptz USING pgroonga AS @@ -366,6 +293,4 @@ CREATE OPERATOR CLASS pgroonga.timestamptz_ops DEFAULT FOR TYPE timestamptz OPERATOR 2 <=, OPERATOR 3 =, OPERATOR 4 >=, - OPERATOR 5 >, - FUNCTION 1 pgroonga.get_timestamptz(internal, internal, timestamptz), - FUNCTION 2 pgroonga.get_timestamptz(internal, internal, timestamptz); + OPERATOR 5 >; Deleted: pgroonga_types.c (+0 -212) 100644 =================================================================== --- pgroonga_types.c 2015-04-01 00:13:15 +0900 (94ec888) +++ /dev/null @@ -1,212 +0,0 @@ -/* - * IDENTIFICATION - * gproonga_types.c - */ - -#include "pgroonga.h" - -#include <catalog/pg_type.h> -#include <utils/array.h> -#include <utils/builtins.h> -#include <utils/timestamp.h> - -#include <groonga.h> - -#include <math.h> - -PG_FUNCTION_INFO_V1(pgroonga_get_text); -PG_FUNCTION_INFO_V1(pgroonga_get_text_array); -PG_FUNCTION_INFO_V1(pgroonga_get_varchar); -PG_FUNCTION_INFO_V1(pgroonga_get_varchar_array); -PG_FUNCTION_INFO_V1(pgroonga_get_bool); -PG_FUNCTION_INFO_V1(pgroonga_get_int2); -PG_FUNCTION_INFO_V1(pgroonga_get_int4); -PG_FUNCTION_INFO_V1(pgroonga_get_int8); -PG_FUNCTION_INFO_V1(pgroonga_get_float4); -PG_FUNCTION_INFO_V1(pgroonga_get_float8); -PG_FUNCTION_INFO_V1(pgroonga_get_timestamp); -PG_FUNCTION_INFO_V1(pgroonga_get_timestamptz); - -Datum -pgroonga_get_text(PG_FUNCTION_ARGS) -{ - grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); - grn_obj *obj = (grn_obj *) PG_GETARG_POINTER(1); - text *value = PG_GETARG_TEXT_PP(2); - - GRN_TEXT_SET(ctx, obj, VARDATA_ANY(value), VARSIZE_ANY_EXHDR(value)); - PG_RETURN_VOID(); -} - -Datum -pgroonga_get_text_array(PG_FUNCTION_ARGS) -{ - grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); - grn_obj *buffer = (grn_obj *) PG_GETARG_POINTER(1); - ArrayType *value = PG_GETARG_ARRAYTYPE_P(2); - int i, n; - - n = ARR_DIMS(value)[0]; - for (i = 1; i <= n; i++) - { - int weight = 0; - Datum elementDatum; - text *element; - bool isNULL; - - elementDatum = array_ref(value, 1, &i, -1, -1, false, 'i', &isNULL); - if (isNULL) - continue; - - element = DatumGetTextPP(elementDatum); - grn_vector_add_element(ctx, buffer, - VARDATA_ANY(element), - VARSIZE_ANY_EXHDR(element), - weight, - buffer->header.domain); - } - - PG_RETURN_VOID(); -} - -Datum -pgroonga_get_varchar(PG_FUNCTION_ARGS) -{ - grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); - grn_obj *buffer = (grn_obj *) PG_GETARG_POINTER(1); - VarChar *value = PG_GETARG_VARCHAR_PP(2); - - GRN_TEXT_SET(ctx, buffer, VARDATA_ANY(value), VARSIZE_ANY_EXHDR(value)); - PG_RETURN_VOID(); -} - -Datum -pgroonga_get_varchar_array(PG_FUNCTION_ARGS) -{ - grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); - grn_obj *buffer = (grn_obj *) PG_GETARG_POINTER(1); - ArrayType *value = PG_GETARG_ARRAYTYPE_P(2); - int i, n; - - n = ARR_DIMS(value)[0]; - for (i = 1; i <= n; i++) - { - int weight = 0; - Datum elementDatum; - VarChar *element; - bool isNULL; - - elementDatum = array_ref(value, 1, &i, -1, -1, false, 'i', &isNULL); - if (isNULL) - continue; - - element = DatumGetVarCharPP(elementDatum); - grn_vector_add_element(ctx, buffer, - VARDATA_ANY(element), - VARSIZE_ANY_EXHDR(element), - weight, - buffer->header.domain); - } - - PG_RETURN_VOID(); -} - -Datum -pgroonga_get_bool(PG_FUNCTION_ARGS) -{ - grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); - grn_obj *buffer = (grn_obj *) PG_GETARG_POINTER(1); - bool value = PG_GETARG_BOOL(2); - - GRN_BOOL_SET(ctx, buffer, value); - PG_RETURN_VOID(); -} - -Datum -pgroonga_get_int2(PG_FUNCTION_ARGS) -{ - grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); - grn_obj *buffer = (grn_obj *) PG_GETARG_POINTER(1); - int16 value = PG_GETARG_INT16(2); - - GRN_INT16_SET(ctx, buffer, value); - PG_RETURN_VOID(); -} - -Datum -pgroonga_get_int4(PG_FUNCTION_ARGS) -{ - grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); - grn_obj *buffer = (grn_obj *) PG_GETARG_POINTER(1); - int32 value = PG_GETARG_INT32(2); - - GRN_INT32_SET(ctx, buffer, value); - PG_RETURN_VOID(); -} - -Datum -pgroonga_get_int8(PG_FUNCTION_ARGS) -{ - grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); - grn_obj *buffer = (grn_obj *) PG_GETARG_POINTER(1); - int64 value = PG_GETARG_INT64(2); - - GRN_INT64_SET(ctx, buffer, value); - PG_RETURN_VOID(); -} - -Datum -pgroonga_get_float4(PG_FUNCTION_ARGS) -{ - grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); - grn_obj *buffer = (grn_obj *) PG_GETARG_POINTER(1); - float8 value = (float8) PG_GETARG_FLOAT4(2); - - GRN_FLOAT_SET(ctx, buffer, value); - PG_RETURN_VOID(); -} - -Datum -pgroonga_get_float8(PG_FUNCTION_ARGS) -{ - grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); - grn_obj *buffer = (grn_obj *) PG_GETARG_POINTER(1); - float8 value = PG_GETARG_FLOAT8(2); - - GRN_FLOAT_SET(ctx, buffer, value); - PG_RETURN_VOID(); -} - -Datum -pgroonga_get_timestamp(PG_FUNCTION_ARGS) -{ - grn_ctx *ctx = (grn_ctx *) PG_GETARG_POINTER(0); - grn_obj *buffer = (grn_obj *) PG_GETARG_POINTER(1); - Timestamp value = PG_GETARG_TIMESTAMP(2); - pg_time_t unixTime; - int32 usec; - - unixTime = timestamptz_to_time_t(value); -#ifdef HAVE_INT64_TIMESTAMP - usec = value % USECS_PER_SEC; -#else - { - double rawUsec; - modf(value, &rawUsec); - usec = rawUsec * USECS_PER_SEC; - if (usec < 0.0) - { - usec = -usec; - } - } -#endif - GRN_TIME_SET(ctx, buffer, GRN_TIME_PACK(unixTime, usec)); - - PG_RETURN_VOID(); -} - -Datum -pgroonga_get_timestamptz(PG_FUNCTION_ARGS) -{ - return pgroonga_get_timestamp(fcinfo); -} -------------- next part -------------- HTML����������������������������...Download