[Groonga-commit] groonga/groonga at 3434261 [master] load: introduce grn_load_input to reduce function call arguments

Back to archive index

Kouhei Sutou null+****@clear*****
Fri Feb 3 16:27:39 JST 2017


Kouhei Sutou	2017-02-03 16:27:39 +0900 (Fri, 03 Feb 2017)

  New Revision: 3434261b95a95f30626d31d1e06055931c2139bf
  https://github.com/groonga/groonga/commit/3434261b95a95f30626d31d1e06055931c2139bf

  Message:
    load: introduce grn_load_input to reduce function call arguments

  Modified files:
    lib/grn_load.h
    lib/load.c
    lib/proc.c

  Modified: lib/grn_load.h (+13 -8)
===================================================================
--- lib/grn_load.h    2017-02-03 16:12:58 +0900 (125e1dd)
+++ lib/grn_load.h    2017-02-03 16:27:39 +0900 (1f0331d)
@@ -19,6 +19,7 @@
 #pragma once
 
 #include "grn.h"
+#include "grn_raw_string.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -27,14 +28,18 @@ extern "C" {
 #define GRN_JSON_LOAD_OPEN_BRACKET 0x40000000
 #define GRN_JSON_LOAD_OPEN_BRACE   0x40000001
 
-GRN_API 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,
-                       grn_obj *output_ids,
-                       uint32_t emit_level);
+typedef struct grn_load_input_ {
+  grn_content_type type;
+  grn_raw_string table;
+  grn_raw_string columns;
+  grn_raw_string values;
+  grn_raw_string if_exists;
+  grn_raw_string each;
+  grn_bool output_ids;
+  uint32_t emit_level;
+} grn_load_input;
+
+void grn_load_internal(grn_ctx *ctx, grn_load_input *input);
 
 #ifdef __cplusplus
 }

  Modified: lib/load.c (+48 -34)
===================================================================
--- lib/load.c    2017-02-03 16:12:58 +0900 (919a1f0)
+++ lib/load.c    2017-02-03 16:27:39 +0900 (08a0896)
@@ -20,7 +20,6 @@
 #include "grn_ctx_impl.h"
 #include "grn_db.h"
 #include "grn_util.h"
-#include "grn_proc.h"
 
 static grn_obj *
 values_add(grn_ctx *ctx, grn_loader *loader)
@@ -1046,39 +1045,41 @@ grn_loader_parse_columns(grn_ctx *ctx, grn_loader *loader,
 static grn_com_addr *addr;
 
 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,
-          grn_obj *output_ids,
-          uint32_t emit_level)
+grn_load_internal(grn_ctx *ctx, grn_load_input *input)
 {
   grn_loader *loader = &ctx->impl->loader;
-  loader->emit_level = emit_level;
+
+  loader->emit_level = input->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);
     /* build msg */
     grn_edge_dispatch(ctx, edge, msg);
   }
-  if (table && table_len) {
+  if (input->table.length > 0) {
     grn_ctx_loader_clear(ctx);
-    loader->input_type = input_type;
-    if (grn_db_check_name(ctx, table, table_len)) {
-      GRN_DB_CHECK_NAME_ERR("[table][load]", table, table_len);
+    loader->input_type = input->type;
+    if (grn_db_check_name(ctx, input->table.value, input->table.length)) {
+      GRN_DB_CHECK_NAME_ERR("[table][load]",
+                            input->table.value,
+                            (int)(input->table.length));
       loader->stat = GRN_LOADER_END;
       return;
     }
-    loader->table = grn_ctx_get(ctx, table, table_len);
+    loader->table = grn_ctx_get(ctx, input->table.value, input->table.length);
     if (!loader->table) {
-      ERR(GRN_INVALID_ARGUMENT, "nonexistent table: <%.*s>", table_len, table);
+      ERR(GRN_INVALID_ARGUMENT,
+          "nonexistent table: <%.*s>",
+          (int)(input->table.length),
+          input->table.value);
       loader->stat = GRN_LOADER_END;
       return;
     }
-    if (columns && columns_len) {
-      grn_rc rc = grn_loader_parse_columns(ctx, loader, columns, columns_len);
+    if (input->columns.length > 0) {
+      grn_rc rc = grn_loader_parse_columns(ctx,
+                                           loader,
+                                           input->columns.value,
+                                           input->columns.length);
       if (rc != GRN_SUCCESS) {
         loader->columns_status = GRN_LOADER_COLUMNS_BROKEN;
         loader->stat = GRN_LOADER_END;
@@ -1086,39 +1087,40 @@ grn_load_(grn_ctx *ctx, grn_content_type input_type,
       }
       loader->columns_status = GRN_LOADER_COLUMNS_SET;
     }
-    if (ifexists && ifexists_len) {
+    if (input->if_exists.length > 0) {
       grn_obj *v;
       GRN_EXPR_CREATE_FOR_QUERY(ctx, loader->table, loader->ifexists, v);
       if (loader->ifexists && v) {
-        grn_expr_parse(ctx, loader->ifexists, ifexists, ifexists_len,
+        grn_expr_parse(ctx,
+                       loader->ifexists,
+                       input->if_exists.value,
+                       input->if_exists.length,
                        NULL, GRN_OP_EQUAL, GRN_OP_AND,
                        GRN_EXPR_SYNTAX_SCRIPT|GRN_EXPR_ALLOW_UPDATE);
       }
     }
-    if (each && each_len) {
+    if (input->each.length > 0) {
       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,
+        grn_expr_parse(ctx, loader->each,
+                       input->each.value,
+                       input->each.length,
                        NULL, GRN_OP_EQUAL, GRN_OP_AND,
                        GRN_EXPR_SYNTAX_SCRIPT|GRN_EXPR_ALLOW_UPDATE);
       }
     }
-    if (output_ids && GRN_TEXT_LEN(output_ids) > 0) {
-      loader->output_ids =
-        grn_proc_option_value_bool(ctx, output_ids, GRN_FALSE);
-    }
+    loader->output_ids = input->output_ids;
   } else {
     if (!loader->table) {
       ERR(GRN_INVALID_ARGUMENT, "mandatory \"table\" parameter is absent");
       loader->stat = GRN_LOADER_END;
       return;
     }
-    input_type = loader->input_type;
   }
-  switch (input_type) {
+  switch (loader->input_type) {
   case GRN_CONTENT_JSON :
-    json_read(ctx, loader, values, values_len);
+    json_read(ctx, loader, input->values.value, input->values.length);
     break;
   case GRN_CONTENT_NONE :
   case GRN_CONTENT_TSV :
@@ -1145,10 +1147,22 @@ grn_load(grn_ctx *ctx, grn_content_type input_type,
     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,
-            NULL,
-            1);
+  {
+    grn_load_input input;
+    input.type = input_type;
+    input.table.value = table;
+    input.table.length = table_len;
+    input.columns.value = columns;
+    input.columns.length = columns_len;
+    input.values.value = values;
+    input.values.length = values_len;
+    input.if_exists.value = ifexists;
+    input.if_exists.length = ifexists_len;
+    input.each.value = each;
+    input.each.length = each_len;
+    input.output_ids = GRN_FALSE;
+    input.emit_level = 1;
+    grn_load_internal(ctx, &input);
+  }
   GRN_API_RETURN(ctx->rc);
 }

  Modified: lib/proc.c (+31 -9)
===================================================================
--- lib/proc.c    2017-02-03 16:12:58 +0900 (bb3695e)
+++ lib/proc.c    2017-02-03 16:27:39 +0900 (7d36b4f)
@@ -1,6 +1,6 @@
 /* -*- c-basic-offset: 2 -*- */
 /*
-  Copyright(C) 2009-2016 Brazil
+  Copyright(C) 2009-2017 Brazil
 
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
@@ -133,14 +133,36 @@ exit :
 static grn_obj *
 proc_load(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
-  grn_load_(ctx, grn_get_ctype(VAR(4)),
-            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(5)), GRN_TEXT_LEN(VAR(5)),
-            VAR(6),
-            1);
+  grn_load_input input;
+
+  input.type = grn_plugin_proc_get_var_content_type(ctx,
+                                                    user_data,
+                                                    "input_type",
+                                                    -1,
+                                                    GRN_CONTENT_JSON);
+#define INIT_STRING_ARGUMENT(member_name, arg_name)             \
+  input.member_name.value =                                     \
+    grn_plugin_proc_get_var_string(ctx,                         \
+                                   user_data,                   \
+                                   arg_name,                    \
+                                   -1,                          \
+                                   &(input.member_name.length))
+
+  INIT_STRING_ARGUMENT(table, "table");
+  INIT_STRING_ARGUMENT(columns, "columns");
+  INIT_STRING_ARGUMENT(values, "values");
+  INIT_STRING_ARGUMENT(if_exists, "ifexists");
+  INIT_STRING_ARGUMENT(each, "each");
+
+#undef INIT_STRING_ARGUMENT
+
+  input.output_ids = grn_plugin_proc_get_var_bool(ctx,
+                                                  user_data,
+                                                  "output_ids", -1,
+                                                  GRN_FALSE);
+  input.emit_level = 1;
+
+  grn_load_internal(ctx, &input);
   if (ctx->rc == GRN_CANCEL) {
     ctx->impl->loader.stat = GRN_LOADER_END;
     ctx->impl->loader.rc = GRN_SUCCESS;
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index