[Groonga-commit] groonga/grngo at 492866b [master] Add internal buffers for GetValue().

Back to archive index

susumu.yata null+****@clear*****
Fri Jul 24 12:20:48 JST 2015


susumu.yata	2015-07-24 12:20:48 +0900 (Fri, 24 Jul 2015)

  New Revision: 492866b205d047454f856472c46d33b6a9dc76cc
  https://github.com/groonga/grngo/commit/492866b205d047454f856472c46d33b6a9dc76cc

  Message:
    Add internal buffers for GetValue().

  Modified files:
    grngo.c
    grngo.h

  Modified: grngo.c (+94 -6)
===================================================================
--- grngo.c    2015-07-24 09:57:13 +0900 (18ec598)
+++ grngo.c    2015-07-24 12:20:48 +0900 (607e315)
@@ -109,6 +109,15 @@ _grngo_free(grngo_db *db, void *buf,
 #define GRNGO_FREE(db, buf)\
   _grngo_free(db, buf, __FILE__, __LINE__, __PRETTY_FUNCTION__)
 
+static grn_bool
+_grngo_is_vector(grn_obj *obj) {
+  if (obj->header.type != GRN_COLUMN_VAR_SIZE) {
+    return GRN_FALSE;
+  }
+  grn_obj_flags type = obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK;
+  return type == GRN_OBJ_COLUMN_VECTOR;
+}
+
 // -- grngo_db --
 
 static grngo_db *
@@ -478,7 +487,9 @@ _grngo_new_column(grngo_table *table) {
   column->db = table->db;
   column->table = table;
   column->srcs = NULL;
-  column->bufs = NULL;
+  column->src_bufs = NULL;
+  column->text_buf = NULL;
+  column->vector_buf = NULL;
   return column;
 }
 
@@ -491,12 +502,20 @@ _grngo_delete_column(grngo_column *column) {
     }
     GRNGO_FREE(column->db, column->srcs);
   }
-  if (column->bufs) {
+  if (column->src_bufs) {
     size_t i;
-    for (i = 0; i < column->n_bufs; i++) {
-      GRN_OBJ_FIN(column->db->ctx, &column->bufs[i]);
+    for (i = 0; i < column->n_srcs; i++) {
+      if (column->src_bufs[i]) {
+        grn_obj_close(column->db->ctx, column->src_bufs[i]);
+      }
     }
-    GRNGO_FREE(column->db, column->bufs);
+    GRNGO_FREE(column->db, column->src_bufs);
+  }
+  if (column->text_buf) {
+    grn_obj_close(column->db->ctx, column->text_buf);
+  }
+  if (column->vector_buf) {
+    grn_obj_close(column->db->ctx, column->vector_buf);
   }
   GRNGO_FREE(column->db, column);
 }
@@ -583,6 +602,75 @@ _grngo_push_src(grngo_column *column, grn_obj *table,
 }
 
 static grn_rc
+_grngo_open_bufs(grngo_column *column) {
+  column->src_bufs = (grn_obj **)GRNGO_MALLOC(column->db,
+                                              sizeof(grn_obj *) * column->n_srcs);
+  if (!column->src_bufs) {
+    return GRN_NO_MEMORY_AVAILABLE;
+  }
+  size_t i = 0;
+  for (i = 0; i < column->n_srcs; i++) {
+    column->src_bufs[i] = NULL;
+  }
+  grn_ctx *ctx = column->db->ctx;
+  for (i = 0; i < (column->n_srcs - 1); i++) {
+    column->src_bufs[i] = grn_obj_open(ctx, GRN_VECTOR, 0, GRN_DB_UINT32);
+    if (!column->src_bufs[i]) {
+      if (ctx->rc != GRN_SUCCESS) {
+        return ctx->rc;
+      }
+      return GRN_UNKNOWN_ERROR;
+    }
+  }
+  grn_builtin_type value_type = column->value_type;
+  switch (value_type) {
+    case GRN_DB_SHORT_TEXT:
+    case GRN_DB_TEXT:
+    case GRN_DB_LONG_TEXT: {
+      if (_grngo_is_vector(column->srcs[i])) {
+        column->src_bufs[i] = grn_obj_open(ctx, GRN_VECTOR, 0, value_type);
+      } else {
+        column->src_bufs[i] = grn_obj_open(ctx, GRN_BULK, 0, GRN_DB_LONG_TEXT);
+      }
+      if (!column->src_bufs[i]) {
+        if (ctx->rc != GRN_SUCCESS) {
+          return ctx->rc;
+        }
+        return GRN_UNKNOWN_ERROR;
+      }
+      column->text_buf = grn_obj_open(ctx, GRN_BULK, 0, GRN_DB_LONG_TEXT);
+      if (!column->text_buf) {
+        if (ctx->rc != GRN_SUCCESS) {
+          return ctx->rc;
+        }
+        return GRN_UNKNOWN_ERROR;
+      }
+      break;
+    }
+    default: {
+      column->src_bufs[i] = grn_obj_open(ctx, GRN_VECTOR, 0, value_type);
+      if (!column->src_bufs[i]) {
+        if (ctx->rc != GRN_SUCCESS) {
+          return ctx->rc;
+        }
+        return GRN_UNKNOWN_ERROR;
+      }
+      break;
+    }
+  }
+  if (column->dimension != 0) {
+    column->vector_buf = grn_obj_open(ctx, GRN_BULK, 0, GRN_DB_LONG_TEXT);
+    if (!column->vector_buf) {
+      if (ctx->rc != GRN_SUCCESS) {
+        return ctx->rc;
+      }
+      return GRN_UNKNOWN_ERROR;
+    }
+  }
+  return GRN_SUCCESS;
+}
+
+static grn_rc
 _grngo_open_column(grngo_table *table, grngo_column *column,
                    const char *name, size_t name_len) {
   grn_obj *owner = table->obj;
@@ -636,7 +724,7 @@ _grngo_open_column(grngo_table *table, grngo_column *column,
     grn_obj_unlink(column->db->ctx, owner);
     owner = new_owner;
   }
-  return GRN_SUCCESS;
+  return _grngo_open_bufs(column);
 }
 
 grn_rc

  Modified: grngo.h (+3 -2)
===================================================================
--- grngo.h    2015-07-24 09:57:13 +0900 (890ad16)
+++ grngo.h    2015-07-24 12:20:48 +0900 (5ecbf47)
@@ -71,8 +71,9 @@ typedef struct {
   grngo_table      *table;
   grn_obj          **srcs;
   size_t           n_srcs;
-  grn_obj          *bufs;
-  size_t           n_bufs;
+  grn_obj          **src_bufs;
+  grn_obj          *text_buf;
+  grn_obj          *vector_buf;
   grn_builtin_type value_type;
   int              dimension;
   grn_bool         writable;
-------------- next part --------------
HTML����������������������������...
다운로드 



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