null+****@clear*****
null+****@clear*****
2010年 8月 23日 (月) 20:56:59 JST
Daijiro MORI 2010-08-23 11:56:59 +0000 (Mon, 23 Aug 2010)
New Revision: fe5e5a21065a11107fc8b84b265d5a3ca84d090f
Log:
Added each parameter to load command.
Modified files:
groonga.h
lib/ctx.c
lib/db.c
lib/proc.c
lib/ql.h
Modified: groonga.h (+2 -1)
===================================================================
--- groonga.h 2010-08-23 08:01:16 +0000 (e957cfd)
+++ groonga.h 2010-08-23 11:56:59 +0000 (6373c5b)
@@ -2147,7 +2147,8 @@ GRN_API grn_rc grn_load(grn_ctx *ctx, grn_content_type input_type,
const char *table, unsigned table_len,
const char *columns, unsigned columns_len,
const char *values, unsigned values_len,
- const char *ifexists, unsigned ifexists_len);
+ const char *ifexists, unsigned ifexists_len,
+ const char *each, unsigned each_len);
#define GRN_CTX_MORE (0x01<<0)
#define GRN_CTX_TAIL (0x01<<1)
Modified: lib/ctx.c (+2 -0)
===================================================================
--- lib/ctx.c 2010-08-23 08:01:16 +0000 (3c44081)
+++ lib/ctx.c 2010-08-23 11:56:59 +0000 (e7a4ad4)
@@ -204,6 +204,7 @@ grn_loader_init(grn_loader *loader)
loader->table = NULL;
loader->last = NULL;
loader->ifexists = NULL;
+ loader->each = NULL;
loader->values_size = 0;
loader->nrecords = 0;
loader->stat = GRN_LOADER_BEGIN;
@@ -219,6 +220,7 @@ grn_ctx_loader_clear(grn_ctx *ctx)
uint32_t i = GRN_BULK_VSIZE(&loader->columns) / sizeof(grn_obj *);
if (ctx->impl->db) { while (i--) { grn_obj_unlink(ctx, *p++); } }
if (loader->ifexists) { grn_obj_unlink(ctx, loader->ifexists); }
+ if (loader->each) { grn_obj_unlink(ctx, loader->each); }
while (v < ve) { GRN_OBJ_FIN(ctx, v++); }
GRN_OBJ_FIN(ctx, &loader->values);
GRN_OBJ_FIN(ctx, &loader->level);
Modified: lib/db.c (+16 -1)
===================================================================
--- lib/db.c 2010-08-23 08:01:16 +0000 (0e12196)
+++ lib/db.c 2010-08-23 11:56:59 +0000 (9b67bb6)
@@ -7575,6 +7575,11 @@ brace_close(grn_ctx *ctx, grn_loader *loader)
}
value = values_next(ctx, value);
}
+ if (loader->each) {
+ grn_obj *v = grn_expr_get_var_by_offset(ctx, loader->each, 0);
+ GRN_RECORD_SET(ctx, v, id);
+ grn_expr_exec(ctx, loader->each, 0);
+ }
loader->nrecords++;
} else {
GRN_LOG(ctx, GRN_LOG_ERROR, "neither _key nor _id is assigned");
@@ -7886,7 +7891,8 @@ grn_load(grn_ctx *ctx, grn_content_type input_type,
const char *table, unsigned table_len,
const char *columns, unsigned columns_len,
const char *values, unsigned values_len,
- const char *ifexists, unsigned ifexists_len)
+ const char *ifexists, unsigned ifexists_len,
+ const char *each, unsigned each_len)
{
grn_loader *loader;
if (!ctx || !ctx->impl) {
@@ -7934,6 +7940,15 @@ grn_load(grn_ctx *ctx, grn_content_type input_type,
GRN_EXPR_SYNTAX_SCRIPT|GRN_EXPR_ALLOW_UPDATE);
}
}
+ if (each && each_len) {
+ grn_obj *v;
+ GRN_EXPR_CREATE_FOR_QUERY(ctx, loader->table, loader->each, v);
+ if (loader->each && v) {
+ grn_expr_parse(ctx, loader->each, each, each_len,
+ NULL, GRN_OP_EQUAL, GRN_OP_AND,
+ GRN_EXPR_SYNTAX_SCRIPT|GRN_EXPR_ALLOW_UPDATE);
+ }
+ }
loader->input_type = input_type;
} else {
input_type = loader->input_type;
Modified: lib/proc.c (+4 -2)
===================================================================
--- lib/proc.c 2010-08-23 08:01:16 +0000 (6f09985)
+++ lib/proc.c 2010-08-23 11:56:59 +0000 (cd0c718)
@@ -363,7 +363,8 @@ proc_load(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
GRN_TEXT_VALUE(VAR(1)), GRN_TEXT_LEN(VAR(1)),
GRN_TEXT_VALUE(VAR(2)), GRN_TEXT_LEN(VAR(2)),
GRN_TEXT_VALUE(VAR(0)), GRN_TEXT_LEN(VAR(0)),
- GRN_TEXT_VALUE(VAR(3)), GRN_TEXT_LEN(VAR(3)));
+ GRN_TEXT_VALUE(VAR(3)), GRN_TEXT_LEN(VAR(3)),
+ GRN_TEXT_VALUE(VAR(5)), GRN_TEXT_LEN(VAR(5)));
if (ctx->impl->loader.stat != GRN_LOADER_END) {
grn_ctx_set_next_expr(ctx, grn_proc_get_info(ctx, user_data, NULL, NULL, NULL));
} else {
@@ -2203,7 +2204,8 @@ grn_db_init_builtin_query(grn_ctx *ctx)
DEF_VAR(vars[2], "columns");
DEF_VAR(vars[3], "ifexists");
DEF_VAR(vars[4], "input_type");
- DEF_COMMAND("load", proc_load, 5, vars);
+ DEF_VAR(vars[5], "each");
+ DEF_COMMAND("load", proc_load, 6, vars);
DEF_COMMAND("status", proc_status, 0, vars);
Modified: lib/ql.h (+1 -0)
===================================================================
--- lib/ql.h 2010-08-23 08:01:16 +0000 (e2ae916)
+++ lib/ql.h 2010-08-23 11:56:59 +0000 (a385f1c)
@@ -151,6 +151,7 @@ typedef struct {
grn_obj *table;
grn_obj *last;
grn_obj *ifexists;
+ grn_obj *each;
uint32_t unichar;
uint32_t values_size;
uint32_t nrecords;