estraier 1.4.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,31 @@
1
+ # Makefile for sample programs of the Ruby binding
2
+
3
+
4
+
5
+ #================================================================
6
+ # Setting Variables
7
+ #================================================================
8
+
9
+
10
+ # Generic settings
11
+ SHELL = /bin/sh
12
+
13
+
14
+
15
+ #================================================================
16
+ # Actions
17
+ #================================================================
18
+
19
+
20
+ all :
21
+
22
+
23
+ clean :
24
+ rm -rf *.exe *.o a.out check.out gmon.out leak.log casket *~
25
+
26
+
27
+ .PHONY : all clean
28
+
29
+
30
+
31
+ # END OF FILE
@@ -0,0 +1,32 @@
1
+ require "estraier"
2
+ include Estraier
3
+
4
+ # create the database object
5
+ db = Database::new
6
+
7
+ # open the database
8
+ unless db.open("casket", Database::DBWRITER | Database::DBCREAT)
9
+ printf("error: %s\n", db.err_msg(db.error))
10
+ exit
11
+ end
12
+
13
+ # create a document object
14
+ doc = Document::new
15
+
16
+ # add attributes to the document object
17
+ doc.add_attr("@uri", "http://estraier.gov/example.txt")
18
+ doc.add_attr("@title", "Over the Rainbow")
19
+
20
+ # add the body text to the document object
21
+ doc.add_text("Somewhere over the rainbow. Way up high.")
22
+ doc.add_text("There's a land that I heard of once in a lullaby.")
23
+
24
+ # register the document object to the database
25
+ unless db.put_doc(doc, Database::PDCLEAN)
26
+ printf("error: %s\n", db.err_msg(db.error))
27
+ end
28
+
29
+ # close the database
30
+ unless db.close
31
+ printf("error: %s\n", db.err_msg(db.error))
32
+ end
@@ -0,0 +1,42 @@
1
+ require "estraier"
2
+ include Estraier
3
+
4
+ # create the database object
5
+ db = Database::new
6
+
7
+ # open the database
8
+ unless db.open("casket", Database::DBREADER)
9
+ printf("error: %s\n", db.err_msg(db.error))
10
+ exit
11
+ end
12
+
13
+ # create a search condition object
14
+ cond = Condition::new
15
+
16
+ # set the search phrase to the search condition object
17
+ cond.set_phrase("rainbow AND lullaby")
18
+
19
+ # get the result of search
20
+ result = db.search(cond)
21
+
22
+ # for each document in the result
23
+ dnum = result.doc_num
24
+ for i in 0...dnum
25
+ # retrieve the document object
26
+ doc = db.get_doc(result.get_doc_id(i), 0)
27
+ next unless doc
28
+ # display attributes
29
+ uri = doc.attr("@uri")
30
+ printf("URI: %s\n", uri) if uri
31
+ title = doc.attr("@title")
32
+ printf("Title: %s\n", title) if title
33
+ # display the body text
34
+ doc.texts.each do |text|
35
+ printf("%s\n", text)
36
+ end
37
+ end
38
+
39
+ # close the database
40
+ unless db.close
41
+ printf("error: %s\n", db.err_msg(db.error))
42
+ end
@@ -0,0 +1,1258 @@
1
+ /*************************************************************************************************
2
+ * Ruby binding of Hyper Estraier
3
+ * Copyright (C) 2004-2005 Mikio Hirabayashi
4
+ * This file is part of Hyper Estraier.
5
+ * Hyper Estraier is free software; you can redistribute it and/or modify it under the terms of
6
+ * the GNU Lesser General Public License as published by the Free Software Foundation; either
7
+ * version 2.1 of the License or any later version. Hyper Estraier is distributed in the hope
8
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
10
+ * License for more details.
11
+ * You should have received a copy of the GNU Lesser General Public License along with Hyper
12
+ * Estraier; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
13
+ * Boston, MA 02111-1307 USA.
14
+ *************************************************************************************************/
15
+
16
+
17
+ #include "ruby.h"
18
+ #include <estraier.h>
19
+ #include <estmtdb.h>
20
+ #include <cabin.h>
21
+ #include <stdlib.h>
22
+
23
+ #define VNDATA "@ptr"
24
+ #define VNINFO "@informer"
25
+ #define VNCOND "@cond"
26
+
27
+ typedef struct {
28
+ int *ids;
29
+ int *dbidxs;
30
+ int num;
31
+ CBMAP *hints;
32
+ } ESTRES;
33
+
34
+ typedef struct {
35
+ ESTMTDB *db;
36
+ int ecode;
37
+ } ESTDBMGR;
38
+
39
+
40
+ /* private function prototypes */
41
+ static void doc_init(void);
42
+ static VALUE doc_initialize(int argc, VALUE *argv, VALUE vself);
43
+ static VALUE doc_add_attr(VALUE vself, VALUE vname, VALUE vvalue);
44
+ static VALUE doc_add_text(VALUE vself, VALUE vtext);
45
+ static VALUE doc_add_hidden_text(VALUE vself, VALUE vtext);
46
+ static VALUE doc_set_keywords(VALUE vself, VALUE vkwords);
47
+ static VALUE doc_set_score(VALUE vself, VALUE vscore);
48
+ static VALUE doc_id(VALUE vself);
49
+ static VALUE doc_attr_names(VALUE vself);
50
+ static VALUE doc_attr(VALUE vself, VALUE vname);
51
+ static VALUE doc_texts(VALUE vself);
52
+ static VALUE doc_cat_texts(VALUE vself);
53
+ static VALUE doc_keywords(VALUE vself);
54
+ static VALUE doc_score(VALUE vself);
55
+ static VALUE doc_dump_draft(VALUE vself);
56
+ static VALUE doc_make_snippet(VALUE vself, VALUE vwords,
57
+ VALUE vwwidth, VALUE vhwidth, VALUE vawidth);
58
+ static void cond_init(void);
59
+ static VALUE cond_initialize(VALUE vself);
60
+ static VALUE cond_set_phrase(VALUE vself, VALUE vphrase);
61
+ static VALUE cond_add_attr(VALUE vself, VALUE vexpr);
62
+ static VALUE cond_set_order(VALUE vself, VALUE vexpr);
63
+ static VALUE cond_set_max(VALUE vself, VALUE vmax);
64
+ static VALUE cond_set_skip(VALUE vself, VALUE vskip);
65
+ static VALUE cond_set_options(VALUE vself, VALUE voptions);
66
+ static VALUE cond_set_auxiliary(VALUE vself, VALUE vmin);
67
+ static VALUE cond_set_eclipse(VALUE vself, VALUE vlimit);
68
+ static VALUE cond_set_distinct(VALUE vself, VALUE vname);
69
+ static VALUE cond_set_mask(VALUE vself, VALUE vmask);
70
+ static void res_init(void);
71
+ static VALUE res_initialize(VALUE vself);
72
+ static ESTRES *est_res_new(void);
73
+ static void est_res_delete(ESTRES *res);
74
+ static VALUE res_doc_num(VALUE vself);
75
+ static VALUE res_get_doc_id(VALUE vself, VALUE vindex);
76
+ static VALUE res_get_dbidx(VALUE vself, VALUE vindex);
77
+ static VALUE res_hint_words(VALUE vself);
78
+ static VALUE res_hint(VALUE vself, VALUE vword);
79
+ static VALUE res_get_score(VALUE vself, VALUE vindex);
80
+ static VALUE res_get_shadows(VALUE vself, VALUE vid);
81
+ static void db_init(void);
82
+ static VALUE db_initialize(VALUE vself);
83
+ static ESTDBMGR *est_dbmgr_new(void);
84
+ static void est_dbmgr_delete(ESTDBMGR *db);
85
+ static VALUE db_search_meta(VALUE vself, VALUE vdbs, VALUE vcond);
86
+ static VALUE db_err_msg(VALUE vself, VALUE vecode);
87
+ static VALUE db_open(VALUE vself, VALUE vname, VALUE vomode);
88
+ static VALUE db_close(VALUE vself);
89
+ static VALUE db_error(VALUE vself);
90
+ static VALUE db_fatal(VALUE vself);
91
+ static VALUE db_add_attr_index(VALUE vself, VALUE vname, VALUE vtype);
92
+ static VALUE db_flush(VALUE vself, VALUE vmax);
93
+ static VALUE db_sync(VALUE vself);
94
+ static VALUE db_optimize(VALUE vself, VALUE voptions);
95
+ static VALUE db_merge(VALUE vself, VALUE vname, VALUE voptions);
96
+ static VALUE db_put_doc(VALUE vself, VALUE vdoc, VALUE voptions);
97
+ static VALUE db_out_doc(VALUE vself, VALUE vid, VALUE voptions);
98
+ static VALUE db_edit_doc(VALUE vself, VALUE vdoc);
99
+ static VALUE db_get_doc(VALUE vself, VALUE vid, VALUE voptions);
100
+ static VALUE db_get_doc_attr(VALUE vself, VALUE vid, VALUE vname);
101
+ static VALUE db_uri_to_id(VALUE vself, VALUE vuri);
102
+ static VALUE db_name(VALUE vself);
103
+ static VALUE db_doc_num(VALUE vself);
104
+ static VALUE db_word_num(VALUE vself);
105
+ static VALUE db_size(VALUE vself);
106
+ static VALUE db_search(VALUE vself, VALUE vcond);
107
+ static VALUE db_scan_doc(VALUE vself, VALUE vdoc, VALUE vcond);
108
+ static VALUE db_set_cache_size(VALUE vself, VALUE vsize, VALUE vanum, VALUE vtnum, VALUE vrnum);
109
+ static VALUE db_add_pseudo_index(VALUE vself, VALUE vpath);
110
+ static VALUE db_set_wildmax(VALUE vself, VALUE vnum);
111
+ static VALUE db_set_informer(VALUE vself, VALUE vinformer);
112
+ static VALUE cblisttoobj(const CBLIST *list);
113
+ static CBLIST *objtocblist(VALUE obj);
114
+ static VALUE cbmaptoobj(CBMAP *map);
115
+ static CBMAP *objtocbmap(VALUE obj);
116
+ static void db_informer(const char *message, void *opaque);
117
+ static VALUE db_informer_process(VALUE arg);
118
+ static VALUE db_informer_resque(VALUE arg);
119
+
120
+
121
+
122
+ /*************************************************************************************************
123
+ * public objects
124
+ *************************************************************************************************/
125
+
126
+
127
+ VALUE mod_estraier;
128
+ VALUE cls_doc;
129
+ VALUE cls_doc_data;
130
+ VALUE cls_cond;
131
+ VALUE cls_cond_data;
132
+ VALUE cls_res;
133
+ VALUE cls_res_data;
134
+ VALUE cls_db;
135
+ VALUE cls_db_data;
136
+
137
+
138
+ int Init_estraier(void){
139
+ mod_estraier = rb_define_module("Estraier");
140
+ doc_init();
141
+ cond_init();
142
+ res_init();
143
+ db_init();
144
+ return 0;
145
+ }
146
+
147
+
148
+
149
+ /*************************************************************************************************
150
+ * private objects
151
+ *************************************************************************************************/
152
+
153
+
154
+ static void doc_init(void){
155
+ cls_doc = rb_define_class_under(mod_estraier, "Document", rb_cObject);
156
+ cls_doc_data = rb_define_class_under(mod_estraier, "Document_data", rb_cObject);
157
+ rb_define_private_method(cls_doc, "initialize", doc_initialize, -1);
158
+ rb_define_method(cls_doc, "add_attr", doc_add_attr, 2);
159
+ rb_define_method(cls_doc, "add_text", doc_add_text, 1);
160
+ rb_define_method(cls_doc, "add_hidden_text", doc_add_hidden_text, 1);
161
+ rb_define_method(cls_doc, "set_keywords", doc_set_keywords, 1);
162
+ rb_define_method(cls_doc, "set_score", doc_set_score, 1);
163
+ rb_define_method(cls_doc, "id", doc_id, 0);
164
+ rb_define_method(cls_doc, "attr_names", doc_attr_names, 0);
165
+ rb_define_method(cls_doc, "attr", doc_attr, 1);
166
+ rb_define_method(cls_doc, "texts", doc_texts, 0);
167
+ rb_define_method(cls_doc, "cat_texts", doc_cat_texts, 0);
168
+ rb_define_method(cls_doc, "keywords", doc_keywords, 0);
169
+ rb_define_method(cls_doc, "score", doc_score, 0);
170
+ rb_define_method(cls_doc, "dump_draft", doc_dump_draft, 0);
171
+ rb_define_method(cls_doc, "make_snippet", doc_make_snippet, 4);
172
+ }
173
+
174
+
175
+ static VALUE doc_initialize(int argc, VALUE *argv, VALUE vself){
176
+ VALUE vdraft, vdoc;
177
+ ESTDOC *doc;
178
+ rb_scan_args(argc, argv, "01", &vdraft);
179
+ if(vdraft != Qnil){
180
+ Check_Type(vdraft, T_STRING);
181
+ doc = est_doc_new_from_draft(StringValuePtr(vdraft));
182
+ } else {
183
+ doc = est_doc_new();
184
+ }
185
+ vdoc = Data_Wrap_Struct(cls_doc_data, 0, est_doc_delete, doc);
186
+ rb_iv_set(vself, VNDATA, vdoc);
187
+ return Qnil;
188
+ }
189
+
190
+
191
+ static VALUE doc_add_attr(VALUE vself, VALUE vname, VALUE vvalue){
192
+ VALUE vdoc;
193
+ ESTDOC *doc;
194
+ const char *value;
195
+ vdoc = rb_iv_get(vself, VNDATA);
196
+ Data_Get_Struct(vdoc, ESTDOC, doc);
197
+ Check_Type(vname, T_STRING);
198
+ if(vvalue != Qnil){
199
+ Check_Type(vvalue, T_STRING);
200
+ value = StringValuePtr(vvalue);
201
+ } else {
202
+ value = NULL;
203
+ }
204
+ est_doc_add_attr(doc, StringValuePtr(vname), value);
205
+ return Qnil;
206
+ }
207
+
208
+
209
+ static VALUE doc_add_text(VALUE vself, VALUE vtext){
210
+ VALUE vdoc;
211
+ ESTDOC *doc;
212
+ vdoc = rb_iv_get(vself, VNDATA);
213
+ Data_Get_Struct(vdoc, ESTDOC, doc);
214
+ Check_Type(vtext, T_STRING);
215
+ est_doc_add_text(doc, StringValuePtr(vtext));
216
+ return Qnil;
217
+ }
218
+
219
+
220
+ static VALUE doc_add_hidden_text(VALUE vself, VALUE vtext){
221
+ VALUE vdoc;
222
+ ESTDOC *doc;
223
+ vdoc = rb_iv_get(vself, VNDATA);
224
+ Data_Get_Struct(vdoc, ESTDOC, doc);
225
+ Check_Type(vtext, T_STRING);
226
+ est_doc_add_hidden_text(doc, StringValuePtr(vtext));
227
+ return Qnil;
228
+ }
229
+
230
+
231
+ static VALUE doc_set_keywords(VALUE vself, VALUE vkwords){
232
+ VALUE vdoc;
233
+ ESTDOC *doc;
234
+ CBMAP *kwords;
235
+ vdoc = rb_iv_get(vself, VNDATA);
236
+ Data_Get_Struct(vdoc, ESTDOC, doc);
237
+ Check_Type(vkwords, T_HASH);
238
+ kwords = objtocbmap(vkwords);
239
+ est_doc_set_keywords(doc, kwords);
240
+ cbmapclose(kwords);
241
+ return Qnil;
242
+ }
243
+
244
+
245
+ static VALUE doc_set_score(VALUE vself, VALUE vscore){
246
+ VALUE vdoc;
247
+ ESTDOC *doc;
248
+ vdoc = rb_iv_get(vself, VNDATA);
249
+ Data_Get_Struct(vdoc, ESTDOC, doc);
250
+ est_doc_set_score(doc, NUM2INT(vscore));
251
+ return Qnil;
252
+ }
253
+
254
+
255
+ static VALUE doc_id(VALUE vself){
256
+ VALUE vdoc;
257
+ ESTDOC *doc;
258
+ vdoc = rb_iv_get(vself, VNDATA);
259
+ Data_Get_Struct(vdoc, ESTDOC, doc);
260
+ return INT2NUM(est_doc_id(doc));
261
+ }
262
+
263
+
264
+ static VALUE doc_attr_names(VALUE vself){
265
+ VALUE vdoc, vnames;
266
+ ESTDOC *doc;
267
+ CBLIST *names;
268
+ vdoc = rb_iv_get(vself, VNDATA);
269
+ Data_Get_Struct(vdoc, ESTDOC, doc);
270
+ names = est_doc_attr_names(doc);
271
+ vnames = cblisttoobj(names);
272
+ cblistclose(names);
273
+ return vnames;
274
+ }
275
+
276
+
277
+ static VALUE doc_attr(VALUE vself, VALUE vname){
278
+ VALUE vdoc;
279
+ ESTDOC *doc;
280
+ const char *value;
281
+ vdoc = rb_iv_get(vself, VNDATA);
282
+ Data_Get_Struct(vdoc, ESTDOC, doc);
283
+ Check_Type(vname, T_STRING);
284
+ value = est_doc_attr(doc, StringValuePtr(vname));
285
+ return value ? rb_str_new2(value) : Qnil;
286
+ }
287
+
288
+
289
+ static VALUE doc_texts(VALUE vself){
290
+ VALUE vdoc;
291
+ ESTDOC *doc;
292
+ vdoc = rb_iv_get(vself, VNDATA);
293
+ Data_Get_Struct(vdoc, ESTDOC, doc);
294
+ return cblisttoobj(est_doc_texts(doc));
295
+ }
296
+
297
+
298
+ static VALUE doc_cat_texts(VALUE vself){
299
+ VALUE vdoc, vtexts;
300
+ ESTDOC *doc;
301
+ char *texts;
302
+ vdoc = rb_iv_get(vself, VNDATA);
303
+ Data_Get_Struct(vdoc, ESTDOC, doc);
304
+ texts = est_doc_cat_texts(doc);
305
+ vtexts = rb_str_new2(texts);
306
+ free(texts);
307
+ return vtexts;
308
+ }
309
+
310
+
311
+ static VALUE doc_keywords(VALUE vself){
312
+ VALUE vdoc;
313
+ ESTDOC *doc;
314
+ CBMAP *kwords;
315
+ vdoc = rb_iv_get(vself, VNDATA);
316
+ Data_Get_Struct(vdoc, ESTDOC, doc);
317
+ if(!(kwords = est_doc_keywords(doc))) return Qnil;
318
+ return cbmaptoobj(kwords);
319
+ }
320
+
321
+
322
+ static VALUE doc_score(VALUE vself){
323
+ VALUE vdoc;
324
+ ESTDOC *doc;
325
+ vdoc = rb_iv_get(vself, VNDATA);
326
+ Data_Get_Struct(vdoc, ESTDOC, doc);
327
+ return INT2NUM(est_doc_score(doc));
328
+ }
329
+
330
+
331
+ static VALUE doc_dump_draft(VALUE vself){
332
+ VALUE vdoc, vdraft;
333
+ ESTDOC *doc;
334
+ char *draft;
335
+ vdoc = rb_iv_get(vself, VNDATA);
336
+ Data_Get_Struct(vdoc, ESTDOC, doc);
337
+ draft = est_doc_dump_draft(doc);
338
+ vdraft = rb_str_new2(draft);
339
+ free(draft);
340
+ return vdraft;
341
+ }
342
+
343
+
344
+ static VALUE doc_make_snippet(VALUE vself, VALUE vwords,
345
+ VALUE vwwidth, VALUE vhwidth, VALUE vawidth){
346
+ VALUE vdoc, vsnippet;
347
+ ESTDOC *doc;
348
+ CBLIST *words;
349
+ int i, len;
350
+ char *snippet;
351
+ vdoc = rb_iv_get(vself, VNDATA);
352
+ Data_Get_Struct(vdoc, ESTDOC, doc);
353
+ Check_Type(vwords, T_ARRAY);
354
+ len = RARRAY(vwords)->len;
355
+ for(i = 0; i < len; i++){
356
+ Check_Type(rb_ary_entry(vwords, i), T_STRING);
357
+ }
358
+ words = objtocblist(vwords);
359
+ snippet = est_doc_make_snippet(doc, words,
360
+ NUM2INT(vwwidth), NUM2INT(vhwidth), NUM2INT(vawidth));
361
+ vsnippet = rb_str_new2(snippet);
362
+ free(snippet);
363
+ cblistclose(words);
364
+ return vsnippet;
365
+ }
366
+
367
+
368
+ static void cond_init(void){
369
+ cls_cond = rb_define_class_under(mod_estraier, "Condition", rb_cObject);
370
+ cls_cond_data = rb_define_class_under(mod_estraier, "Condition_data", rb_cObject);
371
+ rb_define_const(cls_cond, "SURE", INT2NUM(ESTCONDSURE));
372
+ rb_define_const(cls_cond, "USUAL", INT2NUM(ESTCONDUSUAL));
373
+ rb_define_const(cls_cond, "FAST", INT2NUM(ESTCONDFAST));
374
+ rb_define_const(cls_cond, "AGITO", INT2NUM(ESTCONDAGITO));
375
+ rb_define_const(cls_cond, "NOIDF", INT2NUM(ESTCONDNOIDF));
376
+ rb_define_const(cls_cond, "SIMPLE", INT2NUM(ESTCONDSIMPLE));
377
+ rb_define_const(cls_cond, "ROUGH", INT2NUM(ESTCONDROUGH));
378
+ rb_define_const(cls_cond, "UNION", INT2NUM(ESTCONDUNION));
379
+ rb_define_const(cls_cond, "ISECT", INT2NUM(ESTCONDISECT));
380
+ rb_define_const(cls_cond, "ECLSIMURL", rb_float_new(ESTECLSIMURL));
381
+ rb_define_const(cls_cond, "ECLSERV", rb_float_new(ESTECLSERV));
382
+ rb_define_const(cls_cond, "ECLDIR", rb_float_new(ESTECLDIR));
383
+ rb_define_const(cls_cond, "ECLFILE", rb_float_new(ESTECLFILE));
384
+ rb_define_private_method(cls_cond, "initialize", cond_initialize, 0);
385
+ rb_define_method(cls_cond, "set_phrase", cond_set_phrase, 1);
386
+ rb_define_method(cls_cond, "add_attr", cond_add_attr, 1);
387
+ rb_define_method(cls_cond, "set_order", cond_set_order, 1);
388
+ rb_define_method(cls_cond, "set_max", cond_set_max, 1);
389
+ rb_define_method(cls_cond, "set_skip", cond_set_skip, 1);
390
+ rb_define_method(cls_cond, "set_options", cond_set_options, 1);
391
+ rb_define_method(cls_cond, "set_auxiliary", cond_set_auxiliary, 1);
392
+ rb_define_method(cls_cond, "set_eclipse", cond_set_eclipse, 1);
393
+ rb_define_method(cls_cond, "set_distinct", cond_set_distinct, 1);
394
+ rb_define_method(cls_cond, "set_mask", cond_set_mask, 1);
395
+ }
396
+
397
+
398
+ static VALUE cond_initialize(VALUE vself){
399
+ VALUE vcond;
400
+ ESTCOND *cond;
401
+ cond = est_cond_new();
402
+ est_cond_set_options(cond, ESTCONDSCFB);
403
+ vcond = Data_Wrap_Struct(cls_cond_data, 0, est_cond_delete, cond);
404
+ rb_iv_set(vself, VNDATA, vcond);
405
+ return Qnil;
406
+ }
407
+
408
+
409
+ static VALUE cond_set_phrase(VALUE vself, VALUE vphrase){
410
+ VALUE vcond;
411
+ ESTCOND *cond;
412
+ vcond = rb_iv_get(vself, VNDATA);
413
+ Data_Get_Struct(vcond, ESTCOND, cond);
414
+ Check_Type(vphrase, T_STRING);
415
+ est_cond_set_phrase(cond, StringValuePtr(vphrase));
416
+ return Qnil;
417
+ }
418
+
419
+
420
+ static VALUE cond_add_attr(VALUE vself, VALUE vexpr){
421
+ VALUE vcond;
422
+ ESTCOND *cond;
423
+ vcond = rb_iv_get(vself, VNDATA);
424
+ Data_Get_Struct(vcond, ESTCOND, cond);
425
+ Check_Type(vexpr, T_STRING);
426
+ est_cond_add_attr(cond, StringValuePtr(vexpr));
427
+ return Qnil;
428
+ }
429
+
430
+
431
+ static VALUE cond_set_order(VALUE vself, VALUE vexpr){
432
+ VALUE vcond;
433
+ ESTCOND *cond;
434
+ vcond = rb_iv_get(vself, VNDATA);
435
+ Data_Get_Struct(vcond, ESTCOND, cond);
436
+ Check_Type(vexpr, T_STRING);
437
+ est_cond_set_order(cond, StringValuePtr(vexpr));
438
+ return Qnil;
439
+ }
440
+
441
+
442
+ static VALUE cond_set_max(VALUE vself, VALUE vmax){
443
+ VALUE vcond;
444
+ ESTCOND *cond;
445
+ int max;
446
+ vcond = rb_iv_get(vself, VNDATA);
447
+ Data_Get_Struct(vcond, ESTCOND, cond);
448
+ max = NUM2INT(vmax);
449
+ if(max < 0) rb_raise(rb_eArgError, "invalid argument");
450
+ est_cond_set_max(cond, max);
451
+ return Qnil;
452
+ }
453
+
454
+
455
+ static VALUE cond_set_skip(VALUE vself, VALUE vskip){
456
+ VALUE vcond;
457
+ ESTCOND *cond;
458
+ int skip;
459
+ vcond = rb_iv_get(vself, VNDATA);
460
+ Data_Get_Struct(vcond, ESTCOND, cond);
461
+ skip = NUM2INT(vskip);
462
+ if(skip < 0) rb_raise(rb_eArgError, "invalid argument");
463
+ est_cond_set_skip(cond, skip);
464
+ return Qnil;
465
+ }
466
+
467
+
468
+ static VALUE cond_set_options(VALUE vself, VALUE voptions){
469
+ VALUE vcond;
470
+ ESTCOND *cond;
471
+ vcond = rb_iv_get(vself, VNDATA);
472
+ Data_Get_Struct(vcond, ESTCOND, cond);
473
+ est_cond_set_options(cond, NUM2INT(voptions));
474
+ return Qnil;
475
+ }
476
+
477
+
478
+ static VALUE cond_set_auxiliary(VALUE vself, VALUE vmin){
479
+ VALUE vcond;
480
+ ESTCOND *cond;
481
+ vcond = rb_iv_get(vself, VNDATA);
482
+ Data_Get_Struct(vcond, ESTCOND, cond);
483
+ est_cond_set_auxiliary(cond, NUM2INT(vmin));
484
+ return Qnil;
485
+ }
486
+
487
+
488
+ static VALUE cond_set_eclipse(VALUE vself, VALUE vlimit){
489
+ VALUE vcond;
490
+ ESTCOND *cond;
491
+ vcond = rb_iv_get(vself, VNDATA);
492
+ Data_Get_Struct(vcond, ESTCOND, cond);
493
+ est_cond_set_eclipse(cond, NUM2DBL(vlimit));
494
+ return Qnil;
495
+ }
496
+
497
+
498
+ static VALUE cond_set_distinct(VALUE vself, VALUE vname){
499
+ VALUE vcond;
500
+ ESTCOND *cond;
501
+ vcond = rb_iv_get(vself, VNDATA);
502
+ Data_Get_Struct(vcond, ESTCOND, cond);
503
+ Check_Type(vname, T_STRING);
504
+ est_cond_set_distinct(cond, StringValuePtr(vname));
505
+ return Qnil;
506
+ }
507
+
508
+
509
+ static VALUE cond_set_mask(VALUE vself, VALUE vmask){
510
+ VALUE vcond;
511
+ ESTCOND *cond;
512
+ vcond = rb_iv_get(vself, VNDATA);
513
+ Data_Get_Struct(vcond, ESTCOND, cond);
514
+ est_cond_set_mask(cond, NUM2INT(vmask));
515
+ return Qnil;
516
+ }
517
+
518
+
519
+ static void res_init(void){
520
+ cls_res = rb_define_class_under(mod_estraier, "Result", rb_cObject);
521
+ cls_res_data = rb_define_class_under(mod_estraier, "Result_data", rb_cObject);
522
+ rb_define_private_method(cls_res, "initialize", res_initialize, 0);
523
+ rb_define_method(cls_res, "doc_num", res_doc_num, 0);
524
+ rb_define_method(cls_res, "get_doc_id", res_get_doc_id, 1);
525
+ rb_define_method(cls_res, "get_dbidx", res_get_dbidx, 1);
526
+ rb_define_method(cls_res, "hint_words", res_hint_words, 0);
527
+ rb_define_method(cls_res, "hint", res_hint, 1);
528
+ rb_define_method(cls_res, "get_score", res_get_score, 1);
529
+ rb_define_method(cls_res, "get_shadows", res_get_shadows, 1);
530
+ }
531
+
532
+
533
+ static VALUE res_initialize(VALUE vself){
534
+ VALUE vres;
535
+ ESTRES *res;
536
+ res = est_res_new();
537
+ vres = Data_Wrap_Struct(cls_res_data, 0, est_res_delete, res);
538
+ rb_iv_set(vself, VNDATA, vres);
539
+ return Qnil;
540
+ }
541
+
542
+
543
+ static ESTRES *est_res_new(void){
544
+ ESTRES *res;
545
+ res = cbmalloc(sizeof(ESTRES));
546
+ res->ids = NULL;
547
+ res->dbidxs = NULL;
548
+ res->num = 0;
549
+ res->hints = NULL;
550
+ return res;
551
+ }
552
+
553
+
554
+ static void est_res_delete(ESTRES *res){
555
+ if(res->hints) cbmapclose(res->hints);
556
+ if(res->dbidxs) free(res->dbidxs);
557
+ if(res->ids) free(res->ids);
558
+ free(res);
559
+ }
560
+
561
+
562
+ static VALUE res_doc_num(VALUE vself){
563
+ VALUE vres;
564
+ ESTRES *res;
565
+ vres = rb_iv_get(vself, VNDATA);
566
+ Data_Get_Struct(vres, ESTRES, res);
567
+ return INT2NUM(res->num);
568
+ }
569
+
570
+
571
+ static VALUE res_get_doc_id(VALUE vself, VALUE vindex){
572
+ VALUE vres;
573
+ ESTRES *res;
574
+ int index;
575
+ vres = rb_iv_get(vself, VNDATA);
576
+ Data_Get_Struct(vres, ESTRES, res);
577
+ index = NUM2INT(vindex);
578
+ if(!res->ids || index < 0 || index >= res->num) return -1;
579
+ return INT2NUM(res->ids[index]);
580
+ }
581
+
582
+
583
+ static VALUE res_get_dbidx(VALUE vself, VALUE vindex){
584
+ VALUE vres;
585
+ ESTRES *res;
586
+ int index;
587
+ vres = rb_iv_get(vself, VNDATA);
588
+ Data_Get_Struct(vres, ESTRES, res);
589
+ index = NUM2INT(vindex);
590
+ if(!res->dbidxs || index < 0 || index >= res->num) return -1;
591
+ return INT2NUM(res->dbidxs[index]);
592
+ }
593
+
594
+
595
+ static VALUE res_hint_words(VALUE vself){
596
+ VALUE vres, vwords;
597
+ ESTRES *res;
598
+ CBLIST *words;
599
+ const char *vbuf;
600
+ int i;
601
+ vres = rb_iv_get(vself, VNDATA);
602
+ Data_Get_Struct(vres, ESTRES, res);
603
+ if(!res->hints) return rb_ary_new();
604
+ words = cbmapkeys(res->hints);
605
+ for(i = 0; i < cblistnum(words); i++){
606
+ vbuf = cblistval(words, i, NULL);
607
+ if(vbuf[0] == '\0'){
608
+ free(cblistremove(words, i, NULL));
609
+ break;
610
+ }
611
+ }
612
+ vwords = cblisttoobj(words);
613
+ cblistclose(words);
614
+ return vwords;
615
+ }
616
+
617
+
618
+ static VALUE res_hint(VALUE vself, VALUE vword){
619
+ VALUE vres;
620
+ ESTRES *res;
621
+ const char *value;
622
+ vres = rb_iv_get(vself, VNDATA);
623
+ Data_Get_Struct(vres, ESTRES, res);
624
+ Check_Type(vword, T_STRING);
625
+ if(!res->hints) return INT2NUM(0);
626
+ if(!(value = cbmapget(res->hints, StringValuePtr(vword), -1, NULL))) return INT2NUM(0);
627
+ return INT2NUM(atoi(value));
628
+ }
629
+
630
+
631
+ static VALUE res_get_score(VALUE vself, VALUE vindex){
632
+ VALUE vres, vcond;
633
+ ESTRES *res;
634
+ ESTCOND *cond;
635
+ vres = rb_iv_get(vself, VNDATA);
636
+ Data_Get_Struct(vres, ESTRES, res);
637
+ vcond = rb_iv_get(vself, VNCOND);
638
+ Data_Get_Struct(vcond, ESTCOND, cond);
639
+ return INT2NUM(est_cond_score(cond, NUM2INT(vindex)));
640
+ }
641
+
642
+
643
+ static VALUE res_get_shadows(VALUE vself, VALUE vid){
644
+ VALUE vres, vcond, vary;
645
+ ESTRES *res;
646
+ ESTCOND *cond;
647
+ const int *ary;
648
+ int i, anum;
649
+ vres = rb_iv_get(vself, VNDATA);
650
+ Data_Get_Struct(vres, ESTRES, res);
651
+ vcond = rb_iv_get(vself, VNCOND);
652
+ Data_Get_Struct(vcond, ESTCOND, cond);
653
+ ary = est_cond_shadows(cond, NUM2INT(vid), &anum);
654
+ vary = rb_ary_new2(anum);
655
+ for(i = 0; i < anum; i++){
656
+ rb_ary_push(vary, INT2NUM(ary[i]));
657
+ }
658
+ return vary;
659
+ }
660
+
661
+
662
+ static void db_init(void){
663
+ cls_db = rb_define_class_under(mod_estraier, "Database", rb_cObject);
664
+ cls_db_data = rb_define_class_under(mod_estraier, "Database_data", rb_cObject);
665
+ rb_define_const(cls_db, "VERSION", rb_str_new2(est_version));
666
+ rb_define_const(cls_db, "ERRNOERR", INT2NUM(ESTENOERR));
667
+ rb_define_const(cls_db, "ERRINVAL", INT2NUM(ESTEINVAL));
668
+ rb_define_const(cls_db, "ERRACCES", INT2NUM(ESTEACCES));
669
+ rb_define_const(cls_db, "ERRLOCK", INT2NUM(ESTELOCK));
670
+ rb_define_const(cls_db, "ERRDB", INT2NUM(ESTEDB));
671
+ rb_define_const(cls_db, "ERRIO", INT2NUM(ESTEIO));
672
+ rb_define_const(cls_db, "ERRNOITEM", INT2NUM(ESTENOITEM));
673
+ rb_define_const(cls_db, "ERRMISC", INT2NUM(ESTEMISC));
674
+ rb_define_const(cls_db, "DBREADER", INT2NUM(ESTDBREADER));
675
+ rb_define_const(cls_db, "DBWRITER", INT2NUM(ESTDBWRITER));
676
+ rb_define_const(cls_db, "DBCREAT", INT2NUM(ESTDBCREAT));
677
+ rb_define_const(cls_db, "DBTRUNC", INT2NUM(ESTDBTRUNC));
678
+ rb_define_const(cls_db, "DBNOLCK", INT2NUM(ESTDBNOLCK));
679
+ rb_define_const(cls_db, "DBLCKNB", INT2NUM(ESTDBLCKNB));
680
+ rb_define_const(cls_db, "DBPERFNG", INT2NUM(ESTDBPERFNG));
681
+ rb_define_const(cls_db, "DBCHRCAT", INT2NUM(ESTDBCHRCAT));
682
+ rb_define_const(cls_db, "DBSMALL", INT2NUM(ESTDBSMALL));
683
+ rb_define_const(cls_db, "DBLARGE", INT2NUM(ESTDBLARGE));
684
+ rb_define_const(cls_db, "DBHUGE", INT2NUM(ESTDBHUGE));
685
+ rb_define_const(cls_db, "DBHUGE2", INT2NUM(ESTDBHUGE2));
686
+ rb_define_const(cls_db, "DBHUGE3", INT2NUM(ESTDBHUGE3));
687
+ rb_define_const(cls_db, "DBSCVOID", INT2NUM(ESTDBSCVOID));
688
+ rb_define_const(cls_db, "DBSCINT", INT2NUM(ESTDBSCINT));
689
+ rb_define_const(cls_db, "DBSCASIS", INT2NUM(ESTDBSCASIS));
690
+ rb_define_const(cls_db, "IDXATTRSEQ", INT2NUM(ESTIDXATTRSEQ));
691
+ rb_define_const(cls_db, "IDXATTRSTR", INT2NUM(ESTIDXATTRSTR));
692
+ rb_define_const(cls_db, "IDXATTRNUM", INT2NUM(ESTIDXATTRNUM));
693
+ rb_define_const(cls_db, "OPTNOPURGE", INT2NUM(ESTOPTNOPURGE));
694
+ rb_define_const(cls_db, "OPTNODBOPT", INT2NUM(ESTOPTNODBOPT));
695
+ rb_define_const(cls_db, "MGCLEAN", INT2NUM(ESTMGCLEAN));
696
+ rb_define_const(cls_db, "PDCLEAN", INT2NUM(ESTPDCLEAN));
697
+ rb_define_const(cls_db, "PDWEIGHT", INT2NUM(ESTPDWEIGHT));
698
+ rb_define_const(cls_db, "ODCLEAN", INT2NUM(ESTODCLEAN));
699
+ rb_define_const(cls_db, "GDNOATTR", INT2NUM(ESTGDNOATTR));
700
+ rb_define_const(cls_db, "GDNOTEXT", INT2NUM(ESTGDNOTEXT));
701
+ rb_define_const(cls_db, "GDNOKWD", INT2NUM(ESTGDNOKWD));
702
+ rb_define_private_method(cls_db, "initialize", db_initialize, 0);
703
+ rb_define_singleton_method(cls_db, "search_meta", db_search_meta, 2);
704
+ rb_define_method(cls_db, "err_msg", db_err_msg, 1);
705
+ rb_define_method(cls_db, "open", db_open, 2);
706
+ rb_define_method(cls_db, "close", db_close, 0);
707
+ rb_define_method(cls_db, "error", db_error, 0);
708
+ rb_define_method(cls_db, "fatal", db_fatal, 0);
709
+ rb_define_method(cls_db, "add_attr_index", db_add_attr_index, 2);
710
+ rb_define_method(cls_db, "flush", db_flush, 1);
711
+ rb_define_method(cls_db, "sync", db_sync, 0);
712
+ rb_define_method(cls_db, "optimize", db_optimize, 1);
713
+ rb_define_method(cls_db, "merge", db_merge, 2);
714
+ rb_define_method(cls_db, "put_doc", db_put_doc, 2);
715
+ rb_define_method(cls_db, "out_doc", db_out_doc, 2);
716
+ rb_define_method(cls_db, "edit_doc", db_edit_doc, 1);
717
+ rb_define_method(cls_db, "get_doc", db_get_doc, 2);
718
+ rb_define_method(cls_db, "get_doc_attr", db_get_doc_attr, 2);
719
+ rb_define_method(cls_db, "uri_to_id", db_uri_to_id, 1);
720
+ rb_define_method(cls_db, "name", db_name, 0);
721
+ rb_define_method(cls_db, "doc_num", db_doc_num, 0);
722
+ rb_define_method(cls_db, "word_num", db_word_num, 0);
723
+ rb_define_method(cls_db, "size", db_size, 0);
724
+ rb_define_method(cls_db, "search", db_search, 1);
725
+ rb_define_method(cls_db, "scan_doc", db_scan_doc, 2);
726
+ rb_define_method(cls_db, "set_cache_size", db_set_cache_size, 4);
727
+ rb_define_method(cls_db, "add_pseudo_index", db_add_pseudo_index, 1);
728
+ rb_define_method(cls_db, "set_wildmax", db_set_wildmax, 1);
729
+ rb_define_method(cls_db, "set_informer", db_set_informer, 1);
730
+ }
731
+
732
+
733
+ static VALUE db_initialize(VALUE vself){
734
+ VALUE vdb;
735
+ ESTDBMGR *db;
736
+ db = est_dbmgr_new();
737
+ vdb = Data_Wrap_Struct(cls_db_data, 0, est_dbmgr_delete, db);
738
+ rb_iv_set(vself, VNDATA, vdb);
739
+ return Qnil;
740
+ }
741
+
742
+
743
+ static ESTDBMGR *est_dbmgr_new(void){
744
+ ESTDBMGR *db;
745
+ db = cbmalloc(sizeof(ESTDBMGR));
746
+ db->db = NULL;
747
+ db->ecode = ESTENOERR;
748
+ return db;
749
+ }
750
+
751
+
752
+ static void est_dbmgr_delete(ESTDBMGR *db){
753
+ if(db->db) est_mtdb_close(db->db, &(db->ecode));
754
+ free(db);
755
+ }
756
+
757
+
758
+ static VALUE db_search_meta(VALUE vself, VALUE vdbs, VALUE vcond){
759
+ VALUE vdb, vres, tres, tcond;
760
+ ESTDBMGR *db;
761
+ ESTRES *ores;
762
+ ESTCOND *cond;
763
+ ESTMTDB **dbs;
764
+ CBMAP *hints;
765
+ int i, dnum, *res, rnum;
766
+ Check_Type(vdbs, T_ARRAY);
767
+ dnum = RARRAY(vdbs)->len;
768
+ dbs = cbmalloc(dnum * sizeof(ESTMTDB *) + 1);
769
+ for(i = 0; i < dnum; i++){
770
+ vdb = rb_ary_entry(vdbs, i);
771
+ if(rb_obj_is_instance_of(vdb, cls_db) != Qtrue){
772
+ free(dbs);
773
+ rb_raise(rb_eArgError, "invalid argument");
774
+ }
775
+ Data_Get_Struct(rb_iv_get(vdb, VNDATA), ESTDBMGR, db);
776
+ if(!db->db){
777
+ free(dbs);
778
+ rb_raise(rb_eArgError, "invalid argument");
779
+ }
780
+ dbs[i] = db->db;
781
+ }
782
+ if(rb_obj_is_instance_of(vcond, cls_cond) != Qtrue){
783
+ free(dbs);
784
+ rb_raise(rb_eArgError, "invalid argument");
785
+ }
786
+ Data_Get_Struct(rb_iv_get(vcond, VNDATA), ESTCOND, cond);
787
+ hints = cbmapopenex(31);
788
+ res = est_mtdb_search_meta(dbs, dnum, cond, &rnum, hints);
789
+ ores = est_res_new();
790
+ ores->ids = res;
791
+ ores->dbidxs = cbmalloc(rnum / 2 * sizeof(int) + 1);
792
+ for(i = 0; i < rnum; i += 2){
793
+ ores->dbidxs[i/2] = res[i];
794
+ ores->ids[i/2] = res[i+1];
795
+ }
796
+ ores->num = rnum / 2;
797
+ ores->hints = hints;
798
+ vres = rb_funcall(cls_res, rb_intern("new"), 0);
799
+ tres = Data_Wrap_Struct(cls_res_data, 0, est_res_delete, ores);
800
+ rb_iv_set(vres, VNDATA, tres);
801
+ tcond = Data_Wrap_Struct(cls_cond_data, 0, est_cond_delete, est_cond_dup(cond));
802
+ rb_iv_set(vres, VNCOND, tcond);
803
+ free(dbs);
804
+ return vres;
805
+ }
806
+
807
+
808
+ static VALUE db_err_msg(VALUE vself, VALUE vecode){
809
+ return rb_str_new2(est_err_msg(NUM2INT(vecode)));
810
+ }
811
+
812
+
813
+ static VALUE db_open(VALUE vself, VALUE vname, VALUE vomode){
814
+ VALUE vdb;
815
+ ESTDBMGR *db;
816
+ vdb = rb_iv_get(vself, VNDATA);
817
+ Data_Get_Struct(vdb, ESTDBMGR, db);
818
+ if(db->db && !est_mtdb_close(db->db, &(db->ecode))){
819
+ db->db = NULL;
820
+ return Qfalse;
821
+ }
822
+ Check_Type(vname, T_STRING);
823
+ if(!(db->db = est_mtdb_open(StringValuePtr(vname), NUM2INT(vomode), &(db->ecode))))
824
+ return Qfalse;
825
+ return Qtrue;
826
+ }
827
+
828
+
829
+ static VALUE db_close(VALUE vself){
830
+ VALUE vdb;
831
+ ESTDBMGR *db;
832
+ vdb = rb_iv_get(vself, VNDATA);
833
+ Data_Get_Struct(vdb, ESTDBMGR, db);
834
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
835
+ if(!est_mtdb_close(db->db, &(db->ecode))){
836
+ db->db = NULL;
837
+ return Qfalse;
838
+ }
839
+ db->db = NULL;
840
+ return Qtrue;
841
+ }
842
+
843
+
844
+ static VALUE db_error(VALUE vself){
845
+ VALUE vdb;
846
+ ESTDBMGR *db;
847
+ vdb = rb_iv_get(vself, VNDATA);
848
+ Data_Get_Struct(vdb, ESTDBMGR, db);
849
+ return INT2NUM(db->ecode);
850
+ }
851
+
852
+
853
+ static VALUE db_fatal(VALUE vself){
854
+ VALUE vdb;
855
+ ESTDBMGR *db;
856
+ vdb = rb_iv_get(vself, VNDATA);
857
+ Data_Get_Struct(vdb, ESTDBMGR, db);
858
+ if(!db->db) return Qfalse;
859
+ return est_mtdb_fatal(db->db) ? Qtrue : Qfalse;
860
+ }
861
+
862
+
863
+ static VALUE db_add_attr_index(VALUE vself, VALUE vname, VALUE vtype){
864
+ VALUE vdb;
865
+ ESTDBMGR *db;
866
+ vdb = rb_iv_get(vself, VNDATA);
867
+ Data_Get_Struct(vdb, ESTDBMGR, db);
868
+ if(!db->db) return Qfalse;
869
+ Check_Type(vname, T_STRING);
870
+ if(!est_mtdb_add_attr_index(db->db, StringValuePtr(vname), NUM2INT(vtype))){
871
+ db->ecode = est_mtdb_error(db->db);
872
+ return Qfalse;
873
+ }
874
+ return Qtrue;
875
+ }
876
+
877
+
878
+ static VALUE db_flush(VALUE vself, VALUE vmax){
879
+ VALUE vdb;
880
+ ESTDBMGR *db;
881
+ vdb = rb_iv_get(vself, VNDATA);
882
+ Data_Get_Struct(vdb, ESTDBMGR, db);
883
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
884
+ if(!est_mtdb_flush(db->db, NUM2INT(vmax))){
885
+ db->ecode = est_mtdb_error(db->db);
886
+ return Qfalse;
887
+ }
888
+ return Qtrue;
889
+ }
890
+
891
+
892
+ static VALUE db_sync(VALUE vself){
893
+ VALUE vdb;
894
+ ESTDBMGR *db;
895
+ vdb = rb_iv_get(vself, VNDATA);
896
+ Data_Get_Struct(vdb, ESTDBMGR, db);
897
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
898
+ if(!est_mtdb_sync(db->db)){
899
+ db->ecode = est_mtdb_error(db->db);
900
+ return Qfalse;
901
+ }
902
+ return Qtrue;
903
+ }
904
+
905
+
906
+ static VALUE db_optimize(VALUE vself, VALUE voptions){
907
+ VALUE vdb;
908
+ ESTDBMGR *db;
909
+ vdb = rb_iv_get(vself, VNDATA);
910
+ Data_Get_Struct(vdb, ESTDBMGR, db);
911
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
912
+ if(!est_mtdb_optimize(db->db, NUM2INT(voptions))){
913
+ db->ecode = est_mtdb_error(db->db);
914
+ return Qfalse;
915
+ }
916
+ return Qtrue;
917
+ }
918
+
919
+
920
+ static VALUE db_merge(VALUE vself, VALUE vname, VALUE voptions){
921
+ VALUE vdb;
922
+ ESTDBMGR *db;
923
+ vdb = rb_iv_get(vself, VNDATA);
924
+ Data_Get_Struct(vdb, ESTDBMGR, db);
925
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
926
+ Check_Type(vname, T_STRING);
927
+ if(!est_mtdb_merge(db->db, StringValuePtr(vname), NUM2INT(voptions))){
928
+ db->ecode = est_mtdb_error(db->db);
929
+ return Qfalse;
930
+ }
931
+ return Qtrue;
932
+ }
933
+
934
+
935
+ static VALUE db_put_doc(VALUE vself, VALUE vdoc, VALUE voptions){
936
+ VALUE vdb;
937
+ ESTDBMGR *db;
938
+ ESTDOC *doc;
939
+ vdb = rb_iv_get(vself, VNDATA);
940
+ Data_Get_Struct(vdb, ESTDBMGR, db);
941
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
942
+ if(rb_obj_is_instance_of(vdoc, cls_doc) != Qtrue) rb_raise(rb_eArgError, "invalid argument");
943
+ Data_Get_Struct(rb_iv_get(vdoc, VNDATA), ESTDOC, doc);
944
+ if(!est_mtdb_put_doc(db->db, doc, NUM2INT(voptions))){
945
+ db->ecode = est_mtdb_error(db->db);
946
+ return Qfalse;
947
+ }
948
+ return Qtrue;
949
+ }
950
+
951
+
952
+ static VALUE db_out_doc(VALUE vself, VALUE vid, VALUE voptions){
953
+ VALUE vdb;
954
+ ESTDBMGR *db;
955
+ int id;
956
+ vdb = rb_iv_get(vself, VNDATA);
957
+ Data_Get_Struct(vdb, ESTDBMGR, db);
958
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
959
+ id = NUM2INT(vid);
960
+ if(id < 1) rb_raise(rb_eArgError, "invalid argument");
961
+ if(!est_mtdb_out_doc(db->db, id, NUM2INT(voptions))){
962
+ db->ecode = est_mtdb_error(db->db);
963
+ return Qfalse;
964
+ }
965
+ return Qtrue;
966
+ }
967
+
968
+
969
+ static VALUE db_edit_doc(VALUE vself, VALUE vdoc){
970
+ VALUE vdb;
971
+ ESTDBMGR *db;
972
+ ESTDOC *doc;
973
+ vdb = rb_iv_get(vself, VNDATA);
974
+ Data_Get_Struct(vdb, ESTDBMGR, db);
975
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
976
+ if(rb_obj_is_instance_of(vdoc, cls_doc) != Qtrue) rb_raise(rb_eArgError, "invalid argument");
977
+ Data_Get_Struct(rb_iv_get(vdoc, VNDATA), ESTDOC, doc);
978
+ if(!est_mtdb_edit_doc(db->db, doc)){
979
+ db->ecode = est_mtdb_error(db->db);
980
+ return Qfalse;
981
+ }
982
+ return Qtrue;
983
+ }
984
+
985
+
986
+ static VALUE db_get_doc(VALUE vself, VALUE vid, VALUE voptions){
987
+ VALUE vdb, vdoc, tdoc;
988
+ ESTDBMGR *db;
989
+ ESTDOC *doc;
990
+ int id;
991
+ vdb = rb_iv_get(vself, VNDATA);
992
+ Data_Get_Struct(vdb, ESTDBMGR, db);
993
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
994
+ id = NUM2INT(vid);
995
+ if(id < 1) rb_raise(rb_eArgError, "invalid argument");
996
+ if(!(doc = est_mtdb_get_doc(db->db, id, NUM2INT(voptions)))){
997
+ db->ecode = est_mtdb_error(db->db);
998
+ return Qnil;
999
+ }
1000
+ vdoc = rb_funcall(cls_doc, rb_intern("new"), 0);
1001
+ tdoc = Data_Wrap_Struct(cls_doc_data, 0, est_doc_delete, doc);
1002
+ rb_iv_set(vdoc, VNDATA, tdoc);
1003
+ return vdoc;
1004
+ }
1005
+
1006
+
1007
+ static VALUE db_get_doc_attr(VALUE vself, VALUE vid, VALUE vname){
1008
+ VALUE vdb, vvalue;
1009
+ ESTDBMGR *db;
1010
+ char *value;
1011
+ int id;
1012
+ vdb = rb_iv_get(vself, VNDATA);
1013
+ Data_Get_Struct(vdb, ESTDBMGR, db);
1014
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
1015
+ Check_Type(vname, T_STRING);
1016
+ id = NUM2INT(vid);
1017
+ if(id < 1) rb_raise(rb_eArgError, "invalid argument");
1018
+ if(!(value = est_mtdb_get_doc_attr(db->db, id, StringValuePtr(vname)))){
1019
+ db->ecode = est_mtdb_error(db->db);
1020
+ return Qnil;
1021
+ }
1022
+ vvalue = rb_str_new2(value);
1023
+ free(value);
1024
+ return vvalue;
1025
+ }
1026
+
1027
+
1028
+ static VALUE db_uri_to_id(VALUE vself, VALUE vuri){
1029
+ VALUE vdb;
1030
+ ESTDBMGR *db;
1031
+ int id;
1032
+ vdb = rb_iv_get(vself, VNDATA);
1033
+ Data_Get_Struct(vdb, ESTDBMGR, db);
1034
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
1035
+ Check_Type(vuri, T_STRING);
1036
+ if((id = est_mtdb_uri_to_id(db->db, StringValuePtr(vuri))) == -1){
1037
+ db->ecode = est_mtdb_error(db->db);
1038
+ return INT2NUM(-1);
1039
+ }
1040
+ return INT2NUM(id);
1041
+ }
1042
+
1043
+
1044
+ static VALUE db_name(VALUE vself){
1045
+ VALUE vdb;
1046
+ ESTDBMGR *db;
1047
+ vdb = rb_iv_get(vself, VNDATA);
1048
+ Data_Get_Struct(vdb, ESTDBMGR, db);
1049
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
1050
+ return rb_str_new2(est_mtdb_name(db->db));
1051
+ }
1052
+
1053
+
1054
+ static VALUE db_doc_num(VALUE vself){
1055
+ VALUE vdb;
1056
+ ESTDBMGR *db;
1057
+ vdb = rb_iv_get(vself, VNDATA);
1058
+ Data_Get_Struct(vdb, ESTDBMGR, db);
1059
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
1060
+ return INT2NUM(est_mtdb_doc_num(db->db));
1061
+ }
1062
+
1063
+
1064
+ static VALUE db_word_num(VALUE vself){
1065
+ VALUE vdb;
1066
+ ESTDBMGR *db;
1067
+ vdb = rb_iv_get(vself, VNDATA);
1068
+ Data_Get_Struct(vdb, ESTDBMGR, db);
1069
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
1070
+ return INT2NUM(est_mtdb_word_num(db->db));
1071
+ }
1072
+
1073
+
1074
+ static VALUE db_size(VALUE vself){
1075
+ VALUE vdb;
1076
+ ESTDBMGR *db;
1077
+ vdb = rb_iv_get(vself, VNDATA);
1078
+ Data_Get_Struct(vdb, ESTDBMGR, db);
1079
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
1080
+ return rb_float_new(est_mtdb_size(db->db));
1081
+ }
1082
+
1083
+
1084
+ static VALUE db_search(VALUE vself, VALUE vcond){
1085
+ VALUE vdb, vres, tres, tcond;
1086
+ ESTDBMGR *db;
1087
+ ESTRES *ores;
1088
+ ESTCOND *cond;
1089
+ CBMAP *hints;
1090
+ int *res, rnum;
1091
+ vdb = rb_iv_get(vself, VNDATA);
1092
+ Data_Get_Struct(vdb, ESTDBMGR, db);
1093
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
1094
+ if(rb_obj_is_instance_of(vcond, cls_cond) != Qtrue) rb_raise(rb_eArgError, "invalid argument");
1095
+ Data_Get_Struct(rb_iv_get(vcond, VNDATA), ESTCOND, cond);
1096
+ hints = cbmapopenex(31);
1097
+ res = est_mtdb_search(db->db, cond, &rnum, hints);
1098
+ ores = est_res_new();
1099
+ ores->ids = res;
1100
+ ores->num = rnum;
1101
+ ores->hints = hints;
1102
+ vres = rb_funcall(cls_res, rb_intern("new"), 0);
1103
+ tres = Data_Wrap_Struct(cls_res_data, 0, est_res_delete, ores);
1104
+ rb_iv_set(vres, VNDATA, tres);
1105
+ tcond = Data_Wrap_Struct(cls_cond_data, 0, est_cond_delete, est_cond_dup(cond));
1106
+ rb_iv_set(vres, VNCOND, tcond);
1107
+ return vres;
1108
+ }
1109
+
1110
+
1111
+ static VALUE db_scan_doc(VALUE vself, VALUE vdoc, VALUE vcond){
1112
+ VALUE vdb;
1113
+ ESTDBMGR *db;
1114
+ ESTDOC *doc;
1115
+ ESTCOND *cond;
1116
+ vdb = rb_iv_get(vself, VNDATA);
1117
+ Data_Get_Struct(vdb, ESTDBMGR, db);
1118
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
1119
+ if(rb_obj_is_instance_of(vdoc, cls_doc) != Qtrue) rb_raise(rb_eArgError, "invalid argument");
1120
+ if(rb_obj_is_instance_of(vcond, cls_cond) != Qtrue) rb_raise(rb_eArgError, "invalid argument");
1121
+ Data_Get_Struct(rb_iv_get(vdoc, VNDATA), ESTDOC, doc);
1122
+ Data_Get_Struct(rb_iv_get(vcond, VNDATA), ESTCOND, cond);
1123
+ return est_mtdb_scan_doc(db->db, doc, cond) ? Qtrue : Qfalse;
1124
+ }
1125
+
1126
+
1127
+ static VALUE db_set_cache_size(VALUE vself, VALUE vsize, VALUE vanum, VALUE vtnum, VALUE vrnum){
1128
+ VALUE vdb;
1129
+ ESTDBMGR *db;
1130
+ vdb = rb_iv_get(vself, VNDATA);
1131
+ Data_Get_Struct(vdb, ESTDBMGR, db);
1132
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
1133
+ est_mtdb_set_cache_size(db->db, NUM2INT(vsize),
1134
+ NUM2INT(vanum), NUM2INT(vtnum), NUM2INT(vrnum));
1135
+ return Qnil;
1136
+ }
1137
+
1138
+
1139
+ static VALUE db_add_pseudo_index(VALUE vself, VALUE vpath){
1140
+ VALUE vdb;
1141
+ ESTDBMGR *db;
1142
+ vdb = rb_iv_get(vself, VNDATA);
1143
+ Data_Get_Struct(vdb, ESTDBMGR, db);
1144
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
1145
+ Check_Type(vpath, T_STRING);
1146
+ return est_mtdb_add_pseudo_index(db->db, StringValuePtr(vpath)) ? Qtrue : Qfalse;
1147
+ }
1148
+
1149
+
1150
+ static VALUE db_set_wildmax(VALUE vself, VALUE vnum){
1151
+ VALUE vdb;
1152
+ ESTDBMGR *db;
1153
+ vdb = rb_iv_get(vself, VNDATA);
1154
+ Data_Get_Struct(vdb, ESTDBMGR, db);
1155
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
1156
+ est_mtdb_set_wildmax(db->db, NUM2INT(vnum));
1157
+ return Qnil;
1158
+ }
1159
+
1160
+
1161
+
1162
+ static VALUE db_set_informer(VALUE vself, VALUE vinformer){
1163
+ VALUE vdb;
1164
+ ESTDBMGR *db;
1165
+ vdb = rb_iv_get(vself, VNDATA);
1166
+ Data_Get_Struct(vdb, ESTDBMGR, db);
1167
+ if(!db->db) rb_raise(rb_eArgError, "invalid argument");
1168
+ rb_iv_set(vself, VNINFO, vinformer);
1169
+ est_mtdb_set_informer(db->db, db_informer, (void *)vinformer);
1170
+ return Qnil;
1171
+ }
1172
+
1173
+
1174
+ static VALUE cblisttoobj(const CBLIST *list){
1175
+ const char *vbuf;
1176
+ int i, vsiz;
1177
+ VALUE obj;
1178
+ obj = rb_ary_new2(cblistnum(list));
1179
+ for(i = 0; i < cblistnum(list); i++){
1180
+ vbuf = cblistval(list, i, &vsiz);
1181
+ rb_ary_store(obj, i, rb_str_new(vbuf, vsiz));
1182
+ }
1183
+ return obj;
1184
+ }
1185
+
1186
+
1187
+ static CBLIST *objtocblist(VALUE obj){
1188
+ CBLIST *list;
1189
+ VALUE str;
1190
+ int i, len;
1191
+ list = cblistopen();
1192
+ len = RARRAY(obj)->len;
1193
+ for(i = 0; i < len; i++){
1194
+ str = rb_ary_entry(obj, i);
1195
+ cblistpush(list, RSTRING(str)->ptr, RSTRING(str)->len);
1196
+ }
1197
+ return list;
1198
+ }
1199
+
1200
+
1201
+ static VALUE cbmaptoobj(CBMAP *map){
1202
+ const char *kbuf, *vbuf;
1203
+ int ksiz, vsiz;
1204
+ VALUE obj;
1205
+ obj = rb_hash_new();
1206
+ cbmapiterinit(map);
1207
+ while((kbuf = cbmapiternext(map, &ksiz)) != NULL){
1208
+ vbuf = cbmapiterval(kbuf, &vsiz);
1209
+ rb_hash_aset(obj, rb_str_new(kbuf, ksiz), rb_str_new(vbuf, vsiz));
1210
+ }
1211
+ return obj;
1212
+ }
1213
+
1214
+
1215
+ static CBMAP *objtocbmap(VALUE obj){
1216
+ CBMAP *map;
1217
+ VALUE keys, key, val;
1218
+ int i, len;
1219
+ map = cbmapopenex(31);
1220
+ keys = rb_funcall(obj, rb_intern("keys"), 0);
1221
+ len = RARRAY(keys)->len;
1222
+ for(i = 0; i < len; i++){
1223
+ key = rb_ary_entry(keys, i);
1224
+ val = rb_hash_aref(obj, key);
1225
+ key = rb_String(key);
1226
+ val = rb_String(val);
1227
+ cbmapput(map, RSTRING(key)->ptr, RSTRING(key)->len,
1228
+ RSTRING(val)->ptr, RSTRING(val)->len, 0);
1229
+ }
1230
+ return map;
1231
+ }
1232
+
1233
+
1234
+ static void db_informer(const char *message, void *opaque){
1235
+ VALUE ary;
1236
+ ary = rb_ary_new2(2);
1237
+ rb_ary_push(ary, (VALUE)opaque);
1238
+ rb_ary_push(ary, rb_str_new2(message));
1239
+ rb_rescue(db_informer_process, ary, db_informer_resque, Qnil);
1240
+ }
1241
+
1242
+
1243
+ static VALUE db_informer_process(VALUE arg){
1244
+ VALUE informer, message;
1245
+ informer = rb_ary_shift(arg);
1246
+ message = rb_ary_shift(arg);
1247
+ rb_funcall(informer, rb_intern("inform"), 1, message);
1248
+ return Qnil;
1249
+ }
1250
+
1251
+
1252
+ static VALUE db_informer_resque(VALUE arg){
1253
+ return Qnil;
1254
+ }
1255
+
1256
+
1257
+
1258
+ /* END OF FILE */