Kouhei Sutou
null+****@clear*****
Sun Jan 24 12:08:29 JST 2016
Kouhei Sutou 2016-01-24 12:08:29 +0900 (Sun, 24 Jan 2016) New Revision: e36c40095d9f0ef175fac47243a5353044b8e099 https://github.com/pgroonga/pgroonga/commit/e36c40095d9f0ef175fac47243a5353044b8e099 Message: Move more Groonga specific code to pgrn_groonga Modified files: src/pgrn_groonga.c src/pgrn_groonga.h src/pgroonga.c Modified: src/pgrn_groonga.c (+151 -0) =================================================================== --- src/pgrn_groonga.c 2016-01-24 11:50:32 +0900 (7bed5bd) +++ src/pgrn_groonga.c 2016-01-24 12:08:29 +0900 (54f530b) @@ -3,8 +3,21 @@ #include "pgrn_global.h" #include "pgrn_groonga.h" +bool PGrnIsLZ4Available; + static grn_ctx *ctx = &PGrnContext; +void +PGrnInitializeGroongaInformation(void) +{ + grn_obj grnIsSupported; + + GRN_BOOL_INIT(&grnIsSupported, 0); + grn_obj_get_info(ctx, NULL, GRN_INFO_SUPPORT_LZ4, &grnIsSupported); + PGrnIsLZ4Available = (GRN_BOOL_VALUE(&grnIsSupported)); + GRN_OBJ_FIN(ctx, &grnIsSupported); +} + const char * PGrnInspect(grn_obj *object) { @@ -15,3 +28,141 @@ PGrnInspect(grn_obj *object) GRN_TEXT_PUTC(ctx, buffer, '\0'); return GRN_TEXT_VALUE(buffer); } + +int +PGrnRCToPgErrorCode(grn_rc rc) +{ + int errorCode = ERRCODE_SYSTEM_ERROR; + + /* TODO: Fill me. */ + switch (rc) + { + case GRN_NO_SUCH_FILE_OR_DIRECTORY: + errorCode = ERRCODE_IO_ERROR; + break; + case GRN_INPUT_OUTPUT_ERROR: + errorCode = ERRCODE_IO_ERROR; + break; + case GRN_INVALID_ARGUMENT: + errorCode = ERRCODE_INVALID_PARAMETER_VALUE; + break; + default: + break; + } + + return errorCode; +} + +grn_bool +PGrnCheck(const char *message) +{ + if (ctx->rc == GRN_SUCCESS) + return GRN_TRUE; + + ereport(ERROR, + (errcode(PGrnRCToPgErrorCode(ctx->rc)), + errmsg("pgroonga: %s: %s", message, ctx->errbuf))); + return GRN_FALSE; +} + +grn_obj * +PGrnLookup(const char *name, int errorLevel) +{ + grn_obj *object = grn_ctx_get(ctx, name, strlen(name)); + if (!object) + ereport(errorLevel, + (errcode(ERRCODE_INVALID_NAME), + errmsg("pgroonga: object isn't found: <%s>", name))); + return object; +} + +grn_obj * +PGrnLookupColumn(grn_obj *table, const char *name, int errorLevel) +{ + grn_obj *column; + + column = grn_obj_column(ctx, table, name, strlen(name)); + if (!column) + { + char tableName[GRN_TABLE_MAX_KEY_SIZE]; + int tableNameSize; + + tableNameSize = grn_obj_name(ctx, table, tableName, sizeof(tableName)); + ereport(errorLevel, + (errcode(ERRCODE_INVALID_NAME), + errmsg("pgroonga: column isn't found: <%.*s>:<%s>", + tableNameSize, tableName, + name))); + } + + return column; +} + +grn_obj * +PGrnLookupSourcesTable(Relation index, int errorLevel) +{ + char name[GRN_TABLE_MAX_KEY_SIZE]; + + snprintf(name, sizeof(name), + PGrnSourcesTableNameFormat, + index->rd_node.relNode); + return PGrnLookup(name, errorLevel); +} + +grn_obj * +PGrnLookupSourcesCtidColumn(Relation index, int errorLevel) +{ + char name[GRN_TABLE_MAX_KEY_SIZE]; + + snprintf(name, sizeof(name), + PGrnSourcesTableNameFormat "." PGrnSourcesCtidColumnName, + index->rd_node.relNode); + return PGrnLookup(name, errorLevel); +} + +grn_obj * +PGrnLookupIndexColumn(Relation index, unsigned int nthAttribute, int errorLevel) +{ + char name[GRN_TABLE_MAX_KEY_SIZE]; + + snprintf(name, sizeof(name), + PGrnLexiconNameFormat ".%s", + index->rd_node.relNode, + nthAttribute, + PGrnIndexColumnName); + return PGrnLookup(name, errorLevel); +} + +grn_obj * +PGrnCreateTable(const char *name, + grn_obj_flags flags, + grn_obj *type) +{ + grn_obj *table; + + table = grn_table_create(ctx, + name, strlen(name), NULL, + GRN_OBJ_PERSISTENT | flags, + type, + NULL); + PGrnCheck("pgroonga: failed to create table"); + + return table; +} + +grn_obj * +PGrnCreateColumn(grn_obj *table, + const char *name, + grn_obj_flags flags, + grn_obj *type) +{ + grn_obj *column; + + column = grn_column_create(ctx, table, + name, strlen(name), NULL, + GRN_OBJ_PERSISTENT | flags, + type); + PGrnCheck("pgroonga: failed to create column"); + + return column; +} Modified: src/pgrn_groonga.h (+26 -0) =================================================================== --- src/pgrn_groonga.h 2016-01-24 11:50:32 +0900 (acce75c) +++ src/pgrn_groonga.h 2016-01-24 12:08:29 +0900 (d8f3bb0) @@ -1,5 +1,31 @@ #pragma once +#include <postgres.h> +#include <utils/rel.h> + #include <groonga.h> +bool PGrnIsLZ4Available; + +void PGrnInitializeGroongaInformation(void); + const char *PGrnInspect(grn_obj *object); + +int PGrnRCToPgErrorCode(grn_rc rc); +grn_bool PGrnCheck(const char *message); + +grn_obj *PGrnLookup(const char *name, int errorLevel); +grn_obj *PGrnLookupColumn(grn_obj *table, const char *name, int errorLevel); +grn_obj *PGrnLookupSourcesTable(Relation index, int errorLevel); +grn_obj *PGrnLookupSourcesCtidColumn(Relation index, int errorLevel); +grn_obj *PGrnLookupIndexColumn(Relation index, + unsigned int nthAttribute, + int errorLevel); + +grn_obj *PGrnCreateTable(const char *name, + grn_obj_flags flags, + grn_obj *type); +grn_obj *PGrnCreateColumn(grn_obj *table, + const char*name, + grn_obj_flags flags, + grn_obj *type); Modified: src/pgroonga.c (+1 -267) =================================================================== --- src/pgroonga.c 2016-01-24 11:50:32 +0900 (1bc1d5c) +++ src/pgroonga.c 2016-01-24 12:08:29 +0900 (3982612) @@ -2,6 +2,7 @@ #include "pgrn_compatible.h" #include "pgrn_global.h" +#include "pgrn_groonga.h" #include "pgrn_options.h" #include "pgrn_value.h" #include "pgrn_variables.h" @@ -62,8 +63,6 @@ PG_MODULE_MAGIC; static bool PGrnInitialized = false; -static bool PGrnIsLZ4Available; - typedef struct PGrnCreateData { Relation index; @@ -275,17 +274,6 @@ PGrnOnProcExit(int code, Datum arg) } static void -PGrnInitializeGroongaInformation(void) -{ - grn_obj grnIsSupported; - - GRN_BOOL_INIT(&grnIsSupported, 0); - grn_obj_get_info(ctx, NULL, GRN_INFO_SUPPORT_LZ4, &grnIsSupported); - PGrnIsLZ4Available = (GRN_BOOL_VALUE(&grnIsSupported)); - GRN_OBJ_FIN(ctx, &grnIsSupported); -} - -static void PGrnInitializeSequentialSearchData(void) { sequentialSearchData.table = grn_table_create(ctx, @@ -344,42 +332,6 @@ _PG_init(void) PGrnInitializeSequentialSearchData(); } -static int -PGrnRCToPgErrorCode(grn_rc rc) -{ - int errorCode = ERRCODE_SYSTEM_ERROR; - - /* TODO: Fill me. */ - switch (rc) - { - case GRN_NO_SUCH_FILE_OR_DIRECTORY: - errorCode = ERRCODE_IO_ERROR; - break; - case GRN_INPUT_OUTPUT_ERROR: - errorCode = ERRCODE_IO_ERROR; - break; - case GRN_INVALID_ARGUMENT: - errorCode = ERRCODE_INVALID_PARAMETER_VALUE; - break; - default: - break; - } - - return errorCode; -} - -static grn_bool -PGrnCheck(const char *message) -{ - if (ctx->rc == GRN_SUCCESS) - return GRN_TRUE; - - ereport(ERROR, - (errcode(PGrnRCToPgErrorCode(ctx->rc)), - errmsg("pgroonga: %s: %s", message, ctx->errbuf))); - return GRN_FALSE; -} - static grn_id PGrnGetType(Relation index, AttrNumber n, unsigned char *flags) { @@ -799,61 +751,6 @@ PGrnJSONIteratorTokenName(JsonbIteratorToken token) } #endif -static grn_obj * -PGrnLookup(const char *name, int errorLevel) -{ - grn_obj *object = grn_ctx_get(ctx, name, strlen(name)); - if (!object) - ereport(errorLevel, - (errcode(ERRCODE_INVALID_NAME), - errmsg("pgroonga: object isn't found: <%s>", name))); - return object; -} - -static grn_obj * -PGrnLookupColumn(grn_obj *table, const char *name, int errorLevel) -{ - grn_obj *column; - - column = grn_obj_column(ctx, table, name, strlen(name)); - if (!column) - { - char tableName[GRN_TABLE_MAX_KEY_SIZE]; - int tableNameSize; - - tableNameSize = grn_obj_name(ctx, table, tableName, sizeof(tableName)); - ereport(errorLevel, - (errcode(ERRCODE_INVALID_NAME), - errmsg("pgroonga: column isn't found: <%.*s>:<%s>", - tableNameSize, tableName, - name))); - } - - return column; -} - -static grn_obj * -PGrnLookupSourcesTable(Relation index, int errorLevel) -{ - char name[GRN_TABLE_MAX_KEY_SIZE]; - - snprintf(name, sizeof(name), - PGrnSourcesTableNameFormat, - index->rd_node.relNode); - return PGrnLookup(name, errorLevel); -} - -static grn_obj * -PGrnLookupSourcesCtidColumn(Relation index, int errorLevel) -{ - char name[GRN_TABLE_MAX_KEY_SIZE]; - - snprintf(name, sizeof(name), - PGrnSourcesTableNameFormat "." PGrnSourcesCtidColumnName, - index->rd_node.relNode); - return PGrnLookup(name, errorLevel); -} - #ifdef JSONBOID static grn_obj * PGrnLookupJSONPathsTable(Relation index, @@ -882,53 +779,6 @@ PGrnLookupJSONValuesTable(Relation index, } #endif -static grn_obj * -PGrnLookupIndexColumn(Relation index, unsigned int nthAttribute, int errorLevel) -{ - char name[GRN_TABLE_MAX_KEY_SIZE]; - - snprintf(name, sizeof(name), - PGrnLexiconNameFormat ".%s", - index->rd_node.relNode, - nthAttribute, - PGrnIndexColumnName); - return PGrnLookup(name, errorLevel); -} - -static grn_obj * -PGrnCreateTable(const char *name, - grn_obj_flags flags, - grn_obj *type) -{ - grn_obj *table; - - table = grn_table_create(ctx, - name, strlen(name), NULL, - GRN_OBJ_PERSISTENT | flags, - type, - NULL); - PGrnCheck("pgroonga: failed to create table"); - - return table; -} - -static grn_obj * -PGrnCreateColumn(grn_obj *table, - const char *name, - grn_obj_flags flags, - grn_obj *type) -{ - grn_obj *column; - - column = grn_column_create(ctx, table, - name, strlen(name), NULL, - GRN_OBJ_PERSISTENT | flags, - type); - PGrnCheck("pgroonga: failed to create column"); - - return column; -} - static bool PGrnIsForFullTextSearchIndex(Relation index, int nthAttribute) { @@ -972,29 +822,6 @@ PGrnIsForRegexpSearchIndex(Relation index, int nthAttribute) return OidIsValid(regexpStrategyOID); } -static void -PGrnCreateSourcesCtidColumn(PGrnCreateData *data) -{ - data->sourcesCtidColumn = PGrnCreateColumn(data->sourcesTable, - PGrnSourcesCtidColumnName, - GRN_OBJ_COLUMN_SCALAR, - grn_ctx_at(ctx, GRN_DB_UINT64)); -} - -static void -PGrnCreateSourcesTable(PGrnCreateData *data) -{ - char sourcesTableName[GRN_TABLE_MAX_KEY_SIZE]; - - snprintf(sourcesTableName, sizeof(sourcesTableName), - PGrnSourcesTableNameFormat, data->relNode); - data->sourcesTable = PGrnCreateTable(sourcesTableName, - GRN_OBJ_TABLE_NO_KEY, - NULL); - - PGrnCreateSourcesCtidColumn(data); -} - #ifdef JSONBOID static void PGrnCreateDataColumnsForJSON(PGrnCreateData *data) @@ -1159,99 +986,6 @@ PGrnCreateIndexColumnsForJSON(PGrnCreateData *data) } #endif -static void -PGrnCreateDataColumn(PGrnCreateData *data) -{ - grn_obj_flags flags = 0; - - if (data->attributeFlags & GRN_OBJ_VECTOR) - { - flags |= GRN_OBJ_COLUMN_VECTOR; - } - else - { - flags |= GRN_OBJ_COLUMN_SCALAR; - - if (PGrnIsLZ4Available) - { - switch (data->attributeTypeID) - { - case GRN_DB_SHORT_TEXT: - case GRN_DB_TEXT: - case GRN_DB_LONG_TEXT: - flags |= GRN_OBJ_COMPRESS_LZ4; - break; - } - } - } - - PGrnCreateColumn(data->sourcesTable, - data->desc->attrs[data->i]->attname.data, - flags, - grn_ctx_at(ctx, data->attributeTypeID)); -} - -static void -PGrnCreateIndexColumn(PGrnCreateData *data) -{ - grn_id typeID = GRN_ID_NIL; - char lexiconName[GRN_TABLE_MAX_KEY_SIZE]; - grn_obj *lexicon; - - switch (data->attributeTypeID) - { - case GRN_DB_TEXT: - case GRN_DB_LONG_TEXT: - typeID = GRN_DB_SHORT_TEXT; - break; - default: - typeID = data->attributeTypeID; - break; - } - - snprintf(lexiconName, sizeof(lexiconName), - PGrnLexiconNameFormat, data->relNode, data->i); - lexicon = PGrnCreateTable(lexiconName, - GRN_OBJ_TABLE_PAT_KEY, - grn_ctx_at(ctx, typeID)); - GRN_PTR_PUT(ctx, data->lexicons, lexicon); - - if (data->forFullTextSearch || data->forRegexpSearch) - { - const char *tokenizerName; - const char *normalizerName = PGRN_DEFAULT_NORMALIZER; - - if (data->forRegexpSearch) { - tokenizerName = "TokenRegexp"; - } else { - tokenizerName = PGRN_DEFAULT_TOKENIZER; - } - - PGrnApplyOptionValues(data->index, &tokenizerName, &normalizerName); - - if (!PGrnIsNoneValue(tokenizerName)) - { - grn_obj_set_info(ctx, lexicon, GRN_INFO_DEFAULT_TOKENIZER, - PGrnLookup(tokenizerName, ERROR)); - } - if (!PGrnIsNoneValue(normalizerName)) - { - grn_obj_set_info(ctx, lexicon, GRN_INFO_NORMALIZER, - PGrnLookup(normalizerName, ERROR)); - } - } - - { - grn_obj_flags flags = GRN_OBJ_COLUMN_INDEX; - if (data->forFullTextSearch || data->forRegexpSearch) - flags |= GRN_OBJ_WITH_POSITION; - PGrnCreateColumn(lexicon, - PGrnIndexColumnName, - flags, - data->sourcesTable); - } -} - /** * PGrnCreate */ -------------- next part -------------- HTML����������������������������...Télécharger