[Groonga-commit] groonga/groonga at d748a3f [master] grn_ts: use grn_ja_reader_ref/unref()

Back to archive index

Susumu Yata null+****@clear*****
Thu Dec 10 17:21:45 JST 2015


Susumu Yata	2015-12-10 17:21:45 +0900 (Thu, 10 Dec 2015)

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

  Message:
    grn_ts: use grn_ja_reader_ref/unref()
    
    GitHub: #446

  Modified files:
    lib/ts/ts_expr_node.c

  Modified: lib/ts/ts_expr_node.c (+38 -15)
===================================================================
--- lib/ts/ts_expr_node.c    2015-12-10 17:21:27 +0900 (4934715)
+++ lib/ts/ts_expr_node.c    2015-12-10 17:21:45 +0900 (b243f54)
@@ -2320,6 +2320,7 @@ typedef struct {
   grn_obj *column;
   grn_ts_buf buf;
   grn_ts_buf body_buf;
+  grn_ja_reader *reader;
 } grn_ts_expr_column_node;
 
 /* grn_ts_expr_column_node_init() initializes a node. */
@@ -2331,12 +2332,16 @@ grn_ts_expr_column_node_init(grn_ctx *ctx, grn_ts_expr_column_node *node)
   node->column = NULL;
   grn_ts_buf_init(ctx, &node->buf);
   grn_ts_buf_init(ctx, &node->body_buf);
+  node->reader = NULL;
 }
 
 /* grn_ts_expr_column_node_fin() finalizes a node. */
 static void
 grn_ts_expr_column_node_fin(grn_ctx *ctx, grn_ts_expr_column_node *node)
 {
+  if (node->reader) {
+    grn_ja_reader_close(ctx, node->reader);
+  }
   grn_ts_buf_fin(ctx, &node->body_buf);
   grn_ts_buf_fin(ctx, &node->buf);
   if (node->column) {
@@ -2456,33 +2461,51 @@ grn_ts_expr_column_node_evaluate_scalar(grn_ctx *ctx,
       char *buf_ptr;
       grn_rc rc;
       grn_ts_text *out_ptr = (grn_ts_text *)out;
-      grn_ja_reader reader;
-      rc = grn_ja_reader_init(ctx, &reader, (grn_ja *)node->column);
-      if (rc != GRN_SUCCESS) {
-        GRN_TS_ERR_RETURN(rc, "grn_ja_reader_init failed");
+      if (!node->reader) {
+        rc = grn_ja_reader_open(ctx, (grn_ja *)node->column, &node->reader);
+        if (rc != GRN_SUCCESS) {
+          GRN_TS_ERR_RETURN(rc, "grn_ja_reader_open failed");
+        }
+      } else {
+        grn_ja_reader_unref(ctx, node->reader);
       }
       node->buf.pos = 0;
       for (i = 0; i < n_in; i++) {
-        rc = grn_ja_reader_seek(ctx, &reader, in[i].id);
+        rc = grn_ja_reader_seek(ctx, node->reader, in[i].id);
         if (rc == GRN_SUCCESS) {
-          rc = grn_ts_buf_reserve(ctx, &node->buf,
-                                  node->buf.pos + reader.value_size);
-          if (rc == GRN_SUCCESS) {
-            rc = grn_ja_reader_read(ctx, &reader,
-                                    (char *)node->buf.ptr + node->buf.pos);
+          if (node->reader->ref_avail) {
+            void *addr;
+            rc = grn_ja_reader_ref(ctx, node->reader, &addr);
             if (rc == GRN_SUCCESS) {
-              node->buf.pos += reader.value_size;
+              out_ptr[i].ptr = (char *)addr;
+            }
+          } else {
+            rc = grn_ts_buf_reserve(ctx, &node->buf,
+                                    node->buf.pos + node->reader->value_size);
+            if (rc == GRN_SUCCESS) {
+              rc = grn_ja_reader_read(ctx, node->reader,
+                                      (char *)node->buf.ptr + node->buf.pos);
+              if (rc == GRN_SUCCESS) {
+                out_ptr[i].ptr = NULL;
+                node->buf.pos += node->reader->value_size;
+              }
             }
           }
         }
-        out_ptr[i].size = (rc == GRN_SUCCESS) ? reader.value_size : 0;
+        if (rc == GRN_SUCCESS) {
+          out_ptr[i].size = node->reader->value_size;
+        } else {
+          out_ptr[i].ptr = NULL;
+          out_ptr[i].size = 0;
+        }
       }
       buf_ptr = (char *)node->buf.ptr;
       for (i = 0; i < n_in; i++) {
-        out_ptr[i].ptr = buf_ptr;
-        buf_ptr += out_ptr[i].size;
+        if (!out_ptr[i].ptr) {
+          out_ptr[i].ptr = buf_ptr;
+          buf_ptr += out_ptr[i].size;
+        }
       }
-      grn_ja_reader_fin(ctx, &reader);
       return GRN_SUCCESS;
     }
     GRN_TS_EXPR_COLUMN_NODE_EVALUATE_SCALAR_CASE(GEO, geo)
-------------- next part --------------
HTML����������������������������...
다운로드 



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