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 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