susumu.yata
null+****@clear*****
Wed Apr 8 18:21:00 JST 2015
susumu.yata 2015-04-08 18:21:00 +0900 (Wed, 08 Apr 2015) New Revision: 74d342ab64ed51642f198a159b86aa9a7349bfed https://github.com/groonga/grnxx/commit/74d342ab64ed51642f198a159b86aa9a7349bfed Message: Gnx: add gnx_insert_rows() and gnx_set_values(). Modified files: go2/gnx/gnx.cpp go2/gnx/gnx.h Modified: go2/gnx/gnx.cpp (+200 -0) =================================================================== --- go2/gnx/gnx.cpp 2015-04-07 22:12:28 +0900 (d03051c) +++ go2/gnx/gnx.cpp 2015-04-08 18:21:00 +0900 (d19a427) @@ -119,6 +119,206 @@ gnx_bool gnx_set_value2(grn_ctx *ctx, grn_obj *column, gnx_int row_id, return GNX_TRUE; } + +gnx_int gnx_insert_rows(grn_ctx *ctx, const char *table_name, + gnx_int num_keys, gnx_data_type key_type, + const void *keys, gnx_int *row_ids, + gnx_bool *inserted) { + grn_obj *table = grn_ctx_get(ctx, table_name, strlen(table_name)); + if (!table) { + return GNX_NA_BOOL; + } + return gnx_insert_rows2(ctx, table, num_keys, key_type, keys, row_ids, + inserted); +} + +gnx_int gnx_insert_rows2(grn_ctx *ctx, grn_obj *table, + gnx_int num_keys, gnx_data_type key_type, + const void *keys, gnx_int *row_ids, + gnx_bool *inserted) { + // TODO: type check. + gnx_int count = 0; + switch (key_type) { + case GNX_NA: { + for (gnx_int i = 0; i < num_keys; ++i) { + int added; + grn_id id = grn_table_add(ctx, table, nullptr, 0, &added); + if (id == GRN_ID_NIL) { + row_ids[i] = GNX_NA_INT; + } else { + row_ids[i] = id; + ++count; + } + inserted[i] = added ? GNX_TRUE : GNX_FALSE; + } + break; + } + case GNX_INT: { + const gnx_int *int_keys = static_cast<const gnx_int *>(keys); + for (gnx_int i = 0; i < num_keys; ++i) { + int added; + grn_id id = grn_table_add(ctx, table, &int_keys[i], + sizeof(gnx_int), &added); + if (id == GRN_ID_NIL) { + row_ids[i] = GNX_NA_INT; + } else { + row_ids[i] = id; + ++count; + } + inserted[i] = added ? GNX_TRUE : GNX_FALSE; + } + break; + } + case GNX_FLOAT: { + const gnx_float *float_keys = static_cast<const gnx_float *>(keys); + for (gnx_int i = 0; i < num_keys; ++i) { + int added; + grn_id id = grn_table_add(ctx, table, &float_keys[i], + sizeof(gnx_float), &added); + if (id == GRN_ID_NIL) { + row_ids[i] = GNX_NA_INT; + } else { + row_ids[i] = id; + ++count; + } + inserted[i] = added ? GNX_TRUE : GNX_FALSE; + } + break; + } +// case GNX_GEO_POINT: { +// key_size = sizeof(gnx_geo_point); +// break; +// } + case GNX_TEXT: { + const gnx_text *text_keys = static_cast<const gnx_text *>(keys); + for (gnx_int i = 0; i < num_keys; ++i) { + const void *key = text_keys[i].data; + unsigned int key_size = text_keys[i].size; + int added; + grn_id id = grn_table_add(ctx, table, key, key_size, &added); + if (id == GRN_ID_NIL) { + row_ids[i] = GNX_NA_INT; + } else { + row_ids[i] = id; + ++count; + } + inserted[i] = added ? GNX_TRUE : GNX_FALSE; + } + break; + } + default: { + return GNX_NA_INT; + } + } + return count; +} + +gnx_int gnx_set_values(grn_ctx *ctx, const char *table_name, + const char *column_name, gnx_int num_values, + const gnx_int *row_ids, gnx_data_type value_type, + const void *values, gnx_bool *updated) { + grn_obj *table = grn_ctx_get(ctx, table_name, strlen(table_name)); + if (!table) { + return GNX_NA_BOOL; + } + grn_obj *column = grn_obj_column( + ctx, table, column_name, strlen(column_name)); + if (!column) { + return GNX_NA_BOOL; + } + return gnx_set_values2(ctx, table, column, num_values, row_ids, + value_type, values, updated); +} + +gnx_int gnx_set_values2(grn_ctx *ctx, grn_obj *table, grn_obj *column, + gnx_int num_values, const gnx_int *row_ids, + gnx_data_type value_type, const void *values, + gnx_bool *updated) { + gnx_int count = 0; + switch (value_type) { +// case GNX_NA: { +// break; +// } + case GNX_BOOL: { + grn_obj obj; + GRN_BOOL_INIT(&obj, 0); + for (gnx_int i = 0; i < num_values; ++i) { + GRN_BOOL_SET(ctx, &obj, + static_cast<const gnx_bool *>(values)[i] == GNX_TRUE); + grn_rc rc = grn_obj_set_value(ctx, column, row_ids[i], &obj, + GRN_OBJ_SET); + if (rc == GRN_SUCCESS) { + updated[i] = GNX_TRUE; + ++count; + } else { + updated[i] = GNX_FALSE; + } + } + GRN_OBJ_FIN(ctx, &obj); + break; + } + case GNX_INT: { + grn_obj obj; + GRN_INT64_INIT(&obj, 0); + for (gnx_int i = 0; i < num_values; ++i) { + GRN_INT64_SET(ctx, &obj, static_cast<const gnx_int *>(values)[i]); + grn_rc rc = grn_obj_set_value(ctx, column, row_ids[i], &obj, + GRN_OBJ_SET); + if (rc == GRN_SUCCESS) { + updated[i] = GNX_TRUE; + ++count; + } else { + updated[i] = GNX_FALSE; + } + } + GRN_OBJ_FIN(ctx, &obj); + break; + } + case GNX_FLOAT: { + grn_obj obj; + GRN_FLOAT_INIT(&obj, 0); + for (gnx_int i = 0; i < num_values; ++i) { + GRN_FLOAT_SET(ctx, &obj, static_cast<const gnx_float *>(values)[i]); + grn_rc rc = grn_obj_set_value(ctx, column, row_ids[i], &obj, + GRN_OBJ_SET); + if (rc == GRN_SUCCESS) { + updated[i] = GNX_TRUE; + ++count; + } else { + updated[i] = GNX_FALSE; + } + } + GRN_OBJ_FIN(ctx, &obj); + break; + } +// case GNX_GEO_POINT: { +// break; +// } + case GNX_TEXT: { + grn_obj obj; + GRN_TEXT_INIT(&obj, 0); + for (gnx_int i = 0; i < num_values; ++i) { + gnx_text text = static_cast<const gnx_text *>(values)[i]; + GRN_TEXT_SET(ctx, &obj, text.data, text.size); + grn_rc rc = grn_obj_set_value(ctx, column, row_ids[i], &obj, + GRN_OBJ_SET); + if (rc == GRN_SUCCESS) { + updated[i] = GNX_TRUE; + ++count; + } else { + updated[i] = GNX_FALSE; + } + } + GRN_OBJ_FIN(ctx, &obj); + break; + } + default: { + return GNX_NA_INT; + } + } + return count; +} + #ifdef __cplusplus } // extern "C" #endif // __cplusplus Modified: go2/gnx/gnx.h (+18 -0) =================================================================== --- go2/gnx/gnx.h 2015-04-07 22:12:28 +0900 (8fad4f4) +++ go2/gnx/gnx.h 2015-04-08 18:21:00 +0900 (aa07695) @@ -45,6 +45,24 @@ gnx_bool gnx_set_value(grn_ctx *ctx, const char *table_name, gnx_bool gnx_set_value2(grn_ctx *ctx,grn_obj *column, gnx_int row_id, gnx_data_type value_type, const void *value); +gnx_int gnx_insert_rows(grn_ctx *ctx, const char *table_name, + gnx_int num_keys, gnx_data_type key_type, + const void *keys, gnx_int *row_ids, + gnx_bool *inserted); +gnx_int gnx_insert_rows2(grn_ctx *ctx, grn_obj *table, + gnx_int num_keys, gnx_data_type key_type, + const void *keys, gnx_int *row_ids, + gnx_bool *inserted); + +gnx_int gnx_set_values(grn_ctx *ctx, const char *table_name, + const char *column_name, gnx_int num_values, + const gnx_int *row_ids, gnx_data_type value_type, + const void *values, gnx_bool *updated); +gnx_int gnx_set_values2(grn_ctx *ctx, grn_obj *table, grn_obj *column, + gnx_int num_values, const gnx_int *row_ids, + gnx_data_type value_type, const void *values, + gnx_bool *updated); + #ifdef __cplusplus } // extern "C" #endif // __cplusplus -------------- next part -------------- HTML����������������������������...Download