Class: Groonga::Database

Inherits:
Object
  • Object
show all
Includes:
Enumerable, EncodingSupport, Flushable
Defined in:
ext/groonga/rb-grn-database.c,
lib/groonga/database.rb,
ext/groonga/rb-grn-database.c

Overview

テーブルの集合を管理するためのオブジェクト。

コンテキストに結びつけて使用する。通常、アプリケーション 毎に1つのコンテキストを利用するので、データベースも1つだ け利用する。コンテキストと違い、データベースは暗黙のうち に作成されないので明示的に作成する必要がある。

Class Method Summary collapse

  • .create(options = nil) ⇒ Groonga::Database

    新しくデータベースを作成する。 options にはハッシュでオプションを指定する。.

  • .open ⇒ Object

    既存のデータベースを開く。ブロックを指定した場合はブロッ クに開いたデータベースを渡し、ブロックを抜けるときに閉じ る。 options にはハッシュでオプションを指定する。.

Instance Method Summary collapse

Methods included from EncodingSupport

#encoding

Methods included from Flushable

#flush

Methods inherited from Object

#==, #[], #[]=, #accessor?, #append, #builtin?, #closed?, #column?, #dirty?, #domain, #function_procedure?, #id, #index_column?, #inspect, #key_accessor?, #last_modified, #name, #path, #persistent?, #prepend, #procedure?, #range, #reference_column?, #remove, #scorer_procedure?, #selector_only_procedure?, #selector_procedure?, #table?, #temporary?, #unlink, #window_function_procedure?

Constructor Details

#new(path, options = nil) ⇒ Groonga::Database #new(path, options = nil) {|database| ... } ⇒ Object

既存のデータベースを開く。ブロックを指定した場合はブロッ クに開いたデータベースを渡し、ブロックを抜けるときに閉じ る。

Overloads:

  • #new(path, options = nil) ⇒ Groonga::Database

    Parameters:

    • options (::Hash) (defaults to: nil)

      The name and value pairs. Omitted names are initialized as the default value.

    Options Hash (options):

    • :context (Object) — default: Groonga::Context.default

      データベースを結びつけるコンテキスト。省略すると Context.default を利用する。

  • #new(path, options = nil) {|database| ... } ⇒ Object

    Parameters:

    • options (::Hash) (defaults to: nil)

      The name and value pairs. Omitted names are initialized as the default value.

    Options Hash (options):

    • :context (Object) — default: Groonga::Context.default

      データベースを結びつけるコンテキスト。省略すると Context.default を利用する。

    Yields:

    • (database)

    Yield Parameters:



238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
# File 'ext/groonga/rb-grn-database.c', line 238

static VALUE
rb_grn_database_initialize (int argc, VALUE *argv, VALUE self)
{
    grn_ctx *context;
    grn_obj *old_database, *database;
    const char *path;
    VALUE rb_path, options, rb_context;

    rb_scan_args(argc, argv, "11", &rb_path, &options);

    path = StringValuePtr(rb_path);
    rb_grn_scan_options(options,
                        "context", &rb_context,
                        NULL);

    context = rb_grn_context_ensure(&rb_context);

    old_database = grn_ctx_db(context);
    if (old_database)
        grn_obj_unlink(context, old_database);
    reset_floating_objects(rb_context);
    database = grn_db_open(context, path);
    rb_grn_object_assign(Qnil, self, rb_context, context, database);
    rb_grn_context_check(context, self);

    rb_iv_set(self, "@context", rb_context);
    if (!NIL_P(rb_context))
        rb_iv_set(rb_context, "database", self);

    return Qnil;
}

Class Method Details

.create(options = nil) ⇒ Groonga::Database

新しくデータベースを作成する。 options にはハッシュでオプションを指定する。

Examples:

# 一時データベースを作成:
Groonga::Database.create

# 永続データベースを作成:
Groonga::Database.create(:path => "/tmp/db.groonga")

Returns 作成されたデータベースを返す。

Parameters:

  • options (::Hash) (defaults to: nil)

    The name and value pairs. Omitted names are initialized as the default value.

Options Hash (options):

  • :path (Object)

    データベースを保存するパス。省略すると一時データベース となる。

  • :context (Object) — default: Groonga::Context.default

    データベースを結びつけるコンテキスト。省略すると Context.default を利用する。

Returns:



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'ext/groonga/rb-grn-database.c', line 173

static VALUE
rb_grn_database_s_create (int argc, VALUE *argv, VALUE klass)
{
    grn_ctx *context;
    grn_obj *old_database, *database;
    grn_db_create_optarg create_args;
    const char *path = NULL;
    VALUE rb_database;
    VALUE rb_path, options, rb_context, builtin_type_names;
    grn_bool owner;

    rb_scan_args(argc, argv, "01", &options);

    rb_grn_scan_options(options,
                        "path", &rb_path,
                        "context", &rb_context,
                        "builtin_type_names", &builtin_type_names,
                        NULL);

    if (!NIL_P(rb_path))
        path = StringValuePtr(rb_path);
    context = rb_grn_context_ensure(&rb_context);

    create_args.builtin_type_names = NULL;
    create_args.n_builtin_type_names = 0;

    old_database = grn_ctx_db(context);
    if (old_database)
        grn_obj_unlink(context, old_database);
    reset_floating_objects(rb_context);
    database = grn_db_create(context, path, &create_args);
    rb_grn_context_check(context, rb_ary_new_from_values(argc, argv));
    owner = (context->flags & GRN_CTX_PER_DB) ? GRN_FALSE : GRN_TRUE;
    rb_database = GRNOBJECT2RVAL(klass, context, database, owner);
    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_new_from_values(argc, argv));

    if (rb_block_given_p())
        return rb_ensure(rb_yield, rb_database,
                         rb_grn_database_close, rb_database);
    else
        return rb_database;
}

.open(path, options = nil) ⇒ Groonga::Database .open(path, options = nil) {|database| ... } ⇒ Object

既存のデータベースを開く。ブロックを指定した場合はブロッ クに開いたデータベースを渡し、ブロックを抜けるときに閉じ る。 options にはハッシュでオプションを指定する。

Overloads:

  • .open(path, options = nil) ⇒ Groonga::Database

    Parameters:

    • options (::Hash) (defaults to: nil)

      The name and value pairs. Omitted names are initialized as the default value.

    Options Hash (options):

    • :context (Object) — default: Groonga::Context.default

      The context データベースを結びつけるコンテキスト。

    Returns:

  • .open(path, options = nil) {|database| ... } ⇒ Object

    Parameters:

    • options (::Hash) (defaults to: nil)

      The name and value pairs. Omitted names are initialized as the default value.

    Options Hash (options):

    • :context (Object) — default: Groonga::Context.default

      The context データベースを結びつけるコンテキスト。

    Yields:

    • (database)

    Yield Parameters:



290
291
292
293
294
295
296
297
298
299
300
301
# File 'ext/groonga/rb-grn-database.c', line 290

static VALUE
rb_grn_database_s_open (int argc, VALUE *argv, VALUE klass)
{
    VALUE database;

    database = rb_obj_alloc(klass);
    rb_grn_database_initialize(argc, argv, database);
    if (rb_block_given_p())
        return rb_ensure(rb_yield, database, rb_grn_database_close, database);
    else
        return database;
}

Instance Method Details

#clear_lockObject

database のロックを強制的に解除する。



480
481
482
483
484
485
486
487
488
489
490
491
492
# File 'ext/groonga/rb-grn-database.c', line 480

static VALUE
rb_grn_database_clear_lock (VALUE self)
{
    grn_ctx *context;
    grn_obj *database;

    rb_grn_database_deconstruct(SELF(self), &database, &context,
                                NULL, NULL, NULL, NULL);

    grn_obj_clear_lock(context, database);

    return Qnil;
}

#closeObject

database が使用しているリソースを開放する。これ以降 database を 使うことはできない。



131
132
133
134
135
136
137
138
139
140
141
# File 'ext/groonga/rb-grn-database.c', line 131

static VALUE
rb_grn_database_close (VALUE self)
{
    VALUE rb_context;

    rb_context = rb_iv_get(self, "@context");
    if (!NIL_P(rb_context))
        rb_iv_set(rb_context, "database", Qnil);

    return rb_grn_object_close(self);
}

#defrag(options = {}) ⇒ Integer

Defrags all variable size columns in the database.

Parameters:

  • options (::Hash) (defaults to: {})

    option for defrag

Options Hash (options):

  • :threshold (Integer) — default: 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.

Returns:

  • (Integer)

    the number of defraged segments

Since:

  • 1.2.6



541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
# File 'ext/groonga/rb-grn-database.c', line 541

static VALUE
rb_grn_database_defrag (int argc, VALUE *argv, VALUE self)
{
    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);
}

#disk_usageObject



47
48
49
50
51
52
53
54
55
# File 'lib/groonga/database.rb', line 47

def disk_usage
  return 0 if path.nil?

  usage = 0
  measurer = StatisticMeasurer.new
  usage += measurer.measure_disk_usage(path)
  usage += measurer.measure_disk_usage("%s.%07X" % [path, 0])
  usage
end

#dump_index(output_directory) ⇒ Object



57
58
59
60
61
62
# File 'lib/groonga/database.rb', line 57

def dump_index(output_directory)
  each do |object|
    next unless object.is_a?(Groonga::IndexColumn)
    object.dump(output_directory)
  end
end

#each(options = nil) {|object| ... } ⇒ Object #each(options = nil) {|object| ... } ⇒ Object

データベース内のオブジェクトを順番にブロックに渡す。

Examples:

すべてのオブジェクトの名前を表示する:

database.each do |object|
  p object.name
end

すべてのオブジェクトの名前をID順で表示する:

database.each(:order_by => :id) do |object|
  p object.name
end

すべてのオブジェクトの名前をキー名の降順で表示する:

database.each(:order_by => :key, :order => :desc) do |object|
  p object.name
end

Overloads:

  • #each(options = nil) {|object| ... } ⇒ Object

    Parameters:

    • options (::Hash) (defaults to: nil)

    Options Hash (options):

    • :order (Object)

      +:asc+ または +:ascending+ を指定すると昇順にレコードを取 り出す。(デフォルト) +:desc+ または +:descending+ を指定すると降順にレコードを 取り出す。

    • :order_by (Object) — default: :key

      +:id+ を指定するとID順にレコードを取り出す。 +:key+ 指定するとキー順にレコードを取り出す。(デフォル ト)

    Yields:

    • (object)
  • #each(options = nil) {|object| ... } ⇒ Object

    Parameters:

    • options (::Hash) (defaults to: nil)

    Options Hash (options):

    • :order (Object)

      +:asc+ または +:ascending+ を指定すると昇順にレコードを取 り出す。(デフォルト) +:desc+ または +:descending+ を指定すると降順にレコードを 取り出す。

    • :order_by (Object) — default: :key

      +:id+ を指定するとID順にレコードを取り出す。 +:key+ 指定するとキー順にレコードを取り出す。(デフォル ト)

    • :ignore_missing_object (Object) — default: false

      Specify +true+ to ignore missing object. Otherwise, an exception is raised for missing object.

    Yields:

    • (object)

    Since:

    • 2.0.5



344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
# File 'ext/groonga/rb-grn-database.c', line 344

static VALUE
rb_grn_database_each (int argc, VALUE *argv, VALUE self)
{
    grn_ctx *context = NULL;
    grn_obj *database;
    grn_table_cursor *cursor;
    VALUE rb_cursor, rb_options, rb_order, rb_order_by;
    VALUE rb_ignore_missing_object;
    int flags = 0;
    grn_id id;
    VALUE exception;

    RETURN_ENUMERATOR(self, argc, argv);

    rb_grn_database_deconstruct(SELF(self), &database, &context,
                                NULL, NULL, NULL, NULL);

    rb_scan_args(argc, argv, "01", &rb_options);

    rb_grn_scan_options(rb_options,
                        "order", &rb_order,
                        "order_by", &rb_order_by,
                        "ignore_missing_object", &rb_ignore_missing_object,
                        NULL);

    flags |= rb_grn_table_cursor_order_to_flag(rb_order);
    flags |= rb_grn_table_cursor_order_by_to_flag(GRN_TABLE_PAT_KEY,
                                                  self,
                                                  rb_order_by);

    cursor = grn_table_cursor_open(context, database, NULL, 0, NULL, 0,
                                   0, -1,
                                   flags);
    rb_cursor = GRNTABLECURSOR2RVAL(Qnil, context, cursor);
    rb_iv_set(self, "cursor", rb_cursor);
    while ((id = grn_table_cursor_next(context, cursor)) != GRN_ID_NIL) {
        grn_obj *object;

        object = grn_ctx_at(context, id);
        if (!object && RTEST(rb_ignore_missing_object)) {
            context->rc = GRN_SUCCESS;
            continue;
        }

        exception = rb_grn_context_to_exception(context, self);
        if (!NIL_P(exception)) {
            rb_grn_object_close(rb_cursor);
            rb_iv_set(self, "cursor", Qnil);
            rb_exc_raise(exception);
        }

        if (object) {
            rb_yield(GRNOBJECT2RVAL(Qnil, context, object, GRN_FALSE));
        }
    }
    rb_grn_object_close(rb_cursor);
    rb_iv_set(self, "cursor", Qnil);

    return Qnil;
}

#lock(options = {}) ⇒ Object #lock(options = {}) { ... } ⇒ Object

database をロックする。ロックに失敗した場合は ResourceDeadlockAvoided 例外が発生する。

Overloads:

  • #lock(options = {}) ⇒ Object

    Parameters:

    • options (::Hash) (defaults to: {})

      利用可能なオプションは以下の通り。

    Options Hash (options):

    • :timeout (Object)

      ロックを獲得できなかった場合は :timeout 秒間ロックの獲 得を試みる。 :timeout 秒以内にロックを獲得できなかった 場合は例外が発生する。

  • #lock(options = {}) { ... } ⇒ Object

    Parameters:

    • options (::Hash) (defaults to: {})

      利用可能なオプションは以下の通り。

    Options Hash (options):

    • :timeout (Object)

      ロックを獲得できなかった場合は :timeout 秒間ロックの獲 得を試みる。 :timeout 秒以内にロックを獲得できなかった 場合は例外が発生する。

    Yields:

    • ブロックを指定した場合はブロックを抜けたときにunlockする。



443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
# File 'ext/groonga/rb-grn-database.c', line 443

static VALUE
rb_grn_database_lock (int argc, VALUE *argv, VALUE self)
{
    grn_ctx *context;
    grn_obj *database;
    int timeout = 0;
    grn_rc rc;
    VALUE options, rb_timeout;

    rb_scan_args(argc, argv, "01",  &options);

    rb_grn_database_deconstruct(SELF(self), &database, &context,
                                NULL, NULL, NULL, NULL);

    rb_grn_scan_options(options,
                        "timeout", &rb_timeout,
                        NULL);

    if (!NIL_P(rb_timeout))
        timeout = NUM2UINT(rb_timeout);

    rc = grn_obj_lock(context, database, GRN_ID_NIL, timeout);
    rb_grn_context_check(context, self);
    rb_grn_rc_check(rc, self);

    if (rb_block_given_p()) {
        return rb_ensure(rb_yield, Qnil, rb_grn_database_unlock, self);
    } else {
        return Qnil;
    }
}

#locked?Boolean

database がロックされていれば +true+ を返す。

Returns:

  • (Boolean)


499
500
501
502
503
504
505
506
507
508
509
# File 'ext/groonga/rb-grn-database.c', line 499

static VALUE
rb_grn_database_is_locked (VALUE self)
{
    grn_ctx *context;
    grn_obj *database;

    rb_grn_database_deconstruct(SELF(self), &database, &context,
                                NULL, NULL, NULL, NULL);

    return CBOOL2RVAL(grn_obj_is_locked(context, database));
}

#plugin_pathsArray<String>

Returns registered plugin paths.

Returns:

  • (Array<String>)

    registered plugin paths.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/groonga/database.rb', line 32

def plugin_paths
  processed_paths = {}
  paths = []
  each(:ignore_missing_object => true, :order_by => :id) do |object|
    next unless object.is_a?(Groonga::Procedure)
    next if object.builtin?
    path = object.path
    next if path.nil?
    next if processed_paths.has_key?(path)
    processed_paths[path] = true
    paths << path
  end
  paths
end

#recovervoid

Recovers database.

This method returns an undefined value.

If the database is broken, try to recover the database. If the database can’t be recovered, an Error family exception is raised.

If the database isn’t broken, it does nothing.

Since:

  • 4.0.8



581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
# File 'ext/groonga/rb-grn-database.c', line 581

static VALUE
rb_grn_database_recover (VALUE self)
{
    grn_rc rc;
    grn_ctx *context;
    grn_obj *database;

    rb_grn_database_deconstruct(SELF(self), &database, &context,
                                NULL, NULL, NULL, NULL);
    rc = grn_db_recover(context, database);
    rb_grn_context_check(context, self);
    rb_grn_rc_check(rc, self);

    return Qnil;
}

#reindexvoid

Recreates all index columns in the database.

This method is useful when you have any broken index columns in the database. You don’t need to specify each index column. But this method spends more time rather than you specify only reindex needed index columns.

You can use TableKeySupport#reindex to specify reindex target index columns in a table.

You can use FixSizeColumn#reindex or VariableSizeColumn#reindex to specify reindex target index columns. They use index columns of the data column as reindex target index columns.

You can use IndexColumn#reindex to specify the reindex target index column.

Examples:

How to recreate all index columns in the database

database = Groonga::Database.create(:path => "/tmp/db")

Groonga::Schema.define do |schema|
  schema.create_table("Memos") do |table|
    table.short_text("title")
    table.text("content")
  end

  schema.create_table("BigramTerms",
                      :type => :patricia_trie,
                      :key_type => :short_text,
                      :normalizer => "NormalizerAuto",
                      :default_tokenizer => "TokenBigram") do |table|
    table.index("Memos.title")
    table.index("Memos.content")
  end

  schema.create_table("MeCabTerms",
                      :type => :patricia_trie,
                      :key_type => :short_text,
                      :normalizer => "NormalizerAuto",
                      :default_tokenizer => "TokenMecab") do |table|
    table.index("Memos.title")
    table.index("Memos.content")
  end
end

database.reindex
# They are called:
#   Groonga["BigramTerms.Memos_title"].reindex
#   Groonga["BigramTerms.Memos_content"].reindex
#   Groonga["MeCabTerms.Memos_title"].reindex
#   Groonga["MeCabTerms.Memos_content"].reindex

This method returns an undefined value.

See Also:

Since:

  • 5.1.1



691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
# File 'ext/groonga/rb-grn-database.c', line 691

static VALUE
rb_grn_database_reindex (VALUE self)
{
    grn_rc rc;
    grn_ctx *context;
    grn_obj *database;

    rb_grn_database_deconstruct(SELF(self), &database, &context,
                                NULL, NULL, NULL, NULL);

    rc = grn_obj_reindex(context, database);
    rb_grn_context_check(context, self);
    rb_grn_rc_check(rc, self);

    return Qnil;
}

#remove_force(name) ⇒ Object

Removes an object forcibly.

Normally, you should use Object#remove.

Parameters:

  • name (String)

    The target object name.

Since:

  • 6.0.9



719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
# File 'ext/groonga/rb-grn-database.c', line 719

static VALUE
rb_grn_database_remove_force (VALUE self, VALUE rb_name)
{
    grn_rc rc;
    grn_ctx *context;
    char *name;
    int name_size;

    rb_grn_database_deconstruct(SELF(self), NULL, &context,
                                NULL, NULL, NULL, NULL);

    name = StringValueCStr(rb_name);
    name_size = RSTRING_LEN(rb_name);

    rc = grn_obj_remove_force(context, name, name_size);
    rb_grn_context_check(context, self);
    rb_grn_rc_check(rc, self);

    return Qnil;
}

#tablesArray<Groonga::Table>

Returns tables defined in the database.

Returns:



21
22
23
24
25
26
27
28
29
# File 'lib/groonga/database.rb', line 21

def tables
  options = {
    :ignore_missing_object => true,
    :order_by => :key,
  }
  each(options).find_all do |object|
    object.is_a?(Groonga::Table)
  end
end

#touchObject

database の最終更新時刻を現在時刻にする。



516
517
518
519
520
521
522
523
524
525
526
527
# File 'ext/groonga/rb-grn-database.c', line 516

static VALUE
rb_grn_database_touch (VALUE self)
{
    grn_ctx *context;
    grn_obj *database;

    rb_grn_database_deconstruct(SELF(self), &database, &context,
                                NULL, NULL, NULL, NULL);

    grn_db_touch(context, database);
    return Qnil;
}

#unlockObject

database のロックを解除する。



410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
# File 'ext/groonga/rb-grn-database.c', line 410

static VALUE
rb_grn_database_unlock (VALUE self)
{
    grn_ctx *context;
    grn_obj *database;
    grn_rc rc;

    rb_grn_database_deconstruct(SELF(self), &database, &context,
                                NULL, NULL, NULL, NULL);

    rc = grn_obj_unlock(context, database, GRN_ID_NIL);
    rb_grn_context_check(context, self);
    rb_grn_rc_check(rc, self);

    return Qnil;
}

#unmapvoid

This method returns an undefined value.

Unmaps all mapped tables and columns in database.

It frees resources for them.

Normally, you don’t need to unmap explicitly. Because OS manages resourced for mapped tables and columns cleverly.

Since:

  • 5.0.5



611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
# File 'ext/groonga/rb-grn-database.c', line 611

static VALUE
rb_grn_database_unmap (VALUE self)
{
    grn_rc rc;
    grn_ctx *context;
    grn_obj *database;

    rb_grn_database_deconstruct(SELF(self), &database, &context,
                                NULL, NULL, NULL, NULL);
    rc = grn_db_unmap(context, database);
    rb_grn_context_check(context, self);
    rb_grn_rc_check(rc, self);

    return Qnil;
}