17#ifdef HAVE_SYS_CDEFS_H
18# include <sys/cdefs.h>
24#define DSIZE_TYPE TYPEOF_DATUM_DSIZE
25#if SIZEOF_DATUM_DSIZE > SIZEOF_INT
26# define RSTRING_DSIZE(s) RSTRING_LEN(s)
27# define TOO_LONG(n) ((void)(n),0)
29# define RSTRING_DSIZE(s) RSTRING_LENINT(s)
30# define TOO_LONG(n) ((long)(+(DSIZE_TYPE)(n)) != (n))
33static VALUE rb_cDBM, rb_eDBMError;
35#define RUBY_DBM_RW_BIT 0x20000000
42NORETURN(
static void closed_dbm(
void));
47 rb_raise(rb_eDBMError,
"closed DBM file");
50#define GetDBM(obj, dbmp) do {\
51 TypedData_Get_Struct((obj), struct dbmdata, &dbm_type, (dbmp));\
52 if ((dbmp)->di_dbm == 0) closed_dbm();\
55#define GetDBM2(obj, dbmp, dbm) do {\
56 GetDBM((obj), (dbmp));\
57 (dbm) = (dbmp)->di_dbm;\
70memsize_dbm(
const void *
ptr)
73 size_t size =
sizeof(*dbmp);
75 size += DBM_SIZEOF_DBM;
81 {0, free_dbm, memsize_dbm,},
111fdbm_closed(
VALUE obj)
123fdbm_alloc(
VALUE klass)
155 else if (
NIL_P(vmode)) {
176 flags &= ~RUBY_DBM_RW_BIT;
211#if defined(HAVE_DBM_PAGFNO)
214#if defined(HAVE_DBM_DIRFNO)
218#if defined(RUBYDBM_DB_HEADER) && defined(HAVE_TYPE_DBC)
221 ((DBC*)dbm)->dbp->set_errfile(((DBC*)dbm)->dbp,
NULL);
249 VALUE obj = fdbm_alloc(klass);
277 value = dbm_fetch(dbm,
key);
278 if (value.dptr == 0) {
299 return fdbm_fetch(obj, keystr,
Qnil);
313 VALUE keystr, valstr, ifnone;
316 valstr = fdbm_fetch(obj, keystr, ifnone);
342 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
343 val = dbm_fetch(dbm,
key);
356 rb_warn(
"DBM#index is deprecated; use DBM#key");
357 return fdbm_key(hash, value);
368fdbm_select(
VALUE obj)
376 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
378 val = dbm_fetch(dbm,
key);
403 for (i=0; i<
argc; i++) {
411fdbm_modify(
VALUE obj)
440 value = dbm_fetch(dbm,
key);
441 if (value.dptr == 0) {
450 if (dbm_delete(dbm,
key)) {
452 rb_raise(rb_eDBMError,
"dbm_delete failed");
474 VALUE keystr, valstr;
480 key = dbm_firstkey(dbm);
482 val = dbm_fetch(dbm,
key);
485 dbm_delete(dbm,
key);
499fdbm_delete_if(
VALUE obj)
504 VALUE keystr, valstr;
514 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
515 val = dbm_fetch(dbm,
key);
520 if (status != 0)
break;
529 if (dbm_delete(dbm,
key)) {
530 rb_raise(rb_eDBMError,
"dbm_delete failed");
556 while (
key = dbm_firstkey(dbm),
key.dptr) {
557 if (dbm_delete(dbm,
key)) {
558 rb_raise(rb_eDBMError,
"dbm_delete failed");
574fdbm_invert(
VALUE obj)
579 VALUE keystr, valstr;
583 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
584 val = dbm_fetch(dbm,
key);
603 fdbm_store(dbm,
ptr[0],
ptr[1]);
665 if (dbm_store(dbm,
key, val, DBM_REPLACE)) {
668 rb_raise(rb_eDBMError,
"dbm_store failed");
682fdbm_length(
VALUE obj)
692 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
707fdbm_empty_p(
VALUE obj)
717 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
735fdbm_each_value(
VALUE obj)
744 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
745 val = dbm_fetch(dbm,
key);
759fdbm_each_key(
VALUE obj)
768 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
783fdbm_each_pair(
VALUE obj)
788 VALUE keystr, valstr;
794 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
795 val = dbm_fetch(dbm,
key);
822 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
836fdbm_values(
VALUE obj)
845 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
846 val = dbm_fetch(dbm,
key);
877 val = dbm_fetch(dbm,
key);
878 if (val.dptr)
return Qtrue;
905 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
906 val = dbm_fetch(dbm,
key);
931 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
932 val = dbm_fetch(dbm,
key);
948fdbm_to_hash(
VALUE obj)
957 for (
key = dbm_firstkey(dbm);
key.dptr;
key = dbm_nextkey(dbm)) {
958 val = dbm_fetch(dbm,
key);
974fdbm_reject(
VALUE obj)
1112#if defined(_DBM_IOERR)
1114#elif defined(RUBYDBM_GDBM_HEADER)
1115# if defined(HAVE_DECLARED_LIBVAR_GDBM_VERSION)
1118# elif defined(HAVE_UNDECLARED_LIBVAR_GDBM_VERSION)
1126#elif defined(RUBYDBM_DB_HEADER)
1127# if defined(HAVE_DB_VERSION)
1133#elif defined(_RELIC_H)
1134# if defined(HAVE_DPVERSION)
VALUE rb_ary_push(VALUE ary, VALUE item)
VALUE rb_ary_tmp_new(long capa)
VALUE rb_ary_clear(VALUE ary)
VALUE rb_assoc_new(VALUE car, VALUE cdr)
#define rb_define_method(klass, mid, func, arity)
Defines klass#mid.
#define rb_define_singleton_method(klass, mid, func, arity)
Defines klass.mid.
#define GetDBM2(obj, dbmp, dbm)
#define GetDBM(obj, dbmp)
#define RSTRING_LEN(string)
#define RSTRING_PTR(string)
void rb_include_module(VALUE klass, VALUE module)
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
int rb_block_given_p(void)
Determines if the current method is given a block.
void rb_raise(VALUE exc, const char *fmt,...)
void rb_error_frozen(const char *what)
void rb_sys_fail_str(VALUE mesg)
VALUE rb_protect(VALUE(*proc)(VALUE), VALUE data, int *pstate)
Protects a function call from potential global escapes from the function.
void rb_warn(const char *fmt,...)
VALUE rb_ensure(VALUE(*b_proc)(VALUE), VALUE data1, VALUE(*e_proc)(VALUE), VALUE data2)
An equivalent to ensure clause.
void rb_jump_tag(int tag)
Continues the exception caught by rb_protect() and rb_eval_string_protect().
void rb_sys_fail(const char *mesg)
VALUE rb_cObject
Object class.
VALUE rb_hash_delete_if(VALUE hash)
VALUE rb_hash_aset(VALUE hash, VALUE key, VALUE val)
#define RETURN_ENUMERATOR(obj, argc, argv)
void rb_fd_fix_cloexec(int fd)
#define rb_str_new(str, len)
VALUE rb_obj_as_string(VALUE)
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
ID rb_intern(const char *)
void rb_define_const(VALUE, const char *, VALUE)
#define RB_BLOCK_CALL_FUNC_ARGLIST(yielded_arg, callback_arg)
int memcmp(const void *s1, const void *s2, size_t len)
VALUE rb_block_call(VALUE q, ID w, int e, const VALUE *r, type *t, VALUE y)
Call a method with a block.
#define RARRAY_CONST_PTR(s)
#define RARRAY_AREF(a, i)
#define ExportStringValue(v)
#define TypedData_Get_Struct(obj, type, data_type, sval)
@ RUBY_TYPED_FREE_IMMEDIATELY
#define TypedData_Make_Struct(klass, type, data_type, sval)
VALUE rb_sprintf(const char *,...)