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