00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "ruby.h"
00013
00014 #ifdef HAVE_CDEFS_H
00015 # include <cdefs.h>
00016 #endif
00017 #ifdef HAVE_SYS_CDEFS_H
00018 # include <sys/cdefs.h>
00019 #endif
00020 #include DBM_HDR
00021 #include <fcntl.h>
00022 #include <errno.h>
00023
00024 static VALUE rb_cDBM, rb_eDBMError;
00025
00026 #define RUBY_DBM_RW_BIT 0x20000000
00027
00028 struct dbmdata {
00029 int di_size;
00030 DBM *di_dbm;
00031 };
00032
00033 static void
00034 closed_dbm(void)
00035 {
00036 rb_raise(rb_eDBMError, "closed DBM file");
00037 }
00038
00039 #define GetDBM(obj, dbmp) {\
00040 Data_Get_Struct(obj, struct dbmdata, dbmp);\
00041 if (dbmp == 0) closed_dbm();\
00042 if (dbmp->di_dbm == 0) closed_dbm();\
00043 }
00044
00045 #define GetDBM2(obj, data, dbm) {\
00046 GetDBM(obj, data);\
00047 (dbm) = dbmp->di_dbm;\
00048 }
00049
00050 static void
00051 free_dbm(struct dbmdata *dbmp)
00052 {
00053 if (dbmp) {
00054 if (dbmp->di_dbm) dbm_close(dbmp->di_dbm);
00055 xfree(dbmp);
00056 }
00057 }
00058
00059 static VALUE
00060 fdbm_close(VALUE obj)
00061 {
00062 struct dbmdata *dbmp;
00063
00064 GetDBM(obj, dbmp);
00065 dbm_close(dbmp->di_dbm);
00066 dbmp->di_dbm = 0;
00067
00068 return Qnil;
00069 }
00070
00071 static VALUE
00072 fdbm_closed(VALUE obj)
00073 {
00074 struct dbmdata *dbmp;
00075
00076 Data_Get_Struct(obj, struct dbmdata, dbmp);
00077 if (dbmp == 0)
00078 return Qtrue;
00079 if (dbmp->di_dbm == 0)
00080 return Qtrue;
00081
00082 return Qfalse;
00083 }
00084
00085 static VALUE
00086 fdbm_alloc(VALUE klass)
00087 {
00088 return Data_Wrap_Struct(klass, 0, free_dbm, 0);
00089 }
00090
00091 static VALUE
00092 fdbm_initialize(int argc, VALUE *argv, VALUE obj)
00093 {
00094 volatile VALUE file;
00095 VALUE vmode, vflags;
00096 DBM *dbm;
00097 struct dbmdata *dbmp;
00098 int mode, flags = 0;
00099
00100 if (rb_scan_args(argc, argv, "12", &file, &vmode, &vflags) == 1) {
00101 mode = 0666;
00102 }
00103 else if (NIL_P(vmode)) {
00104 mode = -1;
00105 }
00106 else {
00107 mode = NUM2INT(vmode);
00108 }
00109
00110 if (!NIL_P(vflags))
00111 flags = NUM2INT(vflags);
00112
00113 FilePathValue(file);
00114
00115 if (flags & RUBY_DBM_RW_BIT) {
00116 flags &= ~RUBY_DBM_RW_BIT;
00117 dbm = dbm_open(RSTRING_PTR(file), flags, mode);
00118 }
00119 else {
00120 dbm = 0;
00121 if (mode >= 0) {
00122 dbm = dbm_open(RSTRING_PTR(file), O_RDWR|O_CREAT, mode);
00123 }
00124 if (!dbm) {
00125 dbm = dbm_open(RSTRING_PTR(file), O_RDWR, 0);
00126 }
00127 if (!dbm) {
00128 dbm = dbm_open(RSTRING_PTR(file), O_RDONLY, 0);
00129 }
00130 }
00131
00132 if (!dbm) {
00133 if (mode == -1) return Qnil;
00134 rb_sys_fail(RSTRING_PTR(file));
00135 }
00136
00137 dbmp = ALLOC(struct dbmdata);
00138 DATA_PTR(obj) = dbmp;
00139 dbmp->di_dbm = dbm;
00140 dbmp->di_size = -1;
00141
00142 return obj;
00143 }
00144
00145 static VALUE
00146 fdbm_s_open(int argc, VALUE *argv, VALUE klass)
00147 {
00148 VALUE obj = Data_Wrap_Struct(klass, 0, free_dbm, 0);
00149
00150 if (NIL_P(fdbm_initialize(argc, argv, obj))) {
00151 return Qnil;
00152 }
00153
00154 if (rb_block_given_p()) {
00155 return rb_ensure(rb_yield, obj, fdbm_close, obj);
00156 }
00157
00158 return obj;
00159 }
00160
00161 static VALUE
00162 fdbm_fetch(VALUE obj, VALUE keystr, VALUE ifnone)
00163 {
00164 datum key, value;
00165 struct dbmdata *dbmp;
00166 DBM *dbm;
00167
00168 ExportStringValue(keystr);
00169 key.dptr = RSTRING_PTR(keystr);
00170 key.dsize = RSTRING_LEN(keystr);
00171
00172 GetDBM2(obj, dbmp, dbm);
00173 value = dbm_fetch(dbm, key);
00174 if (value.dptr == 0) {
00175 if (ifnone == Qnil && rb_block_given_p())
00176 return rb_yield(rb_tainted_str_new(key.dptr, key.dsize));
00177 return ifnone;
00178 }
00179 return rb_tainted_str_new(value.dptr, value.dsize);
00180 }
00181
00182 static VALUE
00183 fdbm_aref(VALUE obj, VALUE keystr)
00184 {
00185 return fdbm_fetch(obj, keystr, Qnil);
00186 }
00187
00188 static VALUE
00189 fdbm_fetch_m(int argc, VALUE *argv, VALUE obj)
00190 {
00191 VALUE keystr, valstr, ifnone;
00192
00193 rb_scan_args(argc, argv, "11", &keystr, &ifnone);
00194 valstr = fdbm_fetch(obj, keystr, ifnone);
00195 if (argc == 1 && !rb_block_given_p() && NIL_P(valstr))
00196 rb_raise(rb_eIndexError, "key not found");
00197
00198 return valstr;
00199 }
00200
00201 static VALUE
00202 fdbm_key(VALUE obj, VALUE valstr)
00203 {
00204 datum key, val;
00205 struct dbmdata *dbmp;
00206 DBM *dbm;
00207
00208 ExportStringValue(valstr);
00209 val.dptr = RSTRING_PTR(valstr);
00210 val.dsize = RSTRING_LEN(valstr);
00211
00212 GetDBM2(obj, dbmp, dbm);
00213 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00214 val = dbm_fetch(dbm, key);
00215 if (val.dsize == RSTRING_LEN(valstr) &&
00216 memcmp(val.dptr, RSTRING_PTR(valstr), val.dsize) == 0) {
00217 return rb_tainted_str_new(key.dptr, key.dsize);
00218 }
00219 }
00220 return Qnil;
00221 }
00222
00223 static VALUE
00224 fdbm_index(VALUE hash, VALUE value)
00225 {
00226 rb_warn("DBM#index is deprecated; use DBM#key");
00227 return fdbm_key(hash, value);
00228 }
00229
00230 static VALUE
00231 fdbm_select(VALUE obj)
00232 {
00233 VALUE new = rb_ary_new();
00234 datum key, val;
00235 DBM *dbm;
00236 struct dbmdata *dbmp;
00237
00238 GetDBM2(obj, dbmp, dbm);
00239 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00240 VALUE assoc, v;
00241 val = dbm_fetch(dbm, key);
00242 assoc = rb_assoc_new(rb_tainted_str_new(key.dptr, key.dsize),
00243 rb_tainted_str_new(val.dptr, val.dsize));
00244 v = rb_yield(assoc);
00245 if (RTEST(v)) {
00246 rb_ary_push(new, assoc);
00247 }
00248 GetDBM2(obj, dbmp, dbm);
00249 }
00250
00251 return new;
00252 }
00253
00254 static VALUE
00255 fdbm_values_at(int argc, VALUE *argv, VALUE obj)
00256 {
00257 VALUE new = rb_ary_new2(argc);
00258 int i;
00259
00260 for (i=0; i<argc; i++) {
00261 rb_ary_push(new, fdbm_fetch(obj, argv[i], Qnil));
00262 }
00263
00264 return new;
00265 }
00266
00267 static void
00268 fdbm_modify(VALUE obj)
00269 {
00270 rb_secure(4);
00271 if (OBJ_FROZEN(obj)) rb_error_frozen("DBM");
00272 }
00273
00274 static VALUE
00275 fdbm_delete(VALUE obj, VALUE keystr)
00276 {
00277 datum key, value;
00278 struct dbmdata *dbmp;
00279 DBM *dbm;
00280 VALUE valstr;
00281
00282 fdbm_modify(obj);
00283 ExportStringValue(keystr);
00284 key.dptr = RSTRING_PTR(keystr);
00285 key.dsize = RSTRING_LEN(keystr);
00286
00287 GetDBM2(obj, dbmp, dbm);
00288
00289 value = dbm_fetch(dbm, key);
00290 if (value.dptr == 0) {
00291 if (rb_block_given_p()) return rb_yield(keystr);
00292 return Qnil;
00293 }
00294
00295
00296 valstr = rb_tainted_str_new(value.dptr, value.dsize);
00297
00298 if (dbm_delete(dbm, key)) {
00299 dbmp->di_size = -1;
00300 rb_raise(rb_eDBMError, "dbm_delete failed");
00301 }
00302 else if (dbmp->di_size >= 0) {
00303 dbmp->di_size--;
00304 }
00305 return valstr;
00306 }
00307
00308 static VALUE
00309 fdbm_shift(VALUE obj)
00310 {
00311 datum key, val;
00312 struct dbmdata *dbmp;
00313 DBM *dbm;
00314 VALUE keystr, valstr;
00315
00316 fdbm_modify(obj);
00317 GetDBM2(obj, dbmp, dbm);
00318 dbmp->di_size = -1;
00319
00320 key = dbm_firstkey(dbm);
00321 if (!key.dptr) return Qnil;
00322 val = dbm_fetch(dbm, key);
00323 keystr = rb_tainted_str_new(key.dptr, key.dsize);
00324 valstr = rb_tainted_str_new(val.dptr, val.dsize);
00325 dbm_delete(dbm, key);
00326
00327 return rb_assoc_new(keystr, valstr);
00328 }
00329
00330 static VALUE
00331 fdbm_delete_if(VALUE obj)
00332 {
00333 datum key, val;
00334 struct dbmdata *dbmp;
00335 DBM *dbm;
00336 VALUE keystr, valstr;
00337 VALUE ret, ary = rb_ary_new();
00338 int i, status = 0, n;
00339
00340 fdbm_modify(obj);
00341 GetDBM2(obj, dbmp, dbm);
00342 n = dbmp->di_size;
00343 dbmp->di_size = -1;
00344
00345 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00346 val = dbm_fetch(dbm, key);
00347 keystr = rb_tainted_str_new(key.dptr, key.dsize);
00348 valstr = rb_tainted_str_new(val.dptr, val.dsize);
00349 ret = rb_protect(rb_yield, rb_assoc_new(rb_str_dup(keystr), valstr), &status);
00350 if (status != 0) break;
00351 if (RTEST(ret)) rb_ary_push(ary, keystr);
00352 GetDBM2(obj, dbmp, dbm);
00353 }
00354
00355 for (i = 0; i < RARRAY_LEN(ary); i++) {
00356 keystr = RARRAY_PTR(ary)[i];
00357 ExportStringValue(keystr);
00358 key.dptr = RSTRING_PTR(keystr);
00359 key.dsize = RSTRING_LEN(keystr);
00360 if (dbm_delete(dbm, key)) {
00361 rb_raise(rb_eDBMError, "dbm_delete failed");
00362 }
00363 }
00364 if (status) rb_jump_tag(status);
00365 if (n > 0) dbmp->di_size = n - RARRAY_LEN(ary);
00366
00367 return obj;
00368 }
00369
00370 static VALUE
00371 fdbm_clear(VALUE obj)
00372 {
00373 datum key;
00374 struct dbmdata *dbmp;
00375 DBM *dbm;
00376
00377 fdbm_modify(obj);
00378 GetDBM2(obj, dbmp, dbm);
00379 dbmp->di_size = -1;
00380 while (key = dbm_firstkey(dbm), key.dptr) {
00381 if (dbm_delete(dbm, key)) {
00382 rb_raise(rb_eDBMError, "dbm_delete failed");
00383 }
00384 }
00385 dbmp->di_size = 0;
00386
00387 return obj;
00388 }
00389
00390 static VALUE
00391 fdbm_invert(VALUE obj)
00392 {
00393 datum key, val;
00394 struct dbmdata *dbmp;
00395 DBM *dbm;
00396 VALUE keystr, valstr;
00397 VALUE hash = rb_hash_new();
00398
00399 GetDBM2(obj, dbmp, dbm);
00400 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00401 val = dbm_fetch(dbm, key);
00402 keystr = rb_tainted_str_new(key.dptr, key.dsize);
00403 valstr = rb_tainted_str_new(val.dptr, val.dsize);
00404 rb_hash_aset(hash, valstr, keystr);
00405 }
00406 return hash;
00407 }
00408
00409 static VALUE fdbm_store(VALUE,VALUE,VALUE);
00410
00411 static VALUE
00412 update_i(VALUE pair, VALUE dbm)
00413 {
00414 Check_Type(pair, T_ARRAY);
00415 if (RARRAY_LEN(pair) < 2) {
00416 rb_raise(rb_eArgError, "pair must be [key, value]");
00417 }
00418 fdbm_store(dbm, RARRAY_PTR(pair)[0], RARRAY_PTR(pair)[1]);
00419 return Qnil;
00420 }
00421
00422 static VALUE
00423 fdbm_update(VALUE obj, VALUE other)
00424 {
00425 rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
00426 return obj;
00427 }
00428
00429 static VALUE
00430 fdbm_replace(VALUE obj, VALUE other)
00431 {
00432 fdbm_clear(obj);
00433 rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
00434 return obj;
00435 }
00436
00437 static VALUE
00438 fdbm_store(VALUE obj, VALUE keystr, VALUE valstr)
00439 {
00440 datum key, val;
00441 struct dbmdata *dbmp;
00442 DBM *dbm;
00443
00444 fdbm_modify(obj);
00445 keystr = rb_obj_as_string(keystr);
00446 valstr = rb_obj_as_string(valstr);
00447
00448 key.dptr = RSTRING_PTR(keystr);
00449 key.dsize = RSTRING_LEN(keystr);
00450
00451 val.dptr = RSTRING_PTR(valstr);
00452 val.dsize = RSTRING_LEN(valstr);
00453
00454 GetDBM2(obj, dbmp, dbm);
00455 dbmp->di_size = -1;
00456 if (dbm_store(dbm, key, val, DBM_REPLACE)) {
00457 #ifdef HAVE_DBM_CLEARERR
00458 dbm_clearerr(dbm);
00459 #endif
00460 if (errno == EPERM) rb_sys_fail(0);
00461 rb_raise(rb_eDBMError, "dbm_store failed");
00462 }
00463
00464 return valstr;
00465 }
00466
00467 static VALUE
00468 fdbm_length(VALUE obj)
00469 {
00470 datum key;
00471 struct dbmdata *dbmp;
00472 DBM *dbm;
00473 int i = 0;
00474
00475 GetDBM2(obj, dbmp, dbm);
00476 if (dbmp->di_size > 0) return INT2FIX(dbmp->di_size);
00477
00478 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00479 i++;
00480 }
00481 dbmp->di_size = i;
00482
00483 return INT2FIX(i);
00484 }
00485
00486 static VALUE
00487 fdbm_empty_p(VALUE obj)
00488 {
00489 datum key;
00490 struct dbmdata *dbmp;
00491 DBM *dbm;
00492 int i = 0;
00493
00494 GetDBM2(obj, dbmp, dbm);
00495 if (dbmp->di_size < 0) {
00496 dbm = dbmp->di_dbm;
00497
00498 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00499 i++;
00500 }
00501 }
00502 else {
00503 i = dbmp->di_size;
00504 }
00505 if (i == 0) return Qtrue;
00506 return Qfalse;
00507 }
00508
00509 static VALUE
00510 fdbm_each_value(VALUE obj)
00511 {
00512 datum key, val;
00513 struct dbmdata *dbmp;
00514 DBM *dbm;
00515
00516 RETURN_ENUMERATOR(obj, 0, 0);
00517
00518 GetDBM2(obj, dbmp, dbm);
00519 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00520 val = dbm_fetch(dbm, key);
00521 rb_yield(rb_tainted_str_new(val.dptr, val.dsize));
00522 GetDBM2(obj, dbmp, dbm);
00523 }
00524 return obj;
00525 }
00526
00527 static VALUE
00528 fdbm_each_key(VALUE obj)
00529 {
00530 datum key;
00531 struct dbmdata *dbmp;
00532 DBM *dbm;
00533
00534 RETURN_ENUMERATOR(obj, 0, 0);
00535
00536 GetDBM2(obj, dbmp, dbm);
00537 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00538 rb_yield(rb_tainted_str_new(key.dptr, key.dsize));
00539 GetDBM2(obj, dbmp, dbm);
00540 }
00541 return obj;
00542 }
00543
00544 static VALUE
00545 fdbm_each_pair(VALUE obj)
00546 {
00547 datum key, val;
00548 DBM *dbm;
00549 struct dbmdata *dbmp;
00550 VALUE keystr, valstr;
00551
00552 RETURN_ENUMERATOR(obj, 0, 0);
00553
00554 GetDBM2(obj, dbmp, dbm);
00555
00556 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00557 val = dbm_fetch(dbm, key);
00558 keystr = rb_tainted_str_new(key.dptr, key.dsize);
00559 valstr = rb_tainted_str_new(val.dptr, val.dsize);
00560 rb_yield(rb_assoc_new(keystr, valstr));
00561 GetDBM2(obj, dbmp, dbm);
00562 }
00563
00564 return obj;
00565 }
00566
00567 static VALUE
00568 fdbm_keys(VALUE obj)
00569 {
00570 datum key;
00571 struct dbmdata *dbmp;
00572 DBM *dbm;
00573 VALUE ary;
00574
00575 GetDBM2(obj, dbmp, dbm);
00576
00577 ary = rb_ary_new();
00578 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00579 rb_ary_push(ary, rb_tainted_str_new(key.dptr, key.dsize));
00580 }
00581
00582 return ary;
00583 }
00584
00585 static VALUE
00586 fdbm_values(VALUE obj)
00587 {
00588 datum key, val;
00589 struct dbmdata *dbmp;
00590 DBM *dbm;
00591 VALUE ary;
00592
00593 GetDBM2(obj, dbmp, dbm);
00594 ary = rb_ary_new();
00595 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00596 val = dbm_fetch(dbm, key);
00597 rb_ary_push(ary, rb_tainted_str_new(val.dptr, val.dsize));
00598 }
00599
00600 return ary;
00601 }
00602
00603 static VALUE
00604 fdbm_has_key(VALUE obj, VALUE keystr)
00605 {
00606 datum key, val;
00607 struct dbmdata *dbmp;
00608 DBM *dbm;
00609
00610 ExportStringValue(keystr);
00611 key.dptr = RSTRING_PTR(keystr);
00612 key.dsize = RSTRING_LEN(keystr);
00613
00614 GetDBM2(obj, dbmp, dbm);
00615 val = dbm_fetch(dbm, key);
00616 if (val.dptr) return Qtrue;
00617 return Qfalse;
00618 }
00619
00620 static VALUE
00621 fdbm_has_value(VALUE obj, VALUE valstr)
00622 {
00623 datum key, val;
00624 struct dbmdata *dbmp;
00625 DBM *dbm;
00626
00627 ExportStringValue(valstr);
00628 val.dptr = RSTRING_PTR(valstr);
00629 val.dsize = RSTRING_LEN(valstr);
00630
00631 GetDBM2(obj, dbmp, dbm);
00632 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00633 val = dbm_fetch(dbm, key);
00634 if (val.dsize == RSTRING_LEN(valstr) &&
00635 memcmp(val.dptr, RSTRING_PTR(valstr), val.dsize) == 0)
00636 return Qtrue;
00637 }
00638 return Qfalse;
00639 }
00640
00641 static VALUE
00642 fdbm_to_a(VALUE obj)
00643 {
00644 datum key, val;
00645 struct dbmdata *dbmp;
00646 DBM *dbm;
00647 VALUE ary;
00648
00649 GetDBM2(obj, dbmp, dbm);
00650 ary = rb_ary_new();
00651 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00652 val = dbm_fetch(dbm, key);
00653 rb_ary_push(ary, rb_assoc_new(rb_tainted_str_new(key.dptr, key.dsize),
00654 rb_tainted_str_new(val.dptr, val.dsize)));
00655 }
00656
00657 return ary;
00658 }
00659
00660 static VALUE
00661 fdbm_to_hash(VALUE obj)
00662 {
00663 datum key, val;
00664 struct dbmdata *dbmp;
00665 DBM *dbm;
00666 VALUE hash;
00667
00668 GetDBM2(obj, dbmp, dbm);
00669 hash = rb_hash_new();
00670 for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
00671 val = dbm_fetch(dbm, key);
00672 rb_hash_aset(hash, rb_tainted_str_new(key.dptr, key.dsize),
00673 rb_tainted_str_new(val.dptr, val.dsize));
00674 }
00675
00676 return hash;
00677 }
00678
00679 static VALUE
00680 fdbm_reject(VALUE obj)
00681 {
00682 return rb_hash_delete_if(fdbm_to_hash(obj));
00683 }
00684
00685 void
00686 Init_dbm(void)
00687 {
00688 rb_cDBM = rb_define_class("DBM", rb_cObject);
00689 rb_eDBMError = rb_define_class("DBMError", rb_eStandardError);
00690 rb_include_module(rb_cDBM, rb_mEnumerable);
00691
00692 rb_define_alloc_func(rb_cDBM, fdbm_alloc);
00693 rb_define_singleton_method(rb_cDBM, "open", fdbm_s_open, -1);
00694
00695 rb_define_method(rb_cDBM, "initialize", fdbm_initialize, -1);
00696 rb_define_method(rb_cDBM, "close", fdbm_close, 0);
00697 rb_define_method(rb_cDBM, "closed?", fdbm_closed, 0);
00698 rb_define_method(rb_cDBM, "[]", fdbm_aref, 1);
00699 rb_define_method(rb_cDBM, "fetch", fdbm_fetch_m, -1);
00700 rb_define_method(rb_cDBM, "[]=", fdbm_store, 2);
00701 rb_define_method(rb_cDBM, "store", fdbm_store, 2);
00702 rb_define_method(rb_cDBM, "index", fdbm_index, 1);
00703 rb_define_method(rb_cDBM, "key", fdbm_key, 1);
00704 rb_define_method(rb_cDBM, "select", fdbm_select, 0);
00705 rb_define_method(rb_cDBM, "values_at", fdbm_values_at, -1);
00706 rb_define_method(rb_cDBM, "length", fdbm_length, 0);
00707 rb_define_method(rb_cDBM, "size", fdbm_length, 0);
00708 rb_define_method(rb_cDBM, "empty?", fdbm_empty_p, 0);
00709 rb_define_method(rb_cDBM, "each", fdbm_each_pair, 0);
00710 rb_define_method(rb_cDBM, "each_value", fdbm_each_value, 0);
00711 rb_define_method(rb_cDBM, "each_key", fdbm_each_key, 0);
00712 rb_define_method(rb_cDBM, "each_pair", fdbm_each_pair, 0);
00713 rb_define_method(rb_cDBM, "keys", fdbm_keys, 0);
00714 rb_define_method(rb_cDBM, "values", fdbm_values, 0);
00715 rb_define_method(rb_cDBM, "shift", fdbm_shift, 0);
00716 rb_define_method(rb_cDBM, "delete", fdbm_delete, 1);
00717 rb_define_method(rb_cDBM, "delete_if", fdbm_delete_if, 0);
00718 rb_define_method(rb_cDBM, "reject!", fdbm_delete_if, 0);
00719 rb_define_method(rb_cDBM, "reject", fdbm_reject, 0);
00720 rb_define_method(rb_cDBM, "clear", fdbm_clear, 0);
00721 rb_define_method(rb_cDBM,"invert", fdbm_invert, 0);
00722 rb_define_method(rb_cDBM,"update", fdbm_update, 1);
00723 rb_define_method(rb_cDBM,"replace", fdbm_replace, 1);
00724
00725 rb_define_method(rb_cDBM, "include?", fdbm_has_key, 1);
00726 rb_define_method(rb_cDBM, "has_key?", fdbm_has_key, 1);
00727 rb_define_method(rb_cDBM, "member?", fdbm_has_key, 1);
00728 rb_define_method(rb_cDBM, "has_value?", fdbm_has_value, 1);
00729 rb_define_method(rb_cDBM, "key?", fdbm_has_key, 1);
00730 rb_define_method(rb_cDBM, "value?", fdbm_has_value, 1);
00731
00732 rb_define_method(rb_cDBM, "to_a", fdbm_to_a, 0);
00733 rb_define_method(rb_cDBM, "to_hash", fdbm_to_hash, 0);
00734
00735
00736 rb_define_const(rb_cDBM, "READER", INT2FIX(O_RDONLY|RUBY_DBM_RW_BIT));
00737 rb_define_const(rb_cDBM, "WRITER", INT2FIX(O_RDWR|RUBY_DBM_RW_BIT));
00738 rb_define_const(rb_cDBM, "WRCREAT", INT2FIX(O_RDWR|O_CREAT|RUBY_DBM_RW_BIT));
00739 rb_define_const(rb_cDBM, "NEWDB", INT2FIX(O_RDWR|O_CREAT|O_TRUNC|RUBY_DBM_RW_BIT));
00740
00741 #ifdef DB_VERSION_STRING
00742 rb_define_const(rb_cDBM, "VERSION", rb_str_new2(DB_VERSION_STRING));
00743 #else
00744 rb_define_const(rb_cDBM, "VERSION", rb_str_new2("unknown"));
00745 #endif
00746 }
00747