Kouhei Sutou
null+****@clear*****
Sun Jan 24 21:17:16 JST 2016
Kouhei Sutou 2016-01-24 21:17:16 +0900 (Sun, 24 Jan 2016) New Revision: ec9a522686cb3cf62d3de3870a7898040328faa1 https://github.com/pgroonga/pgroonga/commit/ec9a522686cb3cf62d3de3870a7898040328faa1 Message: Extract PGrnConvertFromData() Added files: src/pgrn_convert.c src/pgrn_convert.h Modified files: CMakeLists.txt Makefile src/pgroonga.c Modified: CMakeLists.txt (+1 -0) =================================================================== --- CMakeLists.txt 2016-01-24 20:54:20 +0900 (fe08447) +++ CMakeLists.txt 2016-01-24 21:17:16 +0900 (db27252) @@ -48,6 +48,7 @@ link_directories( set(PGRN_SOURCES "src/pgroonga.c" + "src/pgrn_convert.c" "src/pgrn_create.c" "src/pgrn_global.c" "src/pgrn_groonga.c" Modified: Makefile (+1 -0) =================================================================== --- Makefile 2016-01-24 20:54:20 +0900 (c1c8e45) +++ Makefile 2016-01-24 21:17:16 +0900 (3f36e86) @@ -4,6 +4,7 @@ GROONGA_PKG = "groonga >= $(REQUIRED_GROONGA_VERSION)" MODULE_big = pgroonga SRCS = \ src/pgroonga.c \ + src/pgrn_convert.c \ src/pgrn_create.c \ src/pgrn_global.c \ src/pgrn_groonga.c \ Added: src/pgrn_convert.c (+129 -0) 100644 =================================================================== --- /dev/null +++ src/pgrn_convert.c 2016-01-24 21:17:16 +0900 (e683e9e) @@ -0,0 +1,129 @@ +#include "pgrn_convert.h" +#include "pgrn_global.h" + +#include <catalog/pg_type.h> +#include <utils/array.h> +#include <utils/builtins.h> +#include <utils/timestamp.h> + +static grn_ctx *ctx = &PGrnContext; + +static void +PGrnConvertFromDataArrayType(Datum datum, Oid typeID, grn_obj *buffer) +{ + 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; + + 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; + } + } +} + +void +PGrnConvertFromData(Datum datum, Oid typeID, grn_obj *buffer) +{ + 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: + PGrnConvertFromDataArrayType(datum, typeID, buffer); + break; + default: + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("pgroonga: unsupported datum type: %u", + typeID))); + break; + } +} Added: src/pgrn_convert.h (+9 -0) 100644 =================================================================== --- /dev/null +++ src/pgrn_convert.h 2016-01-24 21:17:16 +0900 (76fa00d) @@ -0,0 +1,9 @@ +#pragma once + +#include <postgres.h> + +#include <groonga.h> + +#define VARCHARARRAYOID 1015 + +void PGrnConvertFromData(Datum datum, Oid typeID, grn_obj *buffer); Modified: src/pgroonga.c (+2 -122) =================================================================== --- src/pgroonga.c 2016-01-24 20:54:20 +0900 (196a3fc) +++ src/pgroonga.c 2016-01-24 21:17:16 +0900 (f8dc7c1) @@ -1,6 +1,8 @@ #include "pgroonga.h" #include "pgrn_compatible.h" + +#include "pgrn_convert.h" #include "pgrn_create.h" #include "pgrn_global.h" #include "pgrn_groonga.h" @@ -58,8 +60,6 @@ typedef struct stat pgrn_stat_buffer; #endif -#define VARCHARARRAYOID 1015 - PG_MODULE_MAGIC; static bool PGrnInitialized = false; @@ -402,126 +402,6 @@ PGrnGetType(Relation index, AttrNumber n, unsigned char *flags) return typeID; } -static void -PGrnConvertFromDataArrayType(Datum datum, Oid typeID, grn_obj *buffer) -{ - 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; - - 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 -PGrnConvertFromData(Datum datum, Oid typeID, grn_obj *buffer) -{ - 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: - PGrnConvertFromDataArrayType(datum, typeID, buffer); - break; - default: - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("pgroonga: unsupported datum type: %u", - typeID))); - break; - } -} - #ifdef PGRN_SUPPORT_INDEX_ONLY_SCAN static Datum PGrnConvertToDatumArrayType(grn_obj *vector, Oid typeID) -------------- next part -------------- HTML����������������������������...Download