Kouhei Sutou
null+****@clear*****
Mon Jul 6 14:05:54 JST 2015
Kouhei Sutou 2015-07-06 14:05:54 +0900 (Mon, 06 Jul 2015) New Revision: b977f372c5f56031ff2d26b18fb50f0dd1a3ed25 https://github.com/groonga/groonga/commit/b977f372c5f56031ff2d26b18fb50f0dd1a3ed25 Message: mrb: add Record Added files: lib/mrb/mrb_record.c lib/mrb/mrb_record.h lib/mrb/scripts/record.rb Modified files: lib/ctx_impl_mrb.c lib/mrb/scripts/initialize/post.rb lib/mrb/sources.am Modified: lib/ctx_impl_mrb.c (+2 -0) =================================================================== --- lib/ctx_impl_mrb.c 2015-07-05 08:42:12 +0900 (39a1aa1) +++ lib/ctx_impl_mrb.c 2015-07-06 14:05:54 +0900 (5fdbd47) @@ -44,6 +44,7 @@ # include "mrb/mrb_table_group_result.h" # include "mrb/mrb_table_sort_flags.h" # include "mrb/mrb_table_sort_key.h" +# include "mrb/mrb_record.h" # include "mrb/mrb_column.h" # include "mrb/mrb_fixed_size_column.h" # include "mrb/mrb_variable_size_column.h" @@ -150,6 +151,7 @@ grn_ctx_impl_mrb_init_bindings(grn_ctx *ctx) grn_mrb_table_group_result_init(ctx); grn_mrb_table_sort_flags_init(ctx); grn_mrb_table_sort_key_init(ctx); + grn_mrb_record_init(ctx); grn_mrb_column_init(ctx); grn_mrb_fixed_size_column_init(ctx); grn_mrb_variable_size_column_init(ctx); Added: lib/mrb/mrb_record.c (+162 -0) 100644 =================================================================== --- /dev/null +++ lib/mrb/mrb_record.c 2015-07-06 14:05:54 +0900 (84d061a) @@ -0,0 +1,162 @@ +/* -*- c-basic-offset: 2 -*- */ +/* + Copyright(C) 2015 Brazil + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License version 2.1 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "../grn_ctx_impl.h" + +#ifdef GRN_WITH_MRUBY +#include <mruby.h> +#include <mruby/class.h> +#include <mruby/variable.h> +#include <mruby/data.h> + +#include "../grn_db.h" +#include "mrb_record.h" +#include "mrb_bulk.h" + +typedef struct { + grn_obj *table; + grn_id id; + grn_obj key; +} grn_mrb_record; + +static void +mrb_grn_record_free(mrb_state *mrb, void *data) +{ + grn_ctx *ctx = (grn_ctx *)mrb->ud; + grn_mrb_record *record = data; + + if (!record) { + return; + } + + GRN_OBJ_FIN(ctx, &(record->key)); + mrb_free(mrb, record); +} + +static struct mrb_data_type mrb_grn_record_type = { + "Groonga::Record", + mrb_grn_record_free +}; + +static mrb_value +mrb_grn_record_initialize(mrb_state *mrb, mrb_value self) +{ + grn_mrb_record *record; + mrb_value mrb_table; + mrb_value mrb_id; + + mrb_get_args(mrb, "oo", &mrb_table, &mrb_id); + + DATA_TYPE(self) = &mrb_grn_record_type; + + record = mrb_malloc(mrb, sizeof(grn_mrb_record)); + record->table = DATA_PTR(mrb_table); + if (mrb_nil_p(mrb_id)) { + record->id = GRN_ID_NIL; + } else { + record->id = mrb_fixnum(mrb_id); + } + + switch (record->table->header.domain) { + case GRN_ID_NIL : + case GRN_DB_SHORT_TEXT : + GRN_SHORT_TEXT_INIT(&(record->key), 0); + break; + default : + GRN_VALUE_FIX_SIZE_INIT(&(record->key), 0, record->table->header.domain); + break; + } + + DATA_PTR(self) = record; + + mrb_iv_set(mrb, self, mrb_intern_lit(mrb, "@table"), mrb_table); + mrb_iv_set(mrb, self, mrb_intern_lit(mrb, "@id"), mrb_id); + + return self; +} + +static mrb_value +mrb_grn_record_set_id(mrb_state *mrb, mrb_value self) +{ + grn_mrb_record *record; + mrb_value mrb_id; + + record = DATA_PTR(self); + mrb_get_args(mrb, "o", &mrb_id); + + if (mrb_nil_p(mrb_id)) { + record->id = GRN_ID_NIL; + } else { + record->id = mrb_fixnum(mrb_id); + } + mrb_iv_set(mrb, self, mrb_intern_lit(mrb, "@id"), mrb_id); + + return mrb_id; +} + +static mrb_value +mrb_grn_record_key(mrb_state *mrb, mrb_value self) +{ + grn_ctx *ctx = (grn_ctx *)mrb->ud; + grn_mrb_record *record; + int key_size; + + record = DATA_PTR(self); + + if (record->id == GRN_ID_NIL) { + return mrb_nil_value(); + } + + if (record->table->header.type == GRN_TABLE_NO_KEY) { + return mrb_nil_value(); + } + + GRN_BULK_REWIND(&(record->key)); + key_size = grn_table_get_key(ctx, record->table, record->id, + GRN_BULK_HEAD(&(record->key)), + GRN_BULK_VSIZE(&(record->key))); + if (key_size > GRN_BULK_VSIZE(&(record->key))) { + grn_bulk_space(ctx, &(record->key), key_size); + key_size = grn_table_get_key(ctx, record->table, record->id, + GRN_BULK_HEAD(&(record->key)), + GRN_BULK_VSIZE(&(record->key))); + } + + return grn_mrb_value_from_bulk(mrb, &(record->key)); +} + +void +grn_mrb_record_init(grn_ctx *ctx) +{ + grn_mrb_data *data = &(ctx->impl->mrb); + mrb_state *mrb = data->state; + struct RClass *module = data->module; + struct RClass *klass; + + klass = mrb_define_class_under(mrb, module, "Record", data->object_class); + MRB_SET_INSTANCE_TT(klass, MRB_TT_DATA); + mrb_define_method(mrb, klass, "initialize", + mrb_grn_record_initialize, MRB_ARGS_REQ(2)); + + mrb_define_method(mrb, klass, "id=", + mrb_grn_record_set_id, MRB_ARGS_REQ(1)); + + mrb_define_method(mrb, klass, "key", + mrb_grn_record_key, MRB_ARGS_NONE()); +} +#endif Added: lib/mrb/mrb_record.h (+34 -0) 100644 =================================================================== --- /dev/null +++ lib/mrb/mrb_record.h 2015-07-06 14:05:54 +0900 (3a7eccb) @@ -0,0 +1,34 @@ +/* -*- c-basic-offset: 2 -*- */ +/* + Copyright(C) 2015 Brazil + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License version 2.1 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef GRN_MRB_RECORD_H +#define GRN_MRB_RECORD_H + +#include "../grn_ctx.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void grn_mrb_record_init(grn_ctx *ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* GRN_MRB_RECORD_H */ Modified: lib/mrb/scripts/initialize/post.rb (+1 -0) =================================================================== --- lib/mrb/scripts/initialize/post.rb 2015-07-05 08:42:12 +0900 (ccd4475) +++ lib/mrb/scripts/initialize/post.rb 2015-07-06 14:05:54 +0900 (96bea42) @@ -7,6 +7,7 @@ require "writer" require "object" require "database" require "table" +require "record" require "index_column" require "command" require "table_cursor" Added: lib/mrb/scripts/record.rb (+12 -0) 100644 =================================================================== --- /dev/null +++ lib/mrb/scripts/record.rb 2015-07-06 14:05:54 +0900 (ac49275) @@ -0,0 +1,12 @@ +module Groonga + class Record + attr_reader :table + attr_reader :id + + def inspect + super.gsub(/>\z/) do + "@id=#{@id.inspect}, @table=#{@table.inspect}>" + end + end + end +end Modified: lib/mrb/sources.am (+2 -0) =================================================================== --- lib/mrb/sources.am 2015-07-05 08:42:12 +0900 (b27e365) +++ lib/mrb/sources.am 2015-07-06 14:05:54 +0900 (0bb712e) @@ -49,6 +49,8 @@ libgrnmrb_la_SOURCES = \ mrb_patricia_trie.h \ mrb_procedure.c \ mrb_procedure.h \ + mrb_record.c \ + mrb_record.h \ mrb_table.c \ mrb_table.h \ mrb_table_cursor.c \ -------------- next part -------------- HTML����������������������������...Download