actsasflinn-ruby-tokyotyrant 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
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.4'
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
@@ -110,6 +110,7 @@ extern TCMAP *varytomap(VALUE vary){
110
110
  const char *kbuf = tclistval(keys, i, &ksiz);
111
111
  tcmapput(recs, kbuf, ksiz, "", 0);
112
112
  }
113
+ tclistdel(keys);
113
114
  return recs;
114
115
  }
115
116
 
@@ -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
  }
@@ -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
  }
@@ -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
- list = tcrdbmisc(db, "putlist", 0, list);
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
- return rb_class_new_instance(1, &vself, rb_path2class("TokyoTyrant::Query"));
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
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-05 00:00:00 -07:00
12
+ date: 2009-04-11 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15