Kouhei Sutou
null+****@clear*****
Tue Dec 6 16:50:59 JST 2016
Kouhei Sutou 2016-12-06 16:50:59 +0900 (Tue, 06 Dec 2016) New Revision: 593b4b17d9c1095d6bcaa2876d482e2980857293 https://github.com/groonga/groonga/commit/593b4b17d9c1095d6bcaa2876d482e2980857293 Message: Remove experimental table plugin It's not used anymore. Removed files: plugins/table/CMakeLists.txt plugins/table/Makefile.am plugins/table/sources.am plugins/table/table.c Modified files: plugins/CMakeLists.txt plugins/Makefile.am Modified: plugins/CMakeLists.txt (+1 -2) =================================================================== --- plugins/CMakeLists.txt 2016-12-06 16:20:21 +0900 (6d6a8df) +++ plugins/CMakeLists.txt 2016-12-06 16:50:59 +0900 (244b60f) @@ -1,4 +1,4 @@ -# Copyright(C) 2012-2015 Brazil +# Copyright(C) 2012-2016 Brazil # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -15,7 +15,6 @@ add_subdirectory(suggest) add_subdirectory(tokenizers) -add_subdirectory(table) add_subdirectory(query_expanders) add_subdirectory(ruby) add_subdirectory(token_filters) Modified: plugins/Makefile.am (+0 -1) =================================================================== --- plugins/Makefile.am 2016-12-06 16:20:21 +0900 (72a7b72) +++ plugins/Makefile.am 2016-12-06 16:50:59 +0900 (6c98a0c) @@ -1,7 +1,6 @@ SUBDIRS = \ tokenizers \ suggest \ - table \ query_expanders \ ruby \ token_filters \ Deleted: plugins/table/CMakeLists.txt (+0 -30) 100644 =================================================================== --- plugins/table/CMakeLists.txt 2016-12-06 16:20:21 +0900 (0ee86e8) +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright(C) 2012-2013 Brazil -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License version 2.1 as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR}/../../lib - ${MRUBY_INCLUDE_DIRS} - ${MESSAGE_PACK_INCLUDE_DIRS}) - -read_file_list(${CMAKE_CURRENT_SOURCE_DIR}/sources.am TABLE_SOURCES) -if(NOT GRN_EMBED) - add_library(table MODULE ${TABLE_SOURCES}) - set_source_files_properties(${TABLE_SOURCES} - PROPERTIES - COMPILE_FLAGS "${GRN_C_COMPILE_FLAGS}") - set_target_properties(table PROPERTIES PREFIX "") - target_link_libraries(table libgroonga) - install(TARGETS table DESTINATION "${GRN_RELATIVE_PLUGINS_DIR}/table") -endif() Deleted: plugins/table/Makefile.am (+0 -24) 100644 =================================================================== --- plugins/table/Makefile.am 2016-12-06 16:20:21 +0900 (4b49b0a) +++ /dev/null @@ -1,24 +0,0 @@ -EXTRA_DIST = \ - CMakeLists.txt - -AM_CFLAGS = \ - $(MESSAGE_PACK_CFLAGS) \ - $(MRUBY_CFLAGS) - -AM_CPPFLAGS = \ - -I$(top_builddir) \ - -I$(top_srcdir)/include \ - -I$(top_srcdir)/lib - -AM_LDFLAGS = \ - -avoid-version \ - -module \ - -no-undefined - -LIBS = \ - $(top_builddir)/lib/libgroonga.la \ - $(MESSAGE_PACK_LIBS) - -table_plugins_LTLIBRARIES = table.la - -include sources.am Deleted: plugins/table/sources.am (+0 -2) 100644 =================================================================== --- plugins/table/sources.am 2016-12-06 16:20:21 +0900 (943e79b) +++ /dev/null @@ -1,2 +0,0 @@ -table_la_SOURCES = \ - table.c Deleted: plugins/table/table.c (+0 -751) 100644 =================================================================== --- plugins/table/table.c 2016-12-06 16:20:21 +0900 (69d600f) +++ /dev/null @@ -1,751 +0,0 @@ -/* -*- c-basic-offset: 2; indent-tabs-mode: nil -*- */ -/* Copyright(C) 2012 Brazil - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License version 2.1 as published by the Free Software Foundation. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include <string.h> - -#include "grn_ctx.h" -#include "grn_db.h" -#include "grn_output.h" -#include "grn_util.h" -#include <groonga/plugin.h> - -#define VAR GRN_PROC_GET_VAR_BY_OFFSET -#define TEXT_VALUE_LEN(x) GRN_TEXT_VALUE(x), GRN_TEXT_LEN(x) - -static grn_obj * -grn_ctx_get_table_by_name_or_id(grn_ctx *ctx, - const char *name, unsigned int name_len) -{ - grn_obj *table; - const char *end = name + name_len; - const char *rest = NULL; - grn_id id = grn_atoui(name, end, &rest); - if (rest == end) { - table = grn_ctx_at(ctx, id); - } else { - table = grn_ctx_get(ctx, name, name_len); - } - if (!GRN_OBJ_TABLEP(table)) { - ERR(GRN_INVALID_ARGUMENT, "invalid table name: <%.*s>", name_len, name); - if (table) { - grn_obj_unlink(ctx, table); - table = NULL; - } - } - return table; -} - -static void -grn_output_table_name_or_id(grn_ctx *ctx, grn_obj *table) -{ - if (table) { - if (((grn_db_obj *)table)->id & GRN_OBJ_TMP_OBJECT) { - GRN_OUTPUT_INT64(((grn_db_obj *)table)->id); - } else { - int name_len; - char name_buf[GRN_TABLE_MAX_KEY_SIZE]; - name_len = grn_obj_name(ctx, table, name_buf, GRN_TABLE_MAX_KEY_SIZE); - GRN_OUTPUT_STR(name_buf, name_len); - } - } else { - GRN_OUTPUT_INT64(0); - } -} - -static grn_bool -parse_bool_value(grn_ctx *ctx, grn_obj *text) -{ - grn_bool value = GRN_FALSE; - if (GRN_TEXT_LEN(text) == 3 && - memcmp("yes", GRN_TEXT_VALUE(text), 3) == 0) { - value = GRN_TRUE; - } - return value; -} - -static grn_operator -parse_set_operator_value(grn_ctx *ctx, grn_obj *text) -{ - grn_operator value = GRN_OP_OR; - if (GRN_TEXT_LEN(text) == 3) { - if (memcmp("and", GRN_TEXT_VALUE(text), 3) == 0) { - value = GRN_OP_AND; - } else if (memcmp("but", GRN_TEXT_VALUE(text), 3) == 0) { - value = GRN_OP_AND_NOT; - } - } else if (GRN_TEXT_LEN(text) == 6 && - memcmp("adjust", GRN_TEXT_VALUE(text), 6) == 0) { - value = GRN_OP_ADJUST; - } else if (GRN_TEXT_LEN(text) == 7 && - memcmp("and_not", GRN_TEXT_VALUE(text), 7) == 0) { - value = GRN_OP_AND_NOT; - } - return value; -} - -static grn_obj * -command_match(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) -{ - grn_obj *result_set = NULL; - grn_obj *table = grn_ctx_get_table_by_name_or_id(ctx, TEXT_VALUE_LEN(VAR(0))); - if (table) { - grn_expr_flags flags = GRN_EXPR_SYNTAX_QUERY; - grn_obj *v, *query, *columns = NULL; - GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, v); - if (query) { - if (GRN_TEXT_LEN(VAR(1))) { - GRN_EXPR_CREATE_FOR_QUERY(ctx, table, columns, v); - if (columns) { - grn_expr_parse(ctx, columns, TEXT_VALUE_LEN(VAR(1)), - NULL, GRN_OP_MATCH, GRN_OP_AND, - GRN_EXPR_SYNTAX_SCRIPT); - } - } - if (parse_bool_value(ctx, VAR(5))) { - flags |= GRN_EXPR_ALLOW_COLUMN; - } - if (parse_bool_value(ctx, VAR(6))) { - flags |= GRN_EXPR_ALLOW_PRAGMA; - } - grn_expr_parse(ctx, query, TEXT_VALUE_LEN(VAR(2)), - columns, GRN_OP_MATCH, GRN_OP_AND, flags); - if (GRN_TEXT_LEN(VAR(3))) { - result_set = grn_ctx_get_table_by_name_or_id(ctx, TEXT_VALUE_LEN(VAR(3))); - } else { - result_set = grn_table_create(ctx, NULL, 0, NULL, - GRN_TABLE_HASH_KEY| - GRN_OBJ_WITH_SUBREC, - table, NULL); - } - if (result_set) { - grn_table_select(ctx, table, query, result_set, - parse_set_operator_value(ctx, VAR(4))); - } - grn_obj_unlink(ctx, columns); - grn_obj_unlink(ctx, query); - } - } - grn_output_table_name_or_id(ctx, result_set); - return NULL; -} - -static grn_obj * -command_filter_by_script(grn_ctx *ctx, int nargs, - grn_obj **args, grn_user_data *user_data) -{ - grn_obj *result_set = NULL; - grn_obj *table = grn_ctx_get_table_by_name_or_id(ctx, TEXT_VALUE_LEN(VAR(0))); - if (table) { - grn_expr_flags flags = GRN_EXPR_SYNTAX_SCRIPT; - grn_obj *v, *query; - GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, v); - if (query) { - if (parse_bool_value(ctx, VAR(4))) { - flags |= GRN_EXPR_ALLOW_UPDATE; - } - grn_expr_parse(ctx, query, TEXT_VALUE_LEN(VAR(1)), - NULL, GRN_OP_MATCH, GRN_OP_AND, flags); - if (GRN_TEXT_LEN(VAR(2))) { - result_set = grn_ctx_get_table_by_name_or_id(ctx, TEXT_VALUE_LEN(VAR(2))); - } else { - result_set = grn_table_create(ctx, NULL, 0, NULL, - GRN_TABLE_HASH_KEY| - GRN_OBJ_WITH_SUBREC, - table, NULL); - } - if (result_set) { - grn_table_select(ctx, table, query, result_set, - parse_set_operator_value(ctx, VAR(3))); - } - grn_obj_unlink(ctx, query); - } - } - grn_output_table_name_or_id(ctx, result_set); - return NULL; -} - -static grn_obj * -command_filter(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) -{ - grn_operator operator = GRN_OP_NOP; - grn_obj *table, *column, *result_set = NULL; - if (!(table = grn_ctx_get_table_by_name_or_id(ctx, TEXT_VALUE_LEN(VAR(0))))) { - goto exit; - } - if (!(column = grn_obj_column(ctx, table, TEXT_VALUE_LEN(VAR(1))))) { - ERR(GRN_INVALID_ARGUMENT, "invalid column name: <%.*s>", - (int)GRN_TEXT_LEN(VAR(1)), GRN_TEXT_VALUE(VAR(1))); - goto exit; - } - if (GRN_TEXT_LEN(VAR(2)) == 0) { - ERR(GRN_INVALID_ARGUMENT, "missing mandatory argument: operator"); - goto exit; - } else { - uint32_t operator_len = GRN_TEXT_LEN(VAR(2)); - const char *operator_text = GRN_TEXT_VALUE(VAR(2)); - switch (operator_text[0]) { - case '<' : - if (operator_len == 1) { - operator = GRN_OP_LESS; - } - break; - } - if (operator == GRN_OP_NOP) { - ERR(GRN_INVALID_ARGUMENT, "invalid operator: <%.*s>", - operator_len, operator_text); - goto exit; - } - } - if (GRN_TEXT_LEN(VAR(4))) { - result_set = grn_ctx_get_table_by_name_or_id(ctx, TEXT_VALUE_LEN(VAR(4))); - } else { - result_set = grn_table_create(ctx, NULL, 0, NULL, - GRN_TABLE_HASH_KEY| - GRN_OBJ_WITH_SUBREC, - table, NULL); - } - if (result_set) { - grn_column_filter(ctx, column, operator, VAR(3), result_set, - parse_set_operator_value(ctx, VAR(5))); - } -exit : - grn_output_table_name_or_id(ctx, result_set); - return NULL; -} - -static grn_obj * -command_group(grn_ctx *ctx, int nargs, grn_obj **args, - grn_user_data *user_data) -{ - const char *table = GRN_TEXT_VALUE(VAR(0)); - unsigned int table_len = GRN_TEXT_LEN(VAR(0)); - const char *key = GRN_TEXT_VALUE(VAR(1)); - unsigned int key_len = GRN_TEXT_LEN(VAR(1)); - const char *set = GRN_TEXT_VALUE(VAR(2)); - unsigned int set_len = GRN_TEXT_LEN(VAR(2)); - grn_obj *table_ = grn_ctx_get_table_by_name_or_id(ctx, table, table_len); - grn_obj *set_ = NULL; - if (table_) { - uint32_t ngkeys; - grn_table_sort_key *gkeys; - gkeys = grn_table_sort_key_from_str(ctx, key, key_len, table_, &ngkeys); - if (gkeys) { - if (set_len) { - set_ = grn_ctx_get_table_by_name_or_id(ctx, set, set_len); - } else { - set_ = grn_table_create_for_group(ctx, NULL, 0, NULL, - gkeys[0].key, table_, 0); - } - if (set_) { - if (GRN_TEXT_LEN(VAR(3))) { - uint32_t gap = grn_atoui(GRN_TEXT_VALUE(VAR(3)), - GRN_BULK_CURR(VAR(3)), NULL); - grn_table_group_with_range_gap(ctx, table_, gkeys, set_, gap); - } else { - grn_table_group_result g = { - set_, 0, 0, 1, - GRN_TABLE_GROUP_CALC_COUNT, 0 - }; - grn_table_group(ctx, table_, gkeys, 1, &g, 1); - } - } - grn_table_sort_key_close(ctx, gkeys, ngkeys); - } - } - grn_output_table_name_or_id(ctx, set_); - return NULL; -} - -#define DEFAULT_LIMIT 10 - -static grn_obj * -command_sort(grn_ctx *ctx, int nargs, grn_obj **args, - grn_user_data *user_data) -{ - const char *table = GRN_TEXT_VALUE(VAR(0)); - unsigned int table_len = GRN_TEXT_LEN(VAR(0)); - const char *keys = GRN_TEXT_VALUE(VAR(1)); - unsigned int keys_len = GRN_TEXT_LEN(VAR(1)); - int offset = GRN_TEXT_LEN(VAR(2)) - ? grn_atoi(GRN_TEXT_VALUE(VAR(2)), GRN_BULK_CURR(VAR(2)), NULL) - : 0; - int limit = GRN_TEXT_LEN(VAR(3)) - ? grn_atoi(GRN_TEXT_VALUE(VAR(3)), GRN_BULK_CURR(VAR(3)), NULL) - : DEFAULT_LIMIT; - grn_obj *table_ = grn_ctx_get_table_by_name_or_id(ctx, table, table_len); - grn_obj *sorted = NULL; - if (table_) { - uint32_t nkeys; - grn_table_sort_key *keys_; - if (keys_len && - (keys_ = grn_table_sort_key_from_str(ctx, keys, keys_len, - table_, &nkeys))) { - if ((sorted = grn_table_create(ctx, NULL, 0, NULL, - GRN_OBJ_TABLE_NO_KEY, NULL, table_))) { - int table_size = (int)grn_table_size(ctx, table_); - grn_normalize_offset_and_limit(ctx, table_size, &offset, &limit); - grn_table_sort(ctx, table_, offset, limit, sorted, keys_, nkeys); - grn_table_sort_key_close(ctx, keys_, nkeys); - } - } - } - grn_output_table_name_or_id(ctx, sorted); - return NULL; -} - -static grn_obj * -command_output(grn_ctx *ctx, int nargs, grn_obj **args, - grn_user_data *user_data) -{ - const char *table = GRN_TEXT_VALUE(VAR(0)); - unsigned int table_len = GRN_TEXT_LEN(VAR(0)); - const char *columns = GRN_TEXT_VALUE(VAR(1)); - unsigned int columns_len = GRN_TEXT_LEN(VAR(1)); - int offset = GRN_TEXT_LEN(VAR(2)) - ? grn_atoi(GRN_TEXT_VALUE(VAR(2)), GRN_BULK_CURR(VAR(2)), NULL) - : 0; - int limit = GRN_TEXT_LEN(VAR(3)) - ? grn_atoi(GRN_TEXT_VALUE(VAR(3)), GRN_BULK_CURR(VAR(3)), NULL) - : DEFAULT_LIMIT; - grn_obj *table_ = grn_ctx_get_table_by_name_or_id(ctx, table, table_len); - if (table_) { - grn_obj_format format; - int table_size = (int)grn_table_size(ctx, table_); - GRN_OBJ_FORMAT_INIT(&format, table_size, 0, limit, offset); - format.flags = - GRN_OBJ_FORMAT_WITH_COLUMN_NAMES| - GRN_OBJ_FORMAT_XML_ELEMENT_RESULTSET; - /* TODO: accept only comma separated expr as columns */ - grn_obj_columns(ctx, table_, columns, columns_len, &format.columns); - GRN_OUTPUT_OBJ(table_, &format); - GRN_OBJ_FORMAT_FIN(ctx, &format); - } - return NULL; -} - -static grn_obj * -command_each(grn_ctx *ctx, int nargs, grn_obj **args, - grn_user_data *user_data) -{ - const char *table = GRN_TEXT_VALUE(VAR(0)); - unsigned int table_len = GRN_TEXT_LEN(VAR(0)); - const char *expr = GRN_TEXT_VALUE(VAR(1)); - unsigned int expr_len = GRN_TEXT_LEN(VAR(1)); - grn_obj *table_ = grn_ctx_get_table_by_name_or_id(ctx, table, table_len); - if (table_) { - grn_obj *v, *expr_; - GRN_EXPR_CREATE_FOR_QUERY(ctx, table_, expr_, v); - if (expr_ && v) { - grn_table_cursor *tc; - grn_expr_parse(ctx, expr_, expr, expr_len, - NULL, GRN_OP_MATCH, GRN_OP_AND, - GRN_EXPR_SYNTAX_SCRIPT|GRN_EXPR_ALLOW_UPDATE); - if ((tc = grn_table_cursor_open(ctx, table_, NULL, 0, - NULL, 0, 0, -1, 0))) { - grn_id id; - while ((id = grn_table_cursor_next(ctx, tc)) != GRN_ID_NIL) { - GRN_RECORD_SET(ctx, v, id); - grn_expr_exec(ctx, expr_, 0); - } - grn_table_cursor_close(ctx, tc); - } - grn_obj_unlink(ctx, expr_); - } - } - GRN_OUTPUT_BOOL(!ctx->rc); - return NULL; -} - -static grn_obj * -command_unlink(grn_ctx *ctx, int nargs, grn_obj **args, - grn_user_data *user_data) -{ - const char *table = GRN_TEXT_VALUE(VAR(0)); - unsigned int table_len = GRN_TEXT_LEN(VAR(0)); - grn_obj *table_ = grn_ctx_get_table_by_name_or_id(ctx, table, table_len); - if (table_) { - grn_obj_unlink(ctx, table_); - } - GRN_OUTPUT_BOOL(!ctx->rc); - return NULL; -} - -static grn_obj * -command_add(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) -{ - grn_load_(ctx, GRN_CONTENT_JSON, - GRN_TEXT_VALUE(VAR(0)), GRN_TEXT_LEN(VAR(0)), - NULL, 0, - GRN_TEXT_VALUE(VAR(1)), GRN_TEXT_LEN(VAR(1)), - NULL, 0, NULL, 0, - NULL, - 0); - GRN_OUTPUT_BOOL(ctx->impl->loader.nrecords); - if (ctx->impl->loader.table) { - grn_db_touch(ctx, DB_OBJ(ctx->impl->loader.table)->db); - } - return NULL; -} - -static grn_obj * -command_set(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) -{ - int table_name_len = GRN_TEXT_LEN(VAR(0)); - const char *table_name = GRN_TEXT_VALUE(VAR(0)); - grn_obj *table = grn_ctx_get(ctx, table_name, table_name_len); - if (table) { - grn_id id = GRN_ID_NIL; - int key_len = GRN_TEXT_LEN(VAR(2)); - int id_len = GRN_TEXT_LEN(VAR(5)); - if (key_len) { - const char *key = GRN_TEXT_VALUE(VAR(2)); - id = grn_table_get(ctx, table, key, key_len); - } else { - if (id_len) { - id = grn_atoui(GRN_TEXT_VALUE(VAR(5)), GRN_BULK_CURR(VAR(5)), NULL); - } - id = grn_table_at(ctx, table, id); - } - if (id) { - grn_obj obj; - grn_obj_format format; - GRN_RECORD_INIT(&obj, 0, ((grn_db_obj *)table)->id); - GRN_OBJ_FORMAT_INIT(&format, 1, 0, 1, 0); - GRN_RECORD_SET(ctx, &obj, id); - grn_obj_columns(ctx, table, - GRN_TEXT_VALUE(VAR(4)), - GRN_TEXT_LEN(VAR(4)), &format.columns); - format.flags = 0 /* GRN_OBJ_FORMAT_WITH_COLUMN_NAMES */; - GRN_OUTPUT_OBJ(&obj, &format); - GRN_OBJ_FORMAT_FIN(ctx, &format); - } - } else { - ERR(GRN_INVALID_ARGUMENT, - "nonexistent table name: <%.*s>", table_name_len, table_name); - } - return NULL; -} - -static grn_rc -command_get_resolve_parameters(grn_ctx *ctx, grn_user_data *user_data, - grn_obj **table, grn_id *id) -{ - const char *table_text, *id_text, *key_text; - int table_length, id_length, key_length; - - table_text = GRN_TEXT_VALUE(VAR(0)); - table_length = GRN_TEXT_LEN(VAR(0)); - if (table_length == 0) { - ERR(GRN_INVALID_ARGUMENT, "[table][get] table isn't specified"); - return ctx->rc; - } - - *table = grn_ctx_get(ctx, table_text, table_length); - if (!*table) { - ERR(GRN_INVALID_ARGUMENT, - "[table][get] table doesn't exist: <%.*s>", table_length, table_text); - return ctx->rc; - } - - key_text = GRN_TEXT_VALUE(VAR(1)); - key_length = GRN_TEXT_LEN(VAR(1)); - id_text = GRN_TEXT_VALUE(VAR(3)); - id_length = GRN_TEXT_LEN(VAR(3)); - switch ((*table)->header.type) { - case GRN_TABLE_NO_KEY: - if (key_length) { - ERR(GRN_INVALID_ARGUMENT, - "[table][get] should not specify key for NO_KEY table: <%.*s>: " - "table: <%.*s>", - key_length, key_text, - table_length, table_text); - return ctx->rc; - } - if (id_length) { - const char *rest = NULL; - *id = grn_atoi(id_text, id_text + id_length, &rest); - if (rest == id_text) { - ERR(GRN_INVALID_ARGUMENT, - "[table][get] ID should be a number: <%.*s>: table: <%.*s>", - id_length, id_text, - table_length, table_text); - } - } else { - ERR(GRN_INVALID_ARGUMENT, - "[table][get] ID isn't specified: table: <%.*s>", - table_length, table_text); - } - break; - case GRN_TABLE_HASH_KEY: - case GRN_TABLE_PAT_KEY: - case GRN_TABLE_DAT_KEY: - if (key_length && id_length) { - ERR(GRN_INVALID_ARGUMENT, - "[table][get] should not specify both key and ID: " - "key: <%.*s>: ID: <%.*s>: table: <%.*s>", - key_length, key_text, - id_length, id_text, - table_length, table_text); - return ctx->rc; - } - if (key_length) { - *id = grn_table_get(ctx, *table, key_text, key_length); - if (!*id) { - ERR(GRN_INVALID_ARGUMENT, - "[table][get] nonexistent key: <%.*s>: table: <%.*s>", - key_length, key_text, - table_length, table_text); - } - } else { - if (id_length) { - const char *rest = NULL; - *id = grn_atoi(id_text, id_text + id_length, &rest); - if (rest == id_text) { - ERR(GRN_INVALID_ARGUMENT, - "[table][get] ID should be a number: <%.*s>: table: <%.*s>", - id_length, id_text, - table_length, table_text); - } - } else { - ERR(GRN_INVALID_ARGUMENT, - "[table][get] key nor ID isn't specified: table: <%.*s>", - table_length, table_text); - } - } - break; - default: - ERR(GRN_INVALID_ARGUMENT, - "[table][get] not a table: <%.*s>", table_length, table_text); - break; - } - - return ctx->rc; -} - -static grn_obj * -command_get(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) -{ - grn_id id = GRN_ID_NIL; - grn_obj *table = NULL; - if (!command_get_resolve_parameters(ctx, user_data, &table, &id)) { - grn_obj obj; - grn_obj_format format; - GRN_OUTPUT_ARRAY_OPEN("RESULT", 2); - GRN_RECORD_INIT(&obj, 0, ((grn_db_obj *)table)->id); - GRN_OBJ_FORMAT_INIT(&format, 1, 0, 1, 0); - GRN_RECORD_SET(ctx, &obj, id); - grn_obj_columns(ctx, table, GRN_TEXT_VALUE(VAR(2)), GRN_TEXT_LEN(VAR(2)), - &format.columns); - format.flags = - GRN_OBJ_FORMAT_WITH_COLUMN_NAMES | - GRN_OBJ_FORMAT_XML_ELEMENT_RESULTSET; - GRN_OUTPUT_OBJ(&obj, &format); - GRN_OBJ_FORMAT_FIN(ctx, &format); - GRN_OUTPUT_ARRAY_CLOSE(); - } - return NULL; -} - -static grn_obj * -command_push(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) -{ - grn_obj *table = grn_ctx_get(ctx, GRN_TEXT_VALUE(VAR(0)), GRN_TEXT_LEN(VAR(0))); - if (table) { - switch (table->header.type) { - case GRN_TABLE_NO_KEY: - { - grn_array *array = (grn_array *)table; - grn_table_queue *queue = grn_array_queue(ctx, array); - if (queue) { - MUTEX_LOCK(queue->mutex); - if (grn_table_queue_head(queue) == queue->cap) { - grn_array_clear_curr_rec(ctx, array); - } - grn_load_(ctx, GRN_CONTENT_JSON, - GRN_TEXT_VALUE(VAR(0)), GRN_TEXT_LEN(VAR(0)), - NULL, 0, - GRN_TEXT_VALUE(VAR(1)), GRN_TEXT_LEN(VAR(1)), - NULL, 0, NULL, 0, - NULL, - 0); - if (grn_table_queue_size(queue) == queue->cap) { - grn_table_queue_tail_increment(queue); - } - grn_table_queue_head_increment(queue); - COND_SIGNAL(queue->cond); - MUTEX_UNLOCK(queue->mutex); - GRN_OUTPUT_BOOL(ctx->impl->loader.nrecords); - if (ctx->impl->loader.table) { - grn_db_touch(ctx, DB_OBJ(ctx->impl->loader.table)->db); - } - } else { - ERR(GRN_OPERATION_NOT_SUPPORTED, "table '%.*s' doesn't support push", - (int)GRN_TEXT_LEN(VAR(0)), GRN_TEXT_VALUE(VAR(0))); - } - } - break; - default : - ERR(GRN_OPERATION_NOT_SUPPORTED, "table '%.*s' doesn't support push", - (int)GRN_TEXT_LEN(VAR(0)), GRN_TEXT_VALUE(VAR(0))); - } - } else { - ERR(GRN_INVALID_ARGUMENT, "table '%.*s' does not exist.", - (int)GRN_TEXT_LEN(VAR(0)), GRN_TEXT_VALUE(VAR(0))); - } - return NULL; -} - -static grn_obj * -command_pull(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) -{ - grn_obj *table = grn_ctx_get(ctx, GRN_TEXT_VALUE(VAR(0)), GRN_TEXT_LEN(VAR(0))); - if (table) { - switch (table->header.type) { - case GRN_TABLE_NO_KEY: - { - grn_array *array = (grn_array *)table; - grn_table_queue *queue = grn_array_queue(ctx, array); - if (queue) { - MUTEX_LOCK(queue->mutex); - while (grn_table_queue_size(queue) == 0) { - if (GRN_TEXT_LEN(VAR(2))) { - MUTEX_UNLOCK(queue->mutex); - GRN_OUTPUT_BOOL(0); - return NULL; - } - COND_WAIT(queue->cond, queue->mutex); - } - grn_table_queue_tail_increment(queue); - { - grn_obj obj; - grn_obj_format format; - GRN_RECORD_INIT(&obj, 0, ((grn_db_obj *)table)->id); - GRN_OBJ_FORMAT_INIT(&format, 1, 0, 1, 0); - GRN_RECORD_SET(ctx, &obj, grn_table_queue_tail(queue)); - grn_obj_columns(ctx, table, GRN_TEXT_VALUE(VAR(1)), GRN_TEXT_LEN(VAR(1)), - &format.columns); - format.flags = 0 /* GRN_OBJ_FORMAT_WITH_COLUMN_NAMES */; - GRN_OUTPUT_OBJ(&obj, &format); - GRN_OBJ_FORMAT_FIN(ctx, &format); - } - MUTEX_UNLOCK(queue->mutex); - } else { - ERR(GRN_OPERATION_NOT_SUPPORTED, "table '%.*s' doesn't support pull", - (int)GRN_TEXT_LEN(VAR(0)), GRN_TEXT_VALUE(VAR(0))); - } - } - break; - default : - ERR(GRN_OPERATION_NOT_SUPPORTED, "table '%.*s' doesn't support pull", - (int)GRN_TEXT_LEN(VAR(0)), GRN_TEXT_VALUE(VAR(0))); - } - } else { - ERR(GRN_INVALID_ARGUMENT, "table '%.*s' does not exist.", - (int)GRN_TEXT_LEN(VAR(0)), GRN_TEXT_VALUE(VAR(0))); - } - return NULL; -} - -grn_rc -GRN_PLUGIN_INIT(grn_ctx *ctx) -{ - return GRN_SUCCESS; -} - -grn_rc -GRN_PLUGIN_REGISTER(grn_ctx *ctx) -{ - grn_expr_var vars[18]; - - grn_plugin_expr_var_init(ctx, &vars[0], "table", -1); - grn_plugin_expr_var_init(ctx, &vars[1], "expression", -1); - grn_plugin_expr_var_init(ctx, &vars[2], "result_set", -1); - grn_plugin_expr_var_init(ctx, &vars[3], "set_operation", -1); - grn_plugin_expr_var_init(ctx, &vars[4], "allow_update", -1); - grn_plugin_command_create(ctx, "filter_by_script", -1, command_filter_by_script, 5, vars); - - grn_plugin_expr_var_init(ctx, &vars[0], "table", -1); - grn_plugin_expr_var_init(ctx, &vars[1], "column", -1); - grn_plugin_expr_var_init(ctx, &vars[2], "operator", -1); - grn_plugin_expr_var_init(ctx, &vars[3], "value", -1); - grn_plugin_expr_var_init(ctx, &vars[4], "result_set", -1); - grn_plugin_expr_var_init(ctx, &vars[5], "set_operation", -1); - grn_plugin_command_create(ctx, "filter", -1, command_filter, 6, vars); - - grn_plugin_expr_var_init(ctx, &vars[0], "table", -1); - grn_plugin_expr_var_init(ctx, &vars[1], "key", -1); - grn_plugin_expr_var_init(ctx, &vars[2], "result_set", -1); - grn_plugin_expr_var_init(ctx, &vars[3], "range_gap", -1); - grn_plugin_command_create(ctx, "group", -1, command_group, 4, vars); - - grn_plugin_expr_var_init(ctx, &vars[0], "table", -1); - grn_plugin_expr_var_init(ctx, &vars[1], "keys", -1); - grn_plugin_expr_var_init(ctx, &vars[2], "offset", -1); - grn_plugin_expr_var_init(ctx, &vars[3], "limit", -1); - grn_plugin_command_create(ctx, "sort", -1, command_sort, 4, vars); - - grn_plugin_expr_var_init(ctx, &vars[0], "table", -1); - grn_plugin_expr_var_init(ctx, &vars[1], "columns", -1); - grn_plugin_expr_var_init(ctx, &vars[2], "offset", -1); - grn_plugin_expr_var_init(ctx, &vars[3], "limit", -1); - grn_plugin_command_create(ctx, "output", -1, command_output, 4, vars); - - grn_plugin_expr_var_init(ctx, &vars[0], "table", -1); - grn_plugin_expr_var_init(ctx, &vars[1], "expression", -1); - grn_plugin_command_create(ctx, "each", -1, command_each, 2, vars); - - grn_plugin_expr_var_init(ctx, &vars[0], "table", -1); - grn_plugin_command_create(ctx, "unlink", -1, command_unlink, 1, vars); - - grn_plugin_expr_var_init(ctx, &vars[0], "table", -1); - grn_plugin_expr_var_init(ctx, &vars[1], "values", -1); - grn_plugin_expr_var_init(ctx, &vars[2], "key", -1); - grn_plugin_expr_var_init(ctx, &vars[3], "columns", -1); - grn_plugin_expr_var_init(ctx, &vars[4], "output_columns", -1); - grn_plugin_expr_var_init(ctx, &vars[5], "id", -1); - grn_plugin_command_create(ctx, "add", -1, command_add, 2, vars); - grn_plugin_command_create(ctx, "push", -1, command_push, 2, vars); - grn_plugin_command_create(ctx, "set", -1, command_set, 6, vars); - - grn_plugin_expr_var_init(ctx, &vars[0], "table", -1); - grn_plugin_expr_var_init(ctx, &vars[1], "key", -1); - grn_plugin_expr_var_init(ctx, &vars[2], "output_columns", -1); - grn_plugin_expr_var_init(ctx, &vars[3], "id", -1); - grn_plugin_command_create(ctx, "get", -1, command_get, 4, vars); - - grn_plugin_expr_var_init(ctx, &vars[0], "table", -1); - grn_plugin_expr_var_init(ctx, &vars[1], "output_columns", -1); - grn_plugin_expr_var_init(ctx, &vars[2], "non_block", -1); - grn_plugin_command_create(ctx, "pull", -1, command_pull, 3, vars); - - grn_plugin_expr_var_init(ctx, &vars[0], "table", -1); - grn_plugin_expr_var_init(ctx, &vars[1], "columns", -1); - grn_plugin_expr_var_init(ctx, &vars[2], "query", -1); - grn_plugin_expr_var_init(ctx, &vars[3], "result_set", -1); - grn_plugin_expr_var_init(ctx, &vars[4], "set_operation", -1); - grn_plugin_expr_var_init(ctx, &vars[5], "allow_column_expression", -1); - grn_plugin_expr_var_init(ctx, &vars[6], "allow_pragma", -1); - grn_plugin_command_create(ctx, "match", -1, command_match, 7, vars); - - return ctx->rc; -} - -grn_rc -GRN_PLUGIN_FIN(grn_ctx *ctx) -{ - return GRN_SUCCESS; -} -------------- next part -------------- HTML����������������������������... 下載