ruby-mdbm 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +6 -0
  3. data/ext/mdbm/extconf.rb +20 -0
  4. data/ext/mdbm/mdbm.c +244 -0
  5. metadata +48 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5b0ebb4244bb32e3c90edcf2bf4405d53e64093e
4
+ data.tar.gz: d029780da0f7cc89a931206796e52f87f12ea4a9
5
+ SHA512:
6
+ metadata.gz: 41e49848337cd9923c1a5b4d0142ef12dcc4a9b5514f42fc650bcf2ad43701e95aabea124abbe16234626269e98d39899ce437dad3b5ea5b63d18116f6555c79
7
+ data.tar.gz: 358c6aba301502b17eae88a371b15382e0c8a7e82eeb4482be95587479f34442aff45f2981fb43d0d8065812470e5e3ce3554e471177b97d1b16fd2b703cbab2
@@ -0,0 +1,6 @@
1
+ require "rake/extensiontask"
2
+
3
+ Rake::ExtensionTask.new "mdbm" do |ext|
4
+ ext.lib_dir = "lib/mdbm"
5
+ end
6
+
@@ -0,0 +1,20 @@
1
+ # Loads mkmf which is used to make makefiles for Ruby extensions
2
+ require 'mkmf'
3
+
4
+ # Give it a name
5
+ extension_name = 'mdbm'
6
+
7
+ # The destination
8
+ dir_config(extension_name)
9
+
10
+ $CFLAGS = "-I/usr/local/include"
11
+
12
+ if find_library("mdbm", "mdbm_open", "/tmp/install/lib64", "/tmp/install/lib")
13
+ then
14
+ create_makefile(extension_name)
15
+ else
16
+ puts "No mdbm lib found"
17
+ end
18
+
19
+
20
+ create_makefile(extension_name)
@@ -0,0 +1,244 @@
1
+ #include "ruby.h"
2
+ #include <mdbm.h>
3
+ #include <errno.h>
4
+
5
+ #define ERRBUF_LEN 512
6
+
7
+ VALUE cMdbm;
8
+
9
+ static void cb_free_mdbm_db(void *p) {
10
+ mdbm_close(p);
11
+ }
12
+
13
+ VALUE method_open(VALUE self, VALUE file, VALUE flags, VALUE mode, VALUE psize, VALUE presize) {
14
+ rb_iv_set(self, "@foo", INT2NUM(77));
15
+ MDBM * db;
16
+ db = mdbm_open(RSTRING_PTR(file), NUM2INT(flags), NUM2INT(mode), NUM2INT(psize), NUM2INT(presize));
17
+ if (!db) {
18
+ rb_raise(rb_eRuntimeError, "unable to open mdbm");
19
+ }
20
+ printf("db: %p\n", db);
21
+ rb_iv_set(self, "@db", Data_Wrap_Struct(cMdbm, 0, cb_free_mdbm_db, db));
22
+
23
+ return self;
24
+ }
25
+
26
+ VALUE method_first(VALUE self) {
27
+ MDBM *db;
28
+ MDBM_ITER *iter;
29
+ VALUE retval = Qnil;
30
+ Data_Get_Struct(rb_iv_get(self, "@db"), MDBM, db);
31
+ mdbm_lock(db);
32
+ kvpair pair = mdbm_first_r(db, iter);
33
+ if (!(pair.key.dsize == 0 && pair.val.dsize == 0)) {
34
+ retval = rb_str_new(pair.key.dptr, pair.key.dsize);
35
+ }
36
+ mdbm_unlock(db);
37
+ return retval;
38
+ }
39
+
40
+ VALUE method_keys(VALUE self) {
41
+ MDBM *db;
42
+ MDBM_ITER iter;
43
+ datum key;
44
+ Data_Get_Struct(rb_iv_get(self, "@db"), MDBM, db);
45
+ VALUE ret = rb_ary_new();
46
+ MDBM_ITER_INIT(&iter);
47
+ mdbm_lock(db);
48
+ while (1) {
49
+ key = mdbm_nextkey_r(db, &iter);
50
+ if (key.dsize == 0) {
51
+ break;
52
+ }
53
+ VALUE data = rb_str_new(key.dptr, key.dsize);
54
+ rb_ary_push(ret, data);
55
+ }
56
+ mdbm_unlock(db);
57
+
58
+ return ret;
59
+ }
60
+
61
+ VALUE method_fetch(VALUE self, VALUE arg_key) {
62
+ MDBM *db;
63
+ datum key, val;
64
+ MDBM_ITER iter;
65
+ MDBM_ITER_INIT(&iter);
66
+ VALUE retval = Qnil;
67
+ Data_Get_Struct(rb_iv_get(self, "@db"), MDBM, db);
68
+ StringValue(arg_key);
69
+ key.dptr = RSTRING_PTR(arg_key);
70
+ key.dsize = RSTRING_LEN(arg_key);
71
+ mdbm_lock(db);
72
+ if (mdbm_fetch_r(db, &key, &val, &iter)) {
73
+ /* check errno, raise after unlock */
74
+ perror("method_fetch ERROR: ");
75
+ mdbm_unlock(db);
76
+ return retval;
77
+ }
78
+ retval = rb_str_new(val.dptr, val.dsize);
79
+ mdbm_unlock(db);
80
+ return retval;
81
+ }
82
+
83
+ VALUE method_store(VALUE self, VALUE arg_key, VALUE arg_val, VALUE arg_flags) {
84
+ MDBM *db;
85
+ datum key, val;
86
+ MDBM_ITER iter;
87
+ int result;
88
+ char err_buf[ERRBUF_LEN];
89
+ MDBM_ITER_INIT(&iter);
90
+ Data_Get_Struct(rb_iv_get(self, "@db"), MDBM, db);
91
+ StringValue(arg_key);
92
+ key.dptr = RSTRING_PTR(arg_key);
93
+ key.dsize = RSTRING_LEN(arg_key);
94
+ StringValue(arg_val);
95
+ val.dptr = RSTRING_PTR(arg_val);
96
+ val.dsize = RSTRING_LEN(arg_val);
97
+
98
+ mdbm_lock(db);
99
+ result = mdbm_store_r(db, &key, &val, NUM2INT(arg_flags), &iter);
100
+ mdbm_unlock(db);
101
+
102
+ if (result) {
103
+ /* this returns `store': No such file or directory (RuntimeError) which is confusing.
104
+ * TODO: find/write a better strerror_r() for mdbm calls
105
+ */
106
+ rb_raise(rb_eRuntimeError, strerror_r(errno, err_buf, ERRBUF_LEN));
107
+ }
108
+ return Qnil;
109
+ }
110
+
111
+ VALUE method_close(VALUE self) {
112
+ MDBM *db;
113
+ Data_Get_Struct(rb_iv_get(self, "@db"), MDBM, db);
114
+ mdbm_close(db);
115
+ return Qnil;
116
+ }
117
+
118
+ void Init_mdbm() {
119
+ cMdbm = rb_define_class("Mdbm", rb_cObject);
120
+ rb_define_method(cMdbm, "initialize", method_open, 5);
121
+ rb_define_method(cMdbm, "first", method_first, 0);
122
+ rb_define_method(cMdbm, "keys", method_keys, 0);
123
+ rb_define_method(cMdbm, "fetch", method_fetch, 1);
124
+ rb_define_method(cMdbm, "[]", method_fetch, 1);
125
+ rb_define_method(cMdbm, "store", method_store, 3);
126
+ rb_define_method(cMdbm, "close", method_store, 0);
127
+
128
+ rb_define_const(cMdbm, "MDBM_API_VERSION", INT2NUM(MDBM_API_VERSION));
129
+ rb_define_const(cMdbm, "MDBM_LOC_NORMAL", INT2NUM(MDBM_LOC_NORMAL));
130
+ rb_define_const(cMdbm, "MDBM_LOC_ARENA", INT2NUM(MDBM_LOC_ARENA));
131
+ rb_define_const(cMdbm, "MDBM_O_RDONLY", INT2NUM(MDBM_O_RDONLY));
132
+ rb_define_const(cMdbm, "MDBM_O_WRONLY", INT2NUM(MDBM_O_WRONLY));
133
+ rb_define_const(cMdbm, "MDBM_O_RDWR", INT2NUM(MDBM_O_RDWR));
134
+ rb_define_const(cMdbm, "MDBM_O_CREAT", INT2NUM(MDBM_O_CREAT));
135
+ rb_define_const(cMdbm, "MDBM_O_TRUNC", INT2NUM(MDBM_O_TRUNC));
136
+ rb_define_const(cMdbm, "MDBM_O_FSYNC", INT2NUM(MDBM_O_FSYNC));
137
+ rb_define_const(cMdbm, "MDBM_O_ASYNC", INT2NUM(MDBM_O_ASYNC));
138
+ rb_define_const(cMdbm, "MDBM_O_DIRECT", INT2NUM(MDBM_O_DIRECT));
139
+ rb_define_const(cMdbm, "MDBM_NO_DIRTY", INT2NUM(MDBM_NO_DIRTY));
140
+ rb_define_const(cMdbm, "MDBM_SINGLE_ARCH", INT2NUM(MDBM_SINGLE_ARCH));
141
+ rb_define_const(cMdbm, "MDBM_OPEN_WINDOWED", INT2NUM(MDBM_OPEN_WINDOWED));
142
+ rb_define_const(cMdbm, "MDBM_PROTECT", INT2NUM(MDBM_PROTECT));
143
+ rb_define_const(cMdbm, "MDBM_DBSIZE_MB", INT2NUM(MDBM_DBSIZE_MB));
144
+ rb_define_const(cMdbm, "MDBM_STAT_OPERATIONS", INT2NUM(MDBM_STAT_OPERATIONS));
145
+ rb_define_const(cMdbm, "MDBM_LARGE_OBJECTS", INT2NUM(MDBM_LARGE_OBJECTS));
146
+ rb_define_const(cMdbm, "MDBM_PARTITIONED_LOCKS", INT2NUM(MDBM_PARTITIONED_LOCKS));
147
+ rb_define_const(cMdbm, "MDBM_RW_LOCKS", INT2NUM(MDBM_RW_LOCKS));
148
+ rb_define_const(cMdbm, "MDBM_ANY_LOCKS", INT2NUM(MDBM_ANY_LOCKS));
149
+ rb_define_const(cMdbm, "MDBM_CREATE_V3", INT2NUM(MDBM_CREATE_V3));
150
+ rb_define_const(cMdbm, "MDBM_OPEN_NOLOCK", INT2NUM(MDBM_OPEN_NOLOCK));
151
+ rb_define_const(cMdbm, "MDBM_DEMAND_PAGING", INT2NUM(MDBM_DEMAND_PAGING));
152
+ rb_define_const(cMdbm, "MDBM_DBSIZE_MB_OLD", INT2NUM(MDBM_DBSIZE_MB_OLD));
153
+ rb_define_const(cMdbm, "MDBM_COPY_LOCK_ALL", INT2NUM(MDBM_COPY_LOCK_ALL));
154
+ rb_define_const(cMdbm, "MDBM_SAVE_COMPRESS_TREE", INT2NUM(MDBM_SAVE_COMPRESS_TREE));
155
+ rb_define_const(cMdbm, "MDBM_ALIGN_8_BITS", INT2NUM(MDBM_ALIGN_8_BITS));
156
+ rb_define_const(cMdbm, "MDBM_ALIGN_16_BITS", INT2NUM(MDBM_ALIGN_16_BITS));
157
+ rb_define_const(cMdbm, "MDBM_ALIGN_32_BITS", INT2NUM(MDBM_ALIGN_32_BITS));
158
+ rb_define_const(cMdbm, "MDBM_ALIGN_64_BITS", INT2NUM(MDBM_ALIGN_64_BITS));
159
+ /*
160
+ rb_define_const(cMdbm, "_MDBM_MAGIC", INT2NUM(_MDBM_MAGIC));
161
+ rb_define_const(cMdbm, "_MDBM_MAGIC_NEW", INT2NUM(_MDBM_MAGIC_NEW));
162
+ rb_define_const(cMdbm, "_MDBM_MAGIC_NEW2", INT2NUM(_MDBM_MAGIC_NEW2));
163
+ */
164
+ rb_define_const(cMdbm, "MDBM_FETCH_FLAG_DIRTY", INT2NUM(MDBM_FETCH_FLAG_DIRTY));
165
+ rb_define_const(cMdbm, "MDBM_INSERT", INT2NUM(MDBM_INSERT));
166
+ rb_define_const(cMdbm, "MDBM_REPLACE", INT2NUM(MDBM_REPLACE));
167
+ rb_define_const(cMdbm, "MDBM_INSERT_DUP", INT2NUM(MDBM_INSERT_DUP));
168
+ rb_define_const(cMdbm, "MDBM_MODIFY", INT2NUM(MDBM_MODIFY));
169
+ rb_define_const(cMdbm, "MDBM_STORE_MASK", INT2NUM(MDBM_STORE_MASK));
170
+ rb_define_const(cMdbm, "MDBM_RESERVE", INT2NUM(MDBM_RESERVE));
171
+ rb_define_const(cMdbm, "MDBM_CLEAN", INT2NUM(MDBM_CLEAN));
172
+ rb_define_const(cMdbm, "MDBM_CACHE_ONLY", INT2NUM(MDBM_CACHE_ONLY));
173
+ rb_define_const(cMdbm, "MDBM_CACHE_REPLACE", INT2NUM(MDBM_CACHE_REPLACE));
174
+ rb_define_const(cMdbm, "MDBM_CACHE_MODIFY", INT2NUM(MDBM_CACHE_MODIFY));
175
+ rb_define_const(cMdbm, "MDBM_STORE_SUCCESS", INT2NUM(MDBM_STORE_SUCCESS));
176
+ rb_define_const(cMdbm, "MDBM_STORE_ENTRY_EXISTS", INT2NUM(MDBM_STORE_ENTRY_EXISTS));
177
+ rb_define_const(cMdbm, "MDBM_ENTRY_DELETED", INT2NUM(MDBM_ENTRY_DELETED));
178
+ rb_define_const(cMdbm, "MDBM_ENTRY_LARGE_OBJECT", INT2NUM(MDBM_ENTRY_LARGE_OBJECT));
179
+ rb_define_const(cMdbm, "MDBM_ITERATE_ENTRIES", INT2NUM(MDBM_ITERATE_ENTRIES));
180
+ rb_define_const(cMdbm, "MDBM_ITERATE_NOLOCK", INT2NUM(MDBM_ITERATE_NOLOCK));
181
+ rb_define_const(cMdbm, "MDBM_LOCKMODE_UNKNOWN", INT2NUM(MDBM_LOCKMODE_UNKNOWN));
182
+ rb_define_const(cMdbm, "MDBM_CHECK_HEADER", INT2NUM(MDBM_CHECK_HEADER));
183
+ rb_define_const(cMdbm, "MDBM_CHECK_CHUNKS", INT2NUM(MDBM_CHECK_CHUNKS));
184
+ rb_define_const(cMdbm, "MDBM_CHECK_DIRECTORY", INT2NUM(MDBM_CHECK_DIRECTORY));
185
+ rb_define_const(cMdbm, "MDBM_CHECK_ALL", INT2NUM(MDBM_CHECK_ALL));
186
+ rb_define_const(cMdbm, "MDBM_PROT_NONE", INT2NUM(MDBM_PROT_NONE));
187
+ rb_define_const(cMdbm, "MDBM_PROT_READ", INT2NUM(MDBM_PROT_READ));
188
+ rb_define_const(cMdbm, "MDBM_PROT_WRITE", INT2NUM(MDBM_PROT_WRITE));
189
+ rb_define_const(cMdbm, "MDBM_PROT_ACCESS", INT2NUM(MDBM_PROT_ACCESS));
190
+ rb_define_const(cMdbm, "MDBM_CLOCK_STANDARD", INT2NUM(MDBM_CLOCK_STANDARD));
191
+ rb_define_const(cMdbm, "MDBM_CLOCK_TSC", INT2NUM(MDBM_CLOCK_TSC));
192
+ rb_define_const(cMdbm, "MDBM_STATS_BASIC", INT2NUM(MDBM_STATS_BASIC));
193
+ rb_define_const(cMdbm, "MDBM_STATS_TIMED", INT2NUM(MDBM_STATS_TIMED));
194
+ rb_define_const(cMdbm, "MDBM_STAT_CB_INC", INT2NUM(MDBM_STAT_CB_INC));
195
+ rb_define_const(cMdbm, "MDBM_STAT_CB_SET", INT2NUM(MDBM_STAT_CB_SET));
196
+ rb_define_const(cMdbm, "MDBM_STAT_CB_ELAPSED", INT2NUM(MDBM_STAT_CB_ELAPSED));
197
+ rb_define_const(cMdbm, "MDBM_STAT_CB_TIME", INT2NUM(MDBM_STAT_CB_TIME));
198
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_FETCH", INT2NUM(MDBM_STAT_TAG_FETCH));
199
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_STORE", INT2NUM(MDBM_STAT_TAG_STORE));
200
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_DELETE", INT2NUM(MDBM_STAT_TAG_DELETE));
201
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_LOCK", INT2NUM(MDBM_STAT_TAG_LOCK));
202
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_FETCH_UNCACHED", INT2NUM(MDBM_STAT_TAG_FETCH_UNCACHED));
203
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_GETPAGE", INT2NUM(MDBM_STAT_TAG_GETPAGE));
204
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_GETPAGE_UNCACHED", INT2NUM(MDBM_STAT_TAG_GETPAGE_UNCACHED));
205
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_CACHE_EVICT", INT2NUM(MDBM_STAT_TAG_CACHE_EVICT));
206
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_CACHE_STORE", INT2NUM(MDBM_STAT_TAG_CACHE_STORE));
207
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_PAGE_STORE", INT2NUM(MDBM_STAT_TAG_PAGE_STORE));
208
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_PAGE_DELETE", INT2NUM(MDBM_STAT_TAG_PAGE_DELETE));
209
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_SYNC", INT2NUM(MDBM_STAT_TAG_SYNC));
210
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_FETCH_NOT_FOUND", INT2NUM(MDBM_STAT_TAG_FETCH_NOT_FOUND));
211
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_FETCH_ERROR", INT2NUM(MDBM_STAT_TAG_FETCH_ERROR));
212
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_STORE_ERROR", INT2NUM(MDBM_STAT_TAG_STORE_ERROR));
213
+ rb_define_const(cMdbm, "MDBM_STAT_TAG_DELETE_FAILED", INT2NUM(MDBM_STAT_TAG_DELETE_FAILED));
214
+ rb_define_const(cMdbm, "MDBM_STAT_DELETED", INT2NUM(MDBM_STAT_DELETED));
215
+ rb_define_const(cMdbm, "MDBM_STAT_KEYS", INT2NUM(MDBM_STAT_KEYS));
216
+ rb_define_const(cMdbm, "MDBM_STAT_VALUES", INT2NUM(MDBM_STAT_VALUES));
217
+ rb_define_const(cMdbm, "MDBM_STAT_PAGES_ONLY", INT2NUM(MDBM_STAT_PAGES_ONLY));
218
+ rb_define_const(cMdbm, "MDBM_STAT_NOLOCK", INT2NUM(MDBM_STAT_NOLOCK));
219
+ rb_define_const(cMdbm, "MDBM_STAT_BUCKETS", INT2NUM(MDBM_STAT_BUCKETS));
220
+ rb_define_const(cMdbm, "MDBM_CACHEMODE_NONE", INT2NUM(MDBM_CACHEMODE_NONE));
221
+ rb_define_const(cMdbm, "MDBM_CACHEMODE_LFU", INT2NUM(MDBM_CACHEMODE_LFU));
222
+ rb_define_const(cMdbm, "MDBM_CACHEMODE_LRU", INT2NUM(MDBM_CACHEMODE_LRU));
223
+ rb_define_const(cMdbm, "MDBM_CACHEMODE_GDSF", INT2NUM(MDBM_CACHEMODE_GDSF));
224
+ rb_define_const(cMdbm, "MDBM_CACHEMODE_MAX", INT2NUM(MDBM_CACHEMODE_MAX));
225
+ rb_define_const(cMdbm, "MDBM_CACHEMODE_EVICT_CLEAN_FIRST", INT2NUM(MDBM_CACHEMODE_EVICT_CLEAN_FIRST));
226
+ rb_define_const(cMdbm, "MDBM_MINPAGE", INT2NUM(MDBM_MINPAGE));
227
+ rb_define_const(cMdbm, "MDBM_PAGE_ALIGN", INT2NUM(MDBM_PAGE_ALIGN));
228
+ rb_define_const(cMdbm, "MDBM_PAGESIZ", INT2NUM(MDBM_PAGESIZ));
229
+ rb_define_const(cMdbm, "MDBM_MIN_PSHIFT", INT2NUM(MDBM_MIN_PSHIFT));
230
+ rb_define_const(cMdbm, "MDBM_HASH_CRC32", INT2NUM(MDBM_HASH_CRC32));
231
+ rb_define_const(cMdbm, "MDBM_HASH_EJB", INT2NUM(MDBM_HASH_EJB));
232
+ rb_define_const(cMdbm, "MDBM_HASH_PHONG", INT2NUM(MDBM_HASH_PHONG));
233
+ rb_define_const(cMdbm, "MDBM_HASH_OZ", INT2NUM(MDBM_HASH_OZ));
234
+ rb_define_const(cMdbm, "MDBM_HASH_TOREK", INT2NUM(MDBM_HASH_TOREK));
235
+ rb_define_const(cMdbm, "MDBM_HASH_FNV", INT2NUM(MDBM_HASH_FNV));
236
+ rb_define_const(cMdbm, "MDBM_HASH_STL", INT2NUM(MDBM_HASH_STL));
237
+ rb_define_const(cMdbm, "MDBM_HASH_MD5", INT2NUM(MDBM_HASH_MD5));
238
+ rb_define_const(cMdbm, "MDBM_HASH_SHA_1", INT2NUM(MDBM_HASH_SHA_1));
239
+ rb_define_const(cMdbm, "MDBM_HASH_JENKINS", INT2NUM(MDBM_HASH_JENKINS));
240
+ rb_define_const(cMdbm, "MDBM_HASH_HSIEH", INT2NUM(MDBM_HASH_HSIEH));
241
+ rb_define_const(cMdbm, "MDBM_MAX_HASH", INT2NUM(MDBM_MAX_HASH));
242
+
243
+ }
244
+
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-mdbm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Evan Miller
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-21 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: MDBM is a super-fast memory-mapped key/value store. https://github.com/yahoo/mdbm
14
+ email:
15
+ - evan@squareup.com
16
+ executables: []
17
+ extensions:
18
+ - ext/mdbm/extconf.rb
19
+ extra_rdoc_files: []
20
+ files:
21
+ - Rakefile
22
+ - ext/mdbm/extconf.rb
23
+ - ext/mdbm/mdbm.c
24
+ homepage: http://github.com/square/ruby-mdbm
25
+ licenses: []
26
+ metadata: {}
27
+ post_install_message:
28
+ rdoc_options: []
29
+ require_paths:
30
+ - lib
31
+ required_ruby_version: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubyforge_project:
43
+ rubygems_version: 2.4.4
44
+ signing_key:
45
+ specification_version: 4
46
+ summary: libmdbm bindings for ruby
47
+ test_files: []
48
+ has_rdoc: