rroonga 0.9.2-x86-mingw32

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.
Files changed (199) hide show
  1. data/AUTHORS +5 -0
  2. data/NEWS.ja.rdoc +114 -0
  3. data/NEWS.rdoc +116 -0
  4. data/README.ja.rdoc +65 -0
  5. data/README.rdoc +66 -0
  6. data/Rakefile +206 -0
  7. data/benchmark/common.rb +49 -0
  8. data/benchmark/read-write-many-small-items.rb +144 -0
  9. data/benchmark/write-many-small-items.rb +135 -0
  10. data/example/bookmark.rb +161 -0
  11. data/example/index-html.rb +89 -0
  12. data/example/search/config.ru +230 -0
  13. data/example/search/public/css/groonga.css +122 -0
  14. data/ext/.gitignore +2 -0
  15. data/ext/groonga/extconf.rb +93 -0
  16. data/ext/groonga/rb-grn-accessor.c +52 -0
  17. data/ext/groonga/rb-grn-array-cursor.c +36 -0
  18. data/ext/groonga/rb-grn-array.c +210 -0
  19. data/ext/groonga/rb-grn-column.c +573 -0
  20. data/ext/groonga/rb-grn-context.c +662 -0
  21. data/ext/groonga/rb-grn-database.c +472 -0
  22. data/ext/groonga/rb-grn-encoding-support.c +64 -0
  23. data/ext/groonga/rb-grn-encoding.c +257 -0
  24. data/ext/groonga/rb-grn-exception.c +1110 -0
  25. data/ext/groonga/rb-grn-expression-builder.c +75 -0
  26. data/ext/groonga/rb-grn-expression.c +731 -0
  27. data/ext/groonga/rb-grn-fix-size-column.c +166 -0
  28. data/ext/groonga/rb-grn-hash-cursor.c +38 -0
  29. data/ext/groonga/rb-grn-hash.c +294 -0
  30. data/ext/groonga/rb-grn-index-column.c +488 -0
  31. data/ext/groonga/rb-grn-logger.c +504 -0
  32. data/ext/groonga/rb-grn-object.c +1369 -0
  33. data/ext/groonga/rb-grn-operation.c +198 -0
  34. data/ext/groonga/rb-grn-patricia-trie-cursor.c +39 -0
  35. data/ext/groonga/rb-grn-patricia-trie.c +488 -0
  36. data/ext/groonga/rb-grn-procedure.c +52 -0
  37. data/ext/groonga/rb-grn-query.c +260 -0
  38. data/ext/groonga/rb-grn-record.c +40 -0
  39. data/ext/groonga/rb-grn-snippet.c +334 -0
  40. data/ext/groonga/rb-grn-table-cursor-key-support.c +69 -0
  41. data/ext/groonga/rb-grn-table-cursor.c +247 -0
  42. data/ext/groonga/rb-grn-table-key-support.c +714 -0
  43. data/ext/groonga/rb-grn-table.c +1977 -0
  44. data/ext/groonga/rb-grn-type.c +181 -0
  45. data/ext/groonga/rb-grn-utils.c +769 -0
  46. data/ext/groonga/rb-grn-variable-size-column.c +36 -0
  47. data/ext/groonga/rb-grn-variable.c +108 -0
  48. data/ext/groonga/rb-grn-view-accessor.c +53 -0
  49. data/ext/groonga/rb-grn-view-cursor.c +35 -0
  50. data/ext/groonga/rb-grn-view-record.c +41 -0
  51. data/ext/groonga/rb-grn-view.c +421 -0
  52. data/ext/groonga/rb-grn.h +698 -0
  53. data/ext/groonga/rb-groonga.c +107 -0
  54. data/extconf.rb +130 -0
  55. data/html/bar.svg +153 -0
  56. data/html/developer.html +117 -0
  57. data/html/developer.svg +469 -0
  58. data/html/download.svg +253 -0
  59. data/html/favicon.ico +0 -0
  60. data/html/favicon.xcf +0 -0
  61. data/html/footer.html.erb +28 -0
  62. data/html/head.html.erb +4 -0
  63. data/html/header.html.erb +17 -0
  64. data/html/index.html +147 -0
  65. data/html/install.svg +636 -0
  66. data/html/logo.xcf +0 -0
  67. data/html/ranguba.css +250 -0
  68. data/html/tutorial.svg +559 -0
  69. data/lib/1.8/groonga.so +0 -0
  70. data/lib/1.9/groonga.so +0 -0
  71. data/lib/groonga.rb +90 -0
  72. data/lib/groonga/context.rb +184 -0
  73. data/lib/groonga/expression-builder.rb +324 -0
  74. data/lib/groonga/patricia-trie.rb +85 -0
  75. data/lib/groonga/record.rb +311 -0
  76. data/lib/groonga/schema.rb +1191 -0
  77. data/lib/groonga/view-record.rb +56 -0
  78. data/license/GPL +340 -0
  79. data/license/LGPL +504 -0
  80. data/license/RUBY +59 -0
  81. data/misc/grnop2ruby.rb +49 -0
  82. data/pkg-config.rb +333 -0
  83. data/rroonga-build.rb +57 -0
  84. data/test-unit/Rakefile +40 -0
  85. data/test-unit/TODO +5 -0
  86. data/test-unit/bin/testrb +5 -0
  87. data/test-unit/html/classic.html +15 -0
  88. data/test-unit/html/index.html +25 -0
  89. data/test-unit/html/index.html.ja +27 -0
  90. data/test-unit/lib/test/unit.rb +323 -0
  91. data/test-unit/lib/test/unit/assertionfailederror.rb +25 -0
  92. data/test-unit/lib/test/unit/assertions.rb +1230 -0
  93. data/test-unit/lib/test/unit/attribute.rb +125 -0
  94. data/test-unit/lib/test/unit/autorunner.rb +360 -0
  95. data/test-unit/lib/test/unit/collector.rb +36 -0
  96. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  97. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  98. data/test-unit/lib/test/unit/collector/load.rb +144 -0
  99. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  100. data/test-unit/lib/test/unit/color-scheme.rb +102 -0
  101. data/test-unit/lib/test/unit/color.rb +96 -0
  102. data/test-unit/lib/test/unit/diff.rb +724 -0
  103. data/test-unit/lib/test/unit/error.rb +130 -0
  104. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  105. data/test-unit/lib/test/unit/failure.rb +136 -0
  106. data/test-unit/lib/test/unit/fixture.rb +176 -0
  107. data/test-unit/lib/test/unit/notification.rb +129 -0
  108. data/test-unit/lib/test/unit/omission.rb +191 -0
  109. data/test-unit/lib/test/unit/pending.rb +150 -0
  110. data/test-unit/lib/test/unit/priority.rb +180 -0
  111. data/test-unit/lib/test/unit/runner/console.rb +52 -0
  112. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  113. data/test-unit/lib/test/unit/runner/tap.rb +8 -0
  114. data/test-unit/lib/test/unit/testcase.rb +476 -0
  115. data/test-unit/lib/test/unit/testresult.rb +89 -0
  116. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  117. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  118. data/test-unit/lib/test/unit/ui/console/testrunner.rb +466 -0
  119. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +63 -0
  120. data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
  121. data/test-unit/lib/test/unit/ui/testrunner.rb +28 -0
  122. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  123. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  124. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  125. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  126. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  127. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  128. data/test-unit/lib/test/unit/version.rb +7 -0
  129. data/test-unit/sample/adder.rb +13 -0
  130. data/test-unit/sample/subtracter.rb +12 -0
  131. data/test-unit/sample/test_adder.rb +20 -0
  132. data/test-unit/sample/test_subtracter.rb +20 -0
  133. data/test-unit/sample/test_user.rb +23 -0
  134. data/test-unit/test/collector/test-descendant.rb +133 -0
  135. data/test-unit/test/collector/test-load.rb +442 -0
  136. data/test-unit/test/collector/test_dir.rb +406 -0
  137. data/test-unit/test/collector/test_objectspace.rb +100 -0
  138. data/test-unit/test/run-test.rb +15 -0
  139. data/test-unit/test/test-attribute.rb +86 -0
  140. data/test-unit/test/test-color-scheme.rb +67 -0
  141. data/test-unit/test/test-color.rb +47 -0
  142. data/test-unit/test/test-diff.rb +518 -0
  143. data/test-unit/test/test-emacs-runner.rb +60 -0
  144. data/test-unit/test/test-fixture.rb +287 -0
  145. data/test-unit/test/test-notification.rb +33 -0
  146. data/test-unit/test/test-omission.rb +81 -0
  147. data/test-unit/test/test-pending.rb +70 -0
  148. data/test-unit/test/test-priority.rb +119 -0
  149. data/test-unit/test/test-testcase.rb +544 -0
  150. data/test-unit/test/test_assertions.rb +1151 -0
  151. data/test-unit/test/test_error.rb +26 -0
  152. data/test-unit/test/test_failure.rb +33 -0
  153. data/test-unit/test/test_testresult.rb +113 -0
  154. data/test-unit/test/test_testsuite.rb +129 -0
  155. data/test-unit/test/testunit-test-util.rb +14 -0
  156. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  157. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  158. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  159. data/test-unit/test/util/test_observable.rb +102 -0
  160. data/test-unit/test/util/test_procwrapper.rb +36 -0
  161. data/test/.gitignore +1 -0
  162. data/test/groonga-test-utils.rb +134 -0
  163. data/test/run-test.rb +58 -0
  164. data/test/test-array.rb +90 -0
  165. data/test/test-column.rb +316 -0
  166. data/test/test-context-select.rb +93 -0
  167. data/test/test-context.rb +73 -0
  168. data/test/test-database.rb +113 -0
  169. data/test/test-encoding.rb +33 -0
  170. data/test/test-exception.rb +93 -0
  171. data/test/test-expression-builder.rb +217 -0
  172. data/test/test-expression.rb +134 -0
  173. data/test/test-fix-size-column.rb +65 -0
  174. data/test/test-gqtp.rb +72 -0
  175. data/test/test-hash.rb +305 -0
  176. data/test/test-index-column.rb +81 -0
  177. data/test/test-logger.rb +37 -0
  178. data/test/test-patricia-trie.rb +205 -0
  179. data/test/test-procedure.rb +37 -0
  180. data/test/test-query.rb +22 -0
  181. data/test/test-record.rb +243 -0
  182. data/test/test-remote.rb +54 -0
  183. data/test/test-schema-view.rb +90 -0
  184. data/test/test-schema.rb +459 -0
  185. data/test/test-snippet.rb +130 -0
  186. data/test/test-table-cursor.rb +153 -0
  187. data/test/test-table-offset-and-limit.rb +102 -0
  188. data/test/test-table-select-normalize.rb +53 -0
  189. data/test/test-table-select.rb +150 -0
  190. data/test/test-table.rb +594 -0
  191. data/test/test-type.rb +71 -0
  192. data/test/test-variable-size-column.rb +98 -0
  193. data/test/test-variable.rb +28 -0
  194. data/test/test-vector-column.rb +76 -0
  195. data/test/test-version.rb +31 -0
  196. data/test/test-view.rb +72 -0
  197. data/text/TUTORIAL.ja.rdoc +392 -0
  198. data/text/expression.rdoc +284 -0
  199. metadata +276 -0
@@ -0,0 +1,472 @@
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) ((RbGrnObject *)DATA_PTR(object))
22
+
23
+ VALUE rb_cGrnDatabase;
24
+
25
+ /*
26
+ * Document-class: Groonga::Database
27
+ *
28
+ * テーブルの集合を管理するためのオブジェクト。
29
+ *
30
+ * コンテキストに結びつけて使用する。通常、アプリケーション
31
+ * 毎に1つのコンテキストを利用するので、データベースも1つだ
32
+ * け利用する。コンテキストと違い、データベースは暗黙のうち
33
+ * に作成されないので明示的に作成する必要がある。
34
+ */
35
+
36
+ grn_obj *
37
+ rb_grn_database_from_ruby_object (VALUE object)
38
+ {
39
+ if (!RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cGrnDatabase))) {
40
+ rb_raise(rb_eTypeError, "not a groonga database");
41
+ }
42
+
43
+ return RVAL2GRNOBJECT(object, NULL);
44
+ }
45
+
46
+ VALUE
47
+ rb_grn_database_to_ruby_object (grn_ctx *context, grn_obj *database,
48
+ rb_grn_boolean owner)
49
+ {
50
+ return GRNOBJECT2RVAL(rb_cGrnDatabase, context, database, owner);
51
+ }
52
+
53
+ static void
54
+ rb_grn_database_mark_existing_ruby_object (grn_ctx *context, grn_obj *database)
55
+ {
56
+ grn_table_cursor *cursor;
57
+ grn_id id;
58
+
59
+ cursor = grn_table_cursor_open(context, database, NULL, 0, NULL, 0,
60
+ 0, -1, GRN_CURSOR_ASCENDING);
61
+ if (!cursor)
62
+ return;
63
+
64
+ while ((id = grn_table_cursor_next(context, cursor)) != GRN_ID_NIL) {
65
+ grn_obj *object;
66
+ grn_user_data *user_data;
67
+ RbGrnObject *rb_grn_object;
68
+
69
+ object = grn_ctx_at(context, id);
70
+ if (!object)
71
+ continue;
72
+ user_data = grn_obj_user_data(context, object);
73
+ if (!user_data)
74
+ continue;
75
+ rb_grn_object = RB_GRN_OBJECT(user_data->ptr);
76
+ if (!rb_grn_object)
77
+ continue;
78
+ rb_gc_mark(rb_grn_object->self);
79
+ }
80
+ grn_table_cursor_close(context, cursor);
81
+ }
82
+
83
+ static void
84
+ rb_grn_database_mark (void *data)
85
+ {
86
+ RbGrnObject *rb_grn_database = data;
87
+ grn_ctx *context;
88
+ grn_obj *database;
89
+
90
+ if (!rb_grn_database)
91
+ return;
92
+
93
+ context = rb_grn_database->context;
94
+ database = rb_grn_database->object;
95
+ if (!context || !database)
96
+ return;
97
+
98
+ rb_grn_database_mark_existing_ruby_object(context, database);
99
+ }
100
+
101
+ static VALUE
102
+ rb_grn_database_alloc (VALUE klass)
103
+ {
104
+ return Data_Wrap_Struct(klass, rb_grn_database_mark, rb_grn_object_free,
105
+ NULL);
106
+ }
107
+
108
+ static void
109
+ rb_grn_database_deconstruct (RbGrnObject *rb_grn_database,
110
+ grn_obj **database,
111
+ grn_ctx **context,
112
+ grn_id *domain_id,
113
+ grn_obj **domain,
114
+ grn_id *range_id,
115
+ grn_obj **range)
116
+ {
117
+ rb_grn_object_deconstruct(rb_grn_database, database, context,
118
+ domain_id, domain,
119
+ range_id, range);
120
+ }
121
+
122
+ /*
123
+ * Document-method: close
124
+ *
125
+ * call-seq:
126
+ * database.close
127
+ *
128
+ * _database_が使用しているリソースを開放する。これ以降_database_を
129
+ * 使うことはできない。
130
+ */
131
+ static VALUE
132
+ rb_grn_database_close (VALUE self)
133
+ {
134
+ VALUE rb_context;
135
+
136
+ rb_context = rb_iv_get(self, "@context");
137
+ if (!NIL_P(rb_context))
138
+ rb_iv_set(rb_context, "database", Qnil);
139
+
140
+ return rb_grn_object_close(self);
141
+ }
142
+
143
+ /*
144
+ * call-seq:
145
+ * Groonga::Database.create(options=nil) -> Groonga::Database
146
+ *
147
+ * 新しくデータベースを作成する。
148
+ *
149
+ * _options_にはハッシュでオプションを指定する。指定できるオ
150
+ * プションは以下の通り。
151
+ *
152
+ * [+:path+]
153
+ * データベースを保存するパス。省略すると一時データベース
154
+ * となる。
155
+ *
156
+ * [+:context+]
157
+ * データベースを結びつけるコンテキスト。省略すると
158
+ * Groonga::Context.defaultを利用する。
159
+ *
160
+ * 使用例は以下の通り。
161
+ *
162
+ * 一時データベースを作成:
163
+ * Groonga::Database.create
164
+ *
165
+ * 永続データベースを作成:
166
+ * Groonga::Database.create(:path => "/tmp/db.groonga")
167
+ */
168
+ static VALUE
169
+ rb_grn_database_s_create (int argc, VALUE *argv, VALUE klass)
170
+ {
171
+ grn_ctx *context;
172
+ grn_obj *old_database, *database;
173
+ grn_db_create_optarg create_args;
174
+ const char *path = NULL;
175
+ VALUE rb_database;
176
+ VALUE rb_path, options, rb_context, builtin_type_names;
177
+
178
+ rb_scan_args(argc, argv, "01", &options);
179
+
180
+ rb_grn_scan_options(options,
181
+ "path", &rb_path,
182
+ "context", &rb_context,
183
+ "builtin_type_names", &builtin_type_names,
184
+ NULL);
185
+
186
+ if (!NIL_P(rb_path))
187
+ path = StringValuePtr(rb_path);
188
+ context = rb_grn_context_ensure(&rb_context);
189
+
190
+ create_args.builtin_type_names = NULL;
191
+ create_args.n_builtin_type_names = 0;
192
+
193
+ old_database = grn_ctx_db(context);
194
+ if (old_database)
195
+ grn_obj_unlink(context, old_database);
196
+ database = grn_db_create(context, path, &create_args);
197
+ rb_grn_context_check(context, rb_ary_new4(argc, argv));
198
+ rb_database = GRNOBJECT2RVAL(klass, context, database, RB_GRN_TRUE);
199
+ rb_iv_set(rb_database, "@context", rb_context);
200
+ if (!NIL_P(rb_context))
201
+ rb_iv_set(rb_context, "database", rb_database);
202
+ rb_grn_context_check(context, rb_ary_new4(argc, argv));
203
+
204
+ if (rb_block_given_p())
205
+ return rb_ensure(rb_yield, rb_database,
206
+ rb_grn_database_close, rb_database);
207
+ else
208
+ return rb_database;
209
+ }
210
+
211
+ /*
212
+ * call-seq:
213
+ * Groonga::Database.new(path, options=nil) -> Groonga::Database
214
+ * Groonga::Database.new(path, options=nil) {|database| ...}
215
+ *
216
+ * 既存のデータベースを開く。ブロックを指定した場合はブロッ
217
+ * クに開いたデータベースを渡し、ブロックを抜けるときに閉じ
218
+ * る。
219
+ *
220
+ * _options_にはハッシュでオプションを指定する。指定できるオ
221
+ * プションは以下の通り。
222
+ *
223
+ * [+:context+]
224
+ * データベースを結びつけるコンテキスト。省略すると
225
+ * Groonga::Context.defaultを利用する。
226
+ */
227
+ static VALUE
228
+ rb_grn_database_initialize (int argc, VALUE *argv, VALUE self)
229
+ {
230
+ grn_ctx *context;
231
+ grn_obj *old_database, *database;
232
+ const char *path;
233
+ VALUE rb_path, options, rb_context;
234
+
235
+ rb_scan_args(argc, argv, "11", &rb_path, &options);
236
+
237
+ path = StringValuePtr(rb_path);
238
+ rb_grn_scan_options(options,
239
+ "context", &rb_context,
240
+ NULL);
241
+
242
+ context = rb_grn_context_ensure(&rb_context);
243
+
244
+ old_database = grn_ctx_db(context);
245
+ if (old_database)
246
+ grn_obj_unlink(context, old_database);
247
+ database = grn_db_open(context, path);
248
+ rb_grn_object_assign(Qnil, self, rb_context, context, database);
249
+ rb_grn_context_check(context, self);
250
+
251
+ rb_iv_set(self, "@context", rb_context);
252
+ if (!NIL_P(rb_context))
253
+ rb_iv_set(rb_context, "database", self);
254
+
255
+ return Qnil;
256
+ }
257
+
258
+ /*
259
+ * call-seq:
260
+ * Groonga::Database.open(path, options=nil) -> Groonga::Database
261
+ * Groonga::Database.open(path, options=nil) {|database| ...}
262
+ *
263
+ * 既存のデータベースを開く。ブロックを指定した場合はブロッ
264
+ * クに開いたデータベースを渡し、ブロックを抜けるときに閉じ
265
+ * る。
266
+ *
267
+ * _options_にはハッシュでオプションを指定する。指定できるオ
268
+ * プションは以下の通り。
269
+ *
270
+ * [+:context+]
271
+ * データベースを結びつけるコンテキスト。省略すると
272
+ * Groonga::Context.defaultを利用する。
273
+ */
274
+ static VALUE
275
+ rb_grn_database_s_open (int argc, VALUE *argv, VALUE klass)
276
+ {
277
+ VALUE database;
278
+
279
+ database = rb_obj_alloc(klass);
280
+ rb_grn_database_initialize(argc, argv, database);
281
+ if (rb_block_given_p())
282
+ return rb_ensure(rb_yield, database, rb_grn_database_close, database);
283
+ else
284
+ return database;
285
+ }
286
+
287
+ /*
288
+ * call-seq:
289
+ * database.each {|object| ...}
290
+ *
291
+ * データベース内のオブジェクトを順番にブロックに渡す。
292
+ *
293
+ * すべてのオブジェクトの名前を表示する:
294
+ * database.each do |object|
295
+ * p object.name
296
+ * end
297
+ */
298
+ static VALUE
299
+ rb_grn_database_each (VALUE self)
300
+ {
301
+ grn_ctx *context = NULL;
302
+ grn_obj *database;
303
+ grn_table_cursor *cursor;
304
+ VALUE rb_cursor;
305
+ grn_id id;
306
+
307
+ rb_grn_database_deconstruct(SELF(self), &database, &context,
308
+ NULL, NULL, NULL, NULL);
309
+ cursor = grn_table_cursor_open(context, database, NULL, 0, NULL, 0,
310
+ 0, -1, GRN_CURSOR_ASCENDING);
311
+ rb_cursor = GRNTABLECURSOR2RVAL(Qnil, context, cursor);
312
+ rb_iv_set(self, "cursor", rb_cursor);
313
+ while ((id = grn_table_cursor_next(context, cursor)) != GRN_ID_NIL) {
314
+ grn_obj *object;
315
+
316
+ object = grn_ctx_at(context, id);
317
+ if (object)
318
+ rb_yield(GRNOBJECT2RVAL(Qnil, context, object, RB_GRN_FALSE));
319
+ }
320
+ rb_grn_object_close(rb_cursor);
321
+ rb_iv_set(self, "cursor", Qnil);
322
+
323
+ return Qnil;
324
+ }
325
+
326
+ /*
327
+ * Document-method: unlock
328
+ *
329
+ * call-seq:
330
+ * database.unlock
331
+ *
332
+ * _database_のロックを解除する。
333
+ */
334
+ static VALUE
335
+ rb_grn_database_unlock (VALUE self)
336
+ {
337
+ grn_ctx *context;
338
+ grn_obj *database;
339
+ grn_rc rc;
340
+
341
+ rb_grn_database_deconstruct(SELF(self), &database, &context,
342
+ NULL, NULL, NULL, NULL);
343
+
344
+ rc = grn_obj_unlock(context, database, GRN_ID_NIL);
345
+ rb_grn_context_check(context, self);
346
+ rb_grn_rc_check(rc, self);
347
+
348
+ return Qnil;
349
+ }
350
+
351
+ /*
352
+ * Document-method: lock
353
+ *
354
+ * call-seq:
355
+ * database.lock(options={})
356
+ * database.lock(options={}) {...}
357
+ *
358
+ * _database_をロックする。ロックに失敗した場合は
359
+ * Groonga::ResourceDeadlockAvoided例外が発生する。
360
+ *
361
+ * ブロックを指定した場合はブロックを抜けたときにunlockする。
362
+ *
363
+ * 利用可能なオプションは以下の通り。
364
+ *
365
+ * [_:timeout_]
366
+ * ロックを獲得できなかった場合は_:timeout_秒間ロックの獲
367
+ * 得を試みる。_:timeout_秒以内にロックを獲得できなかった
368
+ * 場合は例外が発生する。
369
+ */
370
+ static VALUE
371
+ rb_grn_database_lock (int argc, VALUE *argv, VALUE self)
372
+ {
373
+ grn_ctx *context;
374
+ grn_obj *database;
375
+ int timeout = 0;
376
+ grn_rc rc;
377
+ VALUE options, rb_timeout;
378
+
379
+ rb_scan_args(argc, argv, "01", &options);
380
+
381
+ rb_grn_database_deconstruct(SELF(self), &database, &context,
382
+ NULL, NULL, NULL, NULL);
383
+
384
+ rb_grn_scan_options(options,
385
+ "timeout", &rb_timeout,
386
+ NULL);
387
+
388
+ if (!NIL_P(rb_timeout))
389
+ timeout = NUM2UINT(rb_timeout);
390
+
391
+ rc = grn_obj_lock(context, database, GRN_ID_NIL, timeout);
392
+ rb_grn_context_check(context, self);
393
+ rb_grn_rc_check(rc, self);
394
+
395
+ if (rb_block_given_p()) {
396
+ return rb_ensure(rb_yield, Qnil, rb_grn_database_unlock, self);
397
+ } else {
398
+ return Qnil;
399
+ }
400
+ }
401
+
402
+ /*
403
+ * Document-method: clear_lock
404
+ *
405
+ * call-seq:
406
+ * database.clear_lock
407
+ *
408
+ * _database_のロックを強制的に解除する。
409
+ */
410
+ static VALUE
411
+ rb_grn_database_clear_lock (VALUE self)
412
+ {
413
+ grn_ctx *context;
414
+ grn_obj *database;
415
+
416
+ rb_grn_database_deconstruct(SELF(self), &database, &context,
417
+ NULL, NULL, NULL, NULL);
418
+
419
+ grn_obj_clear_lock(context, database);
420
+
421
+ return Qnil;
422
+ }
423
+
424
+ /*
425
+ * Document-method: locked?
426
+ *
427
+ * call-seq:
428
+ * database.locked?
429
+ *
430
+ * _database_がロックされていれば+true+を返す。
431
+ */
432
+ static VALUE
433
+ rb_grn_database_is_locked (VALUE self)
434
+ {
435
+ grn_ctx *context;
436
+ grn_obj *database;
437
+
438
+ rb_grn_database_deconstruct(SELF(self), &database, &context,
439
+ NULL, NULL, NULL, NULL);
440
+
441
+ return CBOOL2RVAL(grn_obj_is_locked(context, database));
442
+ }
443
+
444
+ void
445
+ rb_grn_init_database (VALUE mGrn)
446
+ {
447
+ rb_cGrnDatabase = rb_define_class_under(mGrn, "Database", rb_cGrnObject);
448
+ rb_define_alloc_func(rb_cGrnDatabase, rb_grn_database_alloc);
449
+
450
+ rb_include_module(rb_cGrnDatabase, rb_mEnumerable);
451
+ rb_include_module(rb_cGrnDatabase, rb_mGrnEncodingSupport);
452
+
453
+ rb_define_singleton_method(rb_cGrnDatabase, "create",
454
+ rb_grn_database_s_create, -1);
455
+ rb_define_singleton_method(rb_cGrnDatabase, "open",
456
+ rb_grn_database_s_open, -1);
457
+
458
+ rb_define_method(rb_cGrnDatabase, "initialize",
459
+ rb_grn_database_initialize, -1);
460
+
461
+ rb_define_method(rb_cGrnDatabase, "each",
462
+ rb_grn_database_each, 0);
463
+
464
+ rb_define_method(rb_cGrnDatabase, "close",
465
+ rb_grn_database_close, 0);
466
+
467
+ rb_define_method(rb_cGrnDatabase, "lock", rb_grn_database_lock, -1);
468
+ rb_define_method(rb_cGrnDatabase, "unlock", rb_grn_database_unlock, 0);
469
+ rb_define_method(rb_cGrnDatabase, "clear_lock",
470
+ rb_grn_database_clear_lock, 0);
471
+ rb_define_method(rb_cGrnDatabase, "locked?", rb_grn_database_is_locked, 0);
472
+ }