void test_unsequantial_records_in_table_with_keys(void) { grn_obj *table; grn_id id, expected_id = 1; const gchar *keys[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; int i, n_keys = sizeof(keys) / sizeof(keys[0]); table = table_create("Weekdays", GRN_OBJ_TABLE_HASH_KEY, "ShortText", NULL); grn_test_assert_context(context); for (i = 0; i < n_keys; ++i) { id = grn_table_add(context, table, keys[i], strlen(keys[i]), NULL); cut_assert_equal_int(expected_id++, id); grn_test_assert_context(context); } grn_table_delete_by_id(context, table, 3); grn_table_delete_by_id(context, table, 6); cut_assert_equal_string("table_create Weekdays TABLE_HASH_KEY ShortText\n" "load --table Weekdays\n" "[\n" "[\"_key\"],\n" "[\"Sun\"],\n" "[\"Mon\"],\n" "[\"Wed\"],\n" "[\"Thu\"],\n" "[\"Sat\"]\n" "]", send_command("dump")); }
static mrb_value mrb_grn_table_delete(mrb_state *mrb, mrb_value self) { grn_ctx *ctx = (grn_ctx *)mrb->ud; grn_obj *table; mrb_value mrb_options; mrb_value mrb_id; mrb_value mrb_key; mrb_value mrb_expression; table = DATA_PTR(self); mrb_get_args(mrb, "H", &mrb_options); mrb_id = grn_mrb_options_get_lit(mrb, mrb_options, "id"); if (!mrb_nil_p(mrb_id)) { grn_table_delete_by_id(ctx, table, mrb_fixnum(mrb_id)); grn_mrb_ctx_check(mrb); return mrb_nil_value(); } mrb_key = grn_mrb_options_get_lit(mrb, mrb_options, "key"); if (!mrb_nil_p(mrb_key)) { grn_id key_domain_id; void *key; unsigned int key_size; grn_mrb_value_to_raw_data_buffer buffer; key_domain_id = table->header.domain; grn_mrb_value_to_raw_data_buffer_init(mrb, &buffer); grn_mrb_value_to_raw_data(mrb, "key", mrb_key, key_domain_id, &buffer, &key, &key_size); grn_table_delete(ctx, table, key, key_size); grn_mrb_value_to_raw_data_buffer_fin(mrb, &buffer); grn_mrb_ctx_check(mrb); return mrb_nil_value(); } mrb_expression = grn_mrb_options_get_lit(mrb, mrb_options, "expression"); if (!mrb_nil_p(mrb_expression)) { grn_obj *expression; grn_obj *selected_records; grn_table_cursor *cursor; expression = DATA_PTR(mrb_expression); selected_records = grn_table_select(ctx, table, expression, NULL, GRN_OP_OR); grn_mrb_ctx_check(mrb); cursor = grn_table_cursor_open(ctx, selected_records, NULL, 0, NULL, 0, 0, -1, 0); if (cursor) { while (grn_table_cursor_next(ctx, cursor) != GRN_ID_NIL) { grn_id *id; grn_table_cursor_get_key(ctx, cursor, (void **)&id); grn_table_delete_by_id(ctx, table, *id); } grn_table_cursor_close(ctx, cursor); } grn_mrb_ctx_check(mrb); return mrb_nil_value(); } mrb_raisef(mrb, E_ARGUMENT_ERROR, "must have :id, :key or :expression: %S", mrb_options); return mrb_nil_value(); }