Kouhei Sutou
null+****@clear*****
Sat Jan 23 23:15:37 JST 2016
Kouhei Sutou 2016-01-23 23:15:37 +0900 (Sat, 23 Jan 2016) New Revision: 43505c670c25a6ec7f2e9563a3c13ceacb0dc4cc https://github.com/pgroonga/pgroonga/commit/43505c670c25a6ec7f2e9563a3c13ceacb0dc4cc Message: Split options related code Added files: src/pgrn_inspect.c src/pgrn_inspect.h src/pgrn_options.c src/pgrn_options.h Modified files: CMakeLists.txt Makefile src/pgrn_global.h src/pgroonga.c Modified: CMakeLists.txt (+4 -2) =================================================================== --- CMakeLists.txt 2016-01-23 22:49:42 +0900 (ddb7964) +++ CMakeLists.txt 2016-01-23 23:15:37 +0900 (a8a1763) @@ -48,8 +48,10 @@ link_directories( set(PGRN_SOURCES "src/pgroonga.c" - "src/pgn_value.c" - "src/pgn_variables.c" + "src/pgrn_inspect.c" + "src/pgrn_options.c" + "src/pgrn_value.c" + "src/pgrn_variables.c" "vendor/xxHash/xxhash.c") set_source_files_properties(${PGRN_SOURCES} PROPERTIES Modified: Makefile (+2 -0) =================================================================== --- Makefile 2016-01-23 22:49:42 +0900 (672530a) +++ Makefile 2016-01-23 23:15:37 +0900 (6513136) @@ -4,6 +4,8 @@ GROONGA_PKG = "groonga >= $(REQUIRED_GROONGA_VERSION)" MODULE_big = pgroonga SRCS = \ src/pgroonga.c \ + src/pgrn_inspect.c \ + src/pgrn_options.c \ src/pgrn_value.c \ src/pgrn_variables.c \ vendor/xxHash/xxhash.c Modified: src/pgrn_global.h (+5 -0) =================================================================== --- src/pgrn_global.h 2016-01-23 22:49:42 +0900 (cee89ed) +++ src/pgrn_global.h 2016-01-23 23:15:37 +0900 (9747722) @@ -2,4 +2,9 @@ #include <groonga.h> +struct PGrnBuffers { + grn_obj inspect; +}; + grn_ctx PGrnContext; +struct PGrnBuffers PGrnBuffers; Added: src/pgrn_inspect.c (+17 -0) 100644 =================================================================== --- /dev/null +++ src/pgrn_inspect.c 2016-01-23 23:15:37 +0900 (8f89beb) @@ -0,0 +1,17 @@ +#include "pgroonga.h" + +#include "pgrn_global.h" +#include "pgrn_inspect.h" + +static grn_ctx *ctx = &PGrnContext; + +const char * +PGrnInspect(grn_obj *object) +{ + grn_obj *buffer = &(PGrnBuffers.inspect); + + GRN_BULK_REWIND(buffer); + grn_inspect(ctx, buffer, object); + GRN_TEXT_PUTC(ctx, buffer, '\0'); + return GRN_TEXT_VALUE(buffer); +} Added: src/pgrn_inspect.h (+5 -0) 100644 =================================================================== --- /dev/null +++ src/pgrn_inspect.h 2016-01-23 23:15:37 +0900 (acce75c) @@ -0,0 +1,5 @@ +#pragma once + +#include <groonga.h> + +const char *PGrnInspect(grn_obj *object); Added: src/pgrn_options.c (+170 -0) 100644 =================================================================== --- /dev/null +++ src/pgrn_options.c 2016-01-23 23:15:37 +0900 (0e47db7) @@ -0,0 +1,170 @@ +#include "pgroonga.h" + +#include "pgrn_compatible.h" +#include "pgrn_global.h" +#include "pgrn_inspect.h" +#include "pgrn_options.h" +#include "pgrn_value.h" + +#ifdef PGRN_SUPPORT_OPTIONS +# include <access/reloptions.h> +#endif + +#include <groonga.h> + +#ifdef PGRN_SUPPORT_OPTIONS +typedef struct PGrnOptions +{ + int32 vl_len_; + int tokenizerOffset; + int normalizerOffset; +} PGrnOptions; + +static relopt_kind PGrnReloptionKind; + +static grn_ctx *ctx = &PGrnContext; + +PG_FUNCTION_INFO_V1(pgroonga_options); + +static bool +PGrnIsTokenizer(grn_obj *object) +{ + if (object->header.type != GRN_PROC) + return false; + + if (grn_proc_get_type(ctx, object) != GRN_PROC_TOKENIZER) + return false; + + return true; +} + +static void +PGrnOptionValidateTokenizer(char *name) +{ + grn_obj *tokenizer; + + if (PGrnIsNoneValue(name)) + return; + + tokenizer = grn_ctx_get(ctx, name, -1); + if (!tokenizer) + { + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("pgroonga: nonexistent tokenizer: <%s>", + name))); + } + + if (!PGrnIsTokenizer(tokenizer)) + { + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("pgroonga: not tokenizer: <%s>: %s", + name, PGrnInspect(tokenizer)))); + } +} + +static bool +PGrnIsNormalizer(grn_obj *object) +{ + if (object->header.type != GRN_PROC) + return false; + + if (grn_proc_get_type(ctx, object) != GRN_PROC_NORMALIZER) + return false; + + return true; +} + +static void +PGrnOptionValidateNormalizer(char *name) +{ + grn_obj *normalizer; + + if (PGrnIsNoneValue(name)) + return; + + normalizer = grn_ctx_get(ctx, name, -1); + if (!normalizer) + { + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("pgroonga: nonexistent normalizer: <%s>", + name))); + } + + if (!PGrnIsNormalizer(normalizer)) + { + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("pgroonga: not normalizer: <%s>: %s", + name, PGrnInspect(normalizer)))); + } +} +#endif + +void +PGrnInitializeOptions(void) +{ +#ifdef PGRN_SUPPORT_OPTIONS + PGrnReloptionKind = add_reloption_kind(); + + add_string_reloption(PGrnReloptionKind, + "tokenizer", + "Tokenizer name to be used for full-text search", + PGRN_DEFAULT_TOKENIZER, + PGrnOptionValidateTokenizer); + add_string_reloption(PGrnReloptionKind, + "normalizer", + "Normalizer name to be used for full-text search", + PGRN_DEFAULT_NORMALIZER, + PGrnOptionValidateNormalizer); +#endif +} + +void +PGrnApplyOptionValues(Relation index, + const char **tokenizerName, + const char **normalizerName) +{ +#ifdef PGRN_SUPPORT_OPTIONS + PGrnOptions *options; + + options = (PGrnOptions *) (index->rd_options); + if (!options) + return; + + *tokenizerName = ((const char *) options) + options->tokenizerOffset; + *normalizerName = ((const char *) options) + options->normalizerOffset; +#endif +} + +#ifdef PGRN_SUPPORT_OPTIONS +/** + * pgroonga.options() -- amoptions + */ +Datum +pgroonga_options(PG_FUNCTION_ARGS) +{ + Datum reloptions = PG_GETARG_DATUM(0); + bool validate = PG_GETARG_BOOL(1); + relopt_value *options; + PGrnOptions *grnOptions; + int nOptions; + const relopt_parse_elt optionsMap[] = { + {"tokenizer", RELOPT_TYPE_STRING, + offsetof(PGrnOptions, tokenizerOffset)}, + {"normalizer", RELOPT_TYPE_STRING, + offsetof(PGrnOptions, normalizerOffset)} + }; + + options = parseRelOptions(reloptions, validate, PGrnReloptionKind, + &nOptions); + grnOptions = allocateReloptStruct(sizeof(PGrnOptions), options, nOptions); + fillRelOptions(grnOptions, sizeof(PGrnOptions), options, nOptions, + validate, optionsMap, lengthof(optionsMap)); + pfree(options); + + PG_RETURN_BYTEA_P(grnOptions); +} +#endif Added: src/pgrn_options.h (+10 -0) 100644 =================================================================== --- /dev/null +++ src/pgrn_options.h 2016-01-23 23:15:37 +0900 (dda7c9b) @@ -0,0 +1,10 @@ +#pragma once + +#include <postgres.h> +#include <utils/rel.h> + +void PGrnInitializeOptions(void); + +void PGrnApplyOptionValues(Relation index, + const char **tokenizerName, + const char **normalizerName); Modified: src/pgroonga.c (+7 -183) =================================================================== --- src/pgroonga.c 2016-01-23 22:49:42 +0900 (829c5cd) +++ src/pgroonga.c 2016-01-23 23:15:37 +0900 (4a40766) @@ -2,6 +2,7 @@ #include "pgrn_compatible.h" #include "pgrn_global.h" +#include "pgrn_options.h" #include "pgrn_value.h" #include "pgrn_variables.h" @@ -28,10 +29,6 @@ # include <utils/jsonb.h> #endif -#ifdef PGRN_SUPPORT_OPTIONS -# include <access/reloptions.h> -#endif - #ifdef PGRN_SUPPORT_SCORE # include <lib/ilist.h> # include <utils/snapmgr.h> @@ -66,18 +63,6 @@ PG_MODULE_MAGIC; static bool PGrnInitialized = false; static bool PGrnIsLZ4Available; -#ifdef PGRN_SUPPORT_OPTIONS -static relopt_kind PGrnReloptionKind; -#endif - -#ifdef PGRN_SUPPORT_OPTIONS -typedef struct PGrnOptions -{ - int32 vl_len_; - int tokenizerOffset; - int normalizerOffset; -} PGrnOptions; -#endif typedef struct PGrnCreateData { @@ -193,9 +178,10 @@ PG_FUNCTION_INFO_V1(pgroonga_bulkdelete); PG_FUNCTION_INFO_V1(pgroonga_vacuumcleanup); PG_FUNCTION_INFO_V1(pgroonga_canreturn); PG_FUNCTION_INFO_V1(pgroonga_costestimate); -PG_FUNCTION_INFO_V1(pgroonga_options); grn_ctx PGrnContext; +struct PGrnBuffers PGrnBuffers; + static grn_ctx *ctx = NULL; static grn_obj buffer; static grn_obj pathBuffer; @@ -206,18 +192,8 @@ static grn_obj scoreBuffer; static grn_obj headBuffer; static grn_obj bodyBuffer; static grn_obj footBuffer; -static grn_obj inspectBuffer; static PGrnSequentialSearchData sequentialSearchData; -static const char * -PGrnInspect(grn_obj *object) -{ - GRN_BULK_REWIND(&inspectBuffer); - grn_inspect(ctx, &inspectBuffer, object); - GRN_TEXT_PUTC(ctx, &inspectBuffer, '\0'); - return GRN_TEXT_VALUE(&inspectBuffer); -} - static grn_encoding PGrnGetEncoding(void) { @@ -297,7 +273,7 @@ PGrnOnProcExit(int code, Datum arg) PGrnFinalizeSequentialSearchData(); - GRN_OBJ_FIN(ctx, &inspectBuffer); + GRN_OBJ_FIN(ctx, &(PGrnBuffers.inspect)); GRN_OBJ_FIN(ctx, &footBuffer); GRN_OBJ_FIN(ctx, &bodyBuffer); GRN_OBJ_FIN(ctx, &headBuffer); @@ -329,105 +305,6 @@ PGrnInitializeGroongaInformation(void) GRN_OBJ_FIN(ctx, &grnIsSupported); } -#ifdef PGRN_SUPPORT_OPTIONS -static bool -PGrnIsTokenizer(grn_obj *object) -{ - if (object->header.type != GRN_PROC) - return false; - - if (grn_proc_get_type(ctx, object) != GRN_PROC_TOKENIZER) - return false; - - return true; -} - -static void -PGrnOptionValidateTokenizer(char *name) -{ - grn_obj *tokenizer; - - if (PGrnIsNoneValue(name)) - return; - - tokenizer = grn_ctx_get(ctx, name, -1); - if (!tokenizer) - { - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("pgroonga: nonexistent tokenizer: <%s>", - name))); - } - - if (!PGrnIsTokenizer(tokenizer)) - { - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("pgroonga: not tokenizer: <%s>: %s", - name, PGrnInspect(tokenizer)))); - } -} -#endif - -#ifdef PGRN_SUPPORT_OPTIONS -static bool -PGrnIsNormalizer(grn_obj *object) -{ - if (object->header.type != GRN_PROC) - return false; - - if (grn_proc_get_type(ctx, object) != GRN_PROC_NORMALIZER) - return false; - - return true; -} - -static void -PGrnOptionValidateNormalizer(char *name) -{ - grn_obj *normalizer; - - if (PGrnIsNoneValue(name)) - return; - - normalizer = grn_ctx_get(ctx, name, -1); - if (!normalizer) - { - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("pgroonga: nonexistent normalizer: <%s>", - name))); - } - - if (!PGrnIsNormalizer(normalizer)) - { - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("pgroonga: not normalizer: <%s>: %s", - name, PGrnInspect(normalizer)))); - } -} -#endif - -#ifdef PGRN_SUPPORT_OPTIONS -static void -PGrnInitializeOptions(void) -{ - PGrnReloptionKind = add_reloption_kind(); - - add_string_reloption(PGrnReloptionKind, - "tokenizer", - "Tokenizer name to be used for full-text search", - PGRN_DEFAULT_TOKENIZER, - PGrnOptionValidateTokenizer); - add_string_reloption(PGrnReloptionKind, - "normalizer", - "Normalizer name to be used for full-text search", - PGRN_DEFAULT_NORMALIZER, - PGrnOptionValidateNormalizer); -} -#endif - static void PGrnInitializeSequentialSearchData(void) { @@ -485,15 +362,13 @@ _PG_init(void) GRN_TEXT_INIT(&headBuffer, 0); GRN_TEXT_INIT(&bodyBuffer, 0); GRN_TEXT_INIT(&footBuffer, 0); - GRN_TEXT_INIT(&inspectBuffer, 0); + GRN_TEXT_INIT(&(PGrnBuffers.inspect), 0); PGrnEnsureDatabase(); PGrnInitializeGroongaInformation(); -#ifdef PGRN_SUPPORT_OPTIONS PGrnInitializeOptions(); -#endif PGrnInitializeSequentialSearchData(); } @@ -1224,20 +1099,6 @@ PGrnCreateDataColumnsForJSON(PGrnCreateData *data) jsonTypesTable); } -#ifdef PGRN_SUPPORT_OPTIONS -static void -PGrnApplyOptionValues(PGrnOptions *options, - const char **tokenizerName, - const char **normalizerName) -{ - if (!options) - return; - - *tokenizerName = ((const char *) options) + options->tokenizerOffset; - *normalizerName = ((const char *) options) + options->normalizerOffset; -} -#endif - static void PGrnCreateFullTextSearchIndexColumnForJSON(PGrnCreateData *data) { @@ -1246,11 +1107,7 @@ PGrnCreateFullTextSearchIndexColumnForJSON(PGrnCreateData *data) char lexiconName[GRN_TABLE_MAX_KEY_SIZE]; grn_obj *lexicon; -#ifdef PGRN_SUPPORT_OPTIONS - PGrnApplyOptionValues((PGrnOptions *) (data->index->rd_options), - &tokenizerName, - &normalizerName); -#endif + PGrnApplyOptionValues(data->index, &tokenizerName, &normalizerName); if (PGrnIsNoneValue(tokenizerName)) return; @@ -1399,11 +1256,7 @@ PGrnCreateIndexColumn(PGrnCreateData *data) tokenizerName = PGRN_DEFAULT_TOKENIZER; } -#ifdef PGRN_SUPPORT_OPTIONS - PGrnApplyOptionValues((PGrnOptions *) (data->index->rd_options), - &tokenizerName, - &normalizerName); -#endif + PGrnApplyOptionValues(data->index, &tokenizerName, &normalizerName); if (!PGrnIsNoneValue(tokenizerName)) { @@ -4825,32 +4678,3 @@ pgroonga_costestimate(PG_FUNCTION_ARGS) #endif } -#ifdef PGRN_SUPPORT_OPTIONS -/** - * pgroonga.options() -- amoptions - */ -Datum -pgroonga_options(PG_FUNCTION_ARGS) -{ - Datum reloptions = PG_GETARG_DATUM(0); - bool validate = PG_GETARG_BOOL(1); - relopt_value *options; - PGrnOptions *grnOptions; - int nOptions; - const relopt_parse_elt optionsMap[] = { - {"tokenizer", RELOPT_TYPE_STRING, - offsetof(PGrnOptions, tokenizerOffset)}, - {"normalizer", RELOPT_TYPE_STRING, - offsetof(PGrnOptions, normalizerOffset)} - }; - - options = parseRelOptions(reloptions, validate, PGrnReloptionKind, - &nOptions); - grnOptions = allocateReloptStruct(sizeof(PGrnOptions), options, nOptions); - fillRelOptions(grnOptions, sizeof(PGrnOptions), options, nOptions, - validate, optionsMap, lengthof(optionsMap)); - pfree(options); - - PG_RETURN_BYTEA_P(grnOptions); -} -#endif -------------- next part -------------- HTML����������������������������...Download