Kouhei Sutou
null+****@clear*****
Fri Apr 22 18:21:31 JST 2016
Kouhei Sutou 2016-04-22 18:21:31 +0900 (Fri, 22 Apr 2016) New Revision: db8d29825dadbc84cdf2874684d9487c2c1a0e72 https://github.com/ranguba/rroonga/commit/db8d29825dadbc84cdf2874684d9487c2c1a0e72 Message: Add Groonga::Object#remove(:dependent => true) Modified files: ext/groonga/rb-grn-object.c test/test-table.rb Modified: ext/groonga/rb-grn-object.c (+28 -6) =================================================================== --- ext/groonga/rb-grn-object.c 2016-04-20 22:14:29 +0900 (904e7fa) +++ ext/groonga/rb-grn-object.c 2016-04-22 18:21:31 +0900 (6ef3a33) @@ -1461,23 +1461,45 @@ rb_grn_object_prepend_value (VALUE self, VALUE rb_id, VALUE rb_value) } /* - * _object_ をメモリから解放し、それが永続オブジェクトであっ - * た場合は、該当するファイル一式を削除する。 + * Free the `object`. If the `object` is persistent object, all files + * related with the object are removed. * - * @overload remove + * @overload remove(options={}) + * + * @param [::Hash] options The optional parameters. + * + * @option options [Boolean] :dependent (false) + * If it's `true`, all tables and columns that depend on the + * `object`. */ static VALUE -rb_grn_object_remove (VALUE self) +rb_grn_object_remove (int argc, VALUE *argv, VALUE self) { RbGrnObject *rb_grn_object; grn_ctx *context; + VALUE rb_options; + VALUE rb_dependent_p; + grn_bool dependent_p = GRN_FALSE; rb_grn_object = SELF(self); if (!rb_grn_object->object) return Qnil; + rb_scan_args(argc, argv, "01", &rb_options); + rb_grn_scan_options(rb_options, + "dependent", &rb_dependent_p, + NULL); + + if (!NIL_P(rb_dependent_p)) { + dependent_p = RVAL2CBOOL(rb_dependent_p); + } + context = rb_grn_object->context; - grn_obj_remove(context, rb_grn_object->object); + if (dependent_p) { + grn_obj_remove_dependent(context, rb_grn_object->object); + } else { + grn_obj_remove(context, rb_grn_object->object); + } rb_grn_context_check(context, self); rb_iv_set(self, "@context", Qnil); @@ -1750,7 +1772,7 @@ rb_grn_init_object (VALUE mGrn) rb_define_method(rb_cGrnObject, "append", rb_grn_object_append_value, 2); rb_define_method(rb_cGrnObject, "prepend", rb_grn_object_prepend_value, 2); - rb_define_method(rb_cGrnObject, "remove", rb_grn_object_remove, 0); + rb_define_method(rb_cGrnObject, "remove", rb_grn_object_remove, -1); rb_define_method(rb_cGrnObject, "builtin?", rb_grn_object_builtin_p, 0); rb_define_method(rb_cGrnObject, "table?", rb_grn_object_table_p, 0); Modified: test/test-table.rb (+43 -7) =================================================================== --- test/test-table.rb 2016-04-20 22:14:29 +0900 (cbf8b26) +++ test/test-table.rb 2016-04-22 18:21:31 +0900 (ec6b66a) @@ -302,13 +302,49 @@ class TableTest < Test::Unit::TestCase end end - def test_remove - bookmarks_path = @tables_dir + "bookmarks" - bookmarks = Groonga::Array.create(:name => "Bookmarks", - :path => bookmarks_path.to_s) - assert_predicate(bookmarks_path, :exist?) - bookmarks.remove - assert_not_predicate(bookmarks_path, :exist?) + class RemoveTest < self + def test_default + bookmarks_path = @tables_dir + "bookmarks" + bookmarks = Groonga::Array.create(:name => "Bookmarks", + :path => bookmarks_path.to_s) + assert_predicate(bookmarks_path, :exist?) + bookmarks.remove + assert_not_predicate(bookmarks_path, :exist?) + end + + def test_dependent + names_path = @tables_dir + "names" + names = Groonga::Hash.create(:name => "Names", + :path => names_path.to_s, + :key_type => "ShortText") + users_path = @tables_dir + "users" + Groonga::Hash.create(:name => "Users", + :path => users_path.to_s, + :key_type => "Names") + administrators_path = @tables_dir + "administrators" + Groonga::Hash.create(:name => "Administrator", + :path => administrators_path.to_s, + :key_type => "Names") + members_path = @tables_dir + "members" + members = Groonga::Hash.create(:name => "Members", + :path => members_path.to_s, + :key_type => "ShortText") + members_name_path = @columns_dir + "name" + members.define_column("name", "Names", + :path => members_name_path.to_s) + + assert {names_path.exist?} + assert {users_path.exist?} + assert {administrators_path.exist?} + assert {members_path.exist?} + assert {members_name_path.exist?} + names.remove(:dependent => true) + assert {not names_path.exist?} + assert {not users_path.exist?} + assert {not administrators_path.exist?} + assert {members_path.exist?} + assert {not members_name_path.exist?} + end end def test_temporary_add -------------- next part -------------- HTML����������������������������...다운로드