[Groonga-commit] groonga/grngo at 73413ac [master] Update GetValue() to support (Short/Long)Text.

Back to archive index

susumu.yata null+****@clear*****
Fri Jul 24 15:48:53 JST 2015


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

  New Revision: 73413ac1ab77fdb590ddd49a0c7179367e4e4dc9
  https://github.com/groonga/grngo/commit/73413ac1ab77fdb590ddd49a0c7179367e4e4dc9

  Message:
    Update GetValue() to support (Short/Long)Text.

  Modified files:
    grngo.c
    grngo.go
    grngo_test.go

  Modified: grngo.c (+33 -6)
===================================================================
--- grngo.c    2015-07-24 14:29:23 +0900 (4025068)
+++ grngo.c    2015-07-24 15:48:53 +0900 (c98c587)
@@ -1098,14 +1098,41 @@ grngo_get(grngo_column *column, grn_id id, void **value) {
     n_ids = grn_vector_size(ctx, column->src_bufs[i]);
   }
   GRN_BULK_REWIND(column->src_bufs[i]);
-  for (j = 0; j < n_ids; j++) {
-    // TODO: Vector and Text.
-    grn_obj_get_value(ctx, column->srcs[i], ids[j], column->src_bufs[i]);
-    if (ctx->rc != GRN_SUCCESS) {
-      return ctx->rc;
+  // TODO: Vector.
+  if (column->text_buf) {
+    GRN_BULK_REWIND(column->text_buf);
+    size_t offset = 0;
+    for (j = 0; j < n_ids; j++) {
+      grn_obj_get_value(ctx, column->srcs[i], ids[j], column->src_bufs[i]);
+      if (ctx->rc != GRN_SUCCESS) {
+        return ctx->rc;
+      }
+      size_t size = GRN_BULK_VSIZE(column->src_bufs[i]);
+      grngo_text text = { NULL, size - offset };
+      grn_rc rc = grn_bulk_write(ctx, column->text_buf,
+                                 (char *)&text, sizeof(text));
+      if (rc != GRN_SUCCESS) {
+        return rc;
+      }
+      offset = size;
+    }
+    char *ptr = GRN_BULK_HEAD(column->src_bufs[i]);
+    grngo_text *texts = (grngo_text *)GRN_BULK_HEAD(column->text_buf);
+    for (j = 0; j < n_ids; j++) {
+      texts[j].ptr = ptr;
+      ptr += texts[j].size;
+    }
+    *value = texts;
+  } else {
+    for (j = 0; j < n_ids; j++) {
+      // TODO: Vector and Text.
+      grn_obj_get_value(ctx, column->srcs[i], ids[j], column->src_bufs[i]);
+      if (ctx->rc != GRN_SUCCESS) {
+        return ctx->rc;
+      }
     }
+    *value = GRN_BULK_HEAD(column->src_bufs[i]);
   }
-  *value = GRN_BULK_HEAD(column->src_bufs[i]);
   return GRN_SUCCESS;
 }
 

  Modified: grngo.go (+3 -4)
===================================================================
--- grngo.go    2015-07-24 14:29:23 +0900 (8804997)
+++ grngo.go    2015-07-24 15:48:53 +0900 (a5936b4)
@@ -1045,10 +1045,6 @@ func (column *Column) GetValue(id uint32) (interface{}, error) {
 	if column.c.dimension != 0 {
 		return nil, fmt.Errorf("Vector is not supported yet")
 	}
-	switch column.c.value_type {
-	case C.GRN_DB_SHORT_TEXT, C.GRN_DB_TEXT, C.GRN_DB_LONG_TEXT:
-		return nil, fmt.Errorf("Text is not supported yet")
-	}
 	var ptr unsafe.Pointer
 	rc := C.grngo_get(column.c, C.grn_id(id), &ptr)
 	if rc != C.GRN_SUCCESS {
@@ -1078,6 +1074,9 @@ func (column *Column) GetValue(id uint32) (interface{}, error) {
 		return float64(*(*C.double)(ptr)), nil
 	case C.GRN_DB_TIME:
 		return int64(*(*C.int64_t)(ptr)), nil
+	case C.GRN_DB_SHORT_TEXT, C.GRN_DB_TEXT, C.GRN_DB_LONG_TEXT:
+		cValue := *(*C.grngo_text)(ptr)
+		return C.GoBytes(unsafe.Pointer(cValue.ptr), C.int(cValue.size)), nil
 	case C.GRN_DB_TOKYO_GEO_POINT, C.GRN_DB_WGS84_GEO_POINT:
 		cValue := *(*C.grn_geo_point)(ptr)
 		return GeoPoint{int32(cValue.latitude), int32(cValue.longitude)}, nil

  Modified: grngo_test.go (+9 -9)
===================================================================
--- grngo_test.go    2015-07-24 14:29:23 +0900 (3ccd6f5)
+++ grngo_test.go    2015-07-24 15:48:53 +0900 (42e0196)
@@ -1109,17 +1109,17 @@ func TestColumnGetValueForTime(t *testing.T) {
 	testColumnGetValue(t, "Time")
 }
 
-//func TestColumnGetValueForShortText(t *testing.T) {
-//	testColumnGetValue(t, "ShortText")
-//}
+func TestColumnGetValueForShortText(t *testing.T) {
+	testColumnGetValue(t, "ShortText")
+}
 
-//func TestColumnGetValueForText(t *testing.T) {
-//	testColumnGetValue(t, "Text")
-//}
+func TestColumnGetValueForText(t *testing.T) {
+	testColumnGetValue(t, "Text")
+}
 
-//func TestColumnGetValueForLongText(t *testing.T) {
-//	testColumnGetValue(t, "LongText")
-//}
+func TestColumnGetValueForLongText(t *testing.T) {
+	testColumnGetValue(t, "LongText")
+}
 
 func TestColumnGetValueForTokyoGeoPoint(t *testing.T) {
 	testColumnGetValue(t, "TokyoGeoPoint")
-------------- next part --------------
HTML����������������������������...
Download 



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