Class: Mdbm

Inherits:
Object
  • Object
show all
Defined in:
ext/mdbm/mdbm.c

Constant Summary collapse

MDBM_API_VERSION =
INT2NUM(MDBM_API_VERSION)
MDBM_LOC_NORMAL =
INT2NUM(MDBM_LOC_NORMAL)
MDBM_LOC_ARENA =
INT2NUM(MDBM_LOC_ARENA)
MDBM_O_RDONLY =
INT2NUM(MDBM_O_RDONLY)
MDBM_O_WRONLY =
INT2NUM(MDBM_O_WRONLY)
MDBM_O_RDWR =
INT2NUM(MDBM_O_RDWR)
MDBM_O_CREAT =
INT2NUM(MDBM_O_CREAT)
MDBM_O_TRUNC =
INT2NUM(MDBM_O_TRUNC)
MDBM_O_FSYNC =
INT2NUM(MDBM_O_FSYNC)
MDBM_O_ASYNC =
INT2NUM(MDBM_O_ASYNC)
MDBM_O_DIRECT =
INT2NUM(MDBM_O_DIRECT)
MDBM_NO_DIRTY =
INT2NUM(MDBM_NO_DIRTY)
MDBM_SINGLE_ARCH =
INT2NUM(MDBM_SINGLE_ARCH)
MDBM_OPEN_WINDOWED =
INT2NUM(MDBM_OPEN_WINDOWED)
MDBM_PROTECT =
INT2NUM(MDBM_PROTECT)
MDBM_DBSIZE_MB =
INT2NUM(MDBM_DBSIZE_MB)
MDBM_STAT_OPERATIONS =
INT2NUM(MDBM_STAT_OPERATIONS)
MDBM_LARGE_OBJECTS =
INT2NUM(MDBM_LARGE_OBJECTS)
MDBM_PARTITIONED_LOCKS =
INT2NUM(MDBM_PARTITIONED_LOCKS)
MDBM_RW_LOCKS =
INT2NUM(MDBM_RW_LOCKS)
MDBM_ANY_LOCKS =
INT2NUM(MDBM_ANY_LOCKS)
MDBM_CREATE_V3 =
INT2NUM(MDBM_CREATE_V3)
MDBM_OPEN_NOLOCK =
INT2NUM(MDBM_OPEN_NOLOCK)
MDBM_DEMAND_PAGING =
INT2NUM(MDBM_DEMAND_PAGING)
MDBM_DBSIZE_MB_OLD =
INT2NUM(MDBM_DBSIZE_MB_OLD)
MDBM_COPY_LOCK_ALL =
INT2NUM(MDBM_COPY_LOCK_ALL)
MDBM_SAVE_COMPRESS_TREE =
INT2NUM(MDBM_SAVE_COMPRESS_TREE)
MDBM_ALIGN_8_BITS =
INT2NUM(MDBM_ALIGN_8_BITS)
MDBM_ALIGN_16_BITS =
INT2NUM(MDBM_ALIGN_16_BITS)
MDBM_ALIGN_32_BITS =
INT2NUM(MDBM_ALIGN_32_BITS)
MDBM_ALIGN_64_BITS =
INT2NUM(MDBM_ALIGN_64_BITS)
MDBM_FETCH_FLAG_DIRTY =

rb_define_const(cMdbm, “_MDBM_MAGIC”, INT2NUM(_MDBM_MAGIC)); rb_define_const(cMdbm, “_MDBM_MAGIC_NEW”, INT2NUM(_MDBM_MAGIC_NEW)); rb_define_const(cMdbm, “_MDBM_MAGIC_NEW2”, INT2NUM(_MDBM_MAGIC_NEW2));

INT2NUM(MDBM_FETCH_FLAG_DIRTY)
MDBM_INSERT =
INT2NUM(MDBM_INSERT)
MDBM_REPLACE =
INT2NUM(MDBM_REPLACE)
MDBM_INSERT_DUP =
INT2NUM(MDBM_INSERT_DUP)
MDBM_MODIFY =
INT2NUM(MDBM_MODIFY)
MDBM_STORE_MASK =
INT2NUM(MDBM_STORE_MASK)
MDBM_RESERVE =
INT2NUM(MDBM_RESERVE)
MDBM_CLEAN =
INT2NUM(MDBM_CLEAN)
MDBM_CACHE_ONLY =
INT2NUM(MDBM_CACHE_ONLY)
MDBM_CACHE_REPLACE =
INT2NUM(MDBM_CACHE_REPLACE)
MDBM_CACHE_MODIFY =
INT2NUM(MDBM_CACHE_MODIFY)
MDBM_STORE_SUCCESS =
INT2NUM(MDBM_STORE_SUCCESS)
MDBM_STORE_ENTRY_EXISTS =
INT2NUM(MDBM_STORE_ENTRY_EXISTS)
MDBM_ENTRY_DELETED =
INT2NUM(MDBM_ENTRY_DELETED)
MDBM_ENTRY_LARGE_OBJECT =
INT2NUM(MDBM_ENTRY_LARGE_OBJECT)
MDBM_ITERATE_ENTRIES =
INT2NUM(MDBM_ITERATE_ENTRIES)
MDBM_ITERATE_NOLOCK =
INT2NUM(MDBM_ITERATE_NOLOCK)
MDBM_LOCKMODE_UNKNOWN =
INT2NUM(MDBM_LOCKMODE_UNKNOWN)
MDBM_CHECK_HEADER =
INT2NUM(MDBM_CHECK_HEADER)
MDBM_CHECK_CHUNKS =
INT2NUM(MDBM_CHECK_CHUNKS)
MDBM_CHECK_DIRECTORY =
INT2NUM(MDBM_CHECK_DIRECTORY)
MDBM_CHECK_ALL =
INT2NUM(MDBM_CHECK_ALL)
MDBM_PROT_NONE =
INT2NUM(MDBM_PROT_NONE)
MDBM_PROT_READ =
INT2NUM(MDBM_PROT_READ)
MDBM_PROT_WRITE =
INT2NUM(MDBM_PROT_WRITE)
MDBM_PROT_ACCESS =
INT2NUM(MDBM_PROT_ACCESS)
MDBM_CLOCK_STANDARD =
INT2NUM(MDBM_CLOCK_STANDARD)
MDBM_CLOCK_TSC =
INT2NUM(MDBM_CLOCK_TSC)
MDBM_STATS_BASIC =
INT2NUM(MDBM_STATS_BASIC)
MDBM_STATS_TIMED =
INT2NUM(MDBM_STATS_TIMED)
MDBM_STAT_CB_INC =
INT2NUM(MDBM_STAT_CB_INC)
MDBM_STAT_CB_SET =
INT2NUM(MDBM_STAT_CB_SET)
MDBM_STAT_CB_ELAPSED =
INT2NUM(MDBM_STAT_CB_ELAPSED)
MDBM_STAT_CB_TIME =
INT2NUM(MDBM_STAT_CB_TIME)
MDBM_STAT_TAG_FETCH =
INT2NUM(MDBM_STAT_TAG_FETCH)
MDBM_STAT_TAG_STORE =
INT2NUM(MDBM_STAT_TAG_STORE)
MDBM_STAT_TAG_DELETE =
INT2NUM(MDBM_STAT_TAG_DELETE)
MDBM_STAT_TAG_LOCK =
INT2NUM(MDBM_STAT_TAG_LOCK)
MDBM_STAT_TAG_FETCH_UNCACHED =
INT2NUM(MDBM_STAT_TAG_FETCH_UNCACHED)
MDBM_STAT_TAG_GETPAGE =
INT2NUM(MDBM_STAT_TAG_GETPAGE)
MDBM_STAT_TAG_GETPAGE_UNCACHED =
INT2NUM(MDBM_STAT_TAG_GETPAGE_UNCACHED)
MDBM_STAT_TAG_CACHE_EVICT =
INT2NUM(MDBM_STAT_TAG_CACHE_EVICT)
MDBM_STAT_TAG_CACHE_STORE =
INT2NUM(MDBM_STAT_TAG_CACHE_STORE)
MDBM_STAT_TAG_PAGE_STORE =
INT2NUM(MDBM_STAT_TAG_PAGE_STORE)
MDBM_STAT_TAG_PAGE_DELETE =
INT2NUM(MDBM_STAT_TAG_PAGE_DELETE)
MDBM_STAT_TAG_SYNC =
INT2NUM(MDBM_STAT_TAG_SYNC)
MDBM_STAT_TAG_FETCH_NOT_FOUND =
INT2NUM(MDBM_STAT_TAG_FETCH_NOT_FOUND)
MDBM_STAT_TAG_FETCH_ERROR =
INT2NUM(MDBM_STAT_TAG_FETCH_ERROR)
MDBM_STAT_TAG_STORE_ERROR =
INT2NUM(MDBM_STAT_TAG_STORE_ERROR)
MDBM_STAT_TAG_DELETE_FAILED =
INT2NUM(MDBM_STAT_TAG_DELETE_FAILED)
MDBM_STAT_DELETED =
INT2NUM(MDBM_STAT_DELETED)
MDBM_STAT_KEYS =
INT2NUM(MDBM_STAT_KEYS)
MDBM_STAT_VALUES =
INT2NUM(MDBM_STAT_VALUES)
MDBM_STAT_PAGES_ONLY =
INT2NUM(MDBM_STAT_PAGES_ONLY)
MDBM_STAT_NOLOCK =
INT2NUM(MDBM_STAT_NOLOCK)
MDBM_STAT_BUCKETS =
INT2NUM(MDBM_STAT_BUCKETS)
MDBM_CACHEMODE_NONE =
INT2NUM(MDBM_CACHEMODE_NONE)
MDBM_CACHEMODE_LFU =
INT2NUM(MDBM_CACHEMODE_LFU)
MDBM_CACHEMODE_LRU =
INT2NUM(MDBM_CACHEMODE_LRU)
MDBM_CACHEMODE_GDSF =
INT2NUM(MDBM_CACHEMODE_GDSF)
MDBM_CACHEMODE_MAX =
INT2NUM(MDBM_CACHEMODE_MAX)
MDBM_CACHEMODE_EVICT_CLEAN_FIRST =
INT2NUM(MDBM_CACHEMODE_EVICT_CLEAN_FIRST)
MDBM_MINPAGE =
INT2NUM(MDBM_MINPAGE)
MDBM_PAGE_ALIGN =
INT2NUM(MDBM_PAGE_ALIGN)
MDBM_PAGESIZ =
INT2NUM(MDBM_PAGESIZ)
MDBM_MIN_PSHIFT =
INT2NUM(MDBM_MIN_PSHIFT)
MDBM_HASH_CRC32 =
INT2NUM(MDBM_HASH_CRC32)
MDBM_HASH_EJB =
INT2NUM(MDBM_HASH_EJB)
MDBM_HASH_PHONG =
INT2NUM(MDBM_HASH_PHONG)
MDBM_HASH_OZ =
INT2NUM(MDBM_HASH_OZ)
MDBM_HASH_TOREK =
INT2NUM(MDBM_HASH_TOREK)
MDBM_HASH_FNV =
INT2NUM(MDBM_HASH_FNV)
MDBM_HASH_STL =
INT2NUM(MDBM_HASH_STL)
MDBM_HASH_MD5 =
INT2NUM(MDBM_HASH_MD5)
MDBM_HASH_SHA_1 =
INT2NUM(MDBM_HASH_SHA_1)
MDBM_HASH_JENKINS =
INT2NUM(MDBM_HASH_JENKINS)
MDBM_HASH_HSIEH =
INT2NUM(MDBM_HASH_HSIEH)
MDBM_MAX_HASH =
INT2NUM(MDBM_MAX_HASH)

Instance Method Summary collapse

Constructor Details

#initialize(file, flags, mode, psize, presize) ⇒ Object



13
14
15
16
17
18
19
20
21
22
# File 'ext/mdbm/mdbm.c', line 13

VALUE method_open(VALUE self, VALUE file, VALUE flags, VALUE mode, VALUE psize, VALUE presize) {
  MDBM * db;
  db = mdbm_open(RSTRING_PTR(file), NUM2INT(flags), NUM2INT(mode), NUM2INT(psize), NUM2INT(presize));
  if (!db) {
    rb_raise(rb_eRuntimeError, "unable to open mdbm");
  }
  rb_iv_set(self, "@db", Data_Wrap_Struct(cMdbm, 0, cb_free_mdbm_db, db));

  return self;
}

Instance Method Details

#[](arg_key) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'ext/mdbm/mdbm.c', line 60

VALUE method_fetch(VALUE self, VALUE arg_key) {
  MDBM *db;
  datum key, val;
  MDBM_ITER iter;
  MDBM_ITER_INIT(&iter); 
  VALUE retval = Qnil;
  Data_Get_Struct(rb_iv_get(self, "@db"), MDBM, db);
  StringValue(arg_key);
  key.dptr = RSTRING_PTR(arg_key);
  key.dsize = RSTRING_LEN(arg_key);
  mdbm_lock(db);
  if (mdbm_fetch_r(db, &key, &val, &iter)) {
    /* check errno, raise after unlock */
    perror("method_fetch ERROR: ");
    mdbm_unlock(db);
    return retval;
  }
  retval = rb_str_new(val.dptr, val.dsize);
  mdbm_unlock(db);
  return retval;
}

#closeObject



110
111
112
113
114
115
# File 'ext/mdbm/mdbm.c', line 110

VALUE method_close(VALUE self) {
  MDBM *db;
  Data_Get_Struct(rb_iv_get(self, "@db"), MDBM, db);
  mdbm_close(db);
  return Qnil;
}

#fetch(arg_key) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'ext/mdbm/mdbm.c', line 60

VALUE method_fetch(VALUE self, VALUE arg_key) {
  MDBM *db;
  datum key, val;
  MDBM_ITER iter;
  MDBM_ITER_INIT(&iter); 
  VALUE retval = Qnil;
  Data_Get_Struct(rb_iv_get(self, "@db"), MDBM, db);
  StringValue(arg_key);
  key.dptr = RSTRING_PTR(arg_key);
  key.dsize = RSTRING_LEN(arg_key);
  mdbm_lock(db);
  if (mdbm_fetch_r(db, &key, &val, &iter)) {
    /* check errno, raise after unlock */
    perror("method_fetch ERROR: ");
    mdbm_unlock(db);
    return retval;
  }
  retval = rb_str_new(val.dptr, val.dsize);
  mdbm_unlock(db);
  return retval;
}

#firstObject



24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'ext/mdbm/mdbm.c', line 24

VALUE method_first(VALUE self) {
  MDBM *db;
  MDBM_ITER iter;
  VALUE retval = Qnil;
  Data_Get_Struct(rb_iv_get(self, "@db"), MDBM, db);
  MDBM_ITER_INIT(&iter);
  mdbm_lock(db);
  kvpair pair = mdbm_first_r(db, &iter);
  if (!(pair.key.dsize == 0 && pair.val.dsize == 0)) {
    retval = rb_str_new(pair.key.dptr, pair.key.dsize);
  }
  mdbm_unlock(db);
  return retval;
}

#keysObject



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'ext/mdbm/mdbm.c', line 39

VALUE method_keys(VALUE self) {
  MDBM *db;
  MDBM_ITER iter;
  datum key;
  Data_Get_Struct(rb_iv_get(self, "@db"), MDBM, db);
  VALUE ret = rb_ary_new();
  MDBM_ITER_INIT(&iter);
  mdbm_lock(db);
  while (1) {
    key = mdbm_nextkey_r(db, &iter);
    if (key.dsize == 0) {
      break;
    }
    VALUE data = rb_str_new(key.dptr, key.dsize);
    rb_ary_push(ret, data);
  }
  mdbm_unlock(db);

  return ret;
}

#store(arg_key, arg_val, arg_flags) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'ext/mdbm/mdbm.c', line 82

VALUE method_store(VALUE self, VALUE arg_key, VALUE arg_val, VALUE arg_flags) {
  MDBM *db;
  datum key, val;
  MDBM_ITER iter;
  int result;
  char err_buf[ERRBUF_LEN];
  MDBM_ITER_INIT(&iter); 
  Data_Get_Struct(rb_iv_get(self, "@db"), MDBM, db);
  StringValue(arg_key);
  key.dptr = RSTRING_PTR(arg_key);
  key.dsize = RSTRING_LEN(arg_key);
  StringValue(arg_val);
  val.dptr = RSTRING_PTR(arg_val);
  val.dsize = RSTRING_LEN(arg_val);

  mdbm_lock(db);
  result = mdbm_store_r(db, &key, &val, NUM2INT(arg_flags), &iter);
  mdbm_unlock(db);

  if (result) {
    /* this returns  `store': No such file or directory (RuntimeError) which is confusing.
     * TODO: find/write a better strerror_r() for mdbm calls
     */
    rb_raise(rb_eRuntimeError, strerror_r(errno, err_buf, ERRBUF_LEN));
  }
  return Qnil;
}