null+****@clear*****
null+****@clear*****
2010年 7月 12日 (月) 21:20:28 JST
Daijiro MORI 2010-07-12 12:20:28 +0000 (Mon, 12 Jul 2010)
New Revision: 8c90299113a09f4dfdcbf38798897ed163022d0a
Log:
Returns error when invalid command name is assinged.
Modified files:
lib/ctx.c
lib/proc.c
src/groonga.c
Modified: lib/ctx.c (+39 -33)
===================================================================
--- lib/ctx.c 2010-07-12 10:33:16 +0000 (99a233c)
+++ lib/ctx.c 2010-07-12 12:20:28 +0000 (bb18e9d)
@@ -907,46 +907,52 @@ grn_ctx_qe_exec(grn_ctx *ctx, const char *str, uint32_t str_len)
const char *p = str, *e = str + str_len, *v;
GRN_TEXT_INIT(&buf, 0);
p = grn_text_unesc_tok(ctx, &buf, p, e, &tok_type);
- if ((expr = grn_ctx_get(ctx, GRN_TEXT_VALUE(&buf), GRN_TEXT_LEN(&buf)))) {
- while (p < e) {
- GRN_BULK_REWIND(&buf);
- p = grn_text_unesc_tok(ctx, &buf, p, e, &tok_type);
- v = GRN_TEXT_VALUE(&buf);
- switch (tok_type) {
- case GRN_TOK_VOID :
- p = e;
- break;
- case GRN_TOK_SYMBOL :
- if (GRN_TEXT_LEN(&buf) > 2 && v[0] == '-' && v[1] == '-') {
- int l = GRN_TEXT_LEN(&buf) - 2;
- v += 2;
- if (l == OUTPUT_TYPE_LEN && !memcmp(v, OUTPUT_TYPE, OUTPUT_TYPE_LEN)) {
- GRN_BULK_REWIND(&buf);
- p = grn_text_unesc_tok(ctx, &buf, p, e, &tok_type);
- v = GRN_TEXT_VALUE(&buf);
- get_content_mime_type(ctx, v, GRN_BULK_CURR(&buf));
- } else if ((val = grn_expr_get_or_add_var(ctx, expr, v, l))) {
- grn_obj_reinit(ctx, val, GRN_DB_TEXT, 0);
- p = grn_text_unesc_tok(ctx, val, p, e, &tok_type);
- } else {
- p = e;
- }
- break;
- }
- // fallthru
- case GRN_TOK_STRING :
- case GRN_TOK_QUOTE :
- if ((val = grn_expr_get_var_by_offset(ctx, expr, offset++))) {
+ expr = grn_ctx_get(ctx, GRN_TEXT_VALUE(&buf), GRN_TEXT_LEN(&buf));
+ while (p < e) {
+ GRN_BULK_REWIND(&buf);
+ p = grn_text_unesc_tok(ctx, &buf, p, e, &tok_type);
+ v = GRN_TEXT_VALUE(&buf);
+ switch (tok_type) {
+ case GRN_TOK_VOID :
+ p = e;
+ break;
+ case GRN_TOK_SYMBOL :
+ if (GRN_TEXT_LEN(&buf) > 2 && v[0] == '-' && v[1] == '-') {
+ int l = GRN_TEXT_LEN(&buf) - 2;
+ v += 2;
+ if (l == OUTPUT_TYPE_LEN && !memcmp(v, OUTPUT_TYPE, OUTPUT_TYPE_LEN)) {
+ GRN_BULK_REWIND(&buf);
+ p = grn_text_unesc_tok(ctx, &buf, p, e, &tok_type);
+ v = GRN_TEXT_VALUE(&buf);
+ get_content_mime_type(ctx, v, GRN_BULK_CURR(&buf));
+ } else if (expr && (val = grn_expr_get_or_add_var(ctx, expr, v, l))) {
grn_obj_reinit(ctx, val, GRN_DB_TEXT, 0);
- GRN_TEXT_PUT(ctx, val, GRN_TEXT_VALUE(&buf), GRN_TEXT_LEN(&buf));
+ p = grn_text_unesc_tok(ctx, val, p, e, &tok_type);
} else {
p = e;
}
break;
}
+ // fallthru
+ case GRN_TOK_STRING :
+ case GRN_TOK_QUOTE :
+ if (expr && (val = grn_expr_get_var_by_offset(ctx, expr, offset++))) {
+ grn_obj_reinit(ctx, val, GRN_DB_TEXT, 0);
+ GRN_TEXT_PUT(ctx, val, GRN_TEXT_VALUE(&buf), GRN_TEXT_LEN(&buf));
+ } else {
+ p = e;
+ }
+ break;
}
- ctx->impl->curr_expr = expr;
+ }
+ ctx->impl->curr_expr = expr;
+ if (expr) {
grn_expr_exec(ctx, expr, 0);
+ } else {
+ GRN_BULK_REWIND(&buf);
+ grn_text_unesc_tok(ctx, &buf, str, str + str_len, &tok_type);
+ ERR(GRN_INVALID_ARGUMENT, "invalid command name: %.*s",
+ GRN_TEXT_LEN(&buf), GRN_TEXT_VALUE(&buf));
}
GRN_OBJ_FIN(ctx, &buf);
return expr;
@@ -1017,7 +1023,7 @@ grn_ctx_send(grn_ctx *ctx, const char *str, unsigned int str_len, int flags)
if (ctx->stat == GRN_CTX_QUITTING) { ctx->stat = GRN_CTX_QUIT; }
if (!ERRP(ctx, GRN_CRIT)) {
if (!(flags & GRN_CTX_QUIET) && ctx->impl->output) {
- ctx->impl->output(ctx, 0, ctx->impl->data.ptr);
+ ctx->impl->output(ctx, GRN_CTX_TAIL, ctx->impl->data.ptr);
}
}
if (expr) { grn_expr_clear_vars(ctx, expr); }
Modified: lib/proc.c (+2 -0)
===================================================================
--- lib/proc.c 2010-07-12 10:33:16 +0000 (c639f79)
+++ lib/proc.c 2010-07-12 12:20:28 +0000 (f240317)
@@ -286,6 +286,8 @@ grn_select(grn_ctx *ctx, const char *table, unsigned table_len,
}
if (taintable) { grn_db_touch(ctx, DB_OBJ(table_)->db); }
grn_obj_unlink(ctx, table_);
+ } else {
+ ERR(GRN_INVALID_ARGUMENT, "invalid table name: %.*s", table_len, table);
}
/* GRN_LOG(ctx, GRN_LOG_NONE, "%d", ctx->seqno); */
return ctx->rc;
Modified: src/groonga.c (+9 -8)
===================================================================
--- src/groonga.c 2010-07-12 10:33:16 +0000 (596386d)
+++ src/groonga.c 2010-07-12 12:20:28 +0000 (dcf73ab)
@@ -321,9 +321,9 @@ print_return_code(grn_ctx *ctx, grn_rc rc, grn_obj *head, grn_obj *body, grn_obj
static void
s_output(grn_ctx *ctx, int flags, void *arg)
{
- if (ctx && ctx->impl) {
+ if (ctx && ctx->impl && (flags & GRN_CTX_TAIL)) {
grn_obj *buf = ctx->impl->outbuf;
- if (GRN_TEXT_LEN(buf)) {
+ if (GRN_TEXT_LEN(buf) || ctx->rc) {
FILE * stream = (FILE *) arg;
grn_obj head, foot;
GRN_TEXT_INIT(&head, 0);
@@ -394,7 +394,7 @@ do_alone(int argc, char **argv)
} while (0)
static int
-g_output(grn_ctx *ctx)
+c_output(grn_ctx *ctx)
{
int flags;
char *str;
@@ -407,7 +407,7 @@ g_output(grn_ctx *ctx)
return -1;
}
*/
- if (str_len) {
+ if (str_len || ctx->rc) {
grn_obj head, body, foot;
GRN_TEXT_INIT(&head, 0);
GRN_TEXT_INIT(&body, GRN_OBJ_DO_SHALLOW_COPY);
@@ -449,7 +449,7 @@ g_client(int argc, char **argv)
grn_ctx_send(ctx, buf, size, 0);
rc = ctx->rc;
if (rc) { break; }
- if (g_output(ctx)) { goto exit; }
+ if (c_output(ctx)) { goto exit; }
if (ctx->stat == GRN_CTX_QUIT) { break; }
}
} else {
@@ -458,7 +458,7 @@ g_client(int argc, char **argv)
grn_obj_unlink(ctx, &text);
} else {
rc = grn_ctx_sendv(ctx, argc, argv, 0);
- if (g_output(ctx)) { goto exit; }
+ if (c_output(ctx)) { goto exit; }
}
} else {
fprintf(stderr, "grn_ctx_connect failed (%s:%d)\n", hostname, port);
@@ -489,6 +489,7 @@ h_output(grn_ctx *ctx, int flags, void *arg)
grn_obj *body = &hc->body;
const char *mime_type = ctx->impl->mime_type;
grn_obj head, foot, *outbuf = ctx->impl->outbuf;
+ if (!(flags & GRN_CTX_TAIL)) { return; }
GRN_TEXT_INIT(&head, 0);
GRN_TEXT_INIT(&foot, 0);
if (!expr_rc) {
@@ -1412,7 +1413,7 @@ dispatcher(grn_ctx *ctx, grn_edge *edge)
}
static void
-output(grn_ctx *ctx, int flags, void *arg)
+g_output(grn_ctx *ctx, int flags, void *arg)
{
grn_edge *edge = arg;
grn_com *com = edge->com;
@@ -1454,7 +1455,7 @@ g_handler(grn_ctx *ctx, grn_obj *msg)
GRN_COM_QUEUE_INIT(&edge->recv_new);
GRN_COM_QUEUE_INIT(&edge->send_old);
grn_ctx_use(&edge->ctx, (grn_obj *)com->ev->opaque);
- grn_ctx_recv_handler_set(&edge->ctx, output, edge);
+ grn_ctx_recv_handler_set(&edge->ctx, g_output, edge);
com->opaque = edge;
grn_obj_close(&edge->ctx, edge->ctx.impl->outbuf);
edge->ctx.impl->outbuf = grn_msg_open(&edge->ctx, com, &edge->send_old);