actsasflinn-ruby-tokyotyrant 0.1.5 → 0.1.6
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.
- data/Rakefile +1 -1
- data/ext/tokyo_tyrant.c +22 -6
- data/ext/tokyo_tyrant.h +1 -0
- data/ext/tokyo_tyrant_db.c +49 -48
- data/ext/tokyo_tyrant_module.c +95 -16
- data/ext/tokyo_tyrant_query.c +25 -5
- data/ext/tokyo_tyrant_table.c +16 -5
- data/spec/tokyo_tyrant_query_spec.rb +16 -0
- data/spec/tokyo_tyrant_spec.rb +38 -1
- data/spec/tokyo_tyrant_table_spec.rb +52 -1
- metadata +2 -2
data/Rakefile
CHANGED
@@ -20,7 +20,7 @@ CLEAN.include('pkg', 'tmp')
|
|
20
20
|
|
21
21
|
gemspec = Gem::Specification.new do |s|
|
22
22
|
s.name = 'ruby-tokyotyrant'
|
23
|
-
s.version = '0.1.
|
23
|
+
s.version = '0.1.6'
|
24
24
|
s.authors = [ 'Flinn' ]
|
25
25
|
s.email = 'flinn@actsasflinn.com'
|
26
26
|
s.homepage = 'http://github.com/actsasflinn/ruby-tokyotyrant/'
|
data/ext/tokyo_tyrant.c
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
#include <tokyo_tyrant.h>
|
2
2
|
|
3
|
+
extern VALUE StringRaw(const char *buf, int bsiz){
|
4
|
+
VALUE vval;
|
5
|
+
int i;
|
6
|
+
vval = rb_str_buf_new2("");
|
7
|
+
char s[5];
|
8
|
+
|
9
|
+
for(i=0;i<bsiz;i++){
|
10
|
+
char c = *buf++;
|
11
|
+
s[0] = c;
|
12
|
+
rb_str_buf_cat(vval, s, 1);
|
13
|
+
}
|
14
|
+
// buf -= bsiz;
|
15
|
+
// rb_str_buf_cat2(vval, "");
|
16
|
+
return vval;
|
17
|
+
}
|
18
|
+
|
3
19
|
extern VALUE StringValueEx(VALUE vobj){
|
4
20
|
char kbuf[NUMBUFSIZ];
|
5
21
|
int ksiz;
|
@@ -75,27 +91,27 @@ extern TCMAP *vhashtomap(VALUE vhash){
|
|
75
91
|
}
|
76
92
|
|
77
93
|
extern VALUE maptovhash(TCMAP *map){
|
78
|
-
const char *kbuf
|
94
|
+
const char *kbuf;
|
79
95
|
int ksiz, vsiz;
|
80
96
|
VALUE vhash;
|
81
97
|
vhash = rb_hash_new();
|
82
98
|
tcmapiterinit(map);
|
83
99
|
while((kbuf = tcmapiternext(map, &ksiz)) != NULL){
|
84
|
-
vbuf = tcmapiterval(kbuf, &vsiz);
|
85
|
-
rb_hash_aset(vhash, rb_str_new(kbuf, ksiz),
|
100
|
+
const char *vbuf = tcmapiterval(kbuf, &vsiz);
|
101
|
+
rb_hash_aset(vhash, rb_str_new(kbuf, ksiz), StringRaw(vbuf, vsiz));
|
86
102
|
}
|
87
103
|
return vhash;
|
88
104
|
}
|
89
105
|
|
90
106
|
extern VALUE maptovhashsym(TCMAP *map){
|
91
|
-
const char *kbuf
|
107
|
+
const char *kbuf;
|
92
108
|
int ksiz, vsiz;
|
93
109
|
VALUE vhash;
|
94
110
|
vhash = rb_hash_new();
|
95
111
|
tcmapiterinit(map);
|
96
112
|
while((kbuf = tcmapiternext(map, &ksiz)) != NULL){
|
97
|
-
vbuf = tcmapiterval(kbuf, &vsiz);
|
98
|
-
rb_hash_aset(vhash, ID2SYM(rb_intern(kbuf)),
|
113
|
+
const char *vbuf = tcmapiterval(kbuf, &vsiz);
|
114
|
+
rb_hash_aset(vhash, ID2SYM(rb_intern(kbuf)), StringRaw(vbuf, vsiz));
|
99
115
|
}
|
100
116
|
return vhash;
|
101
117
|
}
|
data/ext/tokyo_tyrant.h
CHANGED
data/ext/tokyo_tyrant_db.c
CHANGED
@@ -81,16 +81,31 @@ static VALUE cDB_putshl(VALUE vself, VALUE vkey, VALUE vstr, VALUE vwidth){
|
|
81
81
|
return Qtrue;
|
82
82
|
}
|
83
83
|
|
84
|
-
static VALUE cDB_get(VALUE
|
85
|
-
VALUE vval;
|
86
|
-
char *
|
84
|
+
static VALUE cDB_get(int argc, VALUE *argv, VALUE vself){
|
85
|
+
VALUE vkey, vraw, vval;
|
86
|
+
char *buf;
|
87
|
+
int bsiz, ecode;
|
88
|
+
bool raw;
|
87
89
|
TCRDB *db;
|
88
90
|
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
89
91
|
|
92
|
+
rb_scan_args(argc, argv, "11", &vkey, &vraw);
|
93
|
+
raw = (vraw == Qtrue);
|
94
|
+
|
95
|
+
// this is ugly
|
90
96
|
vkey = StringValueEx(vkey);
|
91
|
-
if(!(
|
92
|
-
|
93
|
-
|
97
|
+
if(!(buf = tcrdbget(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey), &bsiz))){
|
98
|
+
if ((ecode = tcrdbecode(db))) {
|
99
|
+
if (ecode != TTENOREC) {
|
100
|
+
rb_raise(eTokyoTyrantError, "get error: %s", tcrdberrmsg(ecode));
|
101
|
+
}
|
102
|
+
}
|
103
|
+
return Qnil;
|
104
|
+
} else {
|
105
|
+
vval = StringRaw(buf, bsiz);
|
106
|
+
}
|
107
|
+
|
108
|
+
tcfree(buf);
|
94
109
|
return vval;
|
95
110
|
}
|
96
111
|
|
@@ -134,26 +149,6 @@ static VALUE cDB_vsiz(VALUE vself, VALUE vkey){
|
|
134
149
|
return INT2NUM(tcrdbvsiz2(db, RSTRING_PTR(vkey)));
|
135
150
|
}
|
136
151
|
|
137
|
-
static VALUE cDB_addint(VALUE vself, VALUE vkey, VALUE vnum){
|
138
|
-
int num;
|
139
|
-
TCRDB *db;
|
140
|
-
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
141
|
-
vkey = StringValueEx(vkey);
|
142
|
-
|
143
|
-
num = tcrdbaddint(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey), NUM2INT(vnum));
|
144
|
-
return num == INT_MIN ? Qnil : INT2NUM(num);
|
145
|
-
}
|
146
|
-
|
147
|
-
static VALUE cDB_adddouble(VALUE vself, VALUE vkey, VALUE vnum){
|
148
|
-
double num;
|
149
|
-
TCRDB *db;
|
150
|
-
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
151
|
-
|
152
|
-
vkey = StringValueEx(vkey);
|
153
|
-
num = tcrdbadddouble(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey), NUM2DBL(vnum));
|
154
|
-
return isnan(num) ? Qnil : rb_float_new(num);
|
155
|
-
}
|
156
|
-
|
157
152
|
static VALUE cDB_fetch(int argc, VALUE *argv, VALUE vself){
|
158
153
|
VALUE vkey, vdef, vval;
|
159
154
|
TCRDB *db;
|
@@ -163,7 +158,7 @@ static VALUE cDB_fetch(int argc, VALUE *argv, VALUE vself){
|
|
163
158
|
vkey = StringValueEx(vkey);
|
164
159
|
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
165
160
|
if((vbuf = tcrdbget(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey), &vsiz)) != NULL){
|
166
|
-
vval =
|
161
|
+
vval = StringRaw(vbuf, vsiz);
|
167
162
|
tcfree(vbuf);
|
168
163
|
} else {
|
169
164
|
vval = vdef;
|
@@ -174,16 +169,18 @@ static VALUE cDB_fetch(int argc, VALUE *argv, VALUE vself){
|
|
174
169
|
static VALUE cDB_each(VALUE vself){
|
175
170
|
VALUE vrv;
|
176
171
|
TCRDB *db;
|
177
|
-
char *kxstr, *vxstr;
|
178
172
|
if(rb_block_given_p() != Qtrue) rb_raise(rb_eArgError, "no block given");
|
179
173
|
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
180
174
|
vrv = Qnil;
|
181
175
|
tcrdbiterinit(db);
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
176
|
+
int ksiz;
|
177
|
+
char *kbuf;
|
178
|
+
while((kbuf = tcrdbiternext(db, &ksiz)) != NULL){
|
179
|
+
int vsiz;
|
180
|
+
char *vbuf = tcrdbget(db, kbuf, ksiz, &vsiz);
|
181
|
+
vrv = rb_yield_values(2, rb_str_new2(kbuf), StringRaw(vbuf, vsiz));
|
182
|
+
tcfree(vbuf);
|
183
|
+
tcfree(kbuf);
|
187
184
|
}
|
188
185
|
return vrv;
|
189
186
|
}
|
@@ -191,16 +188,18 @@ static VALUE cDB_each(VALUE vself){
|
|
191
188
|
static VALUE cDB_each_value(VALUE vself){
|
192
189
|
VALUE vrv;
|
193
190
|
TCRDB *db;
|
194
|
-
char *kxstr, *vxstr;
|
195
191
|
if(rb_block_given_p() != Qtrue) rb_raise(rb_eArgError, "no block given");
|
196
192
|
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
197
193
|
vrv = Qnil;
|
198
194
|
tcrdbiterinit(db);
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
195
|
+
int ksiz;
|
196
|
+
char *kbuf;
|
197
|
+
while((kbuf = tcrdbiternext(db, &ksiz)) != NULL){
|
198
|
+
int vsiz;
|
199
|
+
char *vbuf = tcrdbget(db, kbuf, ksiz, &vsiz);
|
200
|
+
vrv = rb_yield_values(1, StringRaw(vbuf, vsiz));
|
201
|
+
tcfree(vbuf);
|
202
|
+
tcfree(kbuf);
|
204
203
|
}
|
205
204
|
return vrv;
|
206
205
|
}
|
@@ -208,38 +207,40 @@ static VALUE cDB_each_value(VALUE vself){
|
|
208
207
|
static VALUE cDB_values(VALUE vself){
|
209
208
|
VALUE vary;
|
210
209
|
TCRDB *db;
|
211
|
-
char *kxstr, *vxstr;
|
212
210
|
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
213
211
|
vary = rb_ary_new2(tcrdbrnum(db));
|
214
212
|
tcrdbiterinit(db);
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
213
|
+
int ksiz;
|
214
|
+
char *kbuf;
|
215
|
+
while((kbuf = tcrdbiternext(db, &ksiz)) != NULL){
|
216
|
+
int vsiz;
|
217
|
+
char *vbuf = tcrdbget(db, kbuf, ksiz, &vsiz);
|
218
|
+
rb_ary_push(vary, StringRaw(vbuf, vsiz));
|
219
|
+
tcfree(vbuf);
|
220
|
+
tcfree(kbuf);
|
220
221
|
}
|
221
222
|
return vary;
|
222
223
|
}
|
223
224
|
|
224
225
|
void init_db(){
|
225
226
|
rb_define_method(cDB, "mput", cDB_mput, 1);
|
227
|
+
rb_define_alias(cDB, "lput", "mput"); // Rufus Compat
|
226
228
|
rb_define_method(cDB, "put", cDB_put, 2);
|
227
229
|
rb_define_alias(cDB, "[]=", "put");
|
228
230
|
rb_define_method(cDB, "putkeep", cDB_putkeep, 2);
|
229
231
|
rb_define_method(cDB, "putcat", cDB_putcat, 2);
|
230
232
|
rb_define_method(cDB, "putshl", cDB_putshl, 2);
|
231
233
|
rb_define_method(cDB, "putnr", cDB_putnr, 2);
|
232
|
-
rb_define_method(cDB, "get", cDB_get, 1);
|
234
|
+
rb_define_method(cDB, "get", cDB_get, -1);
|
233
235
|
rb_define_alias(cDB, "[]", "get");
|
234
236
|
rb_define_method(cDB, "mget", cDB_mget, -1);
|
237
|
+
rb_define_alias(cDB, "lget", "mget"); // Rufus Compat
|
235
238
|
rb_define_method(cDB, "vsiz", cDB_vsiz, 1);
|
236
239
|
/*
|
237
240
|
rb_define_method(cDB, "check_value", cDB_check_value, 1);
|
238
241
|
rb_define_alias(cDB, "has_value?", "check_value");
|
239
242
|
rb_define_alias(cDB, "value?", "check_value");
|
240
243
|
*/
|
241
|
-
rb_define_method(cDB, "addint", cDB_addint, 2);
|
242
|
-
rb_define_method(cDB, "adddouble", cDB_adddouble, 2);
|
243
244
|
|
244
245
|
rb_define_method(cDB, "fetch", cDB_fetch, -1);
|
245
246
|
rb_define_method(cDB, "each", cDB_each, 0);
|
data/ext/tokyo_tyrant_module.c
CHANGED
@@ -67,6 +67,39 @@ static VALUE mTokyoTyrant_out(VALUE vself, VALUE vkey){
|
|
67
67
|
return tcrdbout2(db, RSTRING_PTR(vkey)) ? Qtrue : Qfalse;
|
68
68
|
}
|
69
69
|
|
70
|
+
// TODO: merge out and mout?
|
71
|
+
static VALUE mTokyoTyrant_outlist(int argc, VALUE *argv, VALUE vself){
|
72
|
+
VALUE vkeys, vary, vvalue;
|
73
|
+
TCRDB *db;
|
74
|
+
TCLIST *list, *result;
|
75
|
+
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
76
|
+
rb_scan_args(argc, argv, "*", &vkeys);
|
77
|
+
|
78
|
+
// I really hope there is a better way to do this
|
79
|
+
if (RARRAY_LEN(vkeys) == 1) {
|
80
|
+
vvalue = rb_ary_entry(vkeys, 0);
|
81
|
+
switch (TYPE(vvalue)){
|
82
|
+
case T_STRING:
|
83
|
+
case T_FIXNUM:
|
84
|
+
break;
|
85
|
+
case T_ARRAY:
|
86
|
+
vkeys = vvalue;
|
87
|
+
break;
|
88
|
+
case T_OBJECT:
|
89
|
+
vkeys = rb_convert_type(vvalue, T_ARRAY, "Array", "to_a");
|
90
|
+
break;
|
91
|
+
}
|
92
|
+
}
|
93
|
+
Check_Type(vkeys, T_ARRAY);
|
94
|
+
|
95
|
+
list = varytolist(vkeys);
|
96
|
+
result = tcrdbmisc(db, "outlist", 0, list);
|
97
|
+
tclistdel(list);
|
98
|
+
vary = listtovary(result);
|
99
|
+
tclistdel(result);
|
100
|
+
return vary;
|
101
|
+
}
|
102
|
+
|
70
103
|
static VALUE mTokyoTyrant_check(VALUE vself, VALUE vkey){
|
71
104
|
TCRDB *db;
|
72
105
|
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
@@ -111,6 +144,22 @@ static VALUE mTokyoTyrant_fwmkeys(int argc, VALUE *argv, VALUE vself){
|
|
111
144
|
return vary;
|
112
145
|
}
|
113
146
|
|
147
|
+
static VALUE mTokyoTyrant_delete_keys_with_prefix(int argc, VALUE *argv, VALUE vself){
|
148
|
+
VALUE vprefix, vmax;
|
149
|
+
TCLIST *keys;
|
150
|
+
int max;
|
151
|
+
TCRDB *db;
|
152
|
+
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
153
|
+
rb_scan_args(argc, argv, "11", &vprefix, &vmax);
|
154
|
+
|
155
|
+
vprefix = StringValueEx(vprefix);
|
156
|
+
max = (vmax == Qnil) ? -1 : NUM2INT(vmax);
|
157
|
+
keys = tcrdbfwmkeys(db, RSTRING_PTR(vprefix), RSTRING_LEN(vprefix), max);
|
158
|
+
tcrdbmisc(db, "outlist", 0, keys);
|
159
|
+
tclistdel(keys);
|
160
|
+
return Qnil;
|
161
|
+
}
|
162
|
+
|
114
163
|
static VALUE mTokyoTyrant_keys(VALUE vself){
|
115
164
|
/*
|
116
165
|
VALUE vary;
|
@@ -138,20 +187,32 @@ static VALUE mTokyoTyrant_keys(VALUE vself){
|
|
138
187
|
return vary;
|
139
188
|
}
|
140
189
|
|
141
|
-
|
142
|
-
|
143
|
-
const char *res;
|
144
|
-
VALUE vname, vkey, vvalue, vopts;
|
190
|
+
static VALUE mTokyoTyrant_add_int(VALUE vself, VALUE vkey, VALUE vnum){
|
191
|
+
int num;
|
145
192
|
TCRDB *db;
|
146
193
|
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
194
|
+
vkey = StringValueEx(vkey);
|
147
195
|
|
148
|
-
|
196
|
+
num = tcrdbaddint(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey), NUM2INT(vnum));
|
197
|
+
return num == INT_MIN ? Qnil : INT2NUM(num);
|
198
|
+
}
|
199
|
+
|
200
|
+
static VALUE mTokyoTyrant_get_int(VALUE vself, VALUE vkey){
|
201
|
+
return mTokyoTyrant_add_int(vself, vkey, INT2NUM(0));
|
202
|
+
}
|
203
|
+
|
204
|
+
static VALUE mTokyoTyrant_add_double(VALUE vself, VALUE vkey, VALUE vnum){
|
205
|
+
double num;
|
206
|
+
TCRDB *db;
|
207
|
+
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
149
208
|
|
150
|
-
vname = StringValueEx(vname);
|
151
209
|
vkey = StringValueEx(vkey);
|
152
|
-
|
153
|
-
|
154
|
-
|
210
|
+
num = tcrdbadddouble(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey), NUM2DBL(vnum));
|
211
|
+
return isnan(num) ? Qnil : rb_float_new(num);
|
212
|
+
}
|
213
|
+
|
214
|
+
static VALUE mTokyoTyrant_get_double(VALUE vself, VALUE vkey){
|
215
|
+
return mTokyoTyrant_add_double(vself, vkey, INT2NUM(0));
|
155
216
|
}
|
156
217
|
|
157
218
|
static VALUE mTokyoTyrant_sync(VALUE vself){
|
@@ -176,19 +237,27 @@ static VALUE mTokyoTyrant_copy(VALUE vself, VALUE path){
|
|
176
237
|
return tcrdbcopy(db, RSTRING_PTR(path)) ? Qtrue : Qfalse;
|
177
238
|
}
|
178
239
|
|
179
|
-
static VALUE mTokyoTyrant_restore(VALUE vself, VALUE
|
240
|
+
static VALUE mTokyoTyrant_restore(VALUE vself, VALUE vpath, VALUE vts, VALUE vopts){
|
241
|
+
uint64_t ts;
|
242
|
+
int opts;
|
180
243
|
TCRDB *db;
|
181
244
|
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
182
245
|
|
183
|
-
Check_Type(
|
184
|
-
|
246
|
+
Check_Type(vpath, T_STRING);
|
247
|
+
ts = (uint64_t) FIX2INT(vts);
|
248
|
+
opts = FIX2INT(vopts);
|
249
|
+
return tcrdbrestore(db, RSTRING_PTR(vpath), ts, opts) ? Qtrue : Qfalse;
|
185
250
|
}
|
186
251
|
|
187
|
-
static VALUE mTokyoTyrant_setmst(VALUE vself, VALUE
|
252
|
+
static VALUE mTokyoTyrant_setmst(VALUE vself, VALUE vhost, VALUE vport, VALUE vts, VALUE vopts){
|
253
|
+
uint64_t ts;
|
254
|
+
int opts;
|
188
255
|
TCRDB *db;
|
189
256
|
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
190
257
|
|
191
|
-
|
258
|
+
ts = (uint64_t) FIX2INT(vts);
|
259
|
+
opts = FIX2INT(vopts);
|
260
|
+
return tcrdbsetmst(db, RSTRING_PTR(vhost), FIX2INT(vport), ts, opts) ? Qtrue : Qfalse;
|
192
261
|
}
|
193
262
|
|
194
263
|
static VALUE mTokyoTyrant_rnum(VALUE vself){
|
@@ -271,6 +340,10 @@ void init_mod(){
|
|
271
340
|
rb_define_method(mTokyoTyrant, "errmsg", mTokyoTyrant_errmsg, -1);
|
272
341
|
rb_define_method(mTokyoTyrant, "ecode", mTokyoTyrant_ecode, 0);
|
273
342
|
rb_define_method(mTokyoTyrant, "out", mTokyoTyrant_out, 1);
|
343
|
+
rb_define_alias(mTokyoTyrant, "delete", "out"); // Rufus Compat
|
344
|
+
rb_define_method(mTokyoTyrant, "outlist", mTokyoTyrant_outlist, -1);
|
345
|
+
rb_define_alias(mTokyoTyrant, "mdelete", "outlist");
|
346
|
+
rb_define_alias(mTokyoTyrant, "ldelete", "outlist"); // Rufus Compat
|
274
347
|
rb_define_method(mTokyoTyrant, "check", mTokyoTyrant_check, 1);
|
275
348
|
rb_define_alias(mTokyoTyrant, "has_key?", "check");
|
276
349
|
rb_define_alias(mTokyoTyrant, "key?", "check");
|
@@ -279,8 +352,13 @@ void init_mod(){
|
|
279
352
|
rb_define_method(mTokyoTyrant, "iterinit", mTokyoTyrant_iterinit, 0);
|
280
353
|
rb_define_method(mTokyoTyrant, "iternext", mTokyoTyrant_iternext, 0);
|
281
354
|
rb_define_method(mTokyoTyrant, "fwmkeys", mTokyoTyrant_fwmkeys, -1);
|
355
|
+
rb_define_method(mTokyoTyrant, "delete_keys_with_prefix", mTokyoTyrant_delete_keys_with_prefix, -1);// Rufus Compat
|
356
|
+
rb_define_alias(mTokyoTyrant, "dfwmkeys", "delete_keys_with_prefix");
|
282
357
|
rb_define_method(mTokyoTyrant, "keys", mTokyoTyrant_keys, 0);
|
283
|
-
rb_define_method(mTokyoTyrant, "
|
358
|
+
rb_define_method(mTokyoTyrant, "add_int", mTokyoTyrant_add_int, 2);
|
359
|
+
rb_define_method(mTokyoTyrant, "get_int", mTokyoTyrant_get_int, 1);
|
360
|
+
rb_define_method(mTokyoTyrant, "add_double", mTokyoTyrant_add_double, 2);
|
361
|
+
rb_define_method(mTokyoTyrant, "get_double", mTokyoTyrant_get_double, 1);
|
284
362
|
rb_define_method(mTokyoTyrant, "sync", mTokyoTyrant_sync, 0);
|
285
363
|
rb_define_method(mTokyoTyrant, "vanish", mTokyoTyrant_vanish, 0);
|
286
364
|
rb_define_alias(mTokyoTyrant, "clear", "vanish");
|
@@ -290,7 +368,8 @@ void init_mod(){
|
|
290
368
|
rb_define_method(mTokyoTyrant, "rnum", mTokyoTyrant_rnum, 0);
|
291
369
|
rb_define_alias(mTokyoTyrant, "count", "rnum");
|
292
370
|
rb_define_method(mTokyoTyrant, "empty?", mTokyoTyrant_empty, 0);
|
293
|
-
|
371
|
+
rb_define_alias(mTokyoTyrant, "size", "rnum"); // Rufus Compat
|
372
|
+
rb_define_method(mTokyoTyrant, "db_size", mTokyoTyrant_size, 0); // Rufus Compat
|
294
373
|
rb_define_alias(mTokyoTyrant, "length", "size");
|
295
374
|
rb_define_method(mTokyoTyrant, "stat", mTokyoTyrant_stat, 0);
|
296
375
|
rb_define_method(mTokyoTyrant, "misc", mTokyoTyrant_misc, -1);
|
data/ext/tokyo_tyrant_query.c
CHANGED
@@ -82,10 +82,18 @@ static VALUE cQuery_searchout(VALUE vself){
|
|
82
82
|
return tcrdbqrysearchout(qry) ? Qtrue : Qfalse;
|
83
83
|
}
|
84
84
|
|
85
|
+
static VALUE cQuery_searchcount(VALUE vself){
|
86
|
+
VALUE vqry;
|
87
|
+
RDBQRY *qry;
|
88
|
+
vqry = rb_iv_get(vself, RDBQRYVNDATA);
|
89
|
+
Data_Get_Struct(vqry, RDBQRY, qry);
|
90
|
+
return LL2NUM(tcrdbqrysearchcount(qry));
|
91
|
+
}
|
92
|
+
|
85
93
|
static VALUE cQuery_get(VALUE vself){
|
86
94
|
int i, num, ksiz;
|
87
|
-
const char *name, *col;
|
88
|
-
VALUE vqry, vary, vcols;
|
95
|
+
const char *name, *col, *pkey;
|
96
|
+
VALUE vqry, vary, vcols, vpkey;
|
89
97
|
RDBQRY *qry;
|
90
98
|
TCLIST *res;
|
91
99
|
TCMAP *cols;
|
@@ -95,6 +103,8 @@ static VALUE cQuery_get(VALUE vself){
|
|
95
103
|
res = tcrdbqrysearchget(qry);
|
96
104
|
num = tclistnum(res);
|
97
105
|
vary = rb_ary_new2(num);
|
106
|
+
vpkey = rb_iv_get(vself, "@pkey");
|
107
|
+
pkey = vpkey == Qnil ? "__id" : STR2CSTR(StringValueEx(vpkey));
|
98
108
|
for(i = 0; i < num; i++){
|
99
109
|
vcols = rb_hash_new();
|
100
110
|
cols = tcrdbqryrescols(res, i);
|
@@ -102,7 +112,7 @@ static VALUE cQuery_get(VALUE vself){
|
|
102
112
|
tcmapiterinit(cols);
|
103
113
|
while((name = tcmapiternext(cols, &ksiz)) != NULL){
|
104
114
|
col = tcmapget2(cols, name);
|
105
|
-
if (ksiz == 0) name =
|
115
|
+
if (ksiz == 0) name = pkey;
|
106
116
|
rb_hash_aset(vcols, ID2SYM(rb_intern(name)), rb_str_new2(col));
|
107
117
|
}
|
108
118
|
}
|
@@ -113,6 +123,10 @@ static VALUE cQuery_get(VALUE vself){
|
|
113
123
|
return vary;
|
114
124
|
}
|
115
125
|
|
126
|
+
static VALUE cQuery_set_pkey(VALUE vself, VALUE vpkey) {
|
127
|
+
return rb_iv_set(vself, "@pkey", vpkey);
|
128
|
+
}
|
129
|
+
|
116
130
|
void init_query(){
|
117
131
|
rb_define_const(cQuery, "CSTREQ", INT2NUM(RDBQCSTREQ));
|
118
132
|
rb_define_const(cQuery, "CSTRINC", INT2NUM(RDBQCSTRINC));
|
@@ -140,12 +154,18 @@ void init_query(){
|
|
140
154
|
rb_define_method(cQuery, "addcond", cQuery_addcond, 3);
|
141
155
|
rb_define_alias(cQuery, "add_condition", "addcond");
|
142
156
|
rb_define_alias(cQuery, "condition", "addcond");
|
157
|
+
rb_define_alias(cQuery, "add", "addcond"); // Rufus Compat
|
143
158
|
rb_define_method(cQuery, "setorder", cQuery_setorder, 2);
|
144
|
-
rb_define_alias(cQuery, "order_by", "setorder");
|
159
|
+
rb_define_alias(cQuery, "order_by", "setorder"); // Rufus Compat
|
145
160
|
rb_define_method(cQuery, "setmax", cQuery_setmax, 1);
|
146
|
-
rb_define_alias(cQuery, "limit", "setmax");
|
161
|
+
rb_define_alias(cQuery, "limit", "setmax"); // Rufus Compat
|
147
162
|
rb_define_method(cQuery, "search", cQuery_search, 0);
|
148
163
|
rb_define_alias(cQuery, "run", "search");
|
149
164
|
rb_define_method(cQuery, "searchout", cQuery_searchout, 0);
|
165
|
+
rb_define_alias(cQuery, "delete", "searchout"); // Rufus Compat
|
166
|
+
rb_define_method(cQuery, "searchcount", cQuery_searchcount, 0);
|
167
|
+
rb_define_alias(cQuery, "count", "searchcount"); // Rufus Compat
|
150
168
|
rb_define_method(cQuery, "get", cQuery_get, 0);
|
169
|
+
rb_define_method(cQuery, "set_pkey", cQuery_set_pkey, 1);
|
170
|
+
rb_define_alias(cQuery, "pkey=", "set_pkey");
|
151
171
|
}
|
data/ext/tokyo_tyrant_table.c
CHANGED
@@ -107,7 +107,7 @@ static VALUE cTable_get(VALUE vself, VALUE vkey){
|
|
107
107
|
}
|
108
108
|
|
109
109
|
static VALUE cTable_mget(int argc, VALUE *argv, VALUE vself){
|
110
|
-
const char *kbuf
|
110
|
+
const char *kbuf;
|
111
111
|
int ksiz, vsiz;
|
112
112
|
VALUE vkeys, vhash, vcols, vvalue;
|
113
113
|
TCRDB *db;
|
@@ -137,11 +137,11 @@ static VALUE cTable_mget(int argc, VALUE *argv, VALUE vself){
|
|
137
137
|
vhash = rb_hash_new();
|
138
138
|
tcmapiterinit(recs);
|
139
139
|
while((kbuf = tcmapiternext(recs, &ksiz)) != NULL){
|
140
|
-
vbuf = tcmapiterval(kbuf, &vsiz);
|
140
|
+
const char *vbuf = tcmapiterval(kbuf, &vsiz);
|
141
141
|
cols = tcstrsplit4(vbuf, vsiz);
|
142
142
|
vcols = maptovhashsym(cols);
|
143
143
|
tcmapdel(cols);
|
144
|
-
rb_hash_aset(vhash,
|
144
|
+
rb_hash_aset(vhash, StringRaw(kbuf, ksiz), vcols);
|
145
145
|
}
|
146
146
|
tcmapdel(recs);
|
147
147
|
return vhash;
|
@@ -150,7 +150,15 @@ static VALUE cTable_mget(int argc, VALUE *argv, VALUE vself){
|
|
150
150
|
static VALUE cTable_setindex(VALUE vself, VALUE vname, VALUE vtype){
|
151
151
|
TCRDB *db;
|
152
152
|
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
153
|
-
|
153
|
+
vname = StringValueEx(vname);
|
154
|
+
if (TYPE(vtype) == T_SYMBOL) vtype = rb_str_new2(rb_id2name(SYM2ID(vtype)));
|
155
|
+
|
156
|
+
if (TYPE(vtype) == T_STRING){
|
157
|
+
vtype = StringValueEx(vtype);
|
158
|
+
vtype = tctdbstrtoindextype(RSTRING_PTR(toupper(vtype)));
|
159
|
+
vtype = INT2NUM(vtype);
|
160
|
+
}
|
161
|
+
|
154
162
|
return tcrdbtblsetindex(db, RSTRING_PTR(vname), NUM2INT(vtype)) ? Qtrue : Qfalse;
|
155
163
|
}
|
156
164
|
|
@@ -268,15 +276,18 @@ static VALUE cTable_find(VALUE vself){
|
|
268
276
|
|
269
277
|
void init_table(){
|
270
278
|
rb_define_method(cTable, "mput", cTable_mput, 1);
|
279
|
+
rb_define_alias(cTable, "lput", "mput"); // Rufus Compat
|
271
280
|
rb_define_method(cTable, "put", cTable_put, 2);
|
272
281
|
rb_define_alias(cTable, "[]=", "put");
|
273
282
|
rb_define_method(cTable, "putkeep", cTable_putkeep, 2);
|
274
283
|
rb_define_method(cTable, "putcat", cTable_putcat, 2);
|
275
284
|
rb_define_method(cTable, "out", cTable_out, 1);
|
285
|
+
rb_define_alias(cTable, "delete", "out"); // Rufus Compat
|
276
286
|
rb_define_method(cTable, "get", cTable_get, 1);
|
277
287
|
rb_define_method(cTable, "mget", cTable_mget, -1);
|
288
|
+
rb_define_alias(cTable, "lget", "mget"); // Rufus Compat
|
278
289
|
rb_define_alias(cTable, "[]", "get");
|
279
|
-
rb_define_method(cTable, "
|
290
|
+
rb_define_method(cTable, "set_index", cTable_setindex, 2); // Rufus Compat
|
280
291
|
rb_define_method(cTable, "genuid", cTable_genuid, 0);
|
281
292
|
rb_define_alias(cTable, "generate_unique_id", "genuid");
|
282
293
|
rb_define_method(cTable, "fetch", cTable_fetch, -1);
|
@@ -88,4 +88,20 @@ describe TokyoTyrant::Query, "with an open database" do
|
|
88
88
|
{:type=>"Cucumber", :variety=>"Lemon", :__id=>"4595", :code=>"4595"},
|
89
89
|
{:type=>"Cucumber", :variety=>"Japanese / White", :__id=>"4594", :code=>"4594"}]
|
90
90
|
end
|
91
|
+
|
92
|
+
it "should show query count" do
|
93
|
+
res = @db.prepare_query{ |q| q.condition(:type, :streq, 'Cucumber') }.count
|
94
|
+
res.should == 5
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should allow a custom pkey for a result set" do
|
98
|
+
q = @db.query
|
99
|
+
q.condition(:type, :streq, 'Cucumber')
|
100
|
+
q.set_pkey(:pk)
|
101
|
+
q.get.should == [{:type=>"Cucumber", :code=>"4592", :pk=>"4592", :variety=>"Armenian"},
|
102
|
+
{:type=>"Cucumber", :code=>"4593", :pk=>"4593", :variety=>"English / Hot House / Long Seedless / Telegraph / Continental"},
|
103
|
+
{:type=>"Cucumber", :code=>"4594", :pk=>"4594", :variety=>"Japanese / White"},
|
104
|
+
{:type=>"Cucumber", :code=>"4595", :pk=>"4595", :variety=>"Lemon"},
|
105
|
+
{:type=>"Cucumber", :code=>"4596", :pk=>"4596", :variety=>"Pickling / Gherkin"}]
|
106
|
+
end
|
91
107
|
end
|
data/spec/tokyo_tyrant_spec.rb
CHANGED
@@ -42,6 +42,16 @@ describe TokyoTyrant::DB, "with an open database" do
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
+
it "should delete multiple values" do
|
46
|
+
h = { 'pizza' => 'old forge style',
|
47
|
+
'sandwich' => 'peanut butter jelly',
|
48
|
+
'yogurt' => 'greek',
|
49
|
+
'coffee' => 'black' }
|
50
|
+
@db.mput(h)
|
51
|
+
@db.outlist('coffee', 'yogurt').should.be.empty
|
52
|
+
@db.keys.sort.should == ['pizza','sandwich']
|
53
|
+
end
|
54
|
+
|
45
55
|
it "should get multiple values" do
|
46
56
|
h = { 'pizza' => 'old forge style',
|
47
57
|
'sandwich' => 'peanut butter jelly',
|
@@ -97,6 +107,17 @@ describe TokyoTyrant::DB, "with an open database" do
|
|
97
107
|
@db.fwmkeys('apples').sort.should == ["apples/grannysmith", "apples/royalgala"]
|
98
108
|
end
|
99
109
|
|
110
|
+
it "should delete forward matching keys" do
|
111
|
+
@db['apples/royalgala'] = '4173'
|
112
|
+
@db['apples/grannysmith'] = '4139'
|
113
|
+
@db['bananas/yellow'] = '4011'
|
114
|
+
@db['oranges/shamouti'] = '3027'
|
115
|
+
@db['grapefruit/deepred'] = '4288'
|
116
|
+
@db.delete_keys_with_prefix('apples').should == nil
|
117
|
+
@db.fwmkeys('apples').should.be.empty
|
118
|
+
@db.keys.sort.should == ['bananas/yellow', 'grapefruit/deepred', 'oranges/shamouti']
|
119
|
+
end
|
120
|
+
|
100
121
|
it "should get all keys" do
|
101
122
|
keys = %w[appetizers entree dessert]
|
102
123
|
values = %w[chips chicken\ caeser\ salad ice\ cream]
|
@@ -131,7 +152,7 @@ describe TokyoTyrant::DB, "with an open database" do
|
|
131
152
|
|
132
153
|
it "should report db size" do
|
133
154
|
@db['rootbeer'] = 'virgils'
|
134
|
-
@db.
|
155
|
+
@db.db_size.should == 528736
|
135
156
|
end
|
136
157
|
|
137
158
|
it "should fetch a record" do
|
@@ -177,4 +198,20 @@ describe TokyoTyrant::DB, "with an open database" do
|
|
177
198
|
i = i += 1
|
178
199
|
end
|
179
200
|
end
|
201
|
+
|
202
|
+
it "should add serialized integer values" do
|
203
|
+
key = 'counter'
|
204
|
+
@db.out(key)
|
205
|
+
@db.add_int(key, 1).should == 1
|
206
|
+
@db.add_int(key, 1).should == 2
|
207
|
+
@db.get_int(key).should == 2
|
208
|
+
end
|
209
|
+
|
210
|
+
it "should add serialized double values" do
|
211
|
+
key = 'counter'
|
212
|
+
@db.out(key)
|
213
|
+
@db.add_double(key, 1.0).should.be.close?(1.0, 0.005)
|
214
|
+
@db.add_double(key, 1.0).should.be.close?(2.0, 0.005)
|
215
|
+
@db.get_double(key).should.be.close?(2.0, 0.005)
|
216
|
+
end
|
180
217
|
end
|
@@ -45,6 +45,17 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
+
it "should delete multiple values" do
|
49
|
+
h = { 'pizza' => { :best => 'old forge style', :ok => 'new york style', :worst => 'chicago style' },
|
50
|
+
'sandwich' => { :best => 'peanut butter jelly', :ok => 'turkey', :worst => 'olive loaf' },
|
51
|
+
'yogurt' => { :best => 'greek', :ok => 'organic', :worst => '+hfcs' },
|
52
|
+
'coffee' => { :best => 'black', :ok => 'espresso', :worst => 'latte' } }
|
53
|
+
|
54
|
+
@db.mput(h)
|
55
|
+
@db.outlist('coffee', 'yogurt').should.be.empty
|
56
|
+
@db.keys.sort.should == ['pizza','sandwich']
|
57
|
+
end
|
58
|
+
|
48
59
|
it "should get multiple values" do
|
49
60
|
h = { 'pizza' => { :best => 'old forge style', :ok => 'new york style', :worst => 'chicago style' },
|
50
61
|
'sandwich' => { :best => 'peanut butter jelly', :ok => 'turkey', :worst => 'olive loaf' },
|
@@ -94,6 +105,17 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
94
105
|
@db.fwmkeys('apples').sort.should == ["apples/grannysmith", "apples/royalgala"]
|
95
106
|
end
|
96
107
|
|
108
|
+
it "should delete forward matching keys" do
|
109
|
+
@db['apples/royalgala'] = { :code => '4173', :color => 'red-yellow' }
|
110
|
+
@db['apples/grannysmith'] = { :code => '4139', :color => 'green' }
|
111
|
+
@db['bananas/yellow'] = { :code => '4011', :color => 'yellow' }
|
112
|
+
@db['oranges/shamouti'] = { :code => '3027', :color => 'orange' }
|
113
|
+
@db['grapefruit/deepred'] = { :code => '4288', :color => 'yellow/pink' }
|
114
|
+
@db.delete_keys_with_prefix('apples').should == nil
|
115
|
+
@db.fwmkeys('apples').should.be.empty
|
116
|
+
@db.keys.sort.should == ['bananas/yellow', 'grapefruit/deepred', 'oranges/shamouti']
|
117
|
+
end
|
118
|
+
|
97
119
|
it "should get all keys" do
|
98
120
|
keys = %w[appetizers entree dessert]
|
99
121
|
values = [{ :cheap => 'chips', :expensive => 'sample everything platter' },
|
@@ -134,7 +156,7 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
134
156
|
|
135
157
|
it "should report db size" do
|
136
158
|
@db['rootbeer'] = { :gourmet => 'Virgils', :natural => 'Hansens' }
|
137
|
-
@db.
|
159
|
+
@db.db_size.should == 528768
|
138
160
|
end
|
139
161
|
|
140
162
|
it "should fetch a record" do
|
@@ -187,4 +209,33 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
187
209
|
i = i += 1
|
188
210
|
end
|
189
211
|
end
|
212
|
+
|
213
|
+
it "should add serialized integer values" do
|
214
|
+
key = 'counter'
|
215
|
+
@db.out(key)
|
216
|
+
@db[key] = { :title => 'Bean Counter' }
|
217
|
+
@db.add_int(key, 1).should == 1
|
218
|
+
@db.add_int(key, 1).should == 2
|
219
|
+
@db.get_int(key).should == 2
|
220
|
+
@db[key].should == { :title => 'Bean Counter', :_num => "2" }
|
221
|
+
end
|
222
|
+
|
223
|
+
it "should add serialized double values" do
|
224
|
+
key = 'counter'
|
225
|
+
@db.out(key)
|
226
|
+
@db[key] = { :title => 'Bean Counter' }
|
227
|
+
@db.add_double(key, 1.0).should.be.close?(1.0, 0.005)
|
228
|
+
@db.add_double(key, 1.0).should.be.close?(2.0, 0.005)
|
229
|
+
@db.get_double(key).should.be.close?(2.0, 0.005)
|
230
|
+
@db[key].should == { :title => 'Bean Counter', :_num => "2" }
|
231
|
+
end
|
232
|
+
|
233
|
+
it "should set an index" do
|
234
|
+
key = 'counter'
|
235
|
+
50.times do |i|
|
236
|
+
@db["key#{i}"] = { :title => %w{rice beans corn}.sort_by{rand}.first,
|
237
|
+
:description => 'a whole protein' }
|
238
|
+
end
|
239
|
+
@db.set_index(:title, :lexical).should.be.true
|
240
|
+
end
|
190
241
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: actsasflinn-ruby-tokyotyrant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Flinn
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-05-21 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|