[Groonga-commit] groonga/grngo at ed89965 [master] Support getting integer values other than Int64.

Back to archive index

susumu.yata null+****@clear*****
Mon Jun 22 16:28:57 JST 2015


susumu.yata	2015-06-22 16:28:57 +0900 (Mon, 22 Jun 2015)

  New Revision: ed899652930113a6ce561dec36afb79f7ce71e8a
  https://github.com/groonga/grngo/commit/ed899652930113a6ce561dec36afb79f7ce71e8a

  Message:
    Support getting integer values other than Int64.
    
    GitHub: #5

  Modified files:
    grngo.c
    grngo.go
    grngo.h

  Modified: grngo.c (+165 -10)
===================================================================
--- grngo.c    2015-06-22 16:11:51 +0900 (1d0ce8d)
+++ grngo.c    2015-06-22 16:28:57 +0900 (07674da)
@@ -542,11 +542,59 @@ grn_bool grngo_column_get_bool(grn_ctx *ctx, grn_obj *column,
 }
 
 grn_bool grngo_column_get_int(grn_ctx *ctx, grn_obj *column,
+                              grn_builtin_type data_type,
                               grn_id id, int64_t *value) {
   grn_obj value_obj;
-  GRN_INT64_INIT(&value_obj, 0);
-  grn_obj_get_value(ctx, column, id, &value_obj);
-  *value = GRN_INT64_VALUE(&value_obj);
+  switch (data_type) {
+    case GRN_DB_INT8: {
+      GRN_INT8_INIT(&value_obj, 0);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      *value = GRN_INT8_VALUE(&value_obj);
+      break;
+    }
+    case GRN_DB_INT16: {
+      GRN_INT16_INIT(&value_obj, 0);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      *value = GRN_INT16_VALUE(&value_obj);
+      break;
+    }
+    case GRN_DB_INT32: {
+      GRN_INT32_INIT(&value_obj, 0);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      *value = GRN_INT32_VALUE(&value_obj);
+      break;
+    }
+    case GRN_DB_INT64: {
+      GRN_INT64_INIT(&value_obj, 0);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      *value = GRN_INT64_VALUE(&value_obj);
+      break;
+    }
+    case GRN_DB_UINT8: {
+      GRN_UINT8_INIT(&value_obj, 0);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      *value = GRN_UINT8_VALUE(&value_obj);
+      break;
+    }
+    case GRN_DB_UINT16: {
+      GRN_UINT16_INIT(&value_obj, 0);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      *value = GRN_UINT16_VALUE(&value_obj);
+      break;
+    }
+    case GRN_DB_UINT32: {
+      GRN_UINT32_INIT(&value_obj, 0);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      *value = GRN_UINT32_VALUE(&value_obj);
+      break;
+    }
+    case GRN_DB_UINT64: {
+      GRN_UINT64_INIT(&value_obj, 0);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      *value = GRN_UINT64_VALUE(&value_obj);
+      break;
+    }
+  }
   GRN_OBJ_FIN(ctx, &value_obj);
   return GRN_TRUE;
 }
@@ -601,16 +649,123 @@ grn_bool grngo_column_get_bool_vector(grn_ctx *ctx, grn_obj *column,
 }
 
 grn_bool grngo_column_get_int_vector(grn_ctx *ctx, grn_obj *column,
+                                     grn_builtin_type data_type,
                                      grn_id id, grngo_vector *value) {
   grn_obj value_obj;
-  GRN_INT64_INIT(&value_obj, GRN_OBJ_VECTOR);
-  grn_obj_get_value(ctx, column, id, &value_obj);
-  size_t size_in_bytes = GRN_BULK_VSIZE(&value_obj);
-  size_t size = size_in_bytes / sizeof(int64_t);
-  if (size <= value->size) {
-    memcpy(value->ptr, GRN_BULK_HEAD(&value_obj), size_in_bytes);
+  switch (data_type) {
+    case GRN_DB_INT8: {
+      GRN_INT8_INIT(&value_obj, GRN_OBJ_VECTOR);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      size_t size_in_bytes = GRN_BULK_VSIZE(&value_obj);
+      size_t size = size_in_bytes / sizeof(int8_t);
+      if (size <= value->size) {
+        size_t i;
+        for (i = 0; i < size; i++) {
+          ((int64_t *)value->ptr)[i] = GRN_INT8_VALUE_AT(&value_obj, i);
+        }
+      }
+      value->size = size;
+      break;
+    }
+    case GRN_DB_INT16: {
+      GRN_INT16_INIT(&value_obj, GRN_OBJ_VECTOR);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      size_t size_in_bytes = GRN_BULK_VSIZE(&value_obj);
+      size_t size = size_in_bytes / sizeof(int16_t);
+      if (size <= value->size) {
+        size_t i;
+        for (i = 0; i < size; i++) {
+          ((int64_t *)value->ptr)[i] = GRN_INT16_VALUE_AT(&value_obj, i);
+        }
+      }
+      value->size = size;
+      break;
+    }
+    case GRN_DB_INT32: {
+      GRN_INT32_INIT(&value_obj, GRN_OBJ_VECTOR);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      size_t size_in_bytes = GRN_BULK_VSIZE(&value_obj);
+      size_t size = size_in_bytes / sizeof(int32_t);
+      if (size <= value->size) {
+        size_t i;
+        for (i = 0; i < size; i++) {
+          ((int64_t *)value->ptr)[i] = GRN_INT32_VALUE_AT(&value_obj, i);
+        }
+      }
+      value->size = size;
+      break;
+    }
+    case GRN_DB_INT64: {
+      GRN_INT64_INIT(&value_obj, GRN_OBJ_VECTOR);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      size_t size_in_bytes = GRN_BULK_VSIZE(&value_obj);
+      size_t size = size_in_bytes / sizeof(int64_t);
+      if (size <= value->size) {
+        size_t i;
+        for (i = 0; i < size; i++) {
+          ((int64_t *)value->ptr)[i] = GRN_INT64_VALUE_AT(&value_obj, i);
+        }
+      }
+      value->size = size;
+      break;
+    }
+    case GRN_DB_UINT8: {
+      GRN_UINT8_INIT(&value_obj, GRN_OBJ_VECTOR);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      size_t size_in_bytes = GRN_BULK_VSIZE(&value_obj);
+      size_t size = size_in_bytes / sizeof(uint8_t);
+      if (size <= value->size) {
+        size_t i;
+        for (i = 0; i < size; i++) {
+          ((int64_t *)value->ptr)[i] = GRN_UINT8_VALUE_AT(&value_obj, i);
+        }
+      }
+      value->size = size;
+      break;
+    }
+    case GRN_DB_UINT16: {
+      GRN_UINT16_INIT(&value_obj, GRN_OBJ_VECTOR);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      size_t size_in_bytes = GRN_BULK_VSIZE(&value_obj);
+      size_t size = size_in_bytes / sizeof(uint16_t);
+      if (size <= value->size) {
+        size_t i;
+        for (i = 0; i < size; i++) {
+          ((int64_t *)value->ptr)[i] = GRN_UINT16_VALUE_AT(&value_obj, i);
+        }
+      }
+      value->size = size;
+      break;
+    }
+    case GRN_DB_UINT32: {
+      GRN_UINT32_INIT(&value_obj, GRN_OBJ_VECTOR);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      size_t size_in_bytes = GRN_BULK_VSIZE(&value_obj);
+      size_t size = size_in_bytes / sizeof(uint32_t);
+      if (size <= value->size) {
+        size_t i;
+        for (i = 0; i < size; i++) {
+          ((int64_t *)value->ptr)[i] = GRN_UINT32_VALUE_AT(&value_obj, i);
+        }
+      }
+      value->size = size;
+      break;
+    }
+    case GRN_DB_UINT64: {
+      GRN_UINT64_INIT(&value_obj, GRN_OBJ_VECTOR);
+      grn_obj_get_value(ctx, column, id, &value_obj);
+      size_t size_in_bytes = GRN_BULK_VSIZE(&value_obj);
+      size_t size = size_in_bytes / sizeof(uint64_t);
+      if (size <= value->size) {
+        size_t i;
+        for (i = 0; i < size; i++) {
+          ((int64_t *)value->ptr)[i] = GRN_UINT64_VALUE_AT(&value_obj, i);
+        }
+      }
+      value->size = size;
+      break;
+    }
   }
-  value->size = size;
   GRN_OBJ_FIN(ctx, &value_obj);
   return GRN_TRUE;
 }

  Modified: grngo.go (+3 -0)
===================================================================
--- grngo.go    2015-06-22 16:11:51 +0900 (41bcc06)
+++ grngo.go    2015-06-22 16:28:57 +0900 (2737ff8)
@@ -1144,6 +1144,7 @@ func (column *Column) getBool(id uint32) (interface{}, error) {
 func (column *Column) getInt(id uint32) (interface{}, error) {
 	var grnValue C.int64_t
 	if ok := C.grngo_column_get_int(column.table.db.ctx, column.obj,
+		C.grn_builtin_type(column.valueType),
 		C.grn_id(id), &grnValue); ok != C.GRN_TRUE {
 		return nil, fmt.Errorf("grngo_column_get_int() failed")
 	}
@@ -1216,6 +1217,7 @@ func (column *Column) getBoolVector(id uint32) (interface{}, error) {
 func (column *Column) getIntVector(id uint32) (interface{}, error) {
 	var grnValue C.grngo_vector
 	if ok := C.grngo_column_get_int_vector(column.table.db.ctx, column.obj,
+		C.grn_builtin_type(column.valueType),
 		C.grn_id(id), &grnValue); ok != C.GRN_TRUE {
 		return nil, fmt.Errorf("grngo_column_get_int_vector() failed")
 	}
@@ -1225,6 +1227,7 @@ func (column *Column) getIntVector(id uint32) (interface{}, error) {
 	value := make([]int64, int(grnValue.size))
 	grnValue.ptr = unsafe.Pointer(&value[0])
 	if ok := C.grngo_column_get_int_vector(column.table.db.ctx, column.obj,
+		C.grn_builtin_type(column.valueType),
 		C.grn_id(id), &grnValue); ok != C.GRN_TRUE {
 		return nil, fmt.Errorf("grngo_column_get_int_vector() failed")
 	}

  Modified: grngo.h (+3 -1)
===================================================================
--- grngo.h    2015-06-22 16:11:51 +0900 (4785c88)
+++ grngo.h    2015-06-22 16:28:57 +0900 (e5f619c)
@@ -164,6 +164,7 @@ grn_bool grngo_column_get_bool(grn_ctx *ctx, grn_obj *column,
                                grn_id id, grn_bool *value);
 // grngo_column_get_int() gets a stored Int value.
 grn_bool grngo_column_get_int(grn_ctx *ctx, grn_obj *column,
+                              grn_builtin_type data_type,
                               grn_id id, int64_t *value);
 // grngo_column_get_float() gets a stored Float value.
 grn_bool grngo_column_get_float(grn_ctx *ctx, grn_obj *column,
@@ -179,7 +180,8 @@ grn_bool grngo_column_get_bool_vector(grn_ctx *ctx, grn_obj *column,
                                       grn_id id, grngo_vector *value);
 // grngo_column_get_int_vector() gets a stored Int vector.
 grn_bool grngo_column_get_int_vector(grn_ctx *ctx, grn_obj *column,
-                                      grn_id id, grngo_vector *value);
+                                     grn_builtin_type data_type,
+                                     grn_id id, grngo_vector *value);
 // grngo_column_get_float_vector() gets a stored Float vector.
 grn_bool grngo_column_get_float_vector(grn_ctx *ctx, grn_obj *column,
                                        grn_id id, grngo_vector *value);
-------------- next part --------------
HTML����������������������������...
Download 



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