actsasflinn-ruby-tokyotyrant 0.1.8 → 0.1.9
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/README.rdoc +49 -4
- data/Rakefile +1 -1
- data/ext/tokyo_tyrant.c +0 -13
- data/ext/tokyo_tyrant.h +0 -1
- data/ext/tokyo_tyrant_db.c +24 -40
- data/ext/tokyo_tyrant_module.c +107 -67
- data/ext/tokyo_tyrant_module.h +2 -0
- data/ext/tokyo_tyrant_query.c +5 -5
- data/ext/tokyo_tyrant_table.c +20 -37
- data/spec/ext.lua +4 -0
- data/spec/start_tyrants.sh +3 -0
- data/spec/tokyo_tyrant_query_spec.rb +22 -22
- data/spec/tokyo_tyrant_spec.rb +22 -0
- data/spec/tokyo_tyrant_table_spec.rb +85 -60
- metadata +2 -1
data/ext/tokyo_tyrant_module.h
CHANGED
data/ext/tokyo_tyrant_query.c
CHANGED
@@ -108,8 +108,8 @@ static VALUE cQuery_searchcount(VALUE vself){
|
|
108
108
|
|
109
109
|
static VALUE cQuery_get(VALUE vself){
|
110
110
|
int i, num, ksiz;
|
111
|
-
const char *name, *col
|
112
|
-
VALUE vqry, vary, vcols, vpkey;
|
111
|
+
const char *name, *col;
|
112
|
+
VALUE vqry, vary, vcols, vpkey, vname;
|
113
113
|
RDBQRY *qry;
|
114
114
|
TCLIST *res;
|
115
115
|
TCMAP *cols;
|
@@ -120,7 +120,7 @@ static VALUE cQuery_get(VALUE vself){
|
|
120
120
|
num = tclistnum(res);
|
121
121
|
vary = rb_ary_new2(num);
|
122
122
|
vpkey = rb_iv_get(vself, "@pkey");
|
123
|
-
|
123
|
+
if(vpkey == Qnil) vpkey = rb_str_new2("__id");
|
124
124
|
for(i = 0; i < num; i++){
|
125
125
|
vcols = rb_hash_new();
|
126
126
|
cols = tcrdbqryrescols(res, i);
|
@@ -128,8 +128,8 @@ static VALUE cQuery_get(VALUE vself){
|
|
128
128
|
tcmapiterinit(cols);
|
129
129
|
while((name = tcmapiternext(cols, &ksiz)) != NULL){
|
130
130
|
col = tcmapget2(cols, name);
|
131
|
-
|
132
|
-
rb_hash_aset(vcols,
|
131
|
+
vname = ksiz == 0 ? vpkey : rb_str_new2(name);
|
132
|
+
rb_hash_aset(vcols, vname, rb_str_new2(col));
|
133
133
|
}
|
134
134
|
}
|
135
135
|
tcmapdel(cols);
|
data/ext/tokyo_tyrant_table.c
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
#include <tokyo_tyrant_table.h>
|
2
2
|
|
3
3
|
static VALUE cTable_put_method(VALUE vself, VALUE vkey, VALUE vcols, int method){
|
4
|
-
int ecode;
|
5
4
|
bool res;
|
6
5
|
TCMAP *cols;
|
7
|
-
TCRDB *db;
|
8
|
-
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
6
|
+
TCRDB *db = mTokyoTyrant_getdb(vself);
|
9
7
|
|
10
8
|
vkey = StringValueEx(vkey);
|
11
9
|
Check_Type(vcols, T_HASH);
|
@@ -27,12 +25,8 @@ static VALUE cTable_put_method(VALUE vself, VALUE vkey, VALUE vcols, int method)
|
|
27
25
|
break;
|
28
26
|
}
|
29
27
|
|
30
|
-
if(!res)
|
31
|
-
ecode = tcrdbecode(db);
|
32
|
-
rb_raise(eTokyoTyrantError, "put error: %s\n", tcrdberrmsg(ecode));
|
33
|
-
}
|
28
|
+
if(!res) mTokyoTyrant_exception(vself);
|
34
29
|
tcmapdel(cols);
|
35
|
-
|
36
30
|
return Qtrue;
|
37
31
|
}
|
38
32
|
|
@@ -43,9 +37,8 @@ static VALUE cTable_put(VALUE vself, VALUE vkey, VALUE vcols){
|
|
43
37
|
static VALUE cTable_mput(VALUE vself, VALUE vhash){
|
44
38
|
int i, num, j;
|
45
39
|
VALUE vary, vkeys, vkey, vval;
|
46
|
-
TCRDB *db;
|
47
40
|
TCLIST *list, *result;
|
48
|
-
|
41
|
+
TCRDB *db = mTokyoTyrant_getdb(vself);
|
49
42
|
|
50
43
|
vkeys = rb_funcall(vhash, rb_intern("keys"), 0);
|
51
44
|
num = RARRAY_LEN(vkeys);
|
@@ -86,8 +79,7 @@ static VALUE cTable_putcat(VALUE vself, VALUE vkey, VALUE vcols){
|
|
86
79
|
}
|
87
80
|
|
88
81
|
static VALUE cTable_out(VALUE vself, VALUE vkey){
|
89
|
-
TCRDB *db;
|
90
|
-
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
82
|
+
TCRDB *db = mTokyoTyrant_getdb(vself);
|
91
83
|
vkey = StringValueEx(vkey);
|
92
84
|
|
93
85
|
return tcrdbtblout(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey)) ? Qtrue : Qfalse;
|
@@ -96,20 +88,17 @@ static VALUE cTable_out(VALUE vself, VALUE vkey){
|
|
96
88
|
static VALUE cTable_get(VALUE vself, VALUE vkey){
|
97
89
|
VALUE vcols;
|
98
90
|
int ecode;
|
99
|
-
TCRDB *db;
|
100
91
|
TCMAP *cols;
|
101
|
-
|
92
|
+
TCRDB *db = mTokyoTyrant_getdb(vself);
|
102
93
|
|
103
94
|
vkey = StringValueEx(vkey);
|
104
95
|
if(!(cols = tcrdbtblget(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey)))){
|
105
96
|
if ((ecode = tcrdbecode(db))) {
|
106
|
-
if (ecode != TTENOREC)
|
107
|
-
rb_raise(eTokyoTyrantError, "get error: %s", tcrdberrmsg(ecode));
|
108
|
-
}
|
97
|
+
if (ecode != TTENOREC) mTokyoTyrant_exception(vself);
|
109
98
|
}
|
110
99
|
return Qnil;
|
111
100
|
} else {
|
112
|
-
vcols =
|
101
|
+
vcols = maptovhash(cols);
|
113
102
|
}
|
114
103
|
|
115
104
|
tcmapdel(cols);
|
@@ -120,9 +109,8 @@ static VALUE cTable_mget(int argc, VALUE *argv, VALUE vself){
|
|
120
109
|
const char *kbuf;
|
121
110
|
int ksiz, vsiz;
|
122
111
|
VALUE vkeys, vhash, vcols, vvalue;
|
123
|
-
TCRDB *db;
|
124
112
|
TCMAP *recs, *cols;
|
125
|
-
|
113
|
+
TCRDB *db = mTokyoTyrant_getdb(vself);
|
126
114
|
rb_scan_args(argc, argv, "*", &vkeys);
|
127
115
|
|
128
116
|
// I really hope there is a better way to do this
|
@@ -135,6 +123,7 @@ static VALUE cTable_mget(int argc, VALUE *argv, VALUE vself){
|
|
135
123
|
case T_ARRAY:
|
136
124
|
vkeys = vvalue;
|
137
125
|
break;
|
126
|
+
case T_STRUCT: // range is not a T_STRUCT instead of a T_OBJECT in ruby1.9?
|
138
127
|
case T_OBJECT:
|
139
128
|
vkeys = rb_convert_type(vvalue, T_ARRAY, "Array", "to_a");
|
140
129
|
break;
|
@@ -149,7 +138,7 @@ static VALUE cTable_mget(int argc, VALUE *argv, VALUE vself){
|
|
149
138
|
while((kbuf = tcmapiternext(recs, &ksiz)) != NULL){
|
150
139
|
const char *vbuf = tcmapiterval(kbuf, &vsiz);
|
151
140
|
cols = tcstrsplit4(vbuf, vsiz);
|
152
|
-
vcols =
|
141
|
+
vcols = maptovhash(cols);
|
153
142
|
tcmapdel(cols);
|
154
143
|
rb_hash_aset(vhash, StringRaw(kbuf, ksiz), vcols);
|
155
144
|
}
|
@@ -158,8 +147,7 @@ static VALUE cTable_mget(int argc, VALUE *argv, VALUE vself){
|
|
158
147
|
}
|
159
148
|
|
160
149
|
static VALUE cTable_setindex(VALUE vself, VALUE vname, VALUE vtype){
|
161
|
-
TCRDB *db;
|
162
|
-
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
150
|
+
TCRDB *db = mTokyoTyrant_getdb(vself);
|
163
151
|
vname = StringValueEx(vname);
|
164
152
|
if (TYPE(vtype) == T_SYMBOL) vtype = rb_str_new2(rb_id2name(SYM2ID(vtype)));
|
165
153
|
|
@@ -173,20 +161,18 @@ static VALUE cTable_setindex(VALUE vself, VALUE vname, VALUE vtype){
|
|
173
161
|
}
|
174
162
|
|
175
163
|
static VALUE cTable_genuid(VALUE vself){
|
176
|
-
TCRDB *db;
|
177
|
-
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
164
|
+
TCRDB *db = mTokyoTyrant_getdb(vself);
|
178
165
|
return LL2NUM(tcrdbtblgenuid(db));
|
179
166
|
}
|
180
167
|
|
181
168
|
static VALUE cTable_fetch(int argc, VALUE *argv, VALUE vself){
|
182
169
|
VALUE vkey, vdef, vval;
|
183
|
-
TCRDB *db;
|
184
170
|
TCMAP *cols;
|
171
|
+
TCRDB *db = mTokyoTyrant_getdb(vself);
|
185
172
|
rb_scan_args(argc, argv, "11", &vkey, &vdef);
|
186
173
|
vkey = StringValueEx(vkey);
|
187
|
-
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
188
174
|
if((cols = tcrdbtblget(db, RSTRING_PTR(vkey), RSTRING_LEN(vkey))) != NULL){
|
189
|
-
vval =
|
175
|
+
vval = maptovhash(cols);
|
190
176
|
tcmapdel(cols);
|
191
177
|
} else {
|
192
178
|
vval = vdef;
|
@@ -196,17 +182,16 @@ static VALUE cTable_fetch(int argc, VALUE *argv, VALUE vself){
|
|
196
182
|
|
197
183
|
static VALUE cTable_each(VALUE vself){
|
198
184
|
VALUE vrv;
|
199
|
-
TCRDB *db;
|
200
185
|
TCMAP *cols;
|
201
186
|
char *kbuf;
|
202
187
|
int ksiz;
|
203
188
|
if(rb_block_given_p() != Qtrue) rb_raise(rb_eArgError, "no block given");
|
204
|
-
|
189
|
+
TCRDB *db = mTokyoTyrant_getdb(vself);
|
205
190
|
vrv = Qnil;
|
206
191
|
tcrdbiterinit(db);
|
207
192
|
while((kbuf = tcrdbiternext(db, &ksiz)) != NULL){
|
208
193
|
if((cols = tcrdbtblget(db, kbuf, ksiz)) != NULL){
|
209
|
-
vrv = rb_yield_values(2, rb_str_new(kbuf, ksiz),
|
194
|
+
vrv = rb_yield_values(2, rb_str_new(kbuf, ksiz), maptovhash(cols));
|
210
195
|
tcmapdel(cols);
|
211
196
|
} else {
|
212
197
|
vrv = rb_yield_values(2, rb_str_new(kbuf, ksiz), Qnil);
|
@@ -218,17 +203,16 @@ static VALUE cTable_each(VALUE vself){
|
|
218
203
|
|
219
204
|
static VALUE cTable_each_value(VALUE vself){
|
220
205
|
VALUE vrv;
|
221
|
-
TCRDB *db;
|
222
206
|
TCMAP *cols;
|
223
207
|
char *kbuf;
|
224
208
|
int ksiz;
|
225
209
|
if(rb_block_given_p() != Qtrue) rb_raise(rb_eArgError, "no block given");
|
226
|
-
|
210
|
+
TCRDB *db = mTokyoTyrant_getdb(vself);
|
227
211
|
vrv = Qnil;
|
228
212
|
tcrdbiterinit(db);
|
229
213
|
while((kbuf = tcrdbiternext(db, &ksiz)) != NULL){
|
230
214
|
if((cols = tcrdbtblget(db, kbuf, ksiz)) != NULL){
|
231
|
-
vrv = rb_yield(
|
215
|
+
vrv = rb_yield(maptovhash(cols));
|
232
216
|
tcmapdel(cols);
|
233
217
|
} else {
|
234
218
|
vrv = rb_yield(Qnil);
|
@@ -240,16 +224,15 @@ static VALUE cTable_each_value(VALUE vself){
|
|
240
224
|
|
241
225
|
static VALUE cTable_values(VALUE vself){
|
242
226
|
VALUE vary;
|
243
|
-
TCRDB *db;
|
244
227
|
TCMAP *cols;
|
245
228
|
char *kxstr;
|
246
229
|
int ksiz;
|
247
|
-
|
230
|
+
TCRDB *db = mTokyoTyrant_getdb(vself);
|
248
231
|
vary = rb_ary_new2(tcrdbrnum(db));
|
249
232
|
tcrdbiterinit(db);
|
250
233
|
while((kxstr = tcrdbiternext(db, &ksiz)) != NULL){
|
251
234
|
cols = tcrdbtblget(db, kxstr, ksiz);
|
252
|
-
rb_ary_push(vary,
|
235
|
+
rb_ary_push(vary, maptovhash(cols));
|
253
236
|
tcmapdel(cols);
|
254
237
|
tcfree(kxstr);
|
255
238
|
}
|
data/spec/ext.lua
ADDED
data/spec/start_tyrants.sh
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
#
|
6
6
|
|
7
7
|
TMP=`pwd`/tmp
|
8
|
+
SPEC=`pwd`/spec
|
8
9
|
# so that tt doesn't complain about relative paths...
|
9
10
|
|
10
11
|
[ -d $TMP ] || mkdir $TMP
|
@@ -14,6 +15,7 @@ ttserver \
|
|
14
15
|
-port 45000 \
|
15
16
|
-pid $TMP/t_spec.pid -rts $TMP/t_spec.rts \
|
16
17
|
-log $TMP/t.log \
|
18
|
+
-ext $SPEC/ext.lua \
|
17
19
|
$TMP/tyrant.tch
|
18
20
|
|
19
21
|
ttserver \
|
@@ -21,5 +23,6 @@ ttserver \
|
|
21
23
|
-port 45001 \
|
22
24
|
-pid $TMP/tt_spec.pid -rts $TMP/tt_spec.rts \
|
23
25
|
-log $TMP/tt.log \
|
26
|
+
-ext $SPEC/ext.lua \
|
24
27
|
$TMP/tyrant_table.tct
|
25
28
|
|
@@ -28,8 +28,8 @@ describe TokyoTyrant::Query, "with an open database" do
|
|
28
28
|
|
29
29
|
it "should get ordered keys for search conditions with default order" do
|
30
30
|
q = @db.query
|
31
|
-
q.addcond(
|
32
|
-
q.setorder(
|
31
|
+
q.addcond('type', :streq, 'Spinach')
|
32
|
+
q.setorder('variety')
|
33
33
|
q.search.should == ["3332", "34173"]
|
34
34
|
end
|
35
35
|
|
@@ -66,29 +66,29 @@ describe TokyoTyrant::Query, "with an open database" do
|
|
66
66
|
it "should get records for search conditions" do
|
67
67
|
q = @db.query
|
68
68
|
q.addcond('type', :streq, 'Garlic')
|
69
|
-
res = q.get.sort{ |x,y| x[
|
70
|
-
res.should == [{
|
71
|
-
{
|
72
|
-
{
|
69
|
+
res = q.get.sort{ |x,y| x['variety'] <=> y['variety'] }
|
70
|
+
res.should == [{ '__id' => "4609", 'variety' => "Elephant", 'code' => "4609", 'type' => "Garlic" },
|
71
|
+
{ '__id' => "3401", 'variety' => "One-clove types", 'code' => "3401", 'type' => "Garlic" },
|
72
|
+
{ '__id' => "3052", 'variety' => "String", 'code' => "3052", 'type' => "Garlic" }]
|
73
73
|
end
|
74
74
|
|
75
75
|
it "should remove records for conditions" do
|
76
76
|
q = @db.query
|
77
|
-
q.addcond(
|
77
|
+
q.addcond('type', :streq, 'Orange')
|
78
78
|
q.search.size.should == 11
|
79
79
|
q.searchout.should.be.true
|
80
80
|
q.search.size.should == 0
|
81
81
|
end
|
82
82
|
|
83
83
|
it "should chain search options" do
|
84
|
-
res = @db.query.condition(
|
84
|
+
res = @db.query.condition('type', :streq, 'Cucumber').order_by('variety', :strdesc).limit(3).search
|
85
85
|
res.should == ["4596", "4595", "4594"]
|
86
86
|
end
|
87
87
|
|
88
88
|
it "should query with a block" do
|
89
89
|
res = @db.query do |q|
|
90
|
-
q.condition(
|
91
|
-
q.order_by(
|
90
|
+
q.condition('type', :streq, 'Cucumber')
|
91
|
+
q.order_by('variety', :strdesc)
|
92
92
|
q.limit(3)
|
93
93
|
end
|
94
94
|
res.should == ["4596", "4595", "4594"]
|
@@ -96,28 +96,28 @@ describe TokyoTyrant::Query, "with an open database" do
|
|
96
96
|
|
97
97
|
it "should find with a block" do
|
98
98
|
res = @db.find do |q|
|
99
|
-
q.condition(
|
100
|
-
q.order_by(
|
99
|
+
q.condition('type', :streq, 'Cucumber')
|
100
|
+
q.order_by('variety', :strdesc)
|
101
101
|
q.limit(3)
|
102
102
|
end
|
103
|
-
res.should == [{
|
104
|
-
{
|
105
|
-
{
|
103
|
+
res.should == [{'type'=>"Cucumber", 'variety'=>"Pickling / Gherkin", '__id'=>"4596", 'code'=>"4596"},
|
104
|
+
{'type'=>"Cucumber", 'variety'=>"Lemon", '__id'=>"4595", 'code'=>"4595"},
|
105
|
+
{'type'=>"Cucumber", 'variety'=>"Japanese / White", '__id'=>"4594", 'code'=>"4594"}]
|
106
106
|
end
|
107
107
|
|
108
108
|
it "should show query count" do
|
109
|
-
res = @db.prepare_query{ |q| q.condition(
|
109
|
+
res = @db.prepare_query{ |q| q.condition('type', :streq, 'Cucumber') }.count
|
110
110
|
res.should == 5
|
111
111
|
end
|
112
112
|
|
113
113
|
it "should allow a custom pkey for a result set" do
|
114
114
|
q = @db.query
|
115
|
-
q.condition(
|
115
|
+
q.condition('type', :streq, 'Cucumber')
|
116
116
|
q.set_pkey(:pk)
|
117
|
-
q.get.should == [{
|
118
|
-
{
|
119
|
-
{
|
120
|
-
{
|
121
|
-
{
|
117
|
+
q.get.should == [{'type'=>"Cucumber", 'code'=>"4592", :pk=>"4592", 'variety'=>"Armenian"},
|
118
|
+
{'type'=>"Cucumber", 'code'=>"4593", :pk=>"4593", 'variety'=>"English / Hot House / Long Seedless / Telegraph / Continental"},
|
119
|
+
{'type'=>"Cucumber", 'code'=>"4594", :pk=>"4594", 'variety'=>"Japanese / White"},
|
120
|
+
{'type'=>"Cucumber", 'code'=>"4595", :pk=>"4595", 'variety'=>"Lemon"},
|
121
|
+
{'type'=>"Cucumber", 'code'=>"4596", :pk=>"4596", 'variety'=>"Pickling / Gherkin"}]
|
122
122
|
end
|
123
123
|
end
|
data/spec/tokyo_tyrant_spec.rb
CHANGED
@@ -25,6 +25,10 @@ describe TokyoTyrant::DB, "with an open database" do
|
|
25
25
|
@db.server.should == '127.0.0.1:45000'
|
26
26
|
end
|
27
27
|
|
28
|
+
it "should optimize" do
|
29
|
+
@db.optimize.should.be.true
|
30
|
+
end
|
31
|
+
|
28
32
|
it "should save a value" do
|
29
33
|
@db[:salad] = 'bacon bits'
|
30
34
|
@db[:salad].should == 'bacon bits'
|
@@ -35,6 +39,12 @@ describe TokyoTyrant::DB, "with an open database" do
|
|
35
39
|
@db[:salad].should == 'bacon bits'
|
36
40
|
end
|
37
41
|
|
42
|
+
it "should accept binary data" do
|
43
|
+
s = "mango#{0.chr}salsa"
|
44
|
+
@db.put(s, s).should.be.true
|
45
|
+
@db[s].should.equal(s)
|
46
|
+
end
|
47
|
+
|
38
48
|
it "should save multiple values" do
|
39
49
|
h = { 'pizza' => 'old forge style',
|
40
50
|
'sandwich' => 'peanut butter jelly',
|
@@ -211,6 +221,14 @@ describe TokyoTyrant::DB, "with an open database" do
|
|
211
221
|
@db.get_int(key).should == 2
|
212
222
|
end
|
213
223
|
|
224
|
+
it "should increment integer values" do
|
225
|
+
key = 'counter'
|
226
|
+
@db.out(key)
|
227
|
+
@db.increment(key).should == 1
|
228
|
+
@db.increment(key, 2).should == 3
|
229
|
+
@db.get_int(key).should == 3
|
230
|
+
end
|
231
|
+
|
214
232
|
it "should add serialized double values" do
|
215
233
|
key = 'counter'
|
216
234
|
@db.out(key)
|
@@ -218,4 +236,8 @@ describe TokyoTyrant::DB, "with an open database" do
|
|
218
236
|
@db.add_double(key, 1.0).should.be.close?(2.0, 0.005)
|
219
237
|
@db.get_double(key).should.be.close?(2.0, 0.005)
|
220
238
|
end
|
239
|
+
|
240
|
+
it "should run lua extensions" do
|
241
|
+
@db.ext('echo', 'hello', 'world').should == "hello\tworld"
|
242
|
+
end
|
221
243
|
end
|
@@ -25,23 +25,34 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
25
25
|
@db.server.should == '127.0.0.1:45001'
|
26
26
|
end
|
27
27
|
|
28
|
+
it "should optimize" do
|
29
|
+
@db.optimize.should.be.true
|
30
|
+
end
|
31
|
+
|
28
32
|
it "should save a value" do
|
29
|
-
value = {
|
33
|
+
value = { 'lettuce' => 'Red Leaf', 'dressing' => 'ranch', 'extra' => 'bacon bits' }
|
30
34
|
@db[:salad] = value
|
31
35
|
@db[:salad].should == value
|
32
36
|
end
|
33
37
|
|
34
38
|
it "should return a value" do
|
35
|
-
value = {
|
39
|
+
value = { 'lettuce' => 'Red Leaf', 'dressing' => 'ranch', 'extra' => 'bacon bits' }
|
36
40
|
@db[:salad] = value
|
37
41
|
@db[:salad].should == value
|
38
42
|
end
|
39
43
|
|
44
|
+
it "should accept binary data" do
|
45
|
+
s = "mango#{0.chr}salsa"
|
46
|
+
h = { s => s }
|
47
|
+
@db.put(s, h).should.be.true
|
48
|
+
@db[s].should.equal(h)
|
49
|
+
end
|
50
|
+
|
40
51
|
it "should save multiple values" do
|
41
|
-
h = { 'pizza' => {
|
42
|
-
'sandwich' => {
|
43
|
-
'yogurt' => {
|
44
|
-
'coffee' => {
|
52
|
+
h = { 'pizza' => { 'best' => 'old forge style', 'ok' => 'new york style', 'worst' => 'chicago style' },
|
53
|
+
'sandwich' => { 'best' => 'peanut butter jelly', 'ok' => 'turkey', 'worst' => 'olive loaf' },
|
54
|
+
'yogurt' => { 'best' => 'greek', 'ok' => 'organic', 'worst' => '+hfcs' },
|
55
|
+
'coffee' => { 'best' => 'black', 'ok' => 'espresso', 'worst' => 'latte' } }
|
45
56
|
|
46
57
|
@db.mput(h).should.be.empty
|
47
58
|
h.each_pair do |k,v|
|
@@ -50,10 +61,10 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
50
61
|
end
|
51
62
|
|
52
63
|
it "should delete multiple values" do
|
53
|
-
h = { 'pizza' => {
|
54
|
-
'sandwich' => {
|
55
|
-
'yogurt' => {
|
56
|
-
'coffee' => {
|
64
|
+
h = { 'pizza' => { 'best' => 'old forge style', 'ok' => 'new york style', 'worst' => 'chicago style' },
|
65
|
+
'sandwich' => { 'best' => 'peanut butter jelly', 'ok' => 'turkey', 'worst' => 'olive loaf' },
|
66
|
+
'yogurt' => { 'best' => 'greek', 'ok' => 'organic', 'worst' => '+hfcs' },
|
67
|
+
'coffee' => { 'best' => 'black', 'ok' => 'espresso', 'worst' => 'latte' } }
|
57
68
|
|
58
69
|
@db.mput(h)
|
59
70
|
@db.outlist('coffee', 'yogurt').should.be.empty
|
@@ -61,10 +72,10 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
61
72
|
end
|
62
73
|
|
63
74
|
it "should get multiple values" do
|
64
|
-
h = { 'pizza' => {
|
65
|
-
'sandwich' => {
|
66
|
-
'yogurt' => {
|
67
|
-
'coffee' => {
|
75
|
+
h = { 'pizza' => { 'best' => 'old forge style', 'ok' => 'new york style', 'worst' => 'chicago style' },
|
76
|
+
'sandwich' => { 'best' => 'peanut butter jelly', 'ok' => 'turkey', 'worst' => 'olive loaf' },
|
77
|
+
'yogurt' => { 'best' => 'greek', 'ok' => 'organic', 'worst' => '+hfcs' },
|
78
|
+
'coffee' => { 'best' => 'black', 'ok' => 'espresso', 'worst' => 'latte' } }
|
68
79
|
|
69
80
|
@db.mput(h)
|
70
81
|
@db.mget(h.keys).should == h
|
@@ -72,7 +83,7 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
72
83
|
|
73
84
|
it "should out a value" do
|
74
85
|
k = :tomato
|
75
|
-
@db[k] = {
|
86
|
+
@db[k] = { 'color' => 'red', 'variety' => 'beefy' }
|
76
87
|
@db.out(k).should.be.true
|
77
88
|
@db[k].should.be.nil
|
78
89
|
@db.out(k).should.be.false
|
@@ -80,17 +91,17 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
80
91
|
|
81
92
|
it "should check a key" do
|
82
93
|
k = :fruit
|
83
|
-
@db[k] = {
|
94
|
+
@db[k] = { 'name' => 'banana', 'code' => '4011' }
|
84
95
|
@db.check(k).should.be.true
|
85
96
|
@db.out(k)
|
86
97
|
@db.check(k).should.be.false
|
87
98
|
end
|
88
99
|
|
89
100
|
it "should iterate" do
|
90
|
-
@db[:cheese] = {
|
91
|
-
@db[:grapes] = {
|
92
|
-
@db[:oranges] = {
|
93
|
-
@db[:crackers] = {
|
101
|
+
@db[:cheese] = { 'melty' => 'gouda', 'sharp' => 'cheddar', 'stringy' => 'mozerella' }
|
102
|
+
@db[:grapes] = { 'sour' => 'green', 'big' => 'red', 'wine' => 'purple' }
|
103
|
+
@db[:oranges] = { 'juicy' => 'florida', 'yellow' => 'california' }
|
104
|
+
@db[:crackers] = { 'wheat' => 'triscuit', 'snack' => 'ritz', 'soup' => 'saltine' }
|
94
105
|
|
95
106
|
@db.iterinit.should.be.true
|
96
107
|
@db.iternext.should == 'cheese'
|
@@ -101,20 +112,20 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
101
112
|
end
|
102
113
|
|
103
114
|
it "should get forward matching keys" do
|
104
|
-
@db['apples/royalgala'] = {
|
105
|
-
@db['apples/grannysmith'] = {
|
106
|
-
@db['bananas/yellow'] = {
|
107
|
-
@db['oranges/shamouti'] = {
|
108
|
-
@db['grapefruit/deepred'] = {
|
115
|
+
@db['apples/royalgala'] = { 'code' => '4173', 'color' => 'red-yellow' }
|
116
|
+
@db['apples/grannysmith'] = { 'code' => '4139', 'color' => 'green' }
|
117
|
+
@db['bananas/yellow'] = { 'code' => '4011', 'color' => 'yellow' }
|
118
|
+
@db['oranges/shamouti'] = { 'code' => '3027', 'color' => 'orange' }
|
119
|
+
@db['grapefruit/deepred'] = { 'code' => '4288', 'color' => 'yellow/pink' }
|
109
120
|
@db.fwmkeys('apples').sort.should == ["apples/grannysmith", "apples/royalgala"]
|
110
121
|
end
|
111
122
|
|
112
123
|
it "should delete forward matching keys" do
|
113
|
-
@db['apples/royalgala'] = {
|
114
|
-
@db['apples/grannysmith'] = {
|
115
|
-
@db['bananas/yellow'] = {
|
116
|
-
@db['oranges/shamouti'] = {
|
117
|
-
@db['grapefruit/deepred'] = {
|
124
|
+
@db['apples/royalgala'] = { 'code' => '4173', 'color' => 'red-yellow' }
|
125
|
+
@db['apples/grannysmith'] = { 'code' => '4139', 'color' => 'green' }
|
126
|
+
@db['bananas/yellow'] = { 'code' => '4011', 'color' => 'yellow' }
|
127
|
+
@db['oranges/shamouti'] = { 'code' => '3027', 'color' => 'orange' }
|
128
|
+
@db['grapefruit/deepred'] = { 'code' => '4288', 'color' => 'yellow/pink' }
|
118
129
|
@db.delete_keys_with_prefix('apples').should == nil
|
119
130
|
@db.fwmkeys('apples').should.be.empty
|
120
131
|
@db.keys.sort.should == ['bananas/yellow', 'grapefruit/deepred', 'oranges/shamouti']
|
@@ -122,9 +133,9 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
122
133
|
|
123
134
|
it "should get all keys" do
|
124
135
|
keys = %w[appetizers entree dessert]
|
125
|
-
values = [{
|
126
|
-
{
|
127
|
-
{
|
136
|
+
values = [{ 'cheap' => 'chips', 'expensive' => 'sample everything platter' },
|
137
|
+
{ 'cheap' => 'hoagie', 'expensive' => 'steak' },
|
138
|
+
{ 'cheap' => 'water ice', 'expensive' => 'cheesecake' }]
|
128
139
|
|
129
140
|
keys.each_with_index do |k,i|
|
130
141
|
@db[k] = values[i]
|
@@ -134,9 +145,9 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
134
145
|
|
135
146
|
it "should get all values" do
|
136
147
|
keys = %w[appetizers entree dessert]
|
137
|
-
values = [{
|
138
|
-
{
|
139
|
-
{
|
148
|
+
values = [{ 'cheap' => 'chips', 'expensive' => 'sample everything platter' },
|
149
|
+
{ 'cheap' => 'hoagie', 'expensive' => 'steak' },
|
150
|
+
{ 'cheap' => 'water ice', 'expensive' => 'cheesecake' }]
|
140
151
|
|
141
152
|
keys.each_with_index do |k,i|
|
142
153
|
@db[k] = values[i]
|
@@ -145,36 +156,36 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
145
156
|
end
|
146
157
|
|
147
158
|
it "should vanish all records" do
|
148
|
-
@db['chocolate'] = {
|
149
|
-
@db['tea'] = {
|
159
|
+
@db['chocolate'] = { 'type' => 'dark' }
|
160
|
+
@db['tea'] = { 'type' => 'earl grey' }
|
150
161
|
@db.empty?.should.be.false
|
151
162
|
@db.vanish.should.be.true
|
152
163
|
@db.empty?.should.be.true
|
153
164
|
end
|
154
165
|
|
155
166
|
it "should count records" do
|
156
|
-
@db['hummus'] = {
|
157
|
-
@db['falafel'] = {
|
167
|
+
@db['hummus'] = { 'ingredients' => 'chickpeas,garlic' }
|
168
|
+
@db['falafel'] = { 'ingredients' => 'chickpeas,herbs' }
|
158
169
|
@db.rnum.should == 2
|
159
170
|
end
|
160
171
|
|
161
172
|
it "should report db size" do
|
162
|
-
@db['rootbeer'] = {
|
173
|
+
@db['rootbeer'] = { 'gourmet' => 'Virgils', 'natural' => 'Hansens' }
|
163
174
|
@db.db_size.should.not == 0
|
164
175
|
end
|
165
176
|
|
166
177
|
it "should fetch a record" do
|
167
178
|
@db.out('beer')
|
168
|
-
@db.fetch('beer', {
|
169
|
-
@db['beer'] = {
|
170
|
-
@db.fetch('beer', {
|
179
|
+
@db.fetch('beer', { 'import' => 'heineken' }).should == { 'import' => 'heineken' }
|
180
|
+
@db['beer'] = { 'import' => 'heineken' }
|
181
|
+
@db.fetch('beer', { 'import' => 'becks' }).should == { 'import' => 'heineken' }
|
171
182
|
end
|
172
183
|
|
173
184
|
it "should iterate through records" do
|
174
185
|
keys = %w[grapejuice tacoshells rice]
|
175
|
-
values = [{
|
176
|
-
{
|
177
|
-
{
|
186
|
+
values = [{ 'purple' => 'Kedem', 'green' => 'Juicy Juice' },
|
187
|
+
{ 'crunchy' => 'Ortega', 'soft' => 'Taco Bell' },
|
188
|
+
{ 'brown' => 'Instant', 'white' => 'Uncle Ben' }]
|
178
189
|
keys.each_with_index{ |k,i| @db[k] = values[i] }
|
179
190
|
|
180
191
|
i = 0
|
@@ -187,7 +198,7 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
187
198
|
|
188
199
|
it "should iterate through keys" do
|
189
200
|
keys = %w[burritos fajitas tacos tostas enchiladas]
|
190
|
-
values = Array.new(keys.size, {
|
201
|
+
values = Array.new(keys.size, { 'tasty' => 'yes' })
|
191
202
|
keys.each_with_index{ |k,i| @db[k] = values[i] }
|
192
203
|
|
193
204
|
i = 0
|
@@ -199,11 +210,11 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
199
210
|
|
200
211
|
it "should iterate through values" do
|
201
212
|
keys = %w[falafel humus couscous tabbouleh tzatziki]
|
202
|
-
values = [{
|
203
|
-
{
|
204
|
-
{
|
205
|
-
{
|
206
|
-
{
|
213
|
+
values = [{ 'ingredient' => 'chickpeas' },
|
214
|
+
{ 'ingredient' => 'chickpeas' },
|
215
|
+
{ 'ingredient' => 'semolina' },
|
216
|
+
{ 'ingredient' => 'bulgar' },
|
217
|
+
{ 'ingredient' => 'yogurt' }]
|
207
218
|
|
208
219
|
keys.each_with_index{ |k,i| @db[k] = values[i] }
|
209
220
|
|
@@ -217,29 +228,43 @@ describe TokyoTyrant::Table, "with an open database" do
|
|
217
228
|
it "should add serialized integer values" do
|
218
229
|
key = 'counter'
|
219
230
|
@db.out(key)
|
220
|
-
@db[key] = {
|
231
|
+
@db[key] = { 'title' => 'Bean Counter' }
|
221
232
|
@db.add_int(key, 1).should == 1
|
222
233
|
@db.add_int(key, 1).should == 2
|
223
234
|
@db.get_int(key).should == 2
|
224
|
-
@db[key].should == {
|
235
|
+
@db[key].should == { 'title' => 'Bean Counter', '_num' => "2" }
|
236
|
+
end
|
237
|
+
|
238
|
+
it "should increment integer values" do
|
239
|
+
key = 'counter'
|
240
|
+
@db.out(key)
|
241
|
+
@db[key] = { 'title' => 'Bean Counter' }
|
242
|
+
@db.increment(key).should == 1
|
243
|
+
@db.increment(key, 2).should == 3
|
244
|
+
@db.get_int(key).should == 3
|
245
|
+
@db[key].should == { 'title' => 'Bean Counter', '_num' => "3" }
|
225
246
|
end
|
226
247
|
|
227
248
|
it "should add serialized double values" do
|
228
249
|
key = 'counter'
|
229
250
|
@db.out(key)
|
230
|
-
@db[key] = {
|
251
|
+
@db[key] = { 'title' => 'Bean Counter' }
|
231
252
|
@db.add_double(key, 1.0).should.be.close?(1.0, 0.005)
|
232
253
|
@db.add_double(key, 1.0).should.be.close?(2.0, 0.005)
|
233
254
|
@db.get_double(key).should.be.close?(2.0, 0.005)
|
234
|
-
@db[key].should == {
|
255
|
+
@db[key].should == { 'title' => 'Bean Counter', '_num' => "2" }
|
235
256
|
end
|
236
257
|
|
237
258
|
it "should set an index" do
|
238
259
|
key = 'counter'
|
239
260
|
50.times do |i|
|
240
|
-
@db["key#{i}"] = {
|
241
|
-
|
261
|
+
@db["key#{i}"] = { 'title' => %w{rice beans corn}.sort_by{rand}.first,
|
262
|
+
'description' => 'a whole protein' }
|
242
263
|
end
|
243
|
-
@db.set_index(
|
264
|
+
@db.set_index('title', :lexical).should.be.true
|
265
|
+
end
|
266
|
+
|
267
|
+
it "should run lua extensions" do
|
268
|
+
@db.ext('echo', 'hello', 'world').should == "hello\tworld"
|
244
269
|
end
|
245
270
|
end
|