actsasflinn-ruby-tokyotyrant 0.1.4 → 0.1.5
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 +27 -0
- data/Rakefile +1 -1
- data/ext/tokyo_tyrant.c +1 -0
- data/ext/tokyo_tyrant_db.c +7 -0
- data/ext/tokyo_tyrant_query.c +2 -0
- data/ext/tokyo_tyrant_table.c +35 -4
- data/spec/tokyo_tyrant_query_spec.rb +21 -1
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -84,6 +84,33 @@ This is not in production but the initial benchmarks are very interesting. Resul
|
|
84
84
|
q.get
|
85
85
|
# => [{:__id=>"99", :sex=>"male", :name=>"Pat 99"}, {:__id=>"97", :sex=>"male", :name=>"Pat 97"}, {:__id=>"95", :sex=>"male", :name=>"Pat 95"}, {:__id=>"93", :sex=>"male", :name=>"Pat 93"}, {:__id=>"91", :sex=>"male", :name=>"Pat 91"}]
|
86
86
|
|
87
|
+
# Alternative Syntax (better)
|
88
|
+
|
89
|
+
# Query using a block
|
90
|
+
t.query{ |q|
|
91
|
+
q.condition('sex', :streq, 'male')
|
92
|
+
q.limit(5)
|
93
|
+
}
|
94
|
+
# => ["1", "3", "5", "7", "9"]
|
95
|
+
|
96
|
+
# Get records for a query
|
97
|
+
t.find{ |q|
|
98
|
+
q.condition('sex', :streq, 'male')
|
99
|
+
q.limit(5)
|
100
|
+
}
|
101
|
+
# => [{:sex=>"male", :name=>"Pat 1", :__id=>"1"}, {:sex=>"male", :name=>"Pat 3", :__id=>"3"}, {:sex=>"male", :name=>"Pat 5", :__id=>"5"}, {:sex=>"male", :name=>"Pat 7", :__id=>"7"}, {:sex=>"male", :name=>"Pat 9", :__id=>"9"}]
|
102
|
+
|
103
|
+
# Prepare but don't run a search, return a prepared query object
|
104
|
+
q = t.prepare_query{ |q|
|
105
|
+
q.condition('sex', :streq, 'male')
|
106
|
+
q.limit(5)
|
107
|
+
}
|
108
|
+
# => #<TokyoTyrant::Query:0x247c14 @rdb=#<Object:0x2800a0>, @rdbquery=#<Object:0x247c00>>
|
109
|
+
q.search
|
110
|
+
# => ["1", "3", "5", "7", "9"]
|
111
|
+
q.get
|
112
|
+
# => [{:sex=>"male", :name=>"Pat 1", :__id=>"1"}, {:sex=>"male", :name=>"Pat 3", :__id=>"3"}, {:sex=>"male", :name=>"Pat 5", :__id=>"5"}, {:sex=>"male", :name=>"Pat 7", :__id=>"7"}, {:sex=>"male", :name=>"Pat 9", :__id=>"9"}]
|
113
|
+
|
87
114
|
== TODO
|
88
115
|
* implement get_reverse for has_value?
|
89
116
|
* fix up and test extensions
|
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.5'
|
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
data/ext/tokyo_tyrant_db.c
CHANGED
@@ -48,6 +48,7 @@ static VALUE cDB_mput(VALUE vself, VALUE vhash){
|
|
48
48
|
args = vhashtolist(vhash);
|
49
49
|
list = tcrdbmisc(db, "putlist", 0, args);
|
50
50
|
vary = listtovary(list);
|
51
|
+
tclistdel(args);
|
51
52
|
tclistdel(list);
|
52
53
|
return vary;
|
53
54
|
}
|
@@ -181,6 +182,8 @@ static VALUE cDB_each(VALUE vself){
|
|
181
182
|
while((kxstr = tcrdbiternext2(db)) != NULL){
|
182
183
|
vxstr = tcrdbget2(db, kxstr);
|
183
184
|
vrv = rb_yield_values(2, rb_str_new2(kxstr), rb_str_new2(vxstr));
|
185
|
+
tcfree(vxstr);
|
186
|
+
tcfree(kxstr);
|
184
187
|
}
|
185
188
|
return vrv;
|
186
189
|
}
|
@@ -196,6 +199,8 @@ static VALUE cDB_each_value(VALUE vself){
|
|
196
199
|
while((kxstr = tcrdbiternext2(db)) != NULL){
|
197
200
|
vxstr = tcrdbget2(db, kxstr);
|
198
201
|
vrv = rb_yield_values(1, rb_str_new2(vxstr));
|
202
|
+
tcfree(vxstr);
|
203
|
+
tcfree(kxstr);
|
199
204
|
}
|
200
205
|
return vrv;
|
201
206
|
}
|
@@ -210,6 +215,8 @@ static VALUE cDB_values(VALUE vself){
|
|
210
215
|
while((kxstr = tcrdbiternext2(db)) != NULL){
|
211
216
|
vxstr = tcrdbget2(db, kxstr);
|
212
217
|
rb_ary_push(vary, rb_str_new2(vxstr));
|
218
|
+
tcfree(vxstr);
|
219
|
+
tcfree(kxstr);
|
213
220
|
}
|
214
221
|
return vary;
|
215
222
|
}
|
data/ext/tokyo_tyrant_query.c
CHANGED
@@ -138,12 +138,14 @@ void init_query(){
|
|
138
138
|
|
139
139
|
rb_define_private_method(cQuery, "initialize", cQuery_initialize, 1);
|
140
140
|
rb_define_method(cQuery, "addcond", cQuery_addcond, 3);
|
141
|
+
rb_define_alias(cQuery, "add_condition", "addcond");
|
141
142
|
rb_define_alias(cQuery, "condition", "addcond");
|
142
143
|
rb_define_method(cQuery, "setorder", cQuery_setorder, 2);
|
143
144
|
rb_define_alias(cQuery, "order_by", "setorder");
|
144
145
|
rb_define_method(cQuery, "setmax", cQuery_setmax, 1);
|
145
146
|
rb_define_alias(cQuery, "limit", "setmax");
|
146
147
|
rb_define_method(cQuery, "search", cQuery_search, 0);
|
148
|
+
rb_define_alias(cQuery, "run", "search");
|
147
149
|
rb_define_method(cQuery, "searchout", cQuery_searchout, 0);
|
148
150
|
rb_define_method(cQuery, "get", cQuery_get, 0);
|
149
151
|
}
|
data/ext/tokyo_tyrant_table.c
CHANGED
@@ -44,7 +44,7 @@ static VALUE cTable_mput(VALUE vself, VALUE vhash){
|
|
44
44
|
int i, num, j;
|
45
45
|
VALUE vary, vkeys, vkey, vval;
|
46
46
|
TCRDB *db;
|
47
|
-
TCLIST *list;
|
47
|
+
TCLIST *list, *result;
|
48
48
|
Data_Get_Struct(rb_iv_get(vself, RDBVNDATA), TCRDB, db);
|
49
49
|
|
50
50
|
vkeys = rb_funcall(vhash, rb_intern("keys"), 0);
|
@@ -67,11 +67,13 @@ static VALUE cTable_mput(VALUE vself, VALUE vhash){
|
|
67
67
|
tcxstrcat(xstr, rbuf, rsiz);
|
68
68
|
}
|
69
69
|
tclistpush(list, tcxstrptr(xstr), tcxstrsize(xstr));
|
70
|
+
tclistdel(cols);
|
70
71
|
tcxstrdel(xstr);
|
71
72
|
}
|
72
|
-
|
73
|
-
vary = listtovary(list);
|
73
|
+
result = tcrdbmisc(db, "putlist", 0, list);
|
74
74
|
tclistdel(list);
|
75
|
+
vary = listtovary(result);
|
76
|
+
tclistdel(result);
|
75
77
|
return vary;
|
76
78
|
}
|
77
79
|
|
@@ -138,6 +140,7 @@ static VALUE cTable_mget(int argc, VALUE *argv, VALUE vself){
|
|
138
140
|
vbuf = tcmapiterval(kbuf, &vsiz);
|
139
141
|
cols = tcstrsplit4(vbuf, vsiz);
|
140
142
|
vcols = maptovhashsym(cols);
|
143
|
+
tcmapdel(cols);
|
141
144
|
rb_hash_aset(vhash, rb_str_new(kbuf, ksiz), vcols);
|
142
145
|
}
|
143
146
|
tcmapdel(recs);
|
@@ -230,12 +233,37 @@ static VALUE cTable_values(VALUE vself){
|
|
230
233
|
cols = tcrdbtblget(db, kxstr, ksiz);
|
231
234
|
rb_ary_push(vary, maptovhashsym(cols));
|
232
235
|
tcmapdel(cols);
|
236
|
+
tcfree(kxstr);
|
233
237
|
}
|
234
238
|
return vary;
|
235
239
|
}
|
236
240
|
|
241
|
+
// Probably should dry these up
|
242
|
+
static VALUE cTable_prepare_query(VALUE vself){
|
243
|
+
VALUE vqry;
|
244
|
+
vqry = rb_class_new_instance(1, &vself, rb_path2class("TokyoTyrant::Query"));
|
245
|
+
if(rb_block_given_p()) rb_yield_values(1, vqry);
|
246
|
+
return vqry;
|
247
|
+
}
|
248
|
+
|
237
249
|
static VALUE cTable_query(VALUE vself){
|
238
|
-
|
250
|
+
VALUE vqry, vary;
|
251
|
+
vqry = rb_class_new_instance(1, &vself, rb_path2class("TokyoTyrant::Query"));
|
252
|
+
if(rb_block_given_p()) {
|
253
|
+
rb_yield_values(1, vqry);
|
254
|
+
vary = rb_funcall(vqry, rb_intern("run"), 0);
|
255
|
+
return vary;
|
256
|
+
} else {
|
257
|
+
return vqry;
|
258
|
+
}
|
259
|
+
}
|
260
|
+
|
261
|
+
static VALUE cTable_find(VALUE vself){
|
262
|
+
VALUE vqry, vary;
|
263
|
+
vqry = rb_class_new_instance(1, &vself, rb_path2class("TokyoTyrant::Query"));
|
264
|
+
if(rb_block_given_p()) rb_yield_values(1, vqry);
|
265
|
+
vary = rb_funcall(vqry, rb_intern("get"), 0);
|
266
|
+
return vary;
|
239
267
|
}
|
240
268
|
|
241
269
|
void init_table(){
|
@@ -250,10 +278,13 @@ void init_table(){
|
|
250
278
|
rb_define_alias(cTable, "[]", "get");
|
251
279
|
rb_define_method(cTable, "setindex", cTable_setindex, 2);
|
252
280
|
rb_define_method(cTable, "genuid", cTable_genuid, 0);
|
281
|
+
rb_define_alias(cTable, "generate_unique_id", "genuid");
|
253
282
|
rb_define_method(cTable, "fetch", cTable_fetch, -1);
|
254
283
|
rb_define_method(cTable, "each", cTable_each, 0);
|
255
284
|
rb_define_alias(cTable, "each_pair", "each");
|
256
285
|
rb_define_method(cTable, "each_value", cTable_each_value, 0);
|
257
286
|
rb_define_method(cTable, "values", cTable_values, 0);
|
287
|
+
rb_define_method(cTable, "prepare_query", cTable_prepare_query, 0);
|
258
288
|
rb_define_method(cTable, "query", cTable_query, 0);
|
289
|
+
rb_define_method(cTable, "find", cTable_find, 0);
|
259
290
|
}
|
@@ -4,7 +4,7 @@ require Pathname(__FILE__).dirname.join('spec_base') unless $root
|
|
4
4
|
describe TokyoTyrant::Query, "with an open database" do
|
5
5
|
@db = TokyoTyrant::Table.new('127.0.0.1', 45001)
|
6
6
|
@db.clear
|
7
|
-
load('plu_db.rb')
|
7
|
+
load('spec/plu_db.rb')
|
8
8
|
@db.mput($codes)
|
9
9
|
|
10
10
|
it "should get a query object" do
|
@@ -68,4 +68,24 @@ describe TokyoTyrant::Query, "with an open database" do
|
|
68
68
|
res = @db.query.condition(:type, :streq, 'Cucumber').order_by(:variety, :strdesc).limit(3).search
|
69
69
|
res.should == ["4596", "4595", "4594"]
|
70
70
|
end
|
71
|
+
|
72
|
+
it "should query with a block" do
|
73
|
+
res = @db.query do |q|
|
74
|
+
q.condition(:type, :streq, 'Cucumber')
|
75
|
+
q.order_by(:variety, :strdesc)
|
76
|
+
q.limit(3)
|
77
|
+
end
|
78
|
+
res.should == ["4596", "4595", "4594"]
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should find with a block" do
|
82
|
+
res = @db.find do |q|
|
83
|
+
q.condition(:type, :streq, 'Cucumber')
|
84
|
+
q.order_by(:variety, :strdesc)
|
85
|
+
q.limit(3)
|
86
|
+
end
|
87
|
+
res.should == [{:type=>"Cucumber", :variety=>"Pickling / Gherkin", :__id=>"4596", :code=>"4596"},
|
88
|
+
{:type=>"Cucumber", :variety=>"Lemon", :__id=>"4595", :code=>"4595"},
|
89
|
+
{:type=>"Cucumber", :variety=>"Japanese / White", :__id=>"4594", :code=>"4594"}]
|
90
|
+
end
|
71
91
|
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.5
|
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-04-
|
12
|
+
date: 2009-04-11 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|