Class: DBM
Constant Summary collapse
- READER =
Indicates that dbm_open() should open the database in read-only mode
INT2FIX(O_RDONLY|RUBY_DBM_RW_BIT)
- WRITER =
Indicates that dbm_open() should open the database in read/write mode
INT2FIX(O_RDWR|RUBY_DBM_RW_BIT)
- WRCREAT =
Indicates that dbm_open() should open the database in read/write mode, and create it if it does not already exist
INT2FIX(O_RDWR|O_CREAT|RUBY_DBM_RW_BIT)
- NEWDB =
Indicates that dbm_open() should open the database in read/write mode, create it if it does not already exist, and delete all contents if it does already exist.
INT2FIX(O_RDWR|O_CREAT|O_TRUNC|RUBY_DBM_RW_BIT)
- VERSION =
-
“ndbm (4.3BSD)”
-
“Berkeley DB 4.8.30: (April 9, 2010)”
-
“Berkeley DB (unknown)” (4.4BSD, maybe)
-
“GDBM version 1.8.3. 10/15/2002 (built Jul 1 2011 12:32:45)”
-
“QDBM 1.8.78”
-
Identifies ndbm library version. Examples
Class Method Summary collapse
-
.open(*args) ⇒ Object
Open a dbm database and yields it if a block is given.
Instance Method Summary collapse
-
#[](key) ⇒ nil
Return a value from the database by locating the key string provided.
-
#[]=(keystr, valstr) ⇒ Object
Stores the specified string value in the database, indexed via the string key provided.
-
#clear ⇒ Object
Deletes all data from the database.
-
#close ⇒ Object
Closes the database.
-
#closed? ⇒ Boolean
Returns true if the database is closed, false otherwise.
-
#delete(key) ⇒ Object
Deletes an entry from the database.
-
#delete_if ⇒ Object
Deletes all entries for which the code block returns true.
-
#each_pair {|key, value| ... } ⇒ self
Calls the block once for each [key, value] pair in the database.
-
#each_key {|key| ... } ⇒ self
Calls the block once for each key string in the database.
-
#each_pair {|key, value| ... } ⇒ self
Calls the block once for each [key, value] pair in the database.
-
#each_value {|value| ... } ⇒ self
Calls the block once for each value string in the database.
-
#empty? ⇒ Boolean
Returns true if the database is empty, false otherwise.
-
#fetch(key[, ifnone]) ⇒ Object
Return a value from the database by locating the key string provided.
-
#has_key?(keystr) ⇒ Object
Returns true if the database contains the specified key, false otherwise.
-
#has_value?(valstr) ⇒ Object
Returns true if the database contains the specified string value, false otherwise.
-
#include?(keystr) ⇒ Object
Returns true if the database contains the specified key, false otherwise.
-
#index(value) ⇒ Object
:nodoc:.
-
#new(filename[, mode[, flags]]) ⇒ Object
constructor
Open a dbm database with the specified name, which can include a directory path.
-
#invert ⇒ Hash
Returns a Hash (not a DBM database) created by using each value in the database as a key, with the corresponding key as its value.
-
#key(value) ⇒ String
Returns the key for the specified value.
-
#key?(keystr) ⇒ Object
Returns true if the database contains the specified key, false otherwise.
-
#keys ⇒ Array
Returns an array of all the string keys in the database.
-
#length ⇒ Object
Returns the number of entries in the database.
-
#member?(keystr) ⇒ Object
Returns true if the database contains the specified key, false otherwise.
-
#reject {|key, value| ... } ⇒ Hash
Converts the contents of the database to an in-memory Hash, then calls Hash#reject with the specified code block, returning a new Hash.
-
#reject! ⇒ Object
Deletes all entries for which the code block returns true.
-
#replace(obj) ⇒ Object
Replaces the contents of the database with the contents of the specified object.
-
#select {|key, value| ... } ⇒ Array
Returns a new array consisting of the [key, value] pairs for which the code block returns true.
-
#shift ⇒ Array
Removes a [key, value] pair from the database, and returns it.
-
#size ⇒ Object
Returns the number of entries in the database.
-
#store(keystr, valstr) ⇒ Object
Stores the specified string value in the database, indexed via the string key provided.
-
#to_a ⇒ Array
Converts the contents of the database to an array of [key, value] arrays, and returns it.
-
#to_hash ⇒ Hash
Converts the contents of the database to an in-memory Hash object, and returns it.
-
#update(obj) ⇒ Object
Updates the database with multiple values from the specified object.
-
#value?(valstr) ⇒ Object
Returns true if the database contains the specified string value, false otherwise.
-
#values ⇒ Array
Returns an array of all the string values in the database.
-
#values_at(key, ...) ⇒ Array
Returns an array containing the values associated with the given keys.
Constructor Details
#new(filename[, mode[, flags]]) ⇒ Object
Open a dbm database with the specified name, which can include a directory path. Any file extensions needed will be supplied automatically by the dbm library. For example, Berkeley DB appends ‘.db’, and GNU gdbm uses two physical files with extensions ‘.dir’ and ‘.pag’.
The mode should be an integer, as for Unix chmod.
Flags should be one of READER, WRITER, WRCREAT or NEWDB.
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 |
# File 'dbm.c', line 143
static VALUE
fdbm_initialize(int argc, VALUE *argv, VALUE obj)
{
VALUE file, vmode, vflags;
DBM *dbm;
struct dbmdata *dbmp;
int mode, flags = 0;
TypedData_Get_Struct(obj, struct dbmdata, &dbm_type, dbmp);
if (rb_scan_args(argc, argv, "12", &file, &vmode, &vflags) == 1) {
mode = 0666; /* default value */
}
else if (NIL_P(vmode)) {
mode = -1; /* return nil if DB not exist */
}
else {
mode = NUM2INT(vmode);
}
if (!NIL_P(vflags))
flags = NUM2INT(vflags);
FilePathValue(file);
/*
* Note:
* gdbm 1.10 works with O_CLOEXEC. gdbm 1.9.1 silently ignore it.
*/
#ifndef O_CLOEXEC
# define O_CLOEXEC 0
#endif
if (flags & RUBY_DBM_RW_BIT) {
flags &= ~RUBY_DBM_RW_BIT;
dbm = dbm_open(RSTRING_PTR(file), flags|O_CLOEXEC, mode);
}
else {
dbm = 0;
if (mode >= 0) {
dbm = dbm_open(RSTRING_PTR(file), O_RDWR|O_CREAT|O_CLOEXEC, mode);
}
if (!dbm) {
dbm = dbm_open(RSTRING_PTR(file), O_RDWR|O_CLOEXEC, 0);
}
if (!dbm) {
dbm = dbm_open(RSTRING_PTR(file), O_RDONLY|O_CLOEXEC, 0);
}
}
if (dbm) {
/*
* History of dbm_pagfno() and dbm_dirfno() in ndbm and its compatibles.
* (dbm_pagfno() and dbm_dirfno() is not standardized.)
*
* 1986: 4.3BSD provides ndbm.
* It provides dbm_pagfno() and dbm_dirfno() as macros.
* 1991: gdbm-1.5 provides them as functions.
* They returns a same descriptor.
* (Earlier releases may have the functions too.)
* 1991: Net/2 provides Berkeley DB.
* It doesn't provide dbm_pagfno() and dbm_dirfno().
* 1992: 4.4BSD Alpha provides Berkeley DB with dbm_dirfno() as a function.
* dbm_pagfno() is a macro as DBM_PAGFNO_NOT_AVAILABLE.
* 1997: Berkeley DB 2.0 is released by Sleepycat Software, Inc.
* It defines dbm_pagfno() and dbm_dirfno() as macros.
* 2011: gdbm-1.9 creates a separate dir file.
* dbm_pagfno() and dbm_dirfno() returns different descriptors.
*/
#if defined(HAVE_DBM_PAGFNO)
rb_fd_fix_cloexec(dbm_pagfno(dbm));
#endif
#if defined(HAVE_DBM_DIRFNO)
rb_fd_fix_cloexec(dbm_dirfno(dbm));
#endif
#if defined(RUBYDBM_DB_HEADER) && defined(HAVE_TYPE_DBC)
/* Disable Berkeley DB error messages such as:
* DB->put: attempt to modify a read-only database */
((DBC*)dbm)->dbp->set_errfile(((DBC*)dbm)->dbp, NULL);
#endif
}
if (!dbm) {
if (mode == -1) return Qnil;
rb_sys_fail_str(file);
}
if (dbmp->di_dbm)
dbm_close(dbmp->di_dbm);
dbmp->di_dbm = dbm;
dbmp->di_size = -1;
return obj;
}
|
Class Method Details
.open(filename[, mode[, flags]]) ⇒ Object .open(filename[, mode[, flags]]) {|dbm| ... } ⇒ Object
Open a dbm database and yields it if a block is given. See also DBM.new
.
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 |
# File 'dbm.c', line 246
static VALUE
fdbm_s_open(int argc, VALUE *argv, VALUE klass)
{
VALUE obj = fdbm_alloc(klass);
if (NIL_P(fdbm_initialize(argc, argv, obj))) {
return Qnil;
}
if (rb_block_given_p()) {
return rb_ensure(rb_yield, obj, fdbm_close, obj);
}
return obj;
}
|
Instance Method Details
#[](key) ⇒ nil
Return a value from the database by locating the key string provided. If the key is not found, returns nil.
296 297 298 299 300 |
# File 'dbm.c', line 296
static VALUE
fdbm_aref(VALUE obj, VALUE keystr)
{
return fdbm_fetch(obj, keystr, Qnil);
}
|
#store(key, value) ⇒ Object #[]=(key) ⇒ Object
Stores the specified string value in the database, indexed via the string key provided.
646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 |
# File 'dbm.c', line 646
static VALUE
fdbm_store(VALUE obj, VALUE keystr, VALUE valstr)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
fdbm_modify(obj);
keystr = rb_obj_as_string(keystr);
valstr = rb_obj_as_string(valstr);
key.dptr = RSTRING_PTR(keystr);
key.dsize = RSTRING_DSIZE(keystr);
val.dptr = RSTRING_PTR(valstr);
val.dsize = RSTRING_DSIZE(valstr);
GetDBM2(obj, dbmp, dbm);
dbmp->di_size = -1;
if (dbm_store(dbm, key, val, DBM_REPLACE)) {
dbm_clearerr(dbm);
if (errno == EPERM) rb_sys_fail(0);
rb_raise(rb_eDBMError, "dbm_store failed");
}
return valstr;
}
|
#clear ⇒ Object
Deletes all data from the database.
546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 |
# File 'dbm.c', line 546
static VALUE
fdbm_clear(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
DBM *dbm;
fdbm_modify(obj);
GetDBM2(obj, dbmp, dbm);
dbmp->di_size = -1;
while (key = dbm_firstkey(dbm), key.dptr) {
if (dbm_delete(dbm, key)) {
rb_raise(rb_eDBMError, "dbm_delete failed");
}
}
dbmp->di_size = 0;
return obj;
}
|
#close ⇒ Object
Closes the database.
92 93 94 95 96 97 98 99 100 101 102 |
# File 'dbm.c', line 92
static VALUE
fdbm_close(VALUE obj)
{
struct dbmdata *dbmp;
GetDBM(obj, dbmp);
dbm_close(dbmp->di_dbm);
dbmp->di_dbm = 0;
return Qnil;
}
|
#closed? ⇒ Boolean
Returns true if the database is closed, false otherwise.
110 111 112 113 114 115 116 117 118 119 120 |
# File 'dbm.c', line 110
static VALUE
fdbm_closed(VALUE obj)
{
struct dbmdata *dbmp;
TypedData_Get_Struct(obj, struct dbmdata, &dbm_type, dbmp);
if (dbmp->di_dbm == 0)
return Qtrue;
return Qfalse;
}
|
#delete(key) ⇒ Object
Deletes an entry from the database.
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 |
# File 'dbm.c', line 422
static VALUE
fdbm_delete(VALUE obj, VALUE keystr)
{
datum key, value;
struct dbmdata *dbmp;
DBM *dbm;
VALUE valstr;
long len;
fdbm_modify(obj);
ExportStringValue(keystr);
len = RSTRING_LEN(keystr);
if (TOO_LONG(len)) goto not_found;
key.dptr = RSTRING_PTR(keystr);
key.dsize = (DSIZE_TYPE)len;
GetDBM2(obj, dbmp, dbm);
value = dbm_fetch(dbm, key);
if (value.dptr == 0) {
not_found:
if (rb_block_given_p()) return rb_yield(keystr);
return Qnil;
}
/* need to save value before dbm_delete() */
valstr = rb_str_new(value.dptr, value.dsize);
if (dbm_delete(dbm, key)) {
dbmp->di_size = -1;
rb_raise(rb_eDBMError, "dbm_delete failed");
}
else if (dbmp->di_size >= 0) {
dbmp->di_size--;
}
return valstr;
}
|
#reject! {|key, value| ... } ⇒ self #delete_if {|key, value| ... } ⇒ self
Deletes all entries for which the code block returns true. Returns self.
498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 |
# File 'dbm.c', line 498
static VALUE
fdbm_delete_if(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
VALUE keystr, valstr;
VALUE ret, ary = rb_ary_tmp_new(0);
int status = 0;
long i, n;
fdbm_modify(obj);
GetDBM2(obj, dbmp, dbm);
n = dbmp->di_size;
dbmp->di_size = -1;
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
keystr = rb_str_new(key.dptr, key.dsize);
OBJ_FREEZE(keystr);
valstr = rb_str_new(val.dptr, val.dsize);
ret = rb_protect(rb_yield, rb_assoc_new(rb_str_dup(keystr), valstr), &status);
if (status != 0) break;
if (RTEST(ret)) rb_ary_push(ary, keystr);
GetDBM2(obj, dbmp, dbm);
}
for (i = 0; i < RARRAY_LEN(ary); i++) {
keystr = RARRAY_AREF(ary, i);
key.dptr = RSTRING_PTR(keystr);
key.dsize = (DSIZE_TYPE)RSTRING_LEN(keystr);
if (dbm_delete(dbm, key)) {
rb_raise(rb_eDBMError, "dbm_delete failed");
}
}
if (status) rb_jump_tag(status);
if (n > 0) dbmp->di_size = n - RARRAY_LEN(ary);
rb_ary_clear(ary);
return obj;
}
|
#each_pair {|key, value| ... } ⇒ self
Calls the block once for each [key, value] pair in the database. Returns self.
782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 |
# File 'dbm.c', line 782
static VALUE
fdbm_each_pair(VALUE obj)
{
datum key, val;
DBM *dbm;
struct dbmdata *dbmp;
VALUE keystr, valstr;
RETURN_ENUMERATOR(obj, 0, 0);
GetDBM2(obj, dbmp, dbm);
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
keystr = rb_str_new(key.dptr, key.dsize);
valstr = rb_str_new(val.dptr, val.dsize);
rb_yield(rb_assoc_new(keystr, valstr));
GetDBM2(obj, dbmp, dbm);
}
return obj;
}
|
#each_key {|key| ... } ⇒ self
Calls the block once for each key string in the database. Returns self.
758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 |
# File 'dbm.c', line 758
static VALUE
fdbm_each_key(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
DBM *dbm;
RETURN_ENUMERATOR(obj, 0, 0);
GetDBM2(obj, dbmp, dbm);
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
rb_yield(rb_str_new(key.dptr, key.dsize));
GetDBM2(obj, dbmp, dbm);
}
return obj;
}
|
#each_pair {|key, value| ... } ⇒ self
Calls the block once for each [key, value] pair in the database. Returns self.
782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 |
# File 'dbm.c', line 782
static VALUE
fdbm_each_pair(VALUE obj)
{
datum key, val;
DBM *dbm;
struct dbmdata *dbmp;
VALUE keystr, valstr;
RETURN_ENUMERATOR(obj, 0, 0);
GetDBM2(obj, dbmp, dbm);
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
keystr = rb_str_new(key.dptr, key.dsize);
valstr = rb_str_new(val.dptr, val.dsize);
rb_yield(rb_assoc_new(keystr, valstr));
GetDBM2(obj, dbmp, dbm);
}
return obj;
}
|
#each_value {|value| ... } ⇒ self
Calls the block once for each value string in the database. Returns self.
734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 |
# File 'dbm.c', line 734
static VALUE
fdbm_each_value(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
RETURN_ENUMERATOR(obj, 0, 0);
GetDBM2(obj, dbmp, dbm);
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
rb_yield(rb_str_new(val.dptr, val.dsize));
GetDBM2(obj, dbmp, dbm);
}
return obj;
}
|
#empty? ⇒ Boolean
Returns true if the database is empty, false otherwise.
706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 |
# File 'dbm.c', line 706
static VALUE
fdbm_empty_p(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
DBM *dbm;
GetDBM2(obj, dbmp, dbm);
if (dbmp->di_size < 0) {
dbm = dbmp->di_dbm;
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
return Qfalse;
}
}
else {
if (dbmp->di_size)
return Qfalse;
}
return Qtrue;
}
|
#fetch(key[, ifnone]) ⇒ Object
Return a value from the database by locating the key string provided. If the key is not found, returns ifnone
. If ifnone
is not given, raises IndexError.
310 311 312 313 314 315 316 317 318 319 320 321 |
# File 'dbm.c', line 310
static VALUE
fdbm_fetch_m(int argc, VALUE *argv, VALUE obj)
{
VALUE keystr, valstr, ifnone;
rb_scan_args(argc, argv, "11", &keystr, &ifnone);
valstr = fdbm_fetch(obj, keystr, ifnone);
if (argc == 1 && !rb_block_given_p() && NIL_P(valstr))
rb_raise(rb_eIndexError, "key not found");
return valstr;
}
|
#include?(key) ⇒ Boolean #has_key?(key) ⇒ Boolean #member?(key) ⇒ Boolean #key?(key) ⇒ Boolean
Returns true if the database contains the specified key, false otherwise.
862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 |
# File 'dbm.c', line 862
static VALUE
fdbm_has_key(VALUE obj, VALUE keystr)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
long len;
ExportStringValue(keystr);
len = RSTRING_LEN(keystr);
if (TOO_LONG(len)) return Qfalse;
key.dptr = RSTRING_PTR(keystr);
key.dsize = (DSIZE_TYPE)len;
GetDBM2(obj, dbmp, dbm);
val = dbm_fetch(dbm, key);
if (val.dptr) return Qtrue;
return Qfalse;
}
|
#has_value?(value) ⇒ Boolean #value?(value) ⇒ Boolean
Returns true if the database contains the specified string value, false otherwise.
890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 |
# File 'dbm.c', line 890
static VALUE
fdbm_has_value(VALUE obj, VALUE valstr)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
long len;
ExportStringValue(valstr);
len = RSTRING_LEN(valstr);
if (TOO_LONG(len)) return Qfalse;
val.dptr = RSTRING_PTR(valstr);
val.dsize = (DSIZE_TYPE)len;
GetDBM2(obj, dbmp, dbm);
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
if ((DSIZE_TYPE)val.dsize == (DSIZE_TYPE)RSTRING_LEN(valstr) &&
memcmp(val.dptr, RSTRING_PTR(valstr), val.dsize) == 0)
return Qtrue;
}
return Qfalse;
}
|
#include?(key) ⇒ Boolean #has_key?(key) ⇒ Boolean #member?(key) ⇒ Boolean #key?(key) ⇒ Boolean
Returns true if the database contains the specified key, false otherwise.
862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 |
# File 'dbm.c', line 862
static VALUE
fdbm_has_key(VALUE obj, VALUE keystr)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
long len;
ExportStringValue(keystr);
len = RSTRING_LEN(keystr);
if (TOO_LONG(len)) return Qfalse;
key.dptr = RSTRING_PTR(keystr);
key.dsize = (DSIZE_TYPE)len;
GetDBM2(obj, dbmp, dbm);
val = dbm_fetch(dbm, key);
if (val.dptr) return Qtrue;
return Qfalse;
}
|
#index(value) ⇒ Object
:nodoc:
353 354 355 356 357 358 |
# File 'dbm.c', line 353
static VALUE
fdbm_index(VALUE hash, VALUE value)
{
rb_warn("DBM#index is deprecated; use DBM#key");
return fdbm_key(hash, value);
}
|
#invert ⇒ Hash
Returns a Hash (not a DBM database) created by using each value in the database as a key, with the corresponding key as its value.
573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 |
# File 'dbm.c', line 573
static VALUE
fdbm_invert(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
VALUE keystr, valstr;
VALUE hash = rb_hash_new();
GetDBM2(obj, dbmp, dbm);
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
keystr = rb_str_new(key.dptr, key.dsize);
valstr = rb_str_new(val.dptr, val.dsize);
rb_hash_aset(hash, valstr, keystr);
}
return hash;
}
|
#key(value) ⇒ String
Returns the key for the specified value.
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 |
# File 'dbm.c', line 329
static VALUE
fdbm_key(VALUE obj, VALUE valstr)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
long len;
ExportStringValue(valstr);
len = RSTRING_LEN(valstr);
if (TOO_LONG(len)) return Qnil;
GetDBM2(obj, dbmp, dbm);
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
if ((long)val.dsize == RSTRING_LEN(valstr) &&
memcmp(val.dptr, RSTRING_PTR(valstr), val.dsize) == 0) {
return rb_str_new(key.dptr, key.dsize);
}
}
return Qnil;
}
|
#include?(key) ⇒ Boolean #has_key?(key) ⇒ Boolean #member?(key) ⇒ Boolean #key?(key) ⇒ Boolean
Returns true if the database contains the specified key, false otherwise.
862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 |
# File 'dbm.c', line 862
static VALUE
fdbm_has_key(VALUE obj, VALUE keystr)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
long len;
ExportStringValue(keystr);
len = RSTRING_LEN(keystr);
if (TOO_LONG(len)) return Qfalse;
key.dptr = RSTRING_PTR(keystr);
key.dsize = (DSIZE_TYPE)len;
GetDBM2(obj, dbmp, dbm);
val = dbm_fetch(dbm, key);
if (val.dptr) return Qtrue;
return Qfalse;
}
|
#keys ⇒ Array
Returns an array of all the string keys in the database.
811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 |
# File 'dbm.c', line 811
static VALUE
fdbm_keys(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
DBM *dbm;
VALUE ary;
GetDBM2(obj, dbmp, dbm);
ary = rb_ary_new();
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
rb_ary_push(ary, rb_str_new(key.dptr, key.dsize));
}
return ary;
}
|
#length ⇒ Integer #size ⇒ Integer
Returns the number of entries in the database.
681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 |
# File 'dbm.c', line 681
static VALUE
fdbm_length(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
DBM *dbm;
int i = 0;
GetDBM2(obj, dbmp, dbm);
if (dbmp->di_size > 0) return INT2FIX(dbmp->di_size);
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
i++;
}
dbmp->di_size = i;
return INT2FIX(i);
}
|
#include?(key) ⇒ Boolean #has_key?(key) ⇒ Boolean #member?(key) ⇒ Boolean #key?(key) ⇒ Boolean
Returns true if the database contains the specified key, false otherwise.
862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 |
# File 'dbm.c', line 862
static VALUE
fdbm_has_key(VALUE obj, VALUE keystr)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
long len;
ExportStringValue(keystr);
len = RSTRING_LEN(keystr);
if (TOO_LONG(len)) return Qfalse;
key.dptr = RSTRING_PTR(keystr);
key.dsize = (DSIZE_TYPE)len;
GetDBM2(obj, dbmp, dbm);
val = dbm_fetch(dbm, key);
if (val.dptr) return Qtrue;
return Qfalse;
}
|
#reject {|key, value| ... } ⇒ Hash
Converts the contents of the database to an in-memory Hash, then calls Hash#reject with the specified code block, returning a new Hash.
973 974 975 976 977 |
# File 'dbm.c', line 973
static VALUE
fdbm_reject(VALUE obj)
{
return rb_hash_delete_if(fdbm_to_hash(obj));
}
|
#reject! {|key, value| ... } ⇒ self #delete_if {|key, value| ... } ⇒ self
Deletes all entries for which the code block returns true. Returns self.
498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 |
# File 'dbm.c', line 498
static VALUE
fdbm_delete_if(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
VALUE keystr, valstr;
VALUE ret, ary = rb_ary_tmp_new(0);
int status = 0;
long i, n;
fdbm_modify(obj);
GetDBM2(obj, dbmp, dbm);
n = dbmp->di_size;
dbmp->di_size = -1;
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
keystr = rb_str_new(key.dptr, key.dsize);
OBJ_FREEZE(keystr);
valstr = rb_str_new(val.dptr, val.dsize);
ret = rb_protect(rb_yield, rb_assoc_new(rb_str_dup(keystr), valstr), &status);
if (status != 0) break;
if (RTEST(ret)) rb_ary_push(ary, keystr);
GetDBM2(obj, dbmp, dbm);
}
for (i = 0; i < RARRAY_LEN(ary); i++) {
keystr = RARRAY_AREF(ary, i);
key.dptr = RSTRING_PTR(keystr);
key.dsize = (DSIZE_TYPE)RSTRING_LEN(keystr);
if (dbm_delete(dbm, key)) {
rb_raise(rb_eDBMError, "dbm_delete failed");
}
}
if (status) rb_jump_tag(status);
if (n > 0) dbmp->di_size = n - RARRAY_LEN(ary);
rb_ary_clear(ary);
return obj;
}
|
#replace(obj) ⇒ Object
Replaces the contents of the database with the contents of the specified object. Takes any object which implements the each_pair method, including Hash and DBM objects.
630 631 632 633 634 635 636 |
# File 'dbm.c', line 630
static VALUE
fdbm_replace(VALUE obj, VALUE other)
{
fdbm_clear(obj);
rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
return obj;
}
|
#select {|key, value| ... } ⇒ Array
Returns a new array consisting of the [key, value] pairs for which the code block returns true.
367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 |
# File 'dbm.c', line 367
static VALUE
fdbm_select(VALUE obj)
{
VALUE new = rb_ary_new();
datum key, val;
DBM *dbm;
struct dbmdata *dbmp;
GetDBM2(obj, dbmp, dbm);
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
VALUE assoc, v;
val = dbm_fetch(dbm, key);
assoc = rb_assoc_new(rb_str_new(key.dptr, key.dsize),
rb_str_new(val.dptr, val.dsize));
v = rb_yield(assoc);
if (RTEST(v)) {
rb_ary_push(new, assoc);
}
GetDBM2(obj, dbmp, dbm);
}
return new;
}
|
#shift ⇒ Array
Removes a [key, value] pair from the database, and returns it. If the database is empty, returns nil. The order in which values are removed/returned is not guaranteed.
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 |
# File 'dbm.c', line 468
static VALUE
fdbm_shift(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
VALUE keystr, valstr;
fdbm_modify(obj);
GetDBM2(obj, dbmp, dbm);
dbmp->di_size = -1;
key = dbm_firstkey(dbm);
if (!key.dptr) return Qnil;
val = dbm_fetch(dbm, key);
keystr = rb_str_new(key.dptr, key.dsize);
valstr = rb_str_new(val.dptr, val.dsize);
dbm_delete(dbm, key);
return rb_assoc_new(keystr, valstr);
}
|
#length ⇒ Integer #size ⇒ Integer
Returns the number of entries in the database.
681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 |
# File 'dbm.c', line 681
static VALUE
fdbm_length(VALUE obj)
{
datum key;
struct dbmdata *dbmp;
DBM *dbm;
int i = 0;
GetDBM2(obj, dbmp, dbm);
if (dbmp->di_size > 0) return INT2FIX(dbmp->di_size);
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
i++;
}
dbmp->di_size = i;
return INT2FIX(i);
}
|
#store(key, value) ⇒ Object #[]=(key) ⇒ Object
Stores the specified string value in the database, indexed via the string key provided.
646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 |
# File 'dbm.c', line 646
static VALUE
fdbm_store(VALUE obj, VALUE keystr, VALUE valstr)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
fdbm_modify(obj);
keystr = rb_obj_as_string(keystr);
valstr = rb_obj_as_string(valstr);
key.dptr = RSTRING_PTR(keystr);
key.dsize = RSTRING_DSIZE(keystr);
val.dptr = RSTRING_PTR(valstr);
val.dsize = RSTRING_DSIZE(valstr);
GetDBM2(obj, dbmp, dbm);
dbmp->di_size = -1;
if (dbm_store(dbm, key, val, DBM_REPLACE)) {
dbm_clearerr(dbm);
if (errno == EPERM) rb_sys_fail(0);
rb_raise(rb_eDBMError, "dbm_store failed");
}
return valstr;
}
|
#to_a ⇒ Array
Converts the contents of the database to an array of [key, value] arrays, and returns it.
921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 |
# File 'dbm.c', line 921
static VALUE
fdbm_to_a(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
VALUE ary;
GetDBM2(obj, dbmp, dbm);
ary = rb_ary_new();
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
rb_ary_push(ary, rb_assoc_new(rb_str_new(key.dptr, key.dsize),
rb_str_new(val.dptr, val.dsize)));
}
return ary;
}
|
#to_hash ⇒ Hash
Converts the contents of the database to an in-memory Hash object, and returns it.
947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 |
# File 'dbm.c', line 947
static VALUE
fdbm_to_hash(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
VALUE hash;
GetDBM2(obj, dbmp, dbm);
hash = rb_hash_new();
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
rb_hash_aset(hash, rb_str_new(key.dptr, key.dsize),
rb_str_new(val.dptr, val.dsize));
}
return hash;
}
|
#update(obj) ⇒ Object
Updates the database with multiple values from the specified object. Takes any object which implements the each_pair method, including Hash and DBM objects.
615 616 617 618 619 620 |
# File 'dbm.c', line 615
static VALUE
fdbm_update(VALUE obj, VALUE other)
{
rb_block_call(other, rb_intern("each_pair"), 0, 0, update_i, obj);
return obj;
}
|
#has_value?(value) ⇒ Boolean #value?(value) ⇒ Boolean
Returns true if the database contains the specified string value, false otherwise.
890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 |
# File 'dbm.c', line 890
static VALUE
fdbm_has_value(VALUE obj, VALUE valstr)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
long len;
ExportStringValue(valstr);
len = RSTRING_LEN(valstr);
if (TOO_LONG(len)) return Qfalse;
val.dptr = RSTRING_PTR(valstr);
val.dsize = (DSIZE_TYPE)len;
GetDBM2(obj, dbmp, dbm);
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
if ((DSIZE_TYPE)val.dsize == (DSIZE_TYPE)RSTRING_LEN(valstr) &&
memcmp(val.dptr, RSTRING_PTR(valstr), val.dsize) == 0)
return Qtrue;
}
return Qfalse;
}
|
#values ⇒ Array
Returns an array of all the string values in the database.
835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 |
# File 'dbm.c', line 835
static VALUE
fdbm_values(VALUE obj)
{
datum key, val;
struct dbmdata *dbmp;
DBM *dbm;
VALUE ary;
GetDBM2(obj, dbmp, dbm);
ary = rb_ary_new();
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
rb_ary_push(ary, rb_str_new(val.dptr, val.dsize));
}
return ary;
}
|
#values_at(key, ...) ⇒ Array
Returns an array containing the values associated with the given keys.
397 398 399 400 401 402 403 404 405 406 407 408 |
# File 'dbm.c', line 397
static VALUE
fdbm_values_at(int argc, VALUE *argv, VALUE obj)
{
VALUE new = rb_ary_new2(argc);
int i;
for (i=0; i<argc; i++) {
rb_ary_push(new, fdbm_fetch(obj, argv[i], Qnil));
}
return new;
}
|