00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "ruby.h"
00013
00014 #include "sdbm.h"
00015 #include <fcntl.h>
00016 #include <errno.h>
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 static VALUE rb_cDBM, rb_eDBMError;
00068
00069 struct dbmdata {
00070 int di_size;
00071 DBM *di_dbm;
00072 };
00073
00074 static void
00075 closed_sdbm()
00076 {
00077 rb_raise(rb_eDBMError, "closed SDBM file");
00078 }
00079
00080 #define GetDBM(obj, dbmp) {\
00081 Data_Get_Struct((obj), struct dbmdata, (dbmp));\
00082 if ((dbmp) == 0) closed_sdbm();\
00083 if ((dbmp)->di_dbm == 0) closed_sdbm();\
00084 }
00085
00086 #define GetDBM2(obj, data, dbm) {\
00087 GetDBM((obj), (data));\
00088 (dbm) = dbmp->di_dbm;\
00089 }
00090
00091 static void
00092 free_sdbm(struct dbmdata *dbmp)
00093 {
00094
00095 if (dbmp->di_dbm) sdbm_close(dbmp->di_dbm);
00096 ruby_xfree(dbmp);
00097 }
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 static VALUE
00108 fsdbm_close(VALUE obj)
00109 {
00110 struct dbmdata *dbmp;
00111
00112 GetDBM(obj, dbmp);
00113 sdbm_close(dbmp->di_dbm);
00114 dbmp->di_dbm = 0;
00115
00116 return Qnil;
00117 }
00118
00119
00120
00121
00122
00123
00124
00125 static VALUE
00126 fsdbm_closed(VALUE obj)
00127 {
00128 struct dbmdata *dbmp;
00129
00130 Data_Get_Struct(obj, struct dbmdata, dbmp);
00131 if (dbmp == 0)
00132 return Qtrue;
00133 if (dbmp->di_dbm == 0)
00134 return Qtrue;
00135
00136 return Qfalse;
00137 }
00138
00139 static VALUE
00140 fsdbm_alloc(VALUE klass)
00141 {
00142 return Data_Wrap_Struct(klass, 0, free_sdbm, 0);
00143 }
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 static VALUE
00160 fsdbm_initialize(int argc, VALUE *argv, VALUE obj)
00161 {
00162 volatile VALUE file;
00163 VALUE vmode;
00164 DBM *dbm;
00165 struct dbmdata *dbmp;
00166 int mode;
00167
00168 if (rb_scan_args(argc, argv, "11", &file, &vmode) == 1) {
00169 mode = 0666;
00170 }
00171 else if (NIL_P(vmode)) {
00172 mode = -1;
00173 }
00174 else {
00175 mode = NUM2INT(vmode);
00176 }
00177 FilePathValue(file);
00178
00179 dbm = 0;
00180 if (mode >= 0)
00181 dbm = sdbm_open(RSTRING_PTR(file), O_RDWR|O_CREAT, mode);
00182 if (!dbm)
00183 dbm = sdbm_open(RSTRING_PTR(file), O_RDWR, 0);
00184 if (!dbm)
00185 dbm = sdbm_open(RSTRING_PTR(file), O_RDONLY, 0);
00186
00187 if (!dbm) {
00188 if (mode == -1) return Qnil;
00189 rb_sys_fail_str(file);
00190 }
00191
00192 dbmp = ALLOC(struct dbmdata);
00193 DATA_PTR(obj) = dbmp;
00194 dbmp->di_dbm = dbm;
00195 dbmp->di_size = -1;
00196
00197 return obj;
00198 }
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 static VALUE
00219 fsdbm_s_open(int argc, VALUE *argv, VALUE klass)
00220 {
00221 VALUE obj = Data_Wrap_Struct(klass, 0, free_sdbm, 0);
00222
00223 if (NIL_P(fsdbm_initialize(argc, argv, obj))) {
00224 return Qnil;
00225 }
00226
00227 if (rb_block_given_p()) {
00228 return rb_ensure(rb_yield, obj, fsdbm_close, obj);
00229 }
00230
00231 return obj;
00232 }
00233
00234 static VALUE
00235 fsdbm_fetch(VALUE obj, VALUE keystr, VALUE ifnone)
00236 {
00237 datum key, value;
00238 struct dbmdata *dbmp;
00239 DBM *dbm;
00240
00241 ExportStringValue(keystr);
00242 key.dptr = RSTRING_PTR(keystr);
00243 key.dsize = RSTRING_LENINT(keystr);
00244
00245 GetDBM2(obj, dbmp, dbm);
00246 value = sdbm_fetch(dbm, key);
00247 if (value.dptr == 0) {
00248 if (ifnone == Qnil && rb_block_given_p())
00249 return rb_yield(rb_external_str_new(key.dptr, key.dsize));
00250 return ifnone;
00251 }
00252 return rb_external_str_new(value.dptr, value.dsize);
00253 }
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263 static VALUE
00264 fsdbm_aref(VALUE obj, VALUE keystr)
00265 {
00266 return fsdbm_fetch(obj, keystr, Qnil);
00267 }
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 static VALUE
00284 fsdbm_fetch_m(int argc, VALUE *argv, VALUE obj)
00285 {
00286 VALUE keystr, valstr, ifnone;
00287
00288 rb_scan_args(argc, argv, "11", &keystr, &ifnone);
00289 valstr = fsdbm_fetch(obj, keystr, ifnone);
00290 if (argc == 1 && !rb_block_given_p() && NIL_P(valstr))
00291 rb_raise(rb_eIndexError, "key not found");
00292
00293 return valstr;
00294 }
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 static VALUE
00305 fsdbm_key(VALUE obj, VALUE valstr)
00306 {
00307 datum key, val;
00308 struct dbmdata *dbmp;
00309 DBM *dbm;
00310
00311 ExportStringValue(valstr);
00312 val.dptr = RSTRING_PTR(valstr);
00313 val.dsize = RSTRING_LENINT(valstr);
00314
00315 GetDBM2(obj, dbmp, dbm);
00316 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00317 val = sdbm_fetch(dbm, key);
00318 if (val.dsize == RSTRING_LEN(valstr) &&
00319 memcmp(val.dptr, RSTRING_PTR(valstr), val.dsize) == 0)
00320 return rb_external_str_new(key.dptr, key.dsize);
00321 }
00322 return Qnil;
00323 }
00324
00325
00326
00327
00328 static VALUE
00329 fsdbm_index(VALUE hash, VALUE value)
00330 {
00331 rb_warn("SDBM#index is deprecated; use SDBM#key");
00332 return fsdbm_key(hash, value);
00333 }
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354 static VALUE
00355 fsdbm_select(VALUE obj)
00356 {
00357 VALUE new = rb_ary_new();
00358 datum key, val;
00359 DBM *dbm;
00360 struct dbmdata *dbmp;
00361
00362 GetDBM2(obj, dbmp, dbm);
00363 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00364 VALUE assoc, v;
00365 val = sdbm_fetch(dbm, key);
00366 assoc = rb_assoc_new(rb_external_str_new(key.dptr, key.dsize),
00367 rb_external_str_new(val.dptr, val.dsize));
00368 v = rb_yield(assoc);
00369 if (RTEST(v)) {
00370 rb_ary_push(new, assoc);
00371 }
00372 GetDBM2(obj, dbmp, dbm);
00373 }
00374
00375 return new;
00376 }
00377
00378
00379
00380
00381
00382
00383 static VALUE
00384 fsdbm_values_at(int argc, VALUE *argv, VALUE obj)
00385 {
00386 VALUE new = rb_ary_new2(argc);
00387 int i;
00388
00389 for (i=0; i<argc; i++) {
00390 rb_ary_push(new, fsdbm_fetch(obj, argv[i], Qnil));
00391 }
00392
00393 return new;
00394 }
00395
00396 static void
00397 fdbm_modify(VALUE obj)
00398 {
00399 if (OBJ_FROZEN(obj)) rb_error_frozen("SDBM");
00400 }
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414 static VALUE
00415 fsdbm_delete(VALUE obj, VALUE keystr)
00416 {
00417 datum key, value;
00418 struct dbmdata *dbmp;
00419 DBM *dbm;
00420 VALUE valstr;
00421
00422 fdbm_modify(obj);
00423 ExportStringValue(keystr);
00424 key.dptr = RSTRING_PTR(keystr);
00425 key.dsize = RSTRING_LENINT(keystr);
00426
00427 GetDBM2(obj, dbmp, dbm);
00428 dbmp->di_size = -1;
00429
00430 value = sdbm_fetch(dbm, key);
00431 if (value.dptr == 0) {
00432 if (rb_block_given_p()) return rb_yield(keystr);
00433 return Qnil;
00434 }
00435
00436
00437 valstr = rb_external_str_new(value.dptr, value.dsize);
00438
00439 if (sdbm_delete(dbm, key)) {
00440 dbmp->di_size = -1;
00441 rb_raise(rb_eDBMError, "dbm_delete failed");
00442 }
00443 else if (dbmp->di_size >= 0) {
00444 dbmp->di_size--;
00445 }
00446 return valstr;
00447 }
00448
00449
00450
00451
00452
00453
00454
00455
00456 static VALUE
00457 fsdbm_shift(VALUE obj)
00458 {
00459 datum key, val;
00460 struct dbmdata *dbmp;
00461 DBM *dbm;
00462 VALUE keystr, valstr;
00463
00464 fdbm_modify(obj);
00465 GetDBM2(obj, dbmp, dbm);
00466 key = sdbm_firstkey(dbm);
00467 if (!key.dptr) return Qnil;
00468 val = sdbm_fetch(dbm, key);
00469 keystr = rb_external_str_new(key.dptr, key.dsize);
00470 valstr = rb_external_str_new(val.dptr, val.dsize);
00471 sdbm_delete(dbm, key);
00472 if (dbmp->di_size >= 0) {
00473 dbmp->di_size--;
00474 }
00475
00476 return rb_assoc_new(keystr, valstr);
00477 }
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487 static VALUE
00488 fsdbm_delete_if(VALUE obj)
00489 {
00490 datum key, val;
00491 struct dbmdata *dbmp;
00492 DBM *dbm;
00493 VALUE keystr, valstr;
00494 VALUE ret, ary = rb_ary_new();
00495 int i, status = 0, n;
00496
00497 fdbm_modify(obj);
00498 GetDBM2(obj, dbmp, dbm);
00499 n = dbmp->di_size;
00500 dbmp->di_size = -1;
00501 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00502 val = sdbm_fetch(dbm, key);
00503 keystr = rb_external_str_new(key.dptr, key.dsize);
00504 valstr = rb_external_str_new(val.dptr, val.dsize);
00505 ret = rb_protect(rb_yield, rb_assoc_new(rb_str_dup(keystr), valstr), &status);
00506 if (status != 0) break;
00507 if (RTEST(ret)) rb_ary_push(ary, keystr);
00508 GetDBM2(obj, dbmp, dbm);
00509 }
00510
00511 for (i = 0; i < RARRAY_LEN(ary); i++) {
00512 keystr = RARRAY_PTR(ary)[i];
00513 ExportStringValue(keystr);
00514 key.dptr = RSTRING_PTR(keystr);
00515 key.dsize = RSTRING_LENINT(keystr);
00516 if (sdbm_delete(dbm, key)) {
00517 rb_raise(rb_eDBMError, "sdbm_delete failed");
00518 }
00519 }
00520 if (status) rb_jump_tag(status);
00521 if (n > 0) dbmp->di_size = n - RARRAY_LENINT(ary);
00522
00523 return obj;
00524 }
00525
00526
00527
00528
00529
00530
00531
00532 static VALUE
00533 fsdbm_clear(VALUE obj)
00534 {
00535 datum key;
00536 struct dbmdata *dbmp;
00537 DBM *dbm;
00538
00539 fdbm_modify(obj);
00540 GetDBM2(obj, dbmp, dbm);
00541 dbmp->di_size = -1;
00542 while (key = sdbm_firstkey(dbm), key.dptr) {
00543 if (sdbm_delete(dbm, key)) {
00544 rb_raise(rb_eDBMError, "sdbm_delete failed");
00545 }
00546 }
00547 dbmp->di_size = 0;
00548
00549 return obj;
00550 }
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568 static VALUE
00569 fsdbm_invert(VALUE obj)
00570 {
00571 datum key, val;
00572 struct dbmdata *dbmp;
00573 DBM *dbm;
00574 VALUE keystr, valstr;
00575 VALUE hash = rb_hash_new();
00576
00577 GetDBM2(obj, dbmp, dbm);
00578 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00579 val = sdbm_fetch(dbm, key);
00580 keystr = rb_external_str_new(key.dptr, key.dsize);
00581 valstr = rb_external_str_new(val.dptr, val.dsize);
00582 rb_hash_aset(hash, valstr, keystr);
00583 }
00584 return hash;
00585 }
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599 static VALUE
00600 fsdbm_store(VALUE obj, VALUE keystr, VALUE valstr)
00601 {
00602 datum key, val;
00603 struct dbmdata *dbmp;
00604 DBM *dbm;
00605
00606 if (valstr == Qnil) {
00607 fsdbm_delete(obj, keystr);
00608 return Qnil;
00609 }
00610
00611 fdbm_modify(obj);
00612 ExportStringValue(keystr);
00613 ExportStringValue(valstr);
00614
00615 key.dptr = RSTRING_PTR(keystr);
00616 key.dsize = RSTRING_LENINT(keystr);
00617
00618 val.dptr = RSTRING_PTR(valstr);
00619 val.dsize = RSTRING_LENINT(valstr);
00620
00621 GetDBM2(obj, dbmp, dbm);
00622 dbmp->di_size = -1;
00623 if (sdbm_store(dbm, key, val, DBM_REPLACE)) {
00624 #ifdef HAVE_DBM_CLAERERR
00625 sdbm_clearerr(dbm);
00626 #endif
00627 if (errno == EPERM) rb_sys_fail(0);
00628 rb_raise(rb_eDBMError, "sdbm_store failed");
00629 }
00630
00631 return valstr;
00632 }
00633
00634 static VALUE
00635 update_i(RB_BLOCK_CALL_FUNC_ARGLIST(pair, dbm))
00636 {
00637 Check_Type(pair, T_ARRAY);
00638 if (RARRAY_LEN(pair) < 2) {
00639 rb_raise(rb_eArgError, "pair must be [key, value]");
00640 }
00641 fsdbm_store(dbm, RARRAY_PTR(pair)[0], RARRAY_PTR(pair)[1]);
00642 return Qnil;
00643 }
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654 static VALUE
00655 fsdbm_update(VALUE obj, VALUE other)
00656 {
00657 rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
00658 return obj;
00659 }
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670 static VALUE
00671 fsdbm_replace(VALUE obj, VALUE other)
00672 {
00673 fsdbm_clear(obj);
00674 rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
00675 return obj;
00676 }
00677
00678
00679
00680
00681
00682
00683
00684
00685 static VALUE
00686 fsdbm_length(VALUE obj)
00687 {
00688 datum key;
00689 struct dbmdata *dbmp;
00690 DBM *dbm;
00691 int i = 0;
00692
00693 GetDBM2(obj, dbmp, dbm);
00694 if (dbmp->di_size > 0) return INT2FIX(dbmp->di_size);
00695
00696 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00697 i++;
00698 }
00699 dbmp->di_size = i;
00700
00701 return INT2FIX(i);
00702 }
00703
00704
00705
00706
00707
00708
00709
00710 static VALUE
00711 fsdbm_empty_p(VALUE obj)
00712 {
00713 datum key;
00714 struct dbmdata *dbmp;
00715 DBM *dbm;
00716
00717 GetDBM(obj, dbmp);
00718 if (dbmp->di_size < 0) {
00719 dbm = dbmp->di_dbm;
00720
00721 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00722 return Qfalse;
00723 }
00724 }
00725 else {
00726 if (dbmp->di_size)
00727 return Qfalse;
00728 }
00729 return Qtrue;
00730 }
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741 static VALUE
00742 fsdbm_each_value(VALUE obj)
00743 {
00744 datum key, val;
00745 struct dbmdata *dbmp;
00746 DBM *dbm;
00747
00748 RETURN_ENUMERATOR(obj, 0, 0);
00749
00750 GetDBM2(obj, dbmp, dbm);
00751 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00752 val = sdbm_fetch(dbm, key);
00753 rb_yield(rb_external_str_new(val.dptr, val.dsize));
00754 GetDBM2(obj, dbmp, dbm);
00755 }
00756 return obj;
00757 }
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768 static VALUE
00769 fsdbm_each_key(VALUE obj)
00770 {
00771 datum key;
00772 struct dbmdata *dbmp;
00773 DBM *dbm;
00774
00775 RETURN_ENUMERATOR(obj, 0, 0);
00776
00777 GetDBM2(obj, dbmp, dbm);
00778 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00779 rb_yield(rb_external_str_new(key.dptr, key.dsize));
00780 GetDBM2(obj, dbmp, dbm);
00781 }
00782 return obj;
00783 }
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796 static VALUE
00797 fsdbm_each_pair(VALUE obj)
00798 {
00799 datum key, val;
00800 DBM *dbm;
00801 struct dbmdata *dbmp;
00802 VALUE keystr, valstr;
00803
00804 RETURN_ENUMERATOR(obj, 0, 0);
00805
00806 GetDBM2(obj, dbmp, dbm);
00807 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00808 val = sdbm_fetch(dbm, key);
00809 keystr = rb_external_str_new(key.dptr, key.dsize);
00810 valstr = rb_external_str_new(val.dptr, val.dsize);
00811 rb_yield(rb_assoc_new(keystr, valstr));
00812 GetDBM2(obj, dbmp, dbm);
00813 }
00814
00815 return obj;
00816 }
00817
00818
00819
00820
00821
00822
00823
00824 static VALUE
00825 fsdbm_keys(VALUE obj)
00826 {
00827 datum key;
00828 struct dbmdata *dbmp;
00829 DBM *dbm;
00830 VALUE ary;
00831
00832 GetDBM2(obj, dbmp, dbm);
00833 ary = rb_ary_new();
00834 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00835 rb_ary_push(ary, rb_external_str_new(key.dptr, key.dsize));
00836 }
00837
00838 return ary;
00839 }
00840
00841
00842
00843
00844
00845
00846
00847 static VALUE
00848 fsdbm_values(VALUE obj)
00849 {
00850 datum key, val;
00851 struct dbmdata *dbmp;
00852 DBM *dbm;
00853 VALUE ary;
00854
00855 GetDBM2(obj, dbmp, dbm);
00856 ary = rb_ary_new();
00857 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00858 val = sdbm_fetch(dbm, key);
00859 rb_ary_push(ary, rb_external_str_new(val.dptr, val.dsize));
00860 }
00861
00862 return ary;
00863 }
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874 static VALUE
00875 fsdbm_has_key(VALUE obj, VALUE keystr)
00876 {
00877 datum key, val;
00878 struct dbmdata *dbmp;
00879 DBM *dbm;
00880
00881 ExportStringValue(keystr);
00882 key.dptr = RSTRING_PTR(keystr);
00883 key.dsize = RSTRING_LENINT(keystr);
00884
00885 GetDBM2(obj, dbmp, dbm);
00886 val = sdbm_fetch(dbm, key);
00887 if (val.dptr) return Qtrue;
00888 return Qfalse;
00889 }
00890
00891
00892
00893
00894
00895
00896
00897
00898 static VALUE
00899 fsdbm_has_value(VALUE obj, VALUE valstr)
00900 {
00901 datum key, val;
00902 struct dbmdata *dbmp;
00903 DBM *dbm;
00904
00905 ExportStringValue(valstr);
00906 val.dptr = RSTRING_PTR(valstr);
00907 val.dsize = RSTRING_LENINT(valstr);
00908
00909 GetDBM2(obj, dbmp, dbm);
00910 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00911 val = sdbm_fetch(dbm, key);
00912 if (val.dsize == RSTRING_LENINT(valstr) &&
00913 memcmp(val.dptr, RSTRING_PTR(valstr), val.dsize) == 0)
00914 return Qtrue;
00915 }
00916 return Qfalse;
00917 }
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935 static VALUE
00936 fsdbm_to_a(VALUE obj)
00937 {
00938 datum key, val;
00939 struct dbmdata *dbmp;
00940 DBM *dbm;
00941 VALUE ary;
00942
00943 GetDBM2(obj, dbmp, dbm);
00944 ary = rb_ary_new();
00945 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00946 val = sdbm_fetch(dbm, key);
00947 rb_ary_push(ary, rb_assoc_new(rb_external_str_new(key.dptr, key.dsize),
00948 rb_external_str_new(val.dptr, val.dsize)));
00949 }
00950
00951 return ary;
00952 }
00953
00954
00955
00956
00957
00958
00959
00960 static VALUE
00961 fsdbm_to_hash(VALUE obj)
00962 {
00963 datum key, val;
00964 struct dbmdata *dbmp;
00965 DBM *dbm;
00966 VALUE hash;
00967
00968 GetDBM2(obj, dbmp, dbm);
00969 hash = rb_hash_new();
00970 for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
00971 val = sdbm_fetch(dbm, key);
00972 rb_hash_aset(hash, rb_external_str_new(key.dptr, key.dsize),
00973 rb_external_str_new(val.dptr, val.dsize));
00974 }
00975
00976 return hash;
00977 }
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987 static VALUE
00988 fsdbm_reject(VALUE obj)
00989 {
00990 return rb_hash_delete_if(fsdbm_to_hash(obj));
00991 }
00992
00993 void
00994 Init_sdbm()
00995 {
00996 rb_cDBM = rb_define_class("SDBM", rb_cObject);
00997 rb_eDBMError = rb_define_class("SDBMError", rb_eStandardError);
00998
00999
01000
01001 rb_include_module(rb_cDBM, rb_mEnumerable);
01002
01003 rb_define_alloc_func(rb_cDBM, fsdbm_alloc);
01004 rb_define_singleton_method(rb_cDBM, "open", fsdbm_s_open, -1);
01005
01006 rb_define_method(rb_cDBM, "initialize", fsdbm_initialize, -1);
01007 rb_define_method(rb_cDBM, "close", fsdbm_close, 0);
01008 rb_define_method(rb_cDBM, "closed?", fsdbm_closed, 0);
01009 rb_define_method(rb_cDBM, "[]", fsdbm_aref, 1);
01010 rb_define_method(rb_cDBM, "fetch", fsdbm_fetch_m, -1);
01011 rb_define_method(rb_cDBM, "[]=", fsdbm_store, 2);
01012 rb_define_method(rb_cDBM, "store", fsdbm_store, 2);
01013 rb_define_method(rb_cDBM, "index", fsdbm_index, 1);
01014 rb_define_method(rb_cDBM, "key", fsdbm_key, 1);
01015 rb_define_method(rb_cDBM, "select", fsdbm_select, 0);
01016 rb_define_method(rb_cDBM, "values_at", fsdbm_values_at, -1);
01017 rb_define_method(rb_cDBM, "length", fsdbm_length, 0);
01018 rb_define_method(rb_cDBM, "size", fsdbm_length, 0);
01019 rb_define_method(rb_cDBM, "empty?", fsdbm_empty_p, 0);
01020 rb_define_method(rb_cDBM, "each", fsdbm_each_pair, 0);
01021 rb_define_method(rb_cDBM, "each_value", fsdbm_each_value, 0);
01022 rb_define_method(rb_cDBM, "each_key", fsdbm_each_key, 0);
01023 rb_define_method(rb_cDBM, "each_pair", fsdbm_each_pair, 0);
01024 rb_define_method(rb_cDBM, "keys", fsdbm_keys, 0);
01025 rb_define_method(rb_cDBM, "values", fsdbm_values, 0);
01026 rb_define_method(rb_cDBM, "shift", fsdbm_shift, 0);
01027 rb_define_method(rb_cDBM, "delete", fsdbm_delete, 1);
01028 rb_define_method(rb_cDBM, "delete_if", fsdbm_delete_if, 0);
01029 rb_define_method(rb_cDBM, "reject!", fsdbm_delete_if, 0);
01030 rb_define_method(rb_cDBM, "reject", fsdbm_reject, 0);
01031 rb_define_method(rb_cDBM, "clear", fsdbm_clear, 0);
01032 rb_define_method(rb_cDBM,"invert", fsdbm_invert, 0);
01033 rb_define_method(rb_cDBM,"update", fsdbm_update, 1);
01034 rb_define_method(rb_cDBM,"replace", fsdbm_replace, 1);
01035
01036 rb_define_method(rb_cDBM, "has_key?", fsdbm_has_key, 1);
01037 rb_define_method(rb_cDBM, "include?", fsdbm_has_key, 1);
01038 rb_define_method(rb_cDBM, "key?", fsdbm_has_key, 1);
01039 rb_define_method(rb_cDBM, "member?", fsdbm_has_key, 1);
01040 rb_define_method(rb_cDBM, "has_value?", fsdbm_has_value, 1);
01041 rb_define_method(rb_cDBM, "value?", fsdbm_has_value, 1);
01042
01043 rb_define_method(rb_cDBM, "to_a", fsdbm_to_a, 0);
01044 rb_define_method(rb_cDBM, "to_hash", fsdbm_to_hash, 0);
01045 }
01046