[Groonga-commit] groonga/groonga at b521724 [master] mrb: bind grn_table_delete() and grn_table_delete_by_id()

Back to archive index

Kouhei Sutou null+****@clear*****
Tue Jun 16 16:22:29 JST 2015


Kouhei Sutou	2015-06-16 16:22:29 +0900 (Tue, 16 Jun 2015)

  New Revision: b5217244d76cc12471ae268117cdead4f5854d4c
  https://github.com/groonga/groonga/commit/b5217244d76cc12471ae268117cdead4f5854d4c

  Message:
    mrb: bind grn_table_delete() and grn_table_delete_by_id()
    
    `table.delete(:expression => expression)` is a convenience feature. It's
    not only convenience but also fast.

  Modified files:
    lib/mrb/mrb_table.c

  Modified: lib/mrb/mrb_table.c (+74 -0)
===================================================================
--- lib/mrb/mrb_table.c    2015-06-16 16:21:01 +0900 (651a77e)
+++ lib/mrb/mrb_table.c    2015-06-16 16:22:29 +0900 (87872fb)
@@ -226,6 +226,76 @@ mrb_grn_table_sort(mrb_state *mrb, mrb_value self)
   return grn_mrb_value_from_grn_obj(mrb, result);
 }
 
+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();
+}
+
 void
 grn_mrb_table_init(grn_ctx *ctx)
 {
@@ -253,5 +323,9 @@ grn_mrb_table_init(grn_ctx *ctx)
                     mrb_grn_table_select, MRB_ARGS_ARG(1, 1));
   mrb_define_method(mrb, klass, "sort",
                     mrb_grn_table_sort, MRB_ARGS_ARG(1, 1));
+
+  mrb_define_method(mrb, klass, "delete",
+                    mrb_grn_table_delete, MRB_ARGS_REQ(1));
+
 }
 #endif
-------------- next part --------------
HTML����������������������������...
Descargar 



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