[Groonga-commit] groonga/groonga at 7a033fa [master] Add grn_ctx_get_all_tables()

Back to archive index

Kouhei Sutou null+****@clear*****
Sun Feb 15 20:49:10 JST 2015


Kouhei Sutou	2015-02-15 20:49:10 +0900 (Sun, 15 Feb 2015)

  New Revision: 7a033faea8d37d4852ff55d2d3c01846cf0fe724
  https://github.com/groonga/groonga/commit/7a033faea8d37d4852ff55d2d3c01846cf0fe724

  Message:
    Add grn_ctx_get_all_tables()
    
    Suggested by Masatoshi Teruya. Thanks!!!

  Modified files:
    doc/source/reference/api/grn_ctx.rst
    include/groonga/groonga.h
    lib/db.c
    lib/proc.c

  Modified: doc/source/reference/api/grn_ctx.rst (+41 -0)
===================================================================
--- doc/source/reference/api/grn_ctx.rst    2015-02-14 21:30:38 +0900 (9705408)
+++ doc/source/reference/api/grn_ctx.rst    2015-02-15 20:49:10 +0900 (e389232)
@@ -120,6 +120,47 @@ Reference
 
    :param id: 検索しようとするオブジェクトのidを指定します。
 
+.. c:function:: grn_rc grn_ctx_get_all_tables(grn_ctx *ctx, grn_obj *tables_buffer)
+
+   It pushes all tables in the database of ``ctx`` into
+   ``tables_buffer``. ``tables_buffer`` should be initialized as
+   ``GRN_PVECTOR``. You can use ``GRN_PTR_INIT()`` with
+   ``GRN_OBJ_VECTOR`` flags to initialize ``tables_buffer``.
+
+   Here is an example:
+
+   .. code-block :: c
+
+      grn_rc rc;
+      grn_obj tables;
+      int i;
+      int n_tables;
+
+      GRN_PTR_INIT(&tables, GRN_OBJ_VECTOR, GRN_ID_NIL);
+      rc = grn_ctx_get_all_tables(ctx, &tables);
+      if (rc != GRN_SUCCESS) {
+        GRN_OBJ_FIN(ctx, &tables);
+        /* Handle error. */
+      }
+
+      n_tables = GRN_BULK_VSIZE(&tables) / sizeof(grn_obj *);
+      for (i = 0; i < n_tables; i++) {
+        grn_obj *table = GRN_PTR_VALUE_AT(&tables, i);
+        /* Use table. */
+      }
+
+      /* Free resources. */
+      for (i = 0; i < n_tables; i++) {
+        grn_obj *table = GRN_PTR_VALUE_AT(&tables, i);
+        grn_obj_unlink(ctx, table);
+      }
+      GRN_OBJ_FIN(ctx, &tables);
+
+
+   :param ctx: The context object.
+   :param table_buffer: The output buffer to store tables.
+   :return: ``GRN_SUCCESS`` on success, not ``GRN_SUCCESS`` on error.
+
 .. c:function:: grn_content_type grn_ctx_get_output_type(grn_ctx *ctx)
 
    Gets the current output type of the context.

  Modified: include/groonga/groonga.h (+1 -0)
===================================================================
--- include/groonga/groonga.h    2015-02-14 21:30:38 +0900 (98e7c1f)
+++ include/groonga/groonga.h    2015-02-15 20:49:10 +0900 (6a03747)
@@ -431,6 +431,7 @@ GRN_API grn_rc grn_db_recover(grn_ctx *ctx, grn_obj *db);
 GRN_API grn_rc grn_ctx_use(grn_ctx *ctx, grn_obj *db);
 GRN_API grn_obj *grn_ctx_db(grn_ctx *ctx);
 GRN_API grn_obj *grn_ctx_get(grn_ctx *ctx, const char *name, int name_size);
+GRN_API grn_rc grn_ctx_get_all_tables(grn_ctx *ctx, grn_obj *tables_buffer);
 
 typedef enum {
   GRN_DB_VOID = 0,

  Modified: lib/db.c (+46 -0)
===================================================================
--- lib/db.c    2015-02-14 21:30:38 +0900 (d99dfff)
+++ lib/db.c    2015-02-15 20:49:10 +0900 (0c31909)
@@ -12218,3 +12218,49 @@ grn_db_recover(grn_ctx *ctx, grn_obj *db)
 
   GRN_API_RETURN(ctx->rc);
 }
+
+grn_rc
+grn_ctx_get_all_tables(grn_ctx *ctx, grn_obj *tables_buffer)
+{
+  grn_obj *db;
+  grn_table_cursor *cursor;
+  grn_id id;
+
+  GRN_API_ENTER;
+
+  db = ctx->impl->db;
+  if (!db) {
+    ERR(GRN_INVALID_ARGUMENT, "DB isn't associated");
+    GRN_API_RETURN(ctx->rc);
+  }
+
+  cursor = grn_table_cursor_open(ctx, db, NULL, 0, NULL, 0, 0, -1, 0);
+  if (!cursor) {
+    GRN_API_RETURN(ctx->rc);
+  }
+
+  while ((id = grn_table_cursor_next(ctx, cursor)) != GRN_ID_NIL) {
+    grn_obj *object;
+
+    if ((object = grn_ctx_at(ctx, id))) {
+      switch (object->header.type) {
+      case GRN_TABLE_NO_KEY :
+      case GRN_TABLE_HASH_KEY :
+      case GRN_TABLE_PAT_KEY :
+      case GRN_TABLE_DAT_KEY :
+        GRN_PTR_PUT(ctx, tables_buffer, object);
+        break;
+      default:
+        grn_obj_unlink(ctx, object);
+        break;
+      }
+    } else {
+      if (ctx->rc != GRN_SUCCESS) {
+        ERRCLR(ctx);
+      }
+    }
+  }
+  grn_table_cursor_close(ctx, cursor);
+
+  GRN_API_RETURN(ctx->rc);
+}

  Modified: lib/proc.c (+2 -36)
===================================================================
--- lib/proc.c    2015-02-14 21:30:38 +0900 (64f3288)
+++ lib/proc.c    2015-02-15 20:49:10 +0900 (a9cdd19)
@@ -2224,20 +2224,6 @@ proc_column_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_da
   return NULL;
 }
 
-static grn_bool
-is_table(grn_obj *obj)
-{
-  switch (obj->header.type) {
-  case GRN_TABLE_HASH_KEY:
-  case GRN_TABLE_PAT_KEY:
-  case GRN_TABLE_DAT_KEY:
-  case GRN_TABLE_NO_KEY:
-    return GRN_TRUE;
-  default:
-    return GRN_FALSE;
-  }
-}
-
 static int
 output_table_info(grn_ctx *ctx, grn_obj *table)
 {
@@ -2272,7 +2258,6 @@ output_table_info(grn_ctx *ctx, grn_obj *table)
 static grn_obj *
 proc_table_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
-  grn_table_cursor *cur;
   grn_obj tables;
   int n_top_level_elements;
   int n_elements_for_header = 1;
@@ -2280,26 +2265,7 @@ proc_table_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_dat
   int i;
 
   GRN_PTR_INIT(&tables, GRN_OBJ_VECTOR, GRN_ID_NIL);
-
-  if ((cur = grn_table_cursor_open(ctx, ctx->impl->db, NULL, 0, NULL, 0, 0, -1, 0))) {
-    grn_id id;
-    while ((id = grn_table_cursor_next(ctx, cur)) != GRN_ID_NIL) {
-      grn_obj *object;
-      if ((object = grn_ctx_at(ctx, id))) {
-        if (is_table(object)) {
-          GRN_PTR_PUT(ctx, &tables, object);
-        } else {
-          grn_obj_unlink(ctx, object);
-        }
-      } else {
-        if (ctx->rc != GRN_SUCCESS) {
-          ERRCLR(ctx);
-        }
-      }
-    }
-    grn_table_cursor_close(ctx, cur);
-  }
-
+  grn_ctx_get_all_tables(ctx, &tables);
   n_tables = GRN_BULK_VSIZE(&tables) / sizeof(grn_obj *);
   n_top_level_elements = n_elements_for_header + n_tables;
   GRN_OUTPUT_ARRAY_OPEN("TABLE_LIST", n_top_level_elements);
@@ -2340,7 +2306,7 @@ proc_table_list(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_dat
   GRN_OUTPUT_ARRAY_CLOSE();
 
   for (i = 0; i < n_tables; i++) {
-    grn_obj *table = ((grn_obj **)GRN_BULK_HEAD(&tables))[i];
+    grn_obj *table = GRN_PTR_VALUE_AT(&tables, i);
     output_table_info(ctx, table);
     grn_obj_unlink(ctx, table);
   }
-------------- next part --------------
HTML����������������������������...
Download 



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