susumu.yata
null+****@clear*****
Wed May 6 13:28:01 JST 2015
susumu.yata 2015-05-06 13:28:01 +0900 (Wed, 06 May 2015) New Revision: ba819a8662e267ba84eb294647029a27a0a28aab https://github.com/groonga/grnxx/commit/ba819a8662e267ba84eb294647029a27a0a28aab Message: Gnx: implement Column.GetValue() for Text vector. Modified files: go3/gnx/grn.go go3/gnx/grn_cgo.c go3/gnx/grn_cgo.h go3/gnx/grn_test.go Modified: go3/gnx/grn.go (+31 -2) =================================================================== --- go3/gnx/grn.go 2015-05-01 15:46:06 +0900 (41a8983) +++ go3/gnx/grn.go 2015-05-06 13:28:01 +0900 (1ee316a) @@ -1101,6 +1101,36 @@ func (column *GrnColumn) getGeoPointVector(id Int) (interface{}, error) { return value, nil } +// getTextVector() gets a TextVector. +func (column *GrnColumn) getTextVector(id Int) (interface{}, error) { + var grnVector C.grn_cgo_vector + if ok := C.grn_cgo_column_get_text_vector(column.table.db.ctx, column.obj, + C.grn_id(id), &grnVector); ok != C.GRN_TRUE { + return nil, fmt.Errorf("grn_cgo_column_get_text_vector() failed") + } + if grnVector.size == 0 { + return make([]Text, 0), nil + } + grnValues := make([]C.grn_cgo_text, int(grnVector.size)) + grnVector.ptr = unsafe.Pointer(&grnValues[0]) + if ok := C.grn_cgo_column_get_text_vector(column.table.db.ctx, column.obj, + C.grn_id(id), &grnVector); ok != C.GRN_TRUE { + return nil, fmt.Errorf("grn_cgo_column_get_text_vector() failed") + } + value := make([]Text, int(grnVector.size)) + for i, grnValue := range grnValues { + if grnValue.size != 0 { + value[i] = make(Text, int(grnValue.size)) + grnValues[i].ptr = (*C.char)(unsafe.Pointer(&value[i][0])) + } + } + if ok := C.grn_cgo_column_get_text_vector(column.table.db.ctx, column.obj, + C.grn_id(id), &grnVector); ok != C.GRN_TRUE { + return nil, fmt.Errorf("grn_cgo_column_get_text_vector() failed") + } + return value, nil +} + // GetValue() gets a value. // TODO: GetValue() should use allocated spaces for better performance. func (column *GrnColumn) GetValue(id Int) (interface{}, error) { @@ -1128,8 +1158,7 @@ func (column *GrnColumn) GetValue(id Int) (interface{}, error) { case GeoPointID: return column.getGeoPointVector(id) case TextID: -// return column.getTextVector(id) - return nil, fmt.Errorf("not supported yet") + return column.getTextVector(id) } } return nil, fmt.Errorf("undefined value type: valueType = %d", column.valueType) Modified: go3/gnx/grn_cgo.c (+24 -0) =================================================================== --- go3/gnx/grn_cgo.c 2015-05-01 15:46:06 +0900 (9fc2526) +++ go3/gnx/grn_cgo.c 2015-05-06 13:28:01 +0900 (fe8bf64) @@ -436,3 +436,27 @@ grn_bool grn_cgo_column_get_geo_point_vector(grn_ctx *ctx, grn_obj *column, GRN_OBJ_FIN(ctx, &value_obj); return GRN_TRUE; } + +grn_bool grn_cgo_column_get_text_vector(grn_ctx *ctx, grn_obj *column, + grn_id id, grn_cgo_vector *value) { + grn_obj value_obj; + GRN_TEXT_INIT(&value_obj, GRN_OBJ_VECTOR); + grn_obj_get_value(ctx, column, id, &value_obj); + size_t size = grn_vector_size(ctx, &value_obj); + if (size <= value->size) { + size_t i; + for (i = 0; i < size; i++) { + const char *text_ptr; + unsigned int text_size = grn_vector_get_element(ctx, &value_obj, i, + &text_ptr, NULL, NULL); + grn_cgo_text *text = &((grn_cgo_text *)value->ptr)[i]; + if (text_size <= text->size) { + memcpy(text->ptr, text_ptr, text_size); + } + text->size = text_size; + } + } + value->size = size; + GRN_OBJ_FIN(ctx, &value_obj); + return GRN_TRUE; +} Modified: go3/gnx/grn_cgo.h (+2 -0) =================================================================== --- go3/gnx/grn_cgo.h 2015-05-01 15:46:06 +0900 (7194c14) +++ go3/gnx/grn_cgo.h 2015-05-06 13:28:01 +0900 (3b979fe) @@ -122,5 +122,7 @@ grn_bool grn_cgo_column_get_float_vector(grn_ctx *ctx, grn_obj *column, grn_id id, grn_cgo_vector *value); grn_bool grn_cgo_column_get_geo_point_vector(grn_ctx *ctx, grn_obj *column, grn_id id, grn_cgo_vector *value); +grn_bool grn_cgo_column_get_text_vector(grn_ctx *ctx, grn_obj *column, + grn_id id, grn_cgo_vector *value); #endif // GRN_CGO_H Modified: go3/gnx/grn_test.go (+1 -1) =================================================================== --- go3/gnx/grn_test.go 2015-05-01 15:46:06 +0900 (9cb7b9b) +++ go3/gnx/grn_test.go 2015-05-06 13:28:01 +0900 (dded85e) @@ -480,5 +480,5 @@ func TestGrnColumnGetValue(t *testing.T) { testGrnColumnGetVectorValue(t, "Int") testGrnColumnGetVectorValue(t, "Float") testGrnColumnGetVectorValue(t, "GeoPoint") -// testGrnColumnGetVectorValue(t, "Text") + testGrnColumnGetVectorValue(t, "Text") } -------------- next part -------------- HTML����������������������������... ダウンロード