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