null+****@clear*****
null+****@clear*****
2012年 6月 14日 (木) 00:30:07 JST
Daijiro MORI 2012-06-14 00:30:07 +0900 (Thu, 14 Jun 2012)
New Revision: df13553f0db7b498bfb36ef2c926b837c65b191a
Log:
table: implement add command.
Added files:
test/function/suite/table/add.expected
test/function/suite/table/add.test
Modified files:
lib/ctx_impl.h
lib/db.c
lib/db.h
plugins/table/table.c
Modified: lib/ctx_impl.h (+1 -0)
===================================================================
--- lib/ctx_impl.h 2012-06-13 12:24:25 +0900 (0fb5155)
+++ lib/ctx_impl.h 2012-06-14 00:30:07 +0900 (64c15cd)
@@ -61,6 +61,7 @@ typedef struct {
grn_obj values;
grn_obj level;
grn_obj columns;
+ uint32_t emit_level;
int32_t key_offset;
grn_obj *table;
grn_obj *last;
Modified: lib/db.c (+32 -19)
===================================================================
--- lib/db.c 2012-06-13 12:24:25 +0900 (dcbde8e)
+++ lib/db.c 2012-06-14 00:30:07 +0900 (e590de1)
@@ -8676,7 +8676,7 @@ bracket_close(grn_ctx *ctx, grn_loader *loader)
GRN_ASSERT(value->header.domain & OPEN_BRACKET);
GRN_UINT32_SET(ctx, value, loader->values_size - begin - 1);
value++;
- if (GRN_BULK_VSIZE(&loader->level) <= sizeof(uint32_t)) {
+ if (GRN_BULK_VSIZE(&loader->level) <= sizeof(uint32_t) * loader->emit_level) {
ndata = values_len(ctx, value, ve);
if (loader->table) {
switch (loader->table->header.type) {
@@ -8816,7 +8816,7 @@ brace_close(grn_ctx *ctx, grn_loader *loader)
GRN_ASSERT(value->header.domain & OPEN_BRACKET);
GRN_UINT32_SET(ctx, value, loader->values_size - begin - 1);
value++;
- if (GRN_BULK_VSIZE(&loader->level) <= sizeof(uint32_t)) {
+ if (GRN_BULK_VSIZE(&loader->level) <= sizeof(uint32_t) * loader->emit_level) {
if (loader->table) {
switch (loader->table->header.type) {
case GRN_TABLE_HASH_KEY :
@@ -9263,22 +9263,18 @@ exit:
static grn_com_addr *addr;
-grn_rc
-grn_load(grn_ctx *ctx, grn_content_type input_type,
- const char *table, unsigned int table_len,
- const char *columns, unsigned int columns_len,
- const char *values, unsigned int values_len,
- const char *ifexists, unsigned int ifexists_len,
- const char *each, unsigned int each_len)
+void
+grn_load_(grn_ctx *ctx, grn_content_type input_type,
+ const char *table, unsigned int table_len,
+ const char *columns, unsigned int columns_len,
+ const char *values, unsigned int values_len,
+ const char *ifexists, unsigned int ifexists_len,
+ const char *each, unsigned int each_len,
+ uint32_t emit_level)
{
grn_loader *loader;
- if (!ctx || !ctx->impl) {
- ERR(GRN_INVALID_ARGUMENT, "db not initialized");
- return ctx->rc;
- }
- GRN_API_ENTER;
loader = &ctx->impl->loader;
-
+ loader->emit_level = emit_level;
if (ctx->impl->edge) {
grn_edge *edge = grn_edges_add_communicator(ctx, addr);
grn_obj *msg = grn_msg_open(ctx, edge->com, &ctx->impl->edge->send_old);
@@ -9290,12 +9286,12 @@ grn_load(grn_ctx *ctx, grn_content_type input_type,
loader->input_type = input_type;
if (grn_db_check_name(ctx, table, table_len)) {
GRN_DB_CHECK_NAME_ERR("[table][load]", table, table_len);
- goto exit;
+ return;
}
loader->table = grn_ctx_get(ctx, table, table_len);
if (!loader->table) {
ERR(GRN_INVALID_ARGUMENT, "nonexistent table: <%.*s>", table_len, table);
- goto exit;
+ return;
}
if (loader->table && columns && columns_len) {
int i, n_columns;
@@ -9304,7 +9300,7 @@ grn_load(grn_ctx *ctx, grn_content_type input_type,
GRN_PTR_INIT(&parsed_columns, GRN_OBJ_VECTOR, GRN_ID_NIL);
if (parse_load_columns(ctx, loader->table, columns, columns_len,
&parsed_columns)) {
- goto exit;
+ return;
}
n_columns = GRN_BULK_VSIZE(&parsed_columns) / sizeof(grn_obj *);
for (i = 0; i < n_columns; i++) {
@@ -9353,6 +9349,23 @@ grn_load(grn_ctx *ctx, grn_content_type input_type,
// todo
break;
}
-exit:
+}
+
+grn_rc
+grn_load(grn_ctx *ctx, grn_content_type input_type,
+ const char *table, unsigned int table_len,
+ const char *columns, unsigned int columns_len,
+ const char *values, unsigned int values_len,
+ const char *ifexists, unsigned int ifexists_len,
+ const char *each, unsigned int each_len)
+{
+ if (!ctx || !ctx->impl) {
+ ERR(GRN_INVALID_ARGUMENT, "db not initialized");
+ return ctx->rc;
+ }
+ GRN_API_ENTER;
+ grn_load_(ctx, input_type, table, table_len,
+ columns, columns_len, values, values_len,
+ ifexists, ifexists_len, each, each_len, 1);
GRN_API_RETURN(ctx->rc);
}
Modified: lib/db.h (+8 -0)
===================================================================
--- lib/db.h 2012-06-13 12:24:25 +0900 (dce72e2)
+++ lib/db.h 2012-06-14 00:30:07 +0900 (4948de8)
@@ -432,6 +432,14 @@ GRN_API grn_obj *grn_table_create_for_group(grn_ctx *ctx,
#define KEY_NAME "_key"
#define ID_NAME "_id"
+void grn_load_(grn_ctx *ctx, grn_content_type input_type,
+ const char *table, unsigned int table_len,
+ const char *columns, unsigned int columns_len,
+ const char *values, unsigned int values_len,
+ const char *ifexists, unsigned int ifexists_len,
+ const char *each, unsigned int each_len,
+ uint32_t emit_level);
+
#ifdef __cplusplus
}
#endif
Modified: plugins/table/table.c (+13 -4)
===================================================================
--- plugins/table/table.c 2012-06-13 12:24:25 +0900 (112e727)
+++ plugins/table/table.c 2012-06-14 00:30:07 +0900 (51035dc)
@@ -273,6 +273,15 @@ command_unlink(grn_ctx *ctx, int nargs, grn_obj **args,
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, 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;
}
@@ -362,12 +371,12 @@ GRN_PLUGIN_REGISTER(grn_ctx *ctx)
DEF_COMMAND("unlink", command_unlink, 1, vars);
DEF_VAR(vars[0], "table");
- DEF_VAR(vars[1], "key");
- DEF_VAR(vars[2], "columns");
- DEF_VAR(vars[3], "values");
+ DEF_VAR(vars[1], "values");
+ DEF_VAR(vars[2], "key");
+ DEF_VAR(vars[3], "columns");
DEF_VAR(vars[4], "output_columns");
DEF_VAR(vars[5], "id");
- DEF_COMMAND("add", command_add, 5, vars);
+ DEF_COMMAND("add", command_add, 2, vars);
DEF_COMMAND("set", command_set, 6, vars);
return ctx->rc;
Added: test/function/suite/table/add.expected (+87 -0) 100644
===================================================================
--- /dev/null
+++ test/function/suite/table/add.expected 2012-06-14 00:30:07 +0900 (dd172f0)
@@ -0,0 +1,87 @@
+register table/table
+[[0,0.0,0.0],true]
+table_create Shops TABLE_PAT_KEY ShortText
+[[0,0.0,0.0],true]
+column_create Shops name COLUMN_SCALAR ShortText
+[[0,0.0,0.0],true]
+column_create Shops tags COLUMN_VECTOR ShortText
+[[0,0.0,0.0],true]
+table_create Events TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Events value COLUMN_SCALAR ShortText
+[[0,0.0,0.0],true]
+add Shops '{"_key":"kuriko-an","tags":["たいやき","養殖"]}'
+[[0,0.0,0.0],true]
+select Shops
+[
+ [
+ 0,
+ 0.0,
+ 0.0
+ ],
+ [
+ [
+ [
+ 1
+ ],
+ [
+ [
+ "_id",
+ "UInt32"
+ ],
+ [
+ "_key",
+ "ShortText"
+ ],
+ [
+ "name",
+ "ShortText"
+ ],
+ [
+ "tags",
+ "ShortText"
+ ]
+ ],
+ [
+ 1,
+ "kuriko-an",
+ "",
+ [
+ "たいやき",
+ "養殖"
+ ]
+ ]
+ ]
+ ]
+]
+add Events '{"value":"田無店新規開店!"}'
+[[0,0.0,0.0],true]
+select Events
+[
+ [
+ 0,
+ 0.0,
+ 0.0
+ ],
+ [
+ [
+ [
+ 1
+ ],
+ [
+ [
+ "_id",
+ "UInt32"
+ ],
+ [
+ "value",
+ "ShortText"
+ ]
+ ],
+ [
+ 1,
+ "田無店新規開店!"
+ ]
+ ]
+ ]
+]
Added: test/function/suite/table/add.test (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/function/suite/table/add.test 2012-06-14 00:30:07 +0900 (60beb87)
@@ -0,0 +1,13 @@
+register table/table
+table_create Shops TABLE_PAT_KEY ShortText
+column_create Shops name COLUMN_SCALAR ShortText
+column_create Shops tags COLUMN_VECTOR ShortText
+
+table_create Events TABLE_NO_KEY
+column_create Events value COLUMN_SCALAR ShortText
+
+add Shops '{"_key":"kuriko-an","tags":["たいやき","養殖"]}'
+select Shops
+
+add Events '{"value":"田無店新規開店!"}'
+select Events