76 #if SIZEOF_LONG > SIZEOF_INT
77 #define TOO_LONG(n) ((long)(+(int)(n)) != (long)(n))
82 #define RUBY_GDBM_RW_BIT 0x20000000
84 #define MY_BLOCK_SIZE (2048)
85 #define MY_FATAL_FUNC rb_gdbm_fatal
103 #define GetDBM(obj, dbmp) do {\
104 Data_Get_Struct((obj), struct dbmdata, (dbmp));\
105 if ((dbmp) == 0) closed_dbm();\
106 if ((dbmp)->di_dbm == 0) closed_dbm();\
109 #define GetDBM2(obj, data, dbm) {\
110 GetDBM((obj), (data));\
111 (dbm) = dbmp->di_dbm;\
193 VALUE file, vmode, vflags;
198 if (
rb_scan_args(argc, argv,
"12", &file, &vmode, &vflags) == 1) {
201 else if (
NIL_P(vmode)) {
215 flags |= GDBM_CLOEXEC;
219 flags &= ~RUBY_GDBM_RW_BIT;
241 if (mode == -1)
return Qnil;
243 if (gdbm_errno == GDBM_FILE_OPEN_ERROR ||
244 gdbm_errno == GDBM_CANT_BE_READER ||
245 gdbm_errno == GDBM_CANT_BE_WRITER)
301 val = gdbm_fetch(dbm, key);
321 key.
dsize = (int)len;
342 key = gdbm_firstkey(dbm);
362 key.
dsize = (int)len;
363 key2 = gdbm_nextkey(dbm, key);
409 VALUE keystr, valstr, ifnone;
431 VALUE keystr, valstr2;
439 if (!
NIL_P(valstr2) &&
453 rb_warn(
"GDBM#index is deprecated; use GDBM#key");
499 for (i=0; i<
argc; i++) {
526 key.
dsize = (int)len;
529 if (!gdbm_exists(dbm, key)) {
533 if (gdbm_delete(dbm, key)) {
572 VALUE keystr, valstr;
596 VALUE keystr, valstr;
598 int i, status = 0, n;
611 if (status != 0)
break;
643 while (key = gdbm_firstkey(dbm), key.
dptr) {
644 if (gdbm_delete(dbm, key)) {
651 while (key = gdbm_firstkey(dbm), key.
dptr) {
652 for (; key.
dptr; key = nextkey) {
653 nextkey = gdbm_nextkey(dbm, key);
654 if (gdbm_delete(dbm, key)) {
680 VALUE keystr, valstr;
719 if (gdbm_store(dbm, key, val, GDBM_REPLACE)) {
786 for (key = gdbm_firstkey(dbm); key.
dptr; key = nextkey) {
787 nextkey = gdbm_nextkey(dbm, key);
813 key = gdbm_firstkey(dbm);
944 for (key = gdbm_firstkey(dbm); key.
dptr; key = nextkey) {
945 nextkey = gdbm_nextkey(dbm, key);
974 key.
dsize = (int)len;
977 if (gdbm_exists(dbm, key))
995 VALUE keystr, valstr2;
1004 if (!
NIL_P(valstr2) &&
1054 gdbm_reorganize(dbm);
1096 if (gdbm_setopt(dbm, GDBM_CACHESIZE, &optval,
sizeof(optval)) == -1) {
1124 if (gdbm_setopt(dbm, GDBM_FASTMODE, &optval,
sizeof(optval)) == -1) {
1146 #if !defined(GDBM_SYNCMODE)
1159 if (gdbm_setopt(dbm, GDBM_FASTMODE, &optval,
sizeof(optval)) == -1) {
1275 #if defined(GDBM_SYNC)
1279 #if defined(GDBM_NOLOCK)
static VALUE fgdbm_key(VALUE obj, VALUE valstr)
static VALUE fgdbm_set_syncmode(VALUE obj, VALUE val)
static VALUE fgdbm_empty_p(VALUE obj)
static VALUE fgdbm_values_at(int argc, VALUE *argv, VALUE obj)
static VALUE fgdbm_reject(VALUE obj)
void rb_define_singleton_method(VALUE obj, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a singleton method for obj.
static VALUE fgdbm_clear(VALUE obj)
void rb_error_frozen(const char *what)
void rb_define_alloc_func(VALUE, rb_alloc_func_t)
VALUE rb_ary_push(VALUE ary, VALUE item)
static VALUE update_i(VALUE pair, VALUE dbm)
VALUE rb_ary_tmp_new(long capa)
VALUE rb_protect(VALUE(*proc)(VALUE), VALUE data, int *state)
static VALUE fgdbm_s_alloc(VALUE klass)
void rb_raise(VALUE exc, const char *fmt,...)
#define GetDBM2(obj, data, dbm)
#define RETURN_ENUMERATOR(obj, argc, argv)
VALUE rb_ary_clear(VALUE ary)
static VALUE rb_gdbm_fetch(GDBM_FILE dbm, datum key)
#define SafeStringValue(v)
static VALUE fgdbm_keys(VALUE obj)
static VALUE rb_eGDBMError
void rb_include_module(VALUE klass, VALUE module)
static VALUE fgdbm_select(VALUE obj)
static VALUE fgdbm_has_key(VALUE obj, VALUE keystr)
static VALUE fgdbm_s_open(int argc, VALUE *argv, VALUE klass)
static VALUE fgdbm_close(VALUE obj)
void rb_fd_fix_cloexec(int fd)
static VALUE fgdbm_aref(VALUE obj, VALUE keystr)
static VALUE fgdbm_each_value(VALUE obj)
static VALUE rb_gdbm_nextkey(GDBM_FILE dbm, VALUE keystr)
int rb_block_given_p(void)
static VALUE rb_gdbm_fetch3(VALUE obj, VALUE keystr)
static VALUE fgdbm_reorganize(VALUE obj)
static void closed_dbm(void)
void rb_define_const(VALUE, const char *, VALUE)
static VALUE fgdbm_invert(VALUE obj)
VALUE rb_define_class(const char *name, VALUE super)
Defines a top-level class.
static VALUE fgdbm_to_hash(VALUE obj)
static VALUE fgdbm_delete_if(VALUE obj)
void rb_sys_fail_str(VALUE mesg)
static VALUE fgdbm_has_value(VALUE obj, VALUE valstr)
VALUE rb_hash_aset(VALUE, VALUE, VALUE)
static VALUE fgdbm_to_a(VALUE obj)
static VALUE fgdbm_shift(VALUE obj)
static VALUE fgdbm_store(VALUE obj, VALUE keystr, VALUE valstr)
static VALUE rb_gdbm_delete(VALUE obj, VALUE keystr)
static VALUE fgdbm_each_pair(VALUE obj)
static VALUE fgdbm_initialize(int argc, VALUE *argv, VALUE obj)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
VALUE rb_block_call(VALUE, ID, int, VALUE *, VALUE(*)(ANYARGS), VALUE)
VALUE rb_assoc_new(VALUE car, VALUE cdr)
static VALUE rb_gdbm_fetch2(GDBM_FILE dbm, VALUE keystr)
VALUE rb_ensure(VALUE(*b_proc)(ANYARGS), VALUE data1, VALUE(*e_proc)(ANYARGS), VALUE data2)
int memcmp(const void *s1, const void *s2, size_t len)
void rb_sys_fail(const char *mesg)
void rb_jump_tag(int tag)
#define GetDBM(obj, dbmp)
static VALUE fgdbm_fetch_m(int argc, VALUE *argv, VALUE obj)
RUBY_EXTERN VALUE rb_cObject
static VALUE rb_eGDBMFatalError
static VALUE fgdbm_set_cachesize(VALUE obj, VALUE val)
static VALUE fgdbm_each_key(VALUE obj)
#define Data_Get_Struct(obj, type, sval)
static unsigned int hash(const char *str, unsigned int len)
#define RSTRING_LENINT(str)
static VALUE fgdbm_length(VALUE obj)
VALUE rb_ary_new2(long capa)
VALUE rb_str_new(const char *, long)
VALUE rb_hash_delete_if(VALUE)
static VALUE fgdbm_delete(VALUE obj, VALUE keystr)
static VALUE fgdbm_update(VALUE obj, VALUE other)
static VALUE fgdbm_replace(VALUE obj, VALUE other)
static VALUE rb_gdbm_firstkey(GDBM_FILE dbm)
static VALUE fgdbm_values(VALUE obj)
#define Data_Wrap_Struct(klass, mark, free, sval)
static VALUE fgdbm_closed(VALUE obj)
static VALUE fgdbm_sync(VALUE obj)
static void free_dbm(struct dbmdata *dbmp)
static void rb_gdbm_modify(VALUE obj)
static VALUE fgdbm_set_fastmode(VALUE obj, VALUE val)
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(ANYARGS), int argc)
void rb_warn(const char *fmt,...)
static void rb_gdbm_fatal(const char *msg)
static VALUE fgdbm_index(VALUE obj, VALUE value)
static VALUE fgdbm_fetch(VALUE obj, VALUE keystr, VALUE ifnone)