ext/groonga/rb-grn-database.c in rroonga-1.2.5 vs ext/groonga/rb-grn-database.c in rroonga-1.2.6

- old
+ new

@@ -193,11 +193,11 @@ old_database = grn_ctx_db(context); if (old_database) grn_obj_unlink(context, old_database); database = grn_db_create(context, path, &create_args); rb_grn_context_check(context, rb_ary_new4(argc, argv)); - rb_database = GRNOBJECT2RVAL(klass, context, database, GRN_TRUE); + rb_database = GRNOBJECT2RVAL(klass, context, database, GRN_FALSE); rb_iv_set(rb_database, "@context", rb_context); if (!NIL_P(rb_context)) rb_iv_set(rb_context, "database", rb_database); rb_grn_context_check(context, rb_ary_new4(argc, argv)); @@ -502,10 +502,51 @@ grn_db_touch(context, database); return Qnil; } +/* + * Document-method: defrag + * + * call-seq: + * database.defrag(options={}) -> n_segments + * + * Defrags all variable size columns in the database. + * + * @return [Integer] the number of defraged segments + * @option options [Integer] :threshold (0) the threshold to + * determine whether a segment is defraged. Available + * values are -4..22. -4 means all segments are defraged. + * 22 means no segment is defraged. + * @since 1.2.6 + */ +static VALUE +rb_grn_database_defrag (int argc, VALUE *argv, VALUE self) +{ + RbGrnColumn *rb_grn_column; + grn_ctx *context; + grn_obj *database; + int n_segments; + VALUE options, rb_threshold; + int threshold = 0; + + rb_scan_args(argc, argv, "01", &options); + rb_grn_scan_options(options, + "threshold", &rb_threshold, + NULL); + if (!NIL_P(rb_threshold)) { + threshold = NUM2INT(rb_threshold); + } + + rb_grn_database_deconstruct(SELF(self), &database, &context, + NULL, NULL, NULL, NULL); + n_segments = grn_obj_defrag(context, database, threshold); + rb_grn_context_check(context, self); + + return INT2NUM(n_segments); +} + void rb_grn_init_database (VALUE mGrn) { rb_cGrnDatabase = rb_define_class_under(mGrn, "Database", rb_cGrnObject); rb_define_alloc_func(rb_cGrnDatabase, rb_grn_database_alloc); @@ -532,6 +573,7 @@ rb_define_method(rb_cGrnDatabase, "clear_lock", rb_grn_database_clear_lock, 0); rb_define_method(rb_cGrnDatabase, "locked?", rb_grn_database_is_locked, 0); rb_define_method(rb_cGrnDatabase, "touch", rb_grn_database_touch, 0); + rb_define_method(rb_cGrnDatabase, "defrag", rb_grn_database_defrag, -1); }