ruby-qdbm 0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ MANIFEST
2
+ extconf.rb
3
+ villa.rb
4
+ mod_villa.c
5
+ rbvltest
@@ -0,0 +1,18 @@
1
+ require 'mkmf'
2
+
3
+ dir_config("villa")
4
+
5
+ home = ENV['HOME']
6
+ $CFLAGS = "-I. -I#{home}/include -I/usr/local/include " + `pkg-config qdbm --cflags`.chomp
7
+ $LDFLAGS = "-L#{home}/lib -L/usr/local/lib " + `pkg-config qdbm --libs`.chomp
8
+ $LIBS = "-L#{home}/lib -L/usr/local/lib " + `pkg-config qdbm --libs`.chomp
9
+
10
+ have_library("c", "main")
11
+ have_library("pthread", "main")
12
+ have_library("z", "main")
13
+ have_library("bz2", "main")
14
+ have_library("lzo2", "main")
15
+ have_library("iconv", "main")
16
+ have_library("qdbm", "main")
17
+
18
+ create_makefile("mod_villa")
@@ -0,0 +1,704 @@
1
+ /*************************************************************************************************
2
+ * Implementation of Villa for Ruby
3
+ * Copyright (C) 2000-2006 Mikio Hirabayashi
4
+ * This file is part of QDBM, Quick Database Manager.
5
+ * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
6
+ * Lesser General Public License as published by the Free Software Foundation; either version
7
+ * 2.1 of the License or any later version. QDBM is distributed in the hope that it will be
8
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
10
+ * details.
11
+ * You should have received a copy of the GNU Lesser General Public License along with QDBM; if
12
+ * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
13
+ * 02111-1307 USA.
14
+ *************************************************************************************************/
15
+
16
+
17
+ #include "ruby.h"
18
+ #include <depot.h>
19
+ #include <cabin.h>
20
+ #include <villa.h>
21
+ #include <stdlib.h>
22
+ #include <unistd.h>
23
+ #include <sys/types.h>
24
+ #include <sys/stat.h>
25
+
26
+ #define MAXOPEN 1024
27
+
28
+ #ifndef RUBY_19
29
+ #ifndef RSTRING_LEN
30
+ #define RSTRING_LEN(v) (RSTRING(v)->len)
31
+ #endif
32
+ #endif
33
+
34
+ VALUE cvillaerror;
35
+ VALUE cvillaerror_ENOERR;
36
+ VALUE cvillaerror_EFATAL;
37
+ VALUE cvillaerror_EMODE;
38
+ VALUE cvillaerror_EBROKEN;
39
+ VALUE cvillaerror_EKEEP;
40
+ VALUE cvillaerror_ENOITEM;
41
+ VALUE cvillaerror_EALLOC;
42
+ VALUE cvillaerror_EMAP;
43
+ VALUE cvillaerror_EOPEN;
44
+ VALUE cvillaerror_ECLOSE;
45
+ VALUE cvillaerror_ETRUNC;
46
+ VALUE cvillaerror_ESYNC;
47
+ VALUE cvillaerror_ESTAT;
48
+ VALUE cvillaerror_ESEEK;
49
+ VALUE cvillaerror_EREAD;
50
+ VALUE cvillaerror_EWRITE;
51
+ VALUE cvillaerror_ELOCK;
52
+ VALUE cvillaerror_EUNLINK;
53
+ VALUE cvillaerror_EMKDIR;
54
+ VALUE cvillaerror_ERMDIR;
55
+ VALUE cvillaerror_EMISC;
56
+ VALUE mvilla;
57
+ ID idcompare;
58
+ VILLA *vltable[MAXOPEN];
59
+ char vlsltable[MAXOPEN];
60
+
61
+
62
+ static void vlinit(void);
63
+ static int getnewindex(void);
64
+ static int checkdup(const char *name);
65
+ static void myerror(int ecode);
66
+ static int objcompare(const char *aptr, int asiz, const char *bptr, int bsiz);
67
+ static VALUE rbvlversion(VALUE vself);
68
+ static VALUE rbvlerrmsg(VALUE vself, VALUE vecode);
69
+ static VALUE rbvlopen(VALUE vself, VALUE vname, VALUE vomode, VALUE vcmode);
70
+ static VALUE rbvlclose(VALUE vself, VALUE vindex);
71
+ static VALUE rbvlsetsilent(VALUE vself, VALUE vindex, VALUE vvalue);
72
+ static VALUE rbvlput(VALUE vself, VALUE vindex, VALUE vkey, VALUE vval, VALUE vdmode);
73
+ static VALUE rbvlout(VALUE vself, VALUE vindex, VALUE vkey);
74
+ static VALUE rbvlget(VALUE vself, VALUE vindex, VALUE vkey);
75
+ static VALUE rbvlvsiz(VALUE vself, VALUE vindex, VALUE vkey);
76
+ static VALUE rbvlvnum(VALUE vself, VALUE vindex, VALUE vkey);
77
+ static VALUE rbvlcurfirst(VALUE vself, VALUE vindex);
78
+ static VALUE rbvlcurlast(VALUE vself, VALUE vindex);
79
+ static VALUE rbvlcurprev(VALUE vself, VALUE vindex);
80
+ static VALUE rbvlcurnext(VALUE vself, VALUE vindex);
81
+ static VALUE rbvlcurjump(VALUE vself, VALUE vindex, VALUE vkey, VALUE vjmode);
82
+ static VALUE rbvlcurkey(VALUE vself, VALUE vindex);
83
+ static VALUE rbvlcurval(VALUE vself, VALUE vindex);
84
+ static VALUE rbvlcurput(VALUE vself, VALUE vindex, VALUE vval, VALUE vjmode);
85
+ static VALUE rbvlcurout(VALUE vself, VALUE vindex);
86
+ static VALUE rbvlsettuning(VALUE vself, VALUE vindex,
87
+ VALUE vlrecmax, VALUE vnidxmax, VALUE vlcnum, VALUE vncnum);
88
+ static VALUE rbvlsync(VALUE vself, VALUE vindex);
89
+ static VALUE rbvloptimize(VALUE vself, VALUE vindex);
90
+ static VALUE rbvlfsiz(VALUE vself, VALUE vindex);
91
+ static VALUE rbvlrnum(VALUE vself, VALUE vindex);
92
+ static VALUE rbvlwritable(VALUE vself, VALUE vindex);
93
+ static VALUE rbvlfatalerror(VALUE vself, VALUE vindex);
94
+ static VALUE rbvltranbegin(VALUE vself, VALUE vindex);
95
+ static VALUE rbvltrancommit(VALUE vself, VALUE vindex);
96
+ static VALUE rbvltranabort(VALUE vself, VALUE vindex);
97
+
98
+
99
+
100
+ /*************************************************************************************************
101
+ * public objects
102
+ *************************************************************************************************/
103
+
104
+
105
+ Init_mod_villa(){
106
+ vlinit();
107
+ cvillaerror = rb_define_class("VillaError", rb_eStandardError);
108
+ cvillaerror_ENOERR = rb_define_class("VillaError_ENOERR", cvillaerror);
109
+ cvillaerror_EFATAL = rb_define_class("VillaError_EFATAL", cvillaerror);
110
+ cvillaerror_EMODE = rb_define_class("VillaError_EMODE", cvillaerror);
111
+ cvillaerror_EBROKEN = rb_define_class("VillaError_EBROKEN", cvillaerror);
112
+ cvillaerror_EKEEP = rb_define_class("VillaError_EKEEP", cvillaerror);
113
+ cvillaerror_ENOITEM = rb_define_class("VillaError_ENOITEM", cvillaerror);
114
+ cvillaerror_EALLOC = rb_define_class("VillaError_EALLOC", cvillaerror);
115
+ cvillaerror_EMAP = rb_define_class("VillaError_EMAP", cvillaerror);
116
+ cvillaerror_EOPEN = rb_define_class("VillaError_EOPEN", cvillaerror);
117
+ cvillaerror_ECLOSE = rb_define_class("VillaError_ECLOSE", cvillaerror);
118
+ cvillaerror_ETRUNC = rb_define_class("VillaError_ETRUNC", cvillaerror);
119
+ cvillaerror_ESYNC = rb_define_class("VillaError_ESYNC", cvillaerror);
120
+ cvillaerror_ESTAT = rb_define_class("VillaError_ESTAT", cvillaerror);
121
+ cvillaerror_ESEEK = rb_define_class("VillaError_ESEEK", cvillaerror);
122
+ cvillaerror_EREAD = rb_define_class("VillaError_EREAD", cvillaerror);
123
+ cvillaerror_EWRITE = rb_define_class("VillaError_EWRITE", cvillaerror);
124
+ cvillaerror_ELOCK = rb_define_class("VillaError_ELOCK", cvillaerror);
125
+ cvillaerror_EUNLINK = rb_define_class("VillaError_EUNLINK", cvillaerror);
126
+ cvillaerror_EMKDIR = rb_define_class("VillaError_EMKDIR", cvillaerror);
127
+ cvillaerror_ERMDIR = rb_define_class("VillaError_ERMDIR", cvillaerror);
128
+ cvillaerror_EMISC = rb_define_class("VillaError_EMISC", cvillaerror);
129
+ mvilla = rb_define_module("Mod_Villa");
130
+ rb_define_const(mvilla, "EANY", cvillaerror);
131
+ rb_define_const(mvilla, "ENOERR", cvillaerror_ENOERR);
132
+ rb_define_const(mvilla, "EFATAL", cvillaerror_EFATAL);
133
+ rb_define_const(mvilla, "EMODE", cvillaerror_EMODE);
134
+ rb_define_const(mvilla, "EBROKEN", cvillaerror_EBROKEN);
135
+ rb_define_const(mvilla, "EKEEP", cvillaerror_EKEEP);
136
+ rb_define_const(mvilla, "ENOITEM", cvillaerror_ENOITEM);
137
+ rb_define_const(mvilla, "EALLOC", cvillaerror_EALLOC);
138
+ rb_define_const(mvilla, "EMAP", cvillaerror_EMAP);
139
+ rb_define_const(mvilla, "EOPEN", cvillaerror_EOPEN);
140
+ rb_define_const(mvilla, "ECLOSE", cvillaerror_ECLOSE);
141
+ rb_define_const(mvilla, "ETRUNC", cvillaerror_ETRUNC);
142
+ rb_define_const(mvilla, "ESYNC", cvillaerror_ESYNC);
143
+ rb_define_const(mvilla, "ESTAT", cvillaerror_ESTAT);
144
+ rb_define_const(mvilla, "ESEEK", cvillaerror_ESEEK);
145
+ rb_define_const(mvilla, "EREAD", cvillaerror_EREAD);
146
+ rb_define_const(mvilla, "EWRITE", cvillaerror_EWRITE);
147
+ rb_define_const(mvilla, "ELOCK", cvillaerror_ELOCK);
148
+ rb_define_const(mvilla, "EUNLINK", cvillaerror_EUNLINK);
149
+ rb_define_const(mvilla, "EMKDIR", cvillaerror_EMKDIR);
150
+ rb_define_const(mvilla, "ERMDIR", cvillaerror_ERMDIR);
151
+ rb_define_const(mvilla, "EMISC", cvillaerror_EMISC);
152
+ rb_define_const(mvilla, "OREADER", INT2FIX(VL_OREADER));
153
+ rb_define_const(mvilla, "OWRITER", INT2FIX(VL_OWRITER));
154
+ rb_define_const(mvilla, "OCREAT", INT2FIX(VL_OCREAT));
155
+ rb_define_const(mvilla, "OTRUNC", INT2FIX(VL_OTRUNC));
156
+ rb_define_const(mvilla, "ONOLCK", INT2FIX(VL_ONOLCK));
157
+ rb_define_const(mvilla, "OLCKNB", INT2FIX(VL_OLCKNB));
158
+ rb_define_const(mvilla, "OZCOMP", INT2FIX(VL_OZCOMP));
159
+ rb_define_const(mvilla, "OYCOMP", INT2FIX(VL_OYCOMP));
160
+ rb_define_const(mvilla, "OXCOMP", INT2FIX(VL_OXCOMP));
161
+ rb_define_const(mvilla, "CMPLEX", INT2FIX(0));
162
+ rb_define_const(mvilla, "CMPDEC", INT2FIX(1));
163
+ rb_define_const(mvilla, "CMPOBJ", INT2FIX(2));
164
+ rb_define_const(mvilla, "DOVER", INT2FIX(VL_DOVER));
165
+ rb_define_const(mvilla, "DKEEP", INT2FIX(VL_DKEEP));
166
+ rb_define_const(mvilla, "DCAT", INT2FIX(VL_DCAT));
167
+ rb_define_const(mvilla, "DDUP", INT2FIX(VL_DDUP));
168
+ rb_define_const(mvilla, "DDUPR", INT2FIX(VL_DDUPR));
169
+ rb_define_const(mvilla, "JFORWARD", INT2FIX(VL_JFORWARD));
170
+ rb_define_const(mvilla, "JBACKWARD", INT2FIX(VL_JBACKWARD));
171
+ rb_define_const(mvilla, "CPCURRENT", INT2FIX(VL_CPCURRENT));
172
+ rb_define_const(mvilla, "CPBEFORE", INT2FIX(VL_CPBEFORE));
173
+ rb_define_const(mvilla, "CPAFTER", INT2FIX(VL_CPAFTER));
174
+ rb_define_module_function(mvilla, "mod_open", rbvlopen, 3);
175
+ rb_define_module_function(mvilla, "mod_close", rbvlclose, 1);
176
+ rb_define_module_function(mvilla, "mod_setsilent", rbvlsetsilent, 2);
177
+ rb_define_module_function(mvilla, "mod_put", rbvlput, 4);
178
+ rb_define_module_function(mvilla, "mod_out", rbvlout, 2);
179
+ rb_define_module_function(mvilla, "mod_get", rbvlget, 2);
180
+ rb_define_module_function(mvilla, "mod_vsiz", rbvlvsiz, 2);
181
+ rb_define_module_function(mvilla, "mod_vnum", rbvlvnum, 2);
182
+ rb_define_module_function(mvilla, "mod_curfirst", rbvlcurfirst, 1);
183
+ rb_define_module_function(mvilla, "mod_curlast", rbvlcurlast, 1);
184
+ rb_define_module_function(mvilla, "mod_curprev", rbvlcurprev, 1);
185
+ rb_define_module_function(mvilla, "mod_curnext", rbvlcurnext, 1);
186
+ rb_define_module_function(mvilla, "mod_curjump", rbvlcurjump, 3);
187
+ rb_define_module_function(mvilla, "mod_curkey", rbvlcurkey, 1);
188
+ rb_define_module_function(mvilla, "mod_curval", rbvlcurval, 1);
189
+ rb_define_module_function(mvilla, "mod_curput", rbvlcurput, 3);
190
+ rb_define_module_function(mvilla, "mod_curout", rbvlcurout, 1);
191
+ rb_define_module_function(mvilla, "mod_settuning", rbvlsettuning, 5);
192
+ rb_define_module_function(mvilla, "mod_sync", rbvlsync, 1);
193
+ rb_define_module_function(mvilla, "mod_optimize", rbvloptimize, 1);
194
+ rb_define_module_function(mvilla, "mod_fsiz", rbvlfsiz, 1);
195
+ rb_define_module_function(mvilla, "mod_rnum", rbvlrnum, 1);
196
+ rb_define_module_function(mvilla, "mod_writable", rbvlwritable, 1);
197
+ rb_define_module_function(mvilla, "mod_fatalerror", rbvlfatalerror, 1);
198
+ rb_define_module_function(mvilla, "mod_tranbegin", rbvltranbegin, 1);
199
+ rb_define_module_function(mvilla, "mod_trancommit", rbvltrancommit, 1);
200
+ rb_define_module_function(mvilla, "mod_tranabort", rbvltranabort, 1);
201
+ rb_eval_string("def Mod_Villa.compare(astr, bstr)\n"
202
+ " aobj = nil\n"
203
+ " bobj = nil\n"
204
+ " begin\n"
205
+ " aobj = Marshal.load(astr);\n"
206
+ " rescue\n"
207
+ " end\n"
208
+ " begin\n"
209
+ " bobj = Marshal.load(bstr);\n"
210
+ " rescue\n"
211
+ " end\n"
212
+ " if(aobj && !bobj)\n"
213
+ " return 1\n"
214
+ " end\n"
215
+ " if(!aobj && bobj)\n"
216
+ " return -1\n"
217
+ " end\n"
218
+ " if(!aobj && !bobj)\n"
219
+ " return 0\n"
220
+ " end\n"
221
+ " begin\n"
222
+ " aobj <=> bobj\n"
223
+ " rescue\n"
224
+ " 0\n"
225
+ " end\n"
226
+ "end\n");
227
+ idcompare = rb_intern("compare");
228
+ }
229
+
230
+
231
+
232
+ /*************************************************************************************************
233
+ * private objects
234
+ *************************************************************************************************/
235
+
236
+
237
+ static void vlinit(void){
238
+ int i;
239
+ for(i = 0; i < MAXOPEN; i++){
240
+ vltable[i] = NULL;
241
+ vlsltable[i] = 0;
242
+ }
243
+ }
244
+
245
+
246
+ static int getnewindex(void){
247
+ int i;
248
+ for(i = 0; i < MAXOPEN; i++){
249
+ if(vltable[i] == NULL) return i;
250
+ }
251
+ return -1;
252
+ }
253
+
254
+
255
+ static int checkdup(const char *name){
256
+ struct stat sbuf;
257
+ int i, inode;
258
+ if(stat(name, &sbuf) == -1) return 0;
259
+ inode = sbuf.st_ino;
260
+ for(i = 0; i < MAXOPEN; i++){
261
+ if(vltable[i] != NULL && vlinode(vltable[i]) == inode) return -1;
262
+ }
263
+ return 0;
264
+ }
265
+
266
+
267
+ static void myerror(int ecode){
268
+ VALUE verr;
269
+ switch(ecode){
270
+ case DP_ENOERR: verr = cvillaerror_ENOERR; break;
271
+ case DP_EFATAL: verr = cvillaerror_EFATAL; break;
272
+ case DP_EMODE: verr = cvillaerror_EMODE; break;
273
+ case DP_EBROKEN: verr = cvillaerror_EBROKEN; break;
274
+ case DP_EKEEP: verr = cvillaerror_EKEEP; break;
275
+ case DP_ENOITEM: verr = cvillaerror_ENOITEM; break;
276
+ case DP_EALLOC: verr = cvillaerror_EALLOC; break;
277
+ case DP_EMAP: verr = cvillaerror_EMAP; break;
278
+ case DP_EOPEN: verr = cvillaerror_EOPEN; break;
279
+ case DP_ECLOSE: verr = cvillaerror_ECLOSE; break;
280
+ case DP_ETRUNC: verr = cvillaerror_ETRUNC; break;
281
+ case DP_ESYNC: verr = cvillaerror_ESYNC; break;
282
+ case DP_ESTAT: verr = cvillaerror_ESTAT; break;
283
+ case DP_ESEEK: verr = cvillaerror_ESEEK; break;
284
+ case DP_EREAD: verr = cvillaerror_EREAD; break;
285
+ case DP_EWRITE: verr = cvillaerror_EWRITE; break;
286
+ case DP_ELOCK: verr = cvillaerror_ELOCK; break;
287
+ case DP_EUNLINK: verr = cvillaerror_EUNLINK; break;
288
+ case DP_EMKDIR: verr = cvillaerror_EMKDIR; break;
289
+ case DP_ERMDIR: verr = cvillaerror_ERMDIR; break;
290
+ case DP_EMISC: verr = cvillaerror_EMISC; break;
291
+ default: verr = cvillaerror; break;
292
+ }
293
+ rb_raise(verr, "%s", dperrmsg(ecode));
294
+ }
295
+
296
+
297
+ static int objcompare(const char *aptr, int asiz, const char *bptr, int bsiz){
298
+ VALUE vastr, vbstr, vret;
299
+ vastr = rb_str_new(aptr, asiz);
300
+ vbstr = rb_str_new(bptr, bsiz);
301
+ vret = rb_funcall(mvilla, idcompare, 2, vastr, vbstr);
302
+ return FIX2INT(vret);
303
+ }
304
+
305
+
306
+ static VALUE rbvlopen(VALUE vself, VALUE vname, VALUE vomode, VALUE vcmode){
307
+ VILLA *villa;
308
+ const char *name;
309
+ int index, omode, cmode;
310
+ VLCFUNC cmp;
311
+ if((index = getnewindex()) == -1) myerror(DP_EMISC);
312
+ name = StringValuePtr(vname);
313
+ FIXNUM_P(vomode);
314
+ omode = FIX2INT(vomode);
315
+ FIXNUM_P(vcmode);
316
+ cmode = FIX2INT(vcmode);
317
+ cmp = NULL;
318
+ switch(cmode){
319
+ case 0: cmp = VL_CMPLEX; break;
320
+ case 1: cmp = VL_CMPDEC; break;
321
+ case 2: cmp = objcompare; break;
322
+ default: myerror(DP_EMISC);
323
+ }
324
+ if(checkdup(name) == -1) myerror(DP_EMISC);
325
+ villa = vlopen(name, omode, cmp);
326
+ if(!villa) myerror(dpecode);
327
+ vltable[index] = villa;
328
+ vlsltable[index] = 0;
329
+ return INT2FIX(index);
330
+ }
331
+
332
+
333
+ static VALUE rbvlclose(VALUE vself, VALUE vindex){
334
+ VILLA *villa;
335
+ int index;
336
+ FIXNUM_P(vindex);
337
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
338
+ villa = vltable[index];
339
+ vltable[index] = NULL;
340
+ if(!vlclose(villa)) myerror(dpecode);
341
+ return Qtrue;
342
+ }
343
+
344
+
345
+ static VALUE rbvlsetsilent(VALUE vself, VALUE vindex, VALUE vvalue){
346
+ int index;
347
+ FIXNUM_P(vindex);
348
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
349
+ vlsltable[index] = FIX2INT(vvalue);
350
+ return Qnil;
351
+ }
352
+
353
+
354
+ static VALUE rbvlput(VALUE vself, VALUE vindex, VALUE vkey, VALUE vval, VALUE vdmode){
355
+ VILLA *villa;
356
+ const char *kbuf, *vbuf;
357
+ int index, ksiz, vsiz, dmode;
358
+ FIXNUM_P(vindex);
359
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
360
+ kbuf = StringValuePtr(vkey);
361
+ ksiz = RSTRING_LEN(vkey);
362
+ vbuf = StringValuePtr(vval);
363
+ vsiz = RSTRING_LEN(vval);
364
+ FIXNUM_P(vdmode);
365
+ dmode = FIX2INT(vdmode);
366
+ villa = vltable[index];
367
+ if(!vlput(villa, kbuf, ksiz, vbuf, vsiz, dmode)){
368
+ if(vlsltable[index] && dpecode == DP_EKEEP) return Qfalse;
369
+ myerror(dpecode);
370
+ }
371
+ return Qtrue;
372
+ }
373
+
374
+
375
+ static VALUE rbvlout(VALUE vself, VALUE vindex, VALUE vkey){
376
+ VILLA *villa;
377
+ const char *kbuf;
378
+ int index, ksiz;
379
+ FIXNUM_P(vindex);
380
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
381
+ kbuf = StringValuePtr(vkey);
382
+ ksiz = RSTRING_LEN(vkey);
383
+ villa = vltable[index];
384
+ if(!vlout(villa, kbuf, ksiz)){
385
+ if(vlsltable[index] && dpecode == DP_ENOITEM) return Qfalse;
386
+ myerror(dpecode);
387
+ }
388
+ return Qtrue;
389
+ }
390
+
391
+
392
+ static VALUE rbvlget(VALUE vself, VALUE vindex, VALUE vkey){
393
+ VILLA *villa;
394
+ const char *kbuf, *vbuf;
395
+ int index, ksiz, vsiz;
396
+ VALUE vval;
397
+ FIXNUM_P(vindex);
398
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
399
+ kbuf = StringValuePtr(vkey);
400
+ ksiz = RSTRING_LEN(vkey);
401
+ villa = vltable[index];
402
+ if(!(vbuf = vlget(villa, kbuf, ksiz, &vsiz))){
403
+ if(vlsltable[index] && dpecode == DP_ENOITEM) return Qnil;
404
+ myerror(dpecode);
405
+ }
406
+ vval = rb_str_new(vbuf, vsiz);
407
+ return vval;
408
+ }
409
+
410
+
411
+ static VALUE rbvlvsiz(VALUE vself, VALUE vindex, VALUE vkey){
412
+ VILLA *villa;
413
+ const char *kbuf;
414
+ int index, ksiz, vsiz;
415
+ FIXNUM_P(vindex);
416
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
417
+ kbuf = StringValuePtr(vkey);
418
+ ksiz = RSTRING_LEN(vkey);
419
+ villa = vltable[index];
420
+ if((vsiz = vlvsiz(villa, kbuf, ksiz)) == -1){
421
+ if(vlsltable[index] && dpecode == DP_ENOITEM) return INT2FIX(-1);
422
+ myerror(dpecode);
423
+ }
424
+ return INT2FIX(vsiz);
425
+ }
426
+
427
+
428
+ static VALUE rbvlvnum(VALUE vself, VALUE vindex, VALUE vkey){
429
+ VILLA *villa;
430
+ const char *kbuf;
431
+ int index, ksiz, vnum;
432
+ FIXNUM_P(vindex);
433
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
434
+ kbuf = StringValuePtr(vkey);
435
+ ksiz = RSTRING_LEN(vkey);
436
+ villa = vltable[index];
437
+ vnum = vlvnum(villa, kbuf, ksiz);
438
+ return INT2FIX(vnum);
439
+ }
440
+
441
+
442
+ static VALUE rbvlcurfirst(VALUE vself, VALUE vindex){
443
+ VILLA *villa;
444
+ int index;
445
+ FIXNUM_P(vindex);
446
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
447
+ villa = vltable[index];
448
+ if(!vlcurfirst(villa)){
449
+ if(vlsltable[index] && dpecode == DP_ENOITEM) return Qfalse;
450
+ myerror(dpecode);
451
+ }
452
+ return Qtrue;
453
+ }
454
+
455
+
456
+ static VALUE rbvlcurlast(VALUE vself, VALUE vindex){
457
+ VILLA *villa;
458
+ int index;
459
+ FIXNUM_P(vindex);
460
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
461
+ villa = vltable[index];
462
+ if(!vlcurlast(villa)){
463
+ if(vlsltable[index] && dpecode == DP_ENOITEM) return Qfalse;
464
+ myerror(dpecode);
465
+ }
466
+ return Qtrue;
467
+ }
468
+
469
+
470
+ static VALUE rbvlcurprev(VALUE vself, VALUE vindex){
471
+ VILLA *villa;
472
+ int index;
473
+ FIXNUM_P(vindex);
474
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
475
+ villa = vltable[index];
476
+ if(!vlcurprev(villa)){
477
+ if(vlsltable[index] && dpecode == DP_ENOITEM) return Qfalse;
478
+ myerror(dpecode);
479
+ }
480
+ return Qtrue;
481
+ }
482
+
483
+
484
+ static VALUE rbvlcurnext(VALUE vself, VALUE vindex){
485
+ VILLA *villa;
486
+ int index;
487
+ FIXNUM_P(vindex);
488
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
489
+ villa = vltable[index];
490
+ if(!vlcurnext(villa)){
491
+ if(vlsltable[index] && dpecode == DP_ENOITEM) return Qfalse;
492
+ myerror(dpecode);
493
+ }
494
+ return Qtrue;
495
+ }
496
+
497
+
498
+ static VALUE rbvlcurjump(VALUE vself, VALUE vindex, VALUE vkey, VALUE vjmode){
499
+ VILLA *villa;
500
+ const char *kbuf;
501
+ int index, ksiz, jmode;
502
+ VALUE vval;
503
+ FIXNUM_P(vindex);
504
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
505
+ kbuf = StringValuePtr(vkey);
506
+ ksiz = RSTRING_LEN(vkey);
507
+ FIXNUM_P(vjmode);
508
+ jmode = FIX2INT(vjmode);
509
+ villa = vltable[index];
510
+ if(!vlcurjump(villa, kbuf, ksiz, jmode)){
511
+ if(vlsltable[index] && dpecode == DP_ENOITEM) return Qfalse;
512
+ myerror(dpecode);
513
+ }
514
+ return Qtrue;
515
+ }
516
+
517
+
518
+
519
+ static VALUE rbvlcurkey(VALUE vself, VALUE vindex){
520
+ VILLA *villa;
521
+ const char *kbuf;
522
+ int index, ksiz;
523
+ VALUE vkey;
524
+ FIXNUM_P(vindex);
525
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
526
+ villa = vltable[index];
527
+ if(!(kbuf = vlcurkeycache(villa, &ksiz))){
528
+ if(vlsltable[index] && dpecode == DP_ENOITEM) return Qnil;
529
+ myerror(dpecode);
530
+ }
531
+ vkey = rb_str_new(kbuf, ksiz);
532
+ return vkey;
533
+ }
534
+
535
+
536
+ static VALUE rbvlcurval(VALUE vself, VALUE vindex){
537
+ VILLA *villa;
538
+ const char *vbuf;
539
+ int index, vsiz;
540
+ VALUE vval;
541
+ FIXNUM_P(vindex);
542
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
543
+ villa = vltable[index];
544
+ if(!(vbuf = vlcurvalcache(villa, &vsiz))){
545
+ if(vlsltable[index] && dpecode == DP_ENOITEM) return Qnil;
546
+ myerror(dpecode);
547
+ }
548
+ vval = rb_str_new(vbuf, vsiz);
549
+ return vval;
550
+ }
551
+
552
+
553
+ static VALUE rbvlcurput(VALUE vself, VALUE vindex, VALUE vval, VALUE vcpmode){
554
+ VILLA *villa;
555
+ const char *vbuf;
556
+ int index, vsiz, cpmode;
557
+ FIXNUM_P(vindex);
558
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
559
+ vbuf = StringValuePtr(vval);
560
+ vsiz = RSTRING_LEN(vval);
561
+ FIXNUM_P(vcpmode);
562
+ cpmode = FIX2INT(vcpmode);
563
+ villa = vltable[index];
564
+ if(!vlcurput(villa, vbuf, vsiz, cpmode)){
565
+ if(vlsltable[index] && dpecode == DP_ENOITEM) return Qfalse;
566
+ myerror(dpecode);
567
+ }
568
+ return Qtrue;
569
+ }
570
+
571
+
572
+ static VALUE rbvlcurout(VALUE vself, VALUE vindex){
573
+ VILLA *villa;
574
+ int index;
575
+ FIXNUM_P(vindex);
576
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
577
+ villa = vltable[index];
578
+ if(!vlcurout(villa)){
579
+ if(vlsltable[index] && dpecode == DP_ENOITEM) return Qfalse;
580
+ myerror(dpecode);
581
+ }
582
+ return Qtrue;
583
+ }
584
+
585
+
586
+ static VALUE rbvlsettuning(VALUE vself, VALUE vindex,
587
+ VALUE vlrecmax, VALUE vnidxmax, VALUE vlcnum, VALUE vncnum){
588
+ VILLA *villa;
589
+ int index, lrecmax, nidxmax, lcnum, ncnum;
590
+ FIXNUM_P(vindex);
591
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
592
+ FIXNUM_P(vlrecmax);
593
+ lrecmax = FIX2INT(vlrecmax);
594
+ FIXNUM_P(vnidxmax);
595
+ nidxmax = FIX2INT(vnidxmax);
596
+ FIXNUM_P(vlcnum);
597
+ lcnum = FIX2INT(vlcnum);
598
+ FIXNUM_P(vncnum);
599
+ ncnum = FIX2INT(vncnum);
600
+ villa = vltable[index];
601
+ vlsettuning(villa, lrecmax, nidxmax, lcnum, ncnum);
602
+ return Qtrue;
603
+ }
604
+
605
+
606
+ static VALUE rbvlsync(VALUE vself, VALUE vindex){
607
+ VILLA *villa;
608
+ int index;
609
+ FIXNUM_P(vindex);
610
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
611
+ villa = vltable[index];
612
+ if(!vlsync(villa)) myerror(dpecode);
613
+ return Qtrue;
614
+ }
615
+
616
+
617
+ static VALUE rbvloptimize(VALUE vself, VALUE vindex){
618
+ VILLA *villa;
619
+ int index;
620
+ FIXNUM_P(vindex);
621
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
622
+ villa = vltable[index];
623
+ if(!vloptimize(villa)) myerror(dpecode);
624
+ return Qtrue;
625
+ }
626
+
627
+
628
+ static VALUE rbvlfsiz(VALUE vself, VALUE vindex){
629
+ VILLA *villa;
630
+ int index, fsiz;
631
+ FIXNUM_P(vindex);
632
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
633
+ villa = vltable[index];
634
+ if((fsiz = vlfsiz(villa)) == -1) myerror(dpecode);
635
+ return INT2FIX(fsiz);
636
+ }
637
+
638
+
639
+ static VALUE rbvlrnum(VALUE vself, VALUE vindex){
640
+ VILLA *villa;
641
+ int index, rnum;
642
+ FIXNUM_P(vindex);
643
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
644
+ villa = vltable[index];
645
+ if((rnum = vlrnum(villa)) == -1) myerror(dpecode);
646
+ return INT2FIX(rnum);
647
+ }
648
+
649
+
650
+ static VALUE rbvlwritable(VALUE vself, VALUE vindex){
651
+ VILLA *villa;
652
+ int index;
653
+ FIXNUM_P(vindex);
654
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
655
+ villa = vltable[index];
656
+ return vlwritable(villa) ? Qtrue : Qfalse;
657
+ }
658
+
659
+
660
+ static VALUE rbvlfatalerror(VALUE vself, VALUE vindex){
661
+ VILLA *villa;
662
+ int index;
663
+ FIXNUM_P(vindex);
664
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
665
+ villa = vltable[index];
666
+ return vlfatalerror(villa) ? Qtrue : Qfalse;
667
+ }
668
+
669
+
670
+ static VALUE rbvltranbegin(VALUE vself, VALUE vindex){
671
+ VILLA *villa;
672
+ int index;
673
+ FIXNUM_P(vindex);
674
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
675
+ villa = vltable[index];
676
+ if(!vltranbegin(villa)) myerror(dpecode);
677
+ return Qtrue;
678
+ }
679
+
680
+
681
+ static VALUE rbvltrancommit(VALUE vself, VALUE vindex){
682
+ VILLA *villa;
683
+ int index;
684
+ FIXNUM_P(vindex);
685
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
686
+ villa = vltable[index];
687
+ if(!vltrancommit(villa)) myerror(dpecode);
688
+ return Qtrue;
689
+ }
690
+
691
+
692
+ static VALUE rbvltranabort(VALUE vself, VALUE vindex){
693
+ VILLA *villa;
694
+ int index;
695
+ FIXNUM_P(vindex);
696
+ if((index = FIX2INT(vindex)) == -1) myerror(DP_EMISC);
697
+ villa = vltable[index];
698
+ if(!vltranabort(villa)) myerror(dpecode);
699
+ return Qtrue;
700
+ }
701
+
702
+
703
+
704
+ /* END OF FILE */