[Groonga-commit] groonga/groonga [master] snip: use grn_obj mechanism

Back to archive index

null+****@clear***** null+****@clear*****
2012年 3月 23日 (金) 17:27:42 JST


Kouhei Sutou	2012-03-23 17:27:42 +0900 (Fri, 23 Mar 2012)

  New Revision: 3af4a239f9ea34a1d0916623e46c496eca05854b

  Log:
    snip: use grn_obj mechanism
    
    fixes #1054

  Modified files:
    include/groonga.h
    lib/db.c
    lib/db.h
    lib/snip.c
    lib/snip.h
    test/unit/util/test-snip.c

  Modified: include/groonga.h (+6 -0)
===================================================================
--- include/groonga.h    2012-03-23 16:59:05 +0900 (5ddff92)
+++ include/groonga.h    2012-03-23 17:27:42 +0900 (59eeea3)
@@ -1964,6 +1964,8 @@ GRN_API grn_posting *grn_geo_cursor_next(grn_ctx *ctx, grn_obj *cursor);
 #define GRN_QUERY_COLUMN ':'
 #endif /* GRN_QUERY_COLUMN */
 
+/* grn_snip should be removed.
+ * TODO: 3.0 */
 typedef struct _grn_snip grn_snip;
 typedef struct _grn_snip_mapping grn_snip_mapping;
 
@@ -1975,11 +1977,15 @@ struct _grn_snip_mapping {
 #define GRN_SNIP_COPY_TAG              (0x01<<1)
 #define GRN_SNIP_SKIP_LEADING_SPACES   (0x01<<2)
 
+/* grn_snip_open() should return grn_obj * instead.
+ * TODO: 3.0 */
 GRN_API grn_snip *grn_snip_open(grn_ctx *ctx, int flags, unsigned int width,
                                 unsigned int max_results,
                                 const char *defaultopentag, unsigned int defaultopentag_len,
                                 const char *defaultclosetag, unsigned int defaultclosetag_len,
                                 grn_snip_mapping *mapping);
+/* grn_snip_close() should be removed. Use grn_obj_close() instead.
+ * TODO: 3.0 */
 GRN_API grn_rc grn_snip_close(grn_ctx *ctx, grn_snip *snip);
 GRN_API grn_rc grn_snip_add_cond(grn_ctx *ctx, grn_snip *snip,
                                  const char *keyword, unsigned int keyword_len,

  Modified: lib/db.c (+4 -0)
===================================================================
--- lib/db.c    2012-03-23 16:59:05 +0900 (9467bef)
+++ lib/db.c    2012-03-23 17:27:42 +0900 (3792f9a)
@@ -25,6 +25,7 @@
 #include "proc.h"
 #include "plugin_in.h"
 #include "geo.h"
+#include "snip.h"
 #include "util.h"
 #include <string.h>
 #include <float.h>
@@ -6918,6 +6919,9 @@ grn_obj_close(grn_ctx *ctx, grn_obj *obj)
     case GRN_ACCESSOR_VIEW :
       rc = grn_accessor_view_close(ctx, obj);
       break;
+    case GRN_SNIP :
+      rc = grn_snip_close_real(ctx, (grn_snip *)obj);
+      break;
     case GRN_CURSOR_TABLE_PAT_KEY :
       grn_pat_cursor_close(ctx, (grn_pat_cursor *)obj);
       break;

  Modified: lib/db.h (+3 -2)
===================================================================
--- lib/db.h    2012-03-23 16:59:05 +0900 (fd4c4bf)
+++ lib/db.h    2012-03-23 17:27:42 +0900 (845c22f)
@@ -144,8 +144,9 @@ typedef struct {
 
 #define GRN_DB_OBJP(obj) \
   (obj &&\
-   (GRN_CURSOR_TABLE_HASH_KEY <= ((grn_db_obj *)obj)->header.type) &&\
-   (((grn_db_obj *)obj)->header.type <= GRN_COLUMN_INDEX))
+   ((GRN_SNIP == ((grn_db_obj *)obj)->header.type) ||\
+    ((GRN_CURSOR_TABLE_HASH_KEY <= ((grn_db_obj *)obj)->header.type) &&\
+     (((grn_db_obj *)obj)->header.type <= GRN_COLUMN_INDEX))))
 
 #define GRN_OBJ_TABLEP(obj) \
   (obj &&\

  Modified: lib/snip.c (+24 -1)
===================================================================
--- lib/snip.c    2012-03-23 16:59:05 +0900 (cfe958a)
+++ lib/snip.c    2012-03-23 17:27:42 +0900 (8b51933)
@@ -471,6 +471,17 @@ grn_snip_open(grn_ctx *ctx, int flags, unsigned int width,
   ret->tag_count = 0;
   ret->snip_count = 0;
 
+  GRN_DB_OBJ_SET_TYPE(ret, GRN_SNIP);
+  {
+    grn_obj *db;
+    grn_id id;
+    db = grn_ctx_db(ctx);
+    id = grn_obj_register(ctx, db, NULL, 0);
+    DB_OBJ(ret)->header.domain = GRN_ID_NIL;
+    DB_OBJ(ret)->range = GRN_ID_NIL;
+    grn_db_obj_init(ctx, db, id, DB_OBJ(ret));
+  }
+
   GRN_API_RETURN(ret);
 }
 
@@ -491,8 +502,10 @@ exec_clean(grn_ctx *ctx, grn_snip *snip)
   return GRN_SUCCESS;
 }
 
+/* It should be renamed to grn_snip_close() and marked as internal.
+ * TODO: 3.0 */
 grn_rc
-grn_snip_close(grn_ctx *ctx, grn_snip *snip)
+grn_snip_close_real(grn_ctx *ctx, grn_snip *snip)
 {
   snip_cond *cond, *cond_end;
   if (!snip) { return GRN_INVALID_ARGUMENT; }
@@ -519,6 +532,16 @@ grn_snip_close(grn_ctx *ctx, grn_snip *snip)
   GRN_API_RETURN(GRN_SUCCESS);
 }
 
+/* Just for backward compatibility. It should be replaced with
+ * grn_snip_close_real() when groonga 3.0.
+ * TODO: 3.0 */
+grn_rc
+grn_snip_close(grn_ctx *ctx, grn_snip *snip)
+{
+  return grn_obj_close(ctx, (grn_obj *)snip);
+}
+
+
 grn_rc
 grn_snip_exec(grn_ctx *ctx, grn_snip *snip, const char *string, unsigned int string_len,
               unsigned int *nresults, unsigned int *max_tagged_len)

  Modified: lib/snip.h (+4 -0)
===================================================================
--- lib/snip.h    2012-03-23 16:59:05 +0900 (4ad99b9)
+++ lib/snip.h    2012-03-23 17:27:42 +0900 (f328af4)
@@ -25,6 +25,8 @@
 #include "str.h"
 #endif /* GRN_STR_H */
 
+#include "db.h"
+
 #define ASIZE                   256U
 #define MAX_SNIP_TAG_COUNT      512U
 #define MAX_SNIP_COND_COUNT     32U
@@ -87,6 +89,7 @@ typedef struct
 
 struct _grn_snip
 {
+  grn_db_obj obj;
   grn_encoding encoding;
   int flags;
   size_t width;
@@ -113,6 +116,7 @@ struct _grn_snip
   size_t max_tagged_len;
 };
 
+grn_rc grn_snip_close_real(grn_ctx *ctx, grn_snip *snip);
 grn_rc grn_snip_cond_init(grn_ctx *ctx, snip_cond *sc, const char *keyword, unsigned int keyword_len,
                           grn_encoding enc, int flags);
 void grn_snip_cond_reinit(snip_cond *cond);

  Modified: test/unit/util/test-snip.c (+5 -5)
===================================================================
--- test/unit/util/test-snip.c    2012-03-23 16:59:05 +0900 (925431e)
+++ test/unit/util/test-snip.c    2012-03-23 17:27:42 +0900 (d0748a1)
@@ -1,6 +1,6 @@
 /* -*- c-basic-offset: 2; coding: utf-8 -*- */
 /*
-  Copyright (C) 2008-2009  Kouhei Sutou <kou****@cozmi*****>
+  Copyright (C) 2008-2012  Kouhei Sutou <kou****@clear*****>
 
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
@@ -217,7 +217,7 @@ void
 cut_teardown(void)
 {
   if (snip) {
-    grn_snip_close(&context, snip);
+    grn_obj_close(&context, (grn_obj *)snip);
   }
   if (keyword) {
     g_free(keyword);
@@ -240,7 +240,7 @@ static grn_snip *
 open_snip(void)
 {
   if (snip) {
-    grn_snip_close(&context, snip);
+    grn_obj_close(&context, (grn_obj *)snip);
   }
   GRN_CTX_SET_ENCODING(&context, default_encoding);
   snip = grn_snip_open(&context, default_flags,
@@ -460,7 +460,7 @@ test_exec_with_normalize(void)
                                 &n_results, &max_tagged_len));
   cut_assert_equal_uint(0, n_results);
 
-  grn_snip_close(&context, snip);
+  grn_obj_close(&context, (grn_obj *)snip);
   snip = NULL;
 
 
@@ -747,7 +747,7 @@ test_html_mapping_escape(void)
 void
 test_close_with_null(void)
 {
-  grn_test_assert_equal_rc(GRN_INVALID_ARGUMENT, grn_snip_close(&context, NULL));
+  grn_test_assert_equal_rc(GRN_INVALID_ARGUMENT, grn_obj_close(&context, NULL));
 }
 
 void




Groonga-commit メーリングリストの案内
Back to archive index