groonga 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/NEWS.ja.rdoc +11 -0
- data/NEWS.rdoc +11 -0
- data/README.ja.rdoc +4 -3
- data/README.rdoc +4 -3
- data/Rakefile +1 -1
- data/TUTORIAL.ja.rdoc +168 -44
- data/benchmark/common.rb +49 -0
- data/benchmark/read-write-small-many-items.rb +156 -0
- data/benchmark/write-small-many-items.rb +145 -0
- data/example/bookmark.rb +68 -20
- data/ext/rb-grn-array-cursor.c +8 -0
- data/ext/rb-grn-array.c +40 -11
- data/ext/rb-grn-column.c +38 -209
- data/ext/rb-grn-context.c +203 -56
- data/ext/rb-grn-database.c +119 -5
- data/ext/rb-grn-encoding-support.c +64 -0
- data/ext/rb-grn-encoding.c +58 -1
- data/ext/rb-grn-fix-size-column.c +220 -0
- data/ext/rb-grn-hash-cursor.c +8 -0
- data/ext/rb-grn-hash.c +244 -2
- data/ext/rb-grn-index-column.c +474 -0
- data/ext/rb-grn-object.c +143 -265
- data/ext/rb-grn-patricia-trie.c +148 -2
- data/ext/rb-grn-query.c +5 -3
- data/ext/rb-grn-record.c +3 -2
- data/ext/rb-grn-snippet.c +5 -3
- data/ext/rb-grn-table-cursor-key-support.c +3 -3
- data/ext/rb-grn-table-cursor.c +106 -112
- data/ext/rb-grn-table-key-support.c +220 -118
- data/ext/rb-grn-table.c +336 -80
- data/ext/rb-grn-type.c +5 -4
- data/ext/rb-grn-utils.c +62 -63
- data/ext/rb-grn.h +215 -14
- data/ext/rb-groonga.c +7 -16
- data/extconf.rb +3 -1
- data/html/favicon.ico +0 -0
- data/html/favicon.xcf +0 -0
- data/html/index.html +1 -7
- data/lib/groonga/record.rb +6 -1
- data/test/groonga-test-utils.rb +1 -0
- data/test/test-array.rb +81 -0
- data/test/test-column.rb +22 -12
- data/test/test-context.rb +1 -29
- data/test/test-database.rb +30 -0
- data/test/test-hash.rb +194 -0
- data/test/test-index-column.rb +57 -0
- data/test/test-patricia-trie.rb +82 -0
- data/test/test-record.rb +10 -10
- data/test/test-table.rb +37 -130
- data/test/test-type.rb +4 -3
- metadata +15 -4
- data/benchmark/small-many-items.rb +0 -175
data/ext/rb-grn-context.c
CHANGED
@@ -20,8 +20,29 @@
|
|
20
20
|
|
21
21
|
#define SELF(object) (RVAL2GRNCONTEXT(object))
|
22
22
|
|
23
|
+
#define OBJECTS_TABLE_NAME "<ranguba:objects>"
|
24
|
+
|
23
25
|
static VALUE cGrnContext;
|
24
26
|
|
27
|
+
/*
|
28
|
+
* Document-class: Groonga::Context
|
29
|
+
*
|
30
|
+
* groonga全体に渡る情報を管理するオブジェクト。通常のアプリ
|
31
|
+
* ケーションでは1つのコンテキストを作成し、それを利用する。
|
32
|
+
* 複数のコンテキストを利用する必要はない。
|
33
|
+
*
|
34
|
+
* デフォルトで使用されるコンテキストは
|
35
|
+
* Groonga::Context#defaultでアクセスできる。コンテキストを
|
36
|
+
* 指定できる箇所でコンテキストの指定を省略したり+nil+を指定
|
37
|
+
* した場合はGroonga::Context.defaultが利用される。
|
38
|
+
*
|
39
|
+
* また、デフォルトのコンテキストは必要になると暗黙のうちに
|
40
|
+
* 作成される。そのため、コンテキストを意識することは少ない。
|
41
|
+
*
|
42
|
+
* 暗黙のうちに作成されるコンテキストにオプションを指定する
|
43
|
+
* 場合はGroonga::Context.default_options=を使用する。
|
44
|
+
*/
|
45
|
+
|
25
46
|
grn_ctx *
|
26
47
|
rb_grn_context_from_ruby_object (VALUE object)
|
27
48
|
{
|
@@ -37,13 +58,90 @@ rb_grn_context_from_ruby_object (VALUE object)
|
|
37
58
|
return context;
|
38
59
|
}
|
39
60
|
|
61
|
+
void
|
62
|
+
rb_grn_context_register (grn_ctx *context, RbGrnObject *object)
|
63
|
+
{
|
64
|
+
grn_obj *objects;
|
65
|
+
|
66
|
+
if (!grn_ctx_db(context))
|
67
|
+
return;
|
68
|
+
|
69
|
+
objects = grn_ctx_get(context,
|
70
|
+
OBJECTS_TABLE_NAME,
|
71
|
+
strlen(OBJECTS_TABLE_NAME));
|
72
|
+
if (!objects)
|
73
|
+
objects = grn_table_create(context,
|
74
|
+
OBJECTS_TABLE_NAME,
|
75
|
+
strlen(OBJECTS_TABLE_NAME),
|
76
|
+
NULL,
|
77
|
+
GRN_OBJ_TABLE_HASH_KEY,
|
78
|
+
grn_ctx_at(context, GRN_DB_UINT64),
|
79
|
+
0);
|
80
|
+
|
81
|
+
grn_table_add(context, objects,
|
82
|
+
&object, sizeof(RbGrnObject *),
|
83
|
+
NULL);
|
84
|
+
}
|
85
|
+
|
86
|
+
void
|
87
|
+
rb_grn_context_unregister (grn_ctx *context, RbGrnObject *object)
|
88
|
+
{
|
89
|
+
grn_obj *objects;
|
90
|
+
|
91
|
+
if (!grn_ctx_db(context))
|
92
|
+
return;
|
93
|
+
|
94
|
+
objects = grn_ctx_get(context,
|
95
|
+
OBJECTS_TABLE_NAME,
|
96
|
+
strlen(OBJECTS_TABLE_NAME));
|
97
|
+
if (!objects)
|
98
|
+
return;
|
99
|
+
|
100
|
+
grn_table_delete(context, objects, &object, sizeof(RbGrnObject *));
|
101
|
+
}
|
102
|
+
|
103
|
+
void
|
104
|
+
rb_grn_context_unbind (grn_ctx *context)
|
105
|
+
{
|
106
|
+
grn_obj *database;
|
107
|
+
grn_obj *objects;
|
108
|
+
|
109
|
+
database = grn_ctx_db(context);
|
110
|
+
if (!database)
|
111
|
+
return;
|
112
|
+
|
113
|
+
objects = grn_ctx_get(context,
|
114
|
+
OBJECTS_TABLE_NAME,
|
115
|
+
strlen(OBJECTS_TABLE_NAME));
|
116
|
+
if (objects) {
|
117
|
+
grn_table_cursor *cursor;
|
118
|
+
|
119
|
+
cursor = grn_table_cursor_open(context, objects, NULL, 0, NULL, 0, 0);
|
120
|
+
while (grn_table_cursor_next(context, cursor) != GRN_ID_NIL) {
|
121
|
+
void *value;
|
122
|
+
RbGrnObject *object = NULL;
|
123
|
+
grn_table_cursor_get_key(context, cursor, &value);
|
124
|
+
memcpy(&object, value, sizeof(RbGrnObject *));
|
125
|
+
object->object = NULL;
|
126
|
+
object->unbind(object);
|
127
|
+
}
|
128
|
+
grn_table_cursor_close(context, cursor);
|
129
|
+
grn_obj_close(context, objects);
|
130
|
+
}
|
131
|
+
|
132
|
+
grn_obj_close(context, database);
|
133
|
+
grn_ctx_use(context, NULL);
|
134
|
+
}
|
135
|
+
|
40
136
|
static void
|
41
137
|
rb_grn_context_free (void *pointer)
|
42
138
|
{
|
43
139
|
grn_ctx *context = pointer;
|
44
140
|
|
45
|
-
if (context->stat != GRN_CTX_FIN)
|
141
|
+
if (context->stat != GRN_CTX_FIN) {
|
142
|
+
rb_grn_context_unbind (context);
|
46
143
|
grn_ctx_fin(context);
|
144
|
+
}
|
47
145
|
xfree(context);
|
48
146
|
}
|
49
147
|
|
@@ -66,21 +164,21 @@ rb_grn_context_to_exception (grn_ctx *context, VALUE related_object)
|
|
66
164
|
exception_class = rb_grn_rc_to_exception(context->rc);
|
67
165
|
message = rb_grn_rc_to_message(context->rc);
|
68
166
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
167
|
+
GRN_OBJ_INIT(&bulk, GRN_BULK, 0, GRN_ID_NIL);
|
168
|
+
GRN_TEXT_PUTS(context, &bulk, message);
|
169
|
+
GRN_TEXT_PUTS(context, &bulk, ": ");
|
170
|
+
GRN_TEXT_PUTS(context, &bulk, context->errbuf);
|
73
171
|
if (!NIL_P(related_object)) {
|
74
|
-
|
75
|
-
|
172
|
+
GRN_TEXT_PUTS(context, &bulk, ": ");
|
173
|
+
GRN_TEXT_PUTS(context, &bulk, rb_grn_inspect(related_object));
|
76
174
|
}
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
175
|
+
GRN_TEXT_PUTS(context, &bulk, "\n");
|
176
|
+
GRN_TEXT_PUTS(context, &bulk, context->errfile);
|
177
|
+
GRN_TEXT_PUTS(context, &bulk, ":");
|
178
|
+
grn_text_itoa(context, &bulk, context->errline);
|
179
|
+
GRN_TEXT_PUTS(context, &bulk, ": ");
|
180
|
+
GRN_TEXT_PUTS(context, &bulk, context->errfunc);
|
181
|
+
GRN_TEXT_PUTS(context, &bulk, "()");
|
84
182
|
exception = rb_funcall(exception_class, rb_intern("new"), 1,
|
85
183
|
rb_str_new(GRN_BULK_HEAD(&bulk),
|
86
184
|
GRN_BULK_VSIZE(&bulk)));
|
@@ -102,13 +200,24 @@ rb_grn_context_check (grn_ctx *context, VALUE related_object)
|
|
102
200
|
}
|
103
201
|
|
104
202
|
grn_ctx *
|
105
|
-
rb_grn_context_ensure (VALUE context)
|
203
|
+
rb_grn_context_ensure (VALUE *context)
|
106
204
|
{
|
107
|
-
if (NIL_P(context))
|
108
|
-
context = rb_grn_context_get_default();
|
109
|
-
return SELF(context);
|
205
|
+
if (NIL_P(*context))
|
206
|
+
*context = rb_grn_context_get_default();
|
207
|
+
return SELF(*context);
|
110
208
|
}
|
111
209
|
|
210
|
+
/*
|
211
|
+
* call-seq:
|
212
|
+
* Groonga::Context.default -> Groonga::Context
|
213
|
+
*
|
214
|
+
* デフォルトのコンテキストを返す。デフォルトのコンテキスト
|
215
|
+
* が作成されていない場合は暗黙のうちに作成し、それを返す。
|
216
|
+
*
|
217
|
+
* 暗黙のうちにコンテキストを作成する場合は、
|
218
|
+
* Groonga::Context.default_optionsに設定されているオプショ
|
219
|
+
* ンを利用する。
|
220
|
+
*/
|
112
221
|
static VALUE
|
113
222
|
rb_grn_context_s_get_default (VALUE self)
|
114
223
|
{
|
@@ -128,6 +237,15 @@ rb_grn_context_get_default (void)
|
|
128
237
|
return rb_grn_context_s_get_default(cGrnContext);
|
129
238
|
}
|
130
239
|
|
240
|
+
/*
|
241
|
+
* call-seq:
|
242
|
+
* Groonga::Context.default=(context)
|
243
|
+
*
|
244
|
+
* デフォルトのコンテキストを設定する。+nil+を指定すると、デ
|
245
|
+
* フォルトのコンテキストをリセットする。リセットすると、次
|
246
|
+
* 回Groonga::Context.defaultを呼び出したときに新しくコンテ
|
247
|
+
* キストが作成される。
|
248
|
+
*/
|
131
249
|
static VALUE
|
132
250
|
rb_grn_context_s_set_default (VALUE self, VALUE context)
|
133
251
|
{
|
@@ -135,12 +253,27 @@ rb_grn_context_s_set_default (VALUE self, VALUE context)
|
|
135
253
|
return Qnil;
|
136
254
|
}
|
137
255
|
|
256
|
+
/*
|
257
|
+
* call-seq:
|
258
|
+
* Groonga::Context.default_options -> Hash or nil
|
259
|
+
*
|
260
|
+
* コンテキストを作成する時に利用するデフォルトのオプション
|
261
|
+
* を返す。
|
262
|
+
*/
|
138
263
|
static VALUE
|
139
264
|
rb_grn_context_s_get_default_options (VALUE self)
|
140
265
|
{
|
141
266
|
return rb_cv_get(self, "@@default_options");
|
142
267
|
}
|
143
268
|
|
269
|
+
/*
|
270
|
+
* call-seq:
|
271
|
+
* Groonga::Context.default_options=(options)
|
272
|
+
*
|
273
|
+
* コンテキストを作成する時に利用するデフォルトのオプション
|
274
|
+
* を設定する。利用可能なオプションは
|
275
|
+
* Groonga::Context.newを参照。
|
276
|
+
*/
|
144
277
|
static VALUE
|
145
278
|
rb_grn_context_s_set_default_options (VALUE self, VALUE options)
|
146
279
|
{
|
@@ -148,6 +281,17 @@ rb_grn_context_s_set_default_options (VALUE self, VALUE options)
|
|
148
281
|
return Qnil;
|
149
282
|
}
|
150
283
|
|
284
|
+
/*
|
285
|
+
* call-seq:
|
286
|
+
* Groonga::Context.new(options=nil)
|
287
|
+
*
|
288
|
+
* コンテキストを作成する。_options_に指定可能な値は以下の通
|
289
|
+
* り。
|
290
|
+
*
|
291
|
+
* [+:encoding+]
|
292
|
+
* エンコーディングを指定する。エンコーディングの指定方法
|
293
|
+
* はGroonga::Encodingを参照。
|
294
|
+
*/
|
151
295
|
static VALUE
|
152
296
|
rb_grn_context_initialize (int argc, VALUE *argv, VALUE self)
|
153
297
|
{
|
@@ -155,7 +299,7 @@ rb_grn_context_initialize (int argc, VALUE *argv, VALUE self)
|
|
155
299
|
int flags = 0;
|
156
300
|
grn_rc rc;
|
157
301
|
VALUE options, default_options;
|
158
|
-
VALUE
|
302
|
+
VALUE rb_encoding;
|
159
303
|
|
160
304
|
rb_scan_args(argc, argv, "01", &options);
|
161
305
|
default_options = rb_grn_context_s_get_default_options(rb_obj_class(self));
|
@@ -167,16 +311,9 @@ rb_grn_context_initialize (int argc, VALUE *argv, VALUE self)
|
|
167
311
|
options = rb_funcall(default_options, rb_intern("merge"), 1, options);
|
168
312
|
|
169
313
|
rb_grn_scan_options(options,
|
170
|
-
"use_ql", &use_ql,
|
171
|
-
"batch_mode", &batch_mode,
|
172
314
|
"encoding", &rb_encoding,
|
173
315
|
NULL);
|
174
316
|
|
175
|
-
if (RVAL2CBOOL(use_ql))
|
176
|
-
flags |= GRN_CTX_USE_QL;
|
177
|
-
if (RVAL2CBOOL(batch_mode))
|
178
|
-
flags |= GRN_CTX_BATCH_MODE;
|
179
|
-
|
180
317
|
context = ALLOC(grn_ctx);
|
181
318
|
DATA_PTR(self) = context;
|
182
319
|
rc = grn_ctx_init(context, flags);
|
@@ -192,6 +329,12 @@ rb_grn_context_initialize (int argc, VALUE *argv, VALUE self)
|
|
192
329
|
return Qnil;
|
193
330
|
}
|
194
331
|
|
332
|
+
/*
|
333
|
+
* call-seq:
|
334
|
+
* context.inspect -> String
|
335
|
+
*
|
336
|
+
* コンテキストの中身を人に見やすい文字列で返す。
|
337
|
+
*/
|
195
338
|
static VALUE
|
196
339
|
rb_grn_context_inspect (VALUE self)
|
197
340
|
{
|
@@ -206,20 +349,6 @@ rb_grn_context_inspect (VALUE self)
|
|
206
349
|
rb_str_concat(inspected, rb_inspect(rb_obj_class(self)));
|
207
350
|
rb_str_cat2(inspected, " ");
|
208
351
|
|
209
|
-
rb_str_cat2(inspected, "use_ql: <");
|
210
|
-
if (context->flags & GRN_CTX_USE_QL)
|
211
|
-
rb_str_cat2(inspected, "true");
|
212
|
-
else
|
213
|
-
rb_str_cat2(inspected, "false");
|
214
|
-
rb_str_cat2(inspected, ">, ");
|
215
|
-
|
216
|
-
rb_str_cat2(inspected, "batch_mode: <");
|
217
|
-
if (context->flags & GRN_CTX_BATCH_MODE)
|
218
|
-
rb_str_cat2(inspected, "true");
|
219
|
-
else
|
220
|
-
rb_str_cat2(inspected, "false");
|
221
|
-
rb_str_cat2(inspected, ">, ");
|
222
|
-
|
223
352
|
rb_str_cat2(inspected, "encoding: <");
|
224
353
|
rb_str_concat(inspected, rb_inspect(GRNENCODING2RVAL(context->encoding)));
|
225
354
|
rb_str_cat2(inspected, ">, ");
|
@@ -234,24 +363,25 @@ rb_grn_context_inspect (VALUE self)
|
|
234
363
|
return inspected;
|
235
364
|
}
|
236
365
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
static VALUE
|
244
|
-
rb_grn_context_batch_mode_p (VALUE self)
|
245
|
-
{
|
246
|
-
return CBOOL2RVAL(SELF(self)->flags & GRN_CTX_BATCH_MODE);
|
247
|
-
}
|
248
|
-
|
366
|
+
/*
|
367
|
+
* call-seq:
|
368
|
+
* context.encoding -> Groonga::Encoding
|
369
|
+
*
|
370
|
+
* コンテキストが使うエンコーディングを返す。
|
371
|
+
*/
|
249
372
|
static VALUE
|
250
373
|
rb_grn_context_get_encoding (VALUE self)
|
251
374
|
{
|
252
375
|
return GRNENCODING2RVAL(GRN_CTX_GET_ENCODING(SELF(self)));
|
253
376
|
}
|
254
377
|
|
378
|
+
/*
|
379
|
+
* call-seq:
|
380
|
+
* context.encoding=(encoding)
|
381
|
+
*
|
382
|
+
* コンテキストが使うエンコーディングを設定する。エンコーディ
|
383
|
+
* ングの指定のしかたはGroonga::Encodingを参照。
|
384
|
+
*/
|
255
385
|
static VALUE
|
256
386
|
rb_grn_context_set_encoding (VALUE self, VALUE rb_encoding)
|
257
387
|
{
|
@@ -265,6 +395,12 @@ rb_grn_context_set_encoding (VALUE self, VALUE rb_encoding)
|
|
265
395
|
return rb_encoding;
|
266
396
|
}
|
267
397
|
|
398
|
+
/*
|
399
|
+
* call-seq:
|
400
|
+
* context.database -> Groonga::Database
|
401
|
+
*
|
402
|
+
* コンテキストが使うデータベースを返す。
|
403
|
+
*/
|
268
404
|
static VALUE
|
269
405
|
rb_grn_context_get_database (VALUE self)
|
270
406
|
{
|
@@ -274,6 +410,19 @@ rb_grn_context_get_database (VALUE self)
|
|
274
410
|
return GRNDB2RVAL(context, grn_ctx_db(context), RB_GRN_FALSE);
|
275
411
|
}
|
276
412
|
|
413
|
+
/*
|
414
|
+
* call-seq:
|
415
|
+
* context[name] -> Groonga::Object or nil
|
416
|
+
* context[id] -> Groonga::Object or nil
|
417
|
+
*
|
418
|
+
* コンテキスト管理下にあるオブジェクトを返す。
|
419
|
+
*
|
420
|
+
* _name_として文字列を指定した場合はオブジェクト名でオブジェ
|
421
|
+
* クトを検索する。
|
422
|
+
*
|
423
|
+
* _id_として数値を指定した場合はオブジェクトIDでオブジェク
|
424
|
+
* トを検索する。
|
425
|
+
*/
|
277
426
|
static VALUE
|
278
427
|
rb_grn_context_array_reference (VALUE self, VALUE name_or_id)
|
279
428
|
{
|
@@ -287,11 +436,11 @@ rb_grn_context_array_reference (VALUE self, VALUE name_or_id)
|
|
287
436
|
|
288
437
|
name = StringValuePtr(name_or_id);
|
289
438
|
name_size = RSTRING_LEN(name_or_id);
|
290
|
-
object =
|
439
|
+
object = grn_ctx_get(context, name, name_size);
|
291
440
|
} else if (RVAL2CBOOL(rb_obj_is_kind_of(name_or_id, rb_cInteger))) {
|
292
441
|
unsigned id;
|
293
442
|
id = NUM2UINT(name_or_id);
|
294
|
-
object =
|
443
|
+
object = grn_ctx_at(context, id);
|
295
444
|
} else {
|
296
445
|
rb_raise(rb_eArgError, "should be string or unsigned integer: %s",
|
297
446
|
rb_grn_inspect(name_or_id));
|
@@ -322,8 +471,6 @@ rb_grn_init_context (VALUE mGrn)
|
|
322
471
|
|
323
472
|
rb_define_method(cGrnContext, "inspect", rb_grn_context_inspect, 0);
|
324
473
|
|
325
|
-
rb_define_method(cGrnContext, "use_ql?", rb_grn_context_use_ql_p, 0);
|
326
|
-
rb_define_method(cGrnContext, "batch_mode?", rb_grn_context_batch_mode_p, 0);
|
327
474
|
rb_define_method(cGrnContext, "encoding", rb_grn_context_get_encoding, 0);
|
328
475
|
rb_define_method(cGrnContext, "encoding=", rb_grn_context_set_encoding, 1);
|
329
476
|
|
data/ext/rb-grn-database.c
CHANGED
@@ -18,10 +18,21 @@
|
|
18
18
|
|
19
19
|
#include "rb-grn.h"
|
20
20
|
|
21
|
-
#define SELF(object) (
|
21
|
+
#define SELF(object) ((RbGrnObject *)DATA_PTR(object))
|
22
22
|
|
23
23
|
VALUE rb_cGrnDatabase;
|
24
24
|
|
25
|
+
/*
|
26
|
+
* Document-class: Groonga::Database
|
27
|
+
*
|
28
|
+
* テーブルの集合を管理するためのオブジェクト。
|
29
|
+
*
|
30
|
+
* コンテキストに結びつけて使用する。通常、アプリケーション
|
31
|
+
* 毎に1つのコンテキストを利用するので、データベースも1つだ
|
32
|
+
* け利用する。コンテキストと違い、データベースは暗黙のうち
|
33
|
+
* に作成されないので明示的に作成する必要がある。
|
34
|
+
*/
|
35
|
+
|
25
36
|
grn_obj *
|
26
37
|
rb_grn_database_from_ruby_object (VALUE object)
|
27
38
|
{
|
@@ -39,6 +50,31 @@ rb_grn_database_to_ruby_object (grn_ctx *context, grn_obj *database,
|
|
39
50
|
return GRNOBJECT2RVAL(rb_cGrnDatabase, context, database, owner);
|
40
51
|
}
|
41
52
|
|
53
|
+
/*
|
54
|
+
* call-seq:
|
55
|
+
* Groonga::Database.create(options=nil) -> Groonga::Database
|
56
|
+
*
|
57
|
+
* 新しくデータベースを作成する。
|
58
|
+
*
|
59
|
+
* _options_にはハッシュでオプションを指定する。指定できるオ
|
60
|
+
* プションは以下の通り。
|
61
|
+
*
|
62
|
+
* [+:path+]
|
63
|
+
* データベースを保存するパス。省略すると一時データベース
|
64
|
+
* となる。
|
65
|
+
*
|
66
|
+
* [+:context+]
|
67
|
+
* データベースを結びつけるコンテキスト。省略すると
|
68
|
+
* Groonga::Context.defaultを利用する。
|
69
|
+
*
|
70
|
+
* 使用例は以下の通り。
|
71
|
+
*
|
72
|
+
* 一時データベースを作成:
|
73
|
+
* Groonga::Database.create
|
74
|
+
*
|
75
|
+
* 永続データベースを作成:
|
76
|
+
* Groonga::Database.create(:path => "/tmp/db.groonga")
|
77
|
+
*/
|
42
78
|
static VALUE
|
43
79
|
rb_grn_database_s_create (int argc, VALUE *argv, VALUE klass)
|
44
80
|
{
|
@@ -59,14 +95,17 @@ rb_grn_database_s_create (int argc, VALUE *argv, VALUE klass)
|
|
59
95
|
|
60
96
|
if (!NIL_P(rb_path))
|
61
97
|
path = StringValuePtr(rb_path);
|
62
|
-
context = rb_grn_context_ensure(rb_context);
|
98
|
+
context = rb_grn_context_ensure(&rb_context);
|
63
99
|
|
64
100
|
create_args.builtin_type_names = NULL;
|
65
101
|
create_args.n_builtin_type_names = 0;
|
66
102
|
|
67
103
|
database = grn_db_create(context, path, &create_args);
|
68
104
|
rb_grn_context_check(context, rb_ary_new4(argc, argv));
|
69
|
-
rb_database =
|
105
|
+
rb_database = rb_grn_object_alloc(klass);
|
106
|
+
rb_grn_object_assign(rb_database, rb_context, context,
|
107
|
+
database, RB_GRN_TRUE);
|
108
|
+
rb_iv_set(rb_database, "context", rb_context);
|
70
109
|
rb_grn_context_check(context, rb_ary_new4(argc, argv));
|
71
110
|
|
72
111
|
if (rb_block_given_p())
|
@@ -76,6 +115,22 @@ rb_grn_database_s_create (int argc, VALUE *argv, VALUE klass)
|
|
76
115
|
return rb_database;
|
77
116
|
}
|
78
117
|
|
118
|
+
/*
|
119
|
+
* call-seq:
|
120
|
+
* Groonga::Database.new(path, options=nil) -> Groonga::Database
|
121
|
+
* Groonga::Database.new(path, options=nil) {|database| ...}
|
122
|
+
*
|
123
|
+
* 既存のデータベースを開く。ブロックを指定した場合はブロッ
|
124
|
+
* クに開いたデータベースを渡し、ブロックを抜けるときに閉じ
|
125
|
+
* る。
|
126
|
+
*
|
127
|
+
* _options_にはハッシュでオプションを指定する。指定できるオ
|
128
|
+
* プションは以下の通り。
|
129
|
+
*
|
130
|
+
* [+:context+]
|
131
|
+
* データベースを結びつけるコンテキスト。省略すると
|
132
|
+
* Groonga::Context.defaultを利用する。
|
133
|
+
*/
|
79
134
|
static VALUE
|
80
135
|
rb_grn_database_initialize (int argc, VALUE *argv, VALUE self)
|
81
136
|
{
|
@@ -91,15 +146,31 @@ rb_grn_database_initialize (int argc, VALUE *argv, VALUE self)
|
|
91
146
|
"context", &rb_context,
|
92
147
|
NULL);
|
93
148
|
|
94
|
-
context = rb_grn_context_ensure(rb_context);
|
149
|
+
context = rb_grn_context_ensure(&rb_context);
|
95
150
|
|
96
151
|
database = grn_db_open(context, path);
|
97
|
-
|
152
|
+
rb_grn_object_assign(self, rb_context, context, database, RB_GRN_TRUE);
|
98
153
|
rb_grn_context_check(context, self);
|
99
154
|
|
100
155
|
return Qnil;
|
101
156
|
}
|
102
157
|
|
158
|
+
/*
|
159
|
+
* call-seq:
|
160
|
+
* Groonga::Database.open(path, options=nil) -> Groonga::Database
|
161
|
+
* Groonga::Database.open(path, options=nil) {|database| ...}
|
162
|
+
*
|
163
|
+
* 既存のデータベースを開く。ブロックを指定した場合はブロッ
|
164
|
+
* クに開いたデータベースを渡し、ブロックを抜けるときに閉じ
|
165
|
+
* る。
|
166
|
+
*
|
167
|
+
* _options_にはハッシュでオプションを指定する。指定できるオ
|
168
|
+
* プションは以下の通り。
|
169
|
+
*
|
170
|
+
* [+:context+]
|
171
|
+
* データベースを結びつけるコンテキスト。省略すると
|
172
|
+
* Groonga::Context.defaultを利用する。
|
173
|
+
*/
|
103
174
|
static VALUE
|
104
175
|
rb_grn_database_s_open (int argc, VALUE *argv, VALUE klass)
|
105
176
|
{
|
@@ -113,10 +184,50 @@ rb_grn_database_s_open (int argc, VALUE *argv, VALUE klass)
|
|
113
184
|
return database;
|
114
185
|
}
|
115
186
|
|
187
|
+
/*
|
188
|
+
* call-seq:
|
189
|
+
* database.each {|object| ...}
|
190
|
+
*
|
191
|
+
* データベース内のオブジェクトを順番にブロックに渡す。
|
192
|
+
*
|
193
|
+
* すべてのオブジェクトの名前を表示する:
|
194
|
+
* database.each do |object|
|
195
|
+
* p object.name
|
196
|
+
* end
|
197
|
+
*/
|
198
|
+
static VALUE
|
199
|
+
rb_grn_database_each (VALUE self)
|
200
|
+
{
|
201
|
+
grn_ctx *context = NULL;
|
202
|
+
grn_obj *database;
|
203
|
+
grn_table_cursor *cursor;
|
204
|
+
VALUE rb_cursor;
|
205
|
+
grn_id id;
|
206
|
+
|
207
|
+
rb_grn_object_deconstruct((RbGrnObject *)SELF(self), &database, &context,
|
208
|
+
NULL, NULL, NULL, NULL);
|
209
|
+
cursor = grn_table_cursor_open(context, database, NULL, 0, NULL, 0, 0);
|
210
|
+
rb_cursor = GRNTABLECURSOR2RVAL(Qnil, context, cursor);
|
211
|
+
rb_iv_set(self, "cursor", rb_cursor);
|
212
|
+
while ((id = grn_table_cursor_next(context, cursor)) != GRN_ID_NIL) {
|
213
|
+
grn_obj *object;
|
214
|
+
|
215
|
+
object = grn_ctx_at(context, id);
|
216
|
+
if (object)
|
217
|
+
rb_yield(GRNOBJECT2RVAL(Qnil, context, object, RB_GRN_FALSE));
|
218
|
+
}
|
219
|
+
rb_grn_table_cursor_close(rb_cursor);
|
220
|
+
rb_iv_set(self, "cursor", Qnil);
|
221
|
+
|
222
|
+
return Qnil;
|
223
|
+
}
|
224
|
+
|
116
225
|
void
|
117
226
|
rb_grn_init_database (VALUE mGrn)
|
118
227
|
{
|
119
228
|
rb_cGrnDatabase = rb_define_class_under(mGrn, "Database", rb_cGrnObject);
|
229
|
+
rb_include_module(rb_cGrnDatabase, rb_mEnumerable);
|
230
|
+
rb_include_module(rb_cGrnDatabase, rb_mGrnEncodingSupport);
|
120
231
|
|
121
232
|
rb_define_singleton_method(rb_cGrnDatabase, "create",
|
122
233
|
rb_grn_database_s_create, -1);
|
@@ -125,4 +236,7 @@ rb_grn_init_database (VALUE mGrn)
|
|
125
236
|
|
126
237
|
rb_define_method(rb_cGrnDatabase, "initialize",
|
127
238
|
rb_grn_database_initialize, -1);
|
239
|
+
|
240
|
+
rb_define_method(rb_cGrnDatabase, "each",
|
241
|
+
rb_grn_database_each, 0);
|
128
242
|
}
|
@@ -0,0 +1,64 @@
|
|
1
|
+
/* -*- c-file-style: "ruby" -*- */
|
2
|
+
/*
|
3
|
+
Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
|
4
|
+
|
5
|
+
This library is free software; you can redistribute it and/or
|
6
|
+
modify it under the terms of the GNU Lesser General Public
|
7
|
+
License version 2.1 as published by the Free Software Foundation.
|
8
|
+
|
9
|
+
This library is distributed in the hope that it will be useful,
|
10
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
12
|
+
Lesser General Public License for more details.
|
13
|
+
|
14
|
+
You should have received a copy of the GNU Lesser General Public
|
15
|
+
License along with this library; if not, write to the Free Software
|
16
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
17
|
+
*/
|
18
|
+
|
19
|
+
#include "rb-grn.h"
|
20
|
+
|
21
|
+
#define SELF(object) (RB_GRN_OBJECT(DATA_PTR(object)))
|
22
|
+
|
23
|
+
VALUE rb_mGrnEncodingSupport;
|
24
|
+
|
25
|
+
/*
|
26
|
+
* Document-module: Groonga::EncodingSupport
|
27
|
+
*
|
28
|
+
* オブジェクトにエンコーディング関連の機能を提供するモジュー
|
29
|
+
* ル。
|
30
|
+
*/
|
31
|
+
|
32
|
+
/*
|
33
|
+
* call-seq:
|
34
|
+
* object.encoding -> エンコーディング
|
35
|
+
*
|
36
|
+
* オブジェクトのエンコーディングを返す。
|
37
|
+
*/
|
38
|
+
static VALUE
|
39
|
+
rb_grn_encoding_support_get_encoding (VALUE self)
|
40
|
+
{
|
41
|
+
grn_ctx *context = NULL;
|
42
|
+
grn_obj *object = NULL;
|
43
|
+
grn_obj *encoding_value;
|
44
|
+
grn_encoding encoding;
|
45
|
+
|
46
|
+
rb_grn_object_deconstruct(SELF(self), &object, &context,
|
47
|
+
NULL, NULL, NULL, NULL);
|
48
|
+
encoding_value = grn_obj_get_info(context, object, GRN_INFO_ENCODING, NULL);
|
49
|
+
rb_grn_context_check(context, self);
|
50
|
+
|
51
|
+
memcpy(&encoding, GRN_BULK_HEAD(encoding_value), sizeof(encoding));
|
52
|
+
grn_obj_close(context, encoding_value);
|
53
|
+
|
54
|
+
return GRNENCODING2RVAL(encoding);
|
55
|
+
}
|
56
|
+
|
57
|
+
void
|
58
|
+
rb_grn_init_encoding_support (VALUE mGrn)
|
59
|
+
{
|
60
|
+
rb_mGrnEncodingSupport = rb_define_module_under(mGrn, "EncodingSupport");
|
61
|
+
|
62
|
+
rb_define_method(rb_mGrnEncodingSupport, "encoding",
|
63
|
+
rb_grn_encoding_support_get_encoding, 0);
|
64
|
+
}
|