[Groonga-commit] groonga/groonga at df10c74 [master] Support saving IDs of token filters into spec

Back to archive index

Kouhei Sutou null+****@clear*****
Wed Oct 1 21:20:44 JST 2014


Kouhei Sutou	2014-10-01 21:20:44 +0900 (Wed, 01 Oct 2014)

  New Revision: df10c74b9a2a30aedd48b42a9f76272e79db01db
  https://github.com/groonga/groonga/commit/df10c74b9a2a30aedd48b42a9f76272e79db01db

  Merged fec9865: Merge pull request #209 from groonga/support-token-filters

  Message:
    Support saving IDs of token filters into spec

  Modified files:
    lib/db.c

  Modified: lib/db.c (+70 -0)
===================================================================
--- lib/db.c    2014-10-01 21:19:59 +0900 (64e654c)
+++ lib/db.c    2014-10-01 21:20:44 +0900 (3860ecc)
@@ -6528,6 +6528,23 @@ grn_hook_unpack(grn_ctx *ctx, grn_db_obj *obj, const char *buf, uint32_t buf_siz
   return GRN_SUCCESS;
 }
 
+static void
+grn_token_filters_pack(grn_ctx *ctx,
+                       grn_obj *token_filters,
+                       grn_obj *buffer)
+{
+  unsigned int i, n_token_filters;
+
+  n_token_filters = GRN_BULK_VSIZE(token_filters) / sizeof(grn_obj *);
+  for (i = 0; i < n_token_filters; i++) {
+    grn_obj *token_filter = GRN_PTR_VALUE_AT(token_filters, i);
+    grn_id token_filter_id;
+
+    token_filter_id = grn_obj_id(ctx, token_filter);
+    GRN_RECORD_PUT(ctx, buffer, token_filter_id);
+  }
+}
+
 void
 grn_obj_spec_save(grn_ctx *ctx, grn_db_obj *obj)
 {
@@ -6552,6 +6569,18 @@ grn_obj_spec_save(grn_ctx *ctx, grn_db_obj *obj)
   grn_hook_pack(ctx, obj, b);
   grn_vector_delimit(ctx, &v, 0, 0);
   switch (obj->header.type) {
+  case GRN_TABLE_HASH_KEY :
+    grn_token_filters_pack(ctx, &(((grn_hash *)obj)->token_filters), b);
+    grn_vector_delimit(ctx, &v, 0, 0);
+    break;
+  case GRN_TABLE_PAT_KEY :
+    grn_token_filters_pack(ctx, &(((grn_pat *)obj)->token_filters), b);
+    grn_vector_delimit(ctx, &v, 0, 0);
+    break;
+  case GRN_TABLE_DAT_KEY :
+    grn_token_filters_pack(ctx, &(((grn_dat *)obj)->token_filters), b);
+    grn_vector_delimit(ctx, &v, 0, 0);
+    break;
   case GRN_EXPR :
     grn_expr_pack(ctx, b, (grn_obj *)obj);
     grn_vector_delimit(ctx, &v, 0, 0);
@@ -7715,6 +7744,7 @@ grn_db_obj_init(grn_ctx *ctx, grn_obj *db, grn_id id, grn_db_obj *obj)
 #define SERIALIZED_SPEC_INDEX_PATH   1
 #define SERIALIZED_SPEC_INDEX_SOURCE 2
 #define SERIALIZED_SPEC_INDEX_HOOK   3
+#define SERIALIZED_SPEC_INDEX_TOKEN_FILTERS 4
 #define SERIALIZED_SPEC_INDEX_EXPR   4
 
 #define GET_PATH(spec,buffer,s,id) do {\
@@ -7763,6 +7793,40 @@ grn_db_obj_init(grn_ctx *ctx, grn_obj *db, grn_id id, grn_db_obj *obj)
   }\
 } while (0)
 
+static void
+grn_token_filters_unpack(grn_ctx *ctx,
+                         grn_obj *token_filters,
+                         grn_obj *spec_vector)
+{
+  grn_id *token_filter_ids;
+  unsigned int element_size;
+  unsigned int i, n_token_filter_ids;
+
+  if (grn_vector_size(ctx, spec_vector) < SERIALIZED_SPEC_INDEX_TOKEN_FILTERS) {
+    return;
+  }
+
+  element_size = grn_vector_get_element(ctx,
+                                        spec_vector,
+                                        SERIALIZED_SPEC_INDEX_TOKEN_FILTERS,
+                                        (const char **)(&token_filter_ids),
+                                        NULL,
+                                        NULL);
+  n_token_filter_ids = element_size / sizeof(grn_id);
+  for (i = 0; i < n_token_filter_ids; i++) {
+    grn_id token_filter_id = token_filter_ids[i];
+    grn_obj *token_filter;
+
+    token_filter = grn_ctx_at(ctx, token_filter_id);
+    if (!token_filter) {
+      ERR(GRN_INVALID_ARGUMENT,
+          "nonexistent token filter ID: %d\n", token_filter_id);
+      return;
+    }
+    GRN_PTR_PUT(ctx, token_filters, token_filter);
+  }
+}
+
 grn_obj *
 grn_ctx_at(grn_ctx *ctx, grn_id id)
 {
@@ -7838,27 +7902,33 @@ grn_ctx_at(grn_ctx *ctx, grn_id id)
                   GET_PATH(spec, buffer, s, id);
                   vp->ptr = (grn_obj *)grn_hash_open(ctx, buffer);
                   if (vp->ptr) {
+                    grn_hash *hash = (grn_hash *)(vp->ptr);
                     grn_obj_flags flags = vp->ptr->header.flags;
                     UNPACK_INFO();
                     vp->ptr->header.flags = flags;
+                    grn_token_filters_unpack(ctx, &(hash->token_filters), &v);
                   }
                   break;
                 case GRN_TABLE_PAT_KEY :
                   GET_PATH(spec, buffer, s, id);
                   vp->ptr = (grn_obj *)grn_pat_open(ctx, buffer);
                   if (vp->ptr) {
+                    grn_pat *pat = (grn_pat *)(vp->ptr);
                     grn_obj_flags flags = vp->ptr->header.flags;
                     UNPACK_INFO();
                     vp->ptr->header.flags = flags;
+                    grn_token_filters_unpack(ctx, &(pat->token_filters), &v);
                   }
                   break;
                 case GRN_TABLE_DAT_KEY :
                   GET_PATH(spec, buffer, s, id);
                   vp->ptr = (grn_obj *)grn_dat_open(ctx, buffer);
                   if (vp->ptr) {
+                    grn_dat *dat = (grn_dat *)(vp->ptr);
                     grn_obj_flags flags = vp->ptr->header.flags;
                     UNPACK_INFO();
                     vp->ptr->header.flags = flags;
+                    grn_token_filters_unpack(ctx, &(dat->token_filters), &v);
                   }
                   break;
                 case GRN_TABLE_NO_KEY :
-------------- next part --------------
HTML����������������������������...
Télécharger 



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