[Groonga-commit] groonga/groonga at 99ad5b9 [master] mrb: add Writer#write_table_records

Back to archive index

Kouhei Sutou null+****@clear*****
Fri Feb 6 18:49:39 JST 2015


Kouhei Sutou	2015-02-06 18:49:39 +0900 (Fri, 06 Feb 2015)

  New Revision: 99ad5b923d9aab892a565835660dd1efd3d55cc0
  https://github.com/groonga/groonga/commit/99ad5b923d9aab892a565835660dd1efd3d55cc0

  Message:
    mrb: add Writer#write_table_records

  Modified files:
    lib/mrb/mrb_writer.c

  Modified: lib/mrb/mrb_writer.c (+56 -0)
===================================================================
--- lib/mrb/mrb_writer.c    2015-02-06 18:27:45 +0900 (d36f493)
+++ lib/mrb/mrb_writer.c    2015-02-06 18:49:39 +0900 (e14073e)
@@ -21,6 +21,7 @@
 #ifdef GRN_WITH_MRUBY
 #include <mruby.h>
 #include <mruby/data.h>
+#include <mruby/hash.h>
 #include <mruby/string.h>
 
 #include "../grn_mrb.h"
@@ -141,6 +142,59 @@ writer_write_table_columns(mrb_state *mrb, mrb_value self)
   return mrb_nil_value();
 }
 
+static mrb_value
+writer_write_table_records(mrb_state *mrb, mrb_value self)
+{
+  grn_ctx *ctx = (grn_ctx *)mrb->ud;
+  mrb_value mrb_table;
+  mrb_value mrb_options = mrb_nil_value();
+  char *columns;
+  mrb_int columns_size;
+  grn_obj *table;
+  grn_obj_format format;
+  int n_hits = 0;
+  int offset = 0;
+  int limit = -1;
+  int hits_offset = 0;
+
+  mrb_get_args(mrb, "os|H", &mrb_table, &columns, &columns_size, &mrb_options);
+
+  table = DATA_PTR(mrb_table);
+  if (!mrb_nil_p(mrb_options)) {
+    mrb_value mrb_offset;
+    mrb_value mrb_limit;
+
+    mrb_offset = mrb_hash_get(mrb, mrb_options,
+                              mrb_symbol_value(mrb_intern_lit(mrb, "offset")));
+    if (!mrb_nil_p(mrb_offset)) {
+      offset = mrb_fixnum(mrb_offset);
+    }
+
+    mrb_limit = mrb_hash_get(mrb, mrb_options,
+                             mrb_symbol_value(mrb_intern_lit(mrb, "limit")));
+    if (!mrb_nil_p(mrb_limit)) {
+      limit = mrb_fixnum(mrb_limit);
+    }
+  }
+  if (limit < 0) {
+    limit = grn_table_size(ctx, table) + limit + 1;
+  }
+  GRN_OBJ_FORMAT_INIT(&format, n_hits, offset, limit, hits_offset);
+  {
+    grn_rc rc;
+    rc = grn_output_format_set_columns(ctx, &format,
+                                       table, columns, columns_size);
+    if (rc != GRN_SUCCESS) {
+      GRN_OBJ_FORMAT_FIN(ctx, &format);
+      grn_mrb_ctx_check(mrb);
+    }
+  }
+  GRN_OUTPUT_TABLE_RECORDS(table, &format);
+  GRN_OBJ_FORMAT_FIN(ctx, &format);
+
+  return mrb_nil_value();
+}
+
 void
 grn_mrb_writer_init(grn_ctx *ctx)
 {
@@ -163,5 +217,7 @@ grn_mrb_writer_init(grn_ctx *ctx)
 
   mrb_define_method(mrb, klass, "write_table_columns",
                     writer_write_table_columns, MRB_ARGS_REQ(2));
+  mrb_define_method(mrb, klass, "write_table_records",
+                    writer_write_table_records, MRB_ARGS_ARG(2, 1));
 }
 #endif
-------------- next part --------------
HTML����������������������������...
Download 



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