rufus-tokyo 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,6 +2,16 @@
2
2
  = rufus-tokyo CHANGELOG.txt
3
3
 
4
4
 
5
+ == rufus-tokyo - 1.0.1 released 2009/09/18
6
+
7
+ - todo : add #putcat to Cabinet / Tyrant (Edo and Tokyo)
8
+ - todo : implemented search/union/intersection/difference for tables
9
+ - todo : added #putdup and #get4 to Cabinet (Edo and Tokyo)
10
+ - todo : better dylib 'detection' (Pietro Ferrari)
11
+ - todo : aliased lget to mget (thanks Runa)
12
+ - todo : proper Abort exception (Kenneth Kalmer)
13
+
14
+
5
15
  == rufus-tokyo - 1.0.0 released 2009/07/23
6
16
 
7
17
  - todo : merged in Jeremy Hinegardner's Dystopia work
@@ -11,6 +11,8 @@ Jeremy Hinegardner http://www.copiousfreetime.org/
11
11
 
12
12
  == contributors
13
13
 
14
+ Pietro Ferrari http://github.com/pietroferrari
15
+ Kenneth Kalmer http://www.opensourcery.co.za/
14
16
  Adam Keys http://github.com/therealadam
15
17
  Marcos Piccinini http://github.com/nofxx
16
18
  Matthew King http://github.com/automatthew
@@ -22,6 +24,9 @@ Mark 'mebaran' http://github.com/mebaran
22
24
 
23
25
  == feedback / support
24
26
 
27
+ James Edward Gray II http://blog.grayproductions.net/
28
+ Alexandre Gravem
29
+ Philippe Monnet http://blog.monnet-usa.com/
25
30
  Ilya Grigorik http://igvita.com
26
31
  Elise Huard http://blog.elisehuard.be/
27
32
 
@@ -31,15 +31,27 @@ the rdoc is at http://rufus.rubyforge.org/rufus-tokyo/
31
31
 
32
32
  this 'master' branch/version of rufus-tokyo works with
33
33
 
34
- ffi 0.3.1, 0.3.5
34
+ ffi 0.3.1, 0.3.5, 0.4.0, 0.5.0
35
35
 
36
36
  ruby 1.8.6
37
37
  ruby 1.9.1p129
38
38
  jruby 1.1.6, 1.2.0, 1.3.1
39
39
 
40
- TC 1.4.27 / 28 and TT 1.1.29
40
+ TC 1.4.27 / 29 and TT 1.1.29 / 33
41
41
 
42
- tc-ruby 1.26 and tt-ruby 1.10 (Rufus::Edo)
42
+ tc-ruby 1.26 / 29 and tt-ruby 1.10 / 12 (Rufus::Edo)
43
+
44
+
45
+ == Rufus::Tokyo : pointing to the right library
46
+
47
+ By default Rufus::Tokyo (the FFI side) searches for Tokyo Cabinet and Tyrant dynamic libraries under /usr/lib/, /usr/lib64/, /opt/local/lib/ and /usr/local/lib/
48
+
49
+ If you had to install Tokyo Cabinet (and Tokyo Tyrant) in another location, you can set the environment variables TOKYO_CABINET_LIB and TOKYO_TYRANT_LIB to point to the absolute path of the dynamic library, like in :
50
+
51
+ export TOKYO_CABINET_LIB = /home/toto/tc/libtokyocabinet.so
52
+ export TOKYO_TYRANT_LIB = /home/toto/tc/libtokyotyrant.so
53
+
54
+ So that your rufus-tokyo enabled Ruby application can see the libraries.
43
55
 
44
56
 
45
57
  === TC Abstract API
data/TODO.txt CHANGED
@@ -34,4 +34,5 @@
34
34
 
35
35
  [ ] implement q.metasearch(q, u)
36
36
  [ ] kwic ?
37
+ [x] maybe Edo::Abort vs Tokyo::Abort
37
38
 
@@ -79,7 +79,8 @@ module Rufus::Edo
79
79
  @db.put(k, v) || raise_error
80
80
  end
81
81
 
82
- # No comment
82
+ # Like #put but doesn't overwrite the value if already set. Returns true
83
+ # only if there no previous entry for k.
83
84
  #
84
85
  def putkeep (k, v)
85
86
 
@@ -88,6 +89,18 @@ module Rufus::Edo
88
89
  @db.putkeep(k, v)
89
90
  end
90
91
 
92
+ # Appends the given string at the end of the current string value for key k.
93
+ # If there is no record for key k, a new record will be created.
94
+ #
95
+ # Returns true if successful.
96
+ #
97
+ def putcat (k, v)
98
+
99
+ k = k.to_s; v = v.to_s
100
+
101
+ @db.putcat(k, v)
102
+ end
103
+
91
104
  # (The actual #[] method is provided by HashMethods)
92
105
  #
93
106
  def get (k)
@@ -235,6 +248,8 @@ module Rufus::Edo
235
248
  end
236
249
  end
237
250
 
251
+ alias :mget :lget
252
+
238
253
  # Default impl provided by HashMethods
239
254
  #
240
255
  def merge! (hash)
@@ -214,6 +214,23 @@ module Rufus::Edo
214
214
  self.default = params[:default]
215
215
  @default_proc ||= params[:default_proc]
216
216
  end
217
+
218
+ # This is a B+ Tree method only, puts a value for a key who has
219
+ # [potentially] multiple values.
220
+ #
221
+ def putdup (k, v)
222
+
223
+ @db.putdup(k, v)
224
+ end
225
+
226
+ # This is a B+ Tree method only, returns all the values for a given
227
+ # key.
228
+ #
229
+ def get4 (k)
230
+
231
+ @db.getlist(k)
232
+ end
233
+ alias :getdup :get4
217
234
  end
218
235
  end
219
236
 
@@ -109,6 +109,8 @@ module Rufus::Edo
109
109
  h
110
110
  end
111
111
 
112
+ alias :mget :lget
113
+
112
114
  def transaction #:nodoc#
113
115
  raise NoMethodError.new("NetTyrant : transactions not supported")
114
116
  end
@@ -202,6 +202,8 @@ module Rufus::Edo
202
202
  end
203
203
  end
204
204
 
205
+ alias :mget :lget
206
+
205
207
  # Returns the number of records in this table db
206
208
  #
207
209
  def size
@@ -272,8 +274,120 @@ module Rufus::Edo
272
274
  @db
273
275
  end
274
276
 
277
+ # Returns the union of the listed queries
278
+ #
279
+ # r = table.union(
280
+ # @t.prepare_query { |q|
281
+ # q.add 'lang', :includes, 'es'
282
+ # },
283
+ # @t.prepare_query { |q|
284
+ # q.add 'lang', :includes, 'li'
285
+ # }
286
+ # )
287
+ #
288
+ # will return a hash { primary_key => record } of the values matching
289
+ # the first query OR the second.
290
+ #
291
+ # If the last element element passed to this method is the value 'false',
292
+ # the return value will the array of matching primary keys.
293
+ #
294
+ def union (*queries)
295
+
296
+ search(:union, *queries)
297
+ end
298
+
299
+ # Returns the intersection of the listed queries
300
+ #
301
+ # r = table.intersection(
302
+ # @t.prepare_query { |q|
303
+ # q.add 'lang', :includes, 'es'
304
+ # },
305
+ # @t.prepare_query { |q|
306
+ # q.add 'lang', :includes, 'li'
307
+ # }
308
+ # )
309
+ #
310
+ # will return a hash { primary_key => record } of the values matching
311
+ # the first query AND the second.
312
+ #
313
+ # If the last element element passed to this method is the value 'false',
314
+ # the return value will the array of matching primary keys.
315
+ #
316
+ def intersection (*queries)
317
+
318
+ search(:intersection, *queries)
319
+ end
320
+
321
+ # Returns the difference of the listed queries
322
+ #
323
+ # r = table.intersection(
324
+ # @t.prepare_query { |q|
325
+ # q.add 'lang', :includes, 'es'
326
+ # },
327
+ # @t.prepare_query { |q|
328
+ # q.add 'lang', :includes, 'li'
329
+ # }
330
+ # )
331
+ #
332
+ # will return a hash { primary_key => record } of the values matching
333
+ # the first query OR the second but not both.
334
+ #
335
+ # If the last element element passed to this method is the value 'false',
336
+ # the return value will the array of matching primary keys.
337
+ #
338
+ def difference (*queries)
339
+
340
+ search(:difference, *queries)
341
+ end
342
+
343
+ # A #search a la ruby-tokyotyrant
344
+ # (http://github.com/actsasflinn/ruby-tokyotyrant/tree)
345
+ #
346
+ # r = table.search(
347
+ # :intersection,
348
+ # @t.prepare_query { |q|
349
+ # q.add 'lang', :includes, 'es'
350
+ # },
351
+ # @t.prepare_query { |q|
352
+ # q.add 'lang', :includes, 'li'
353
+ # }
354
+ # )
355
+ #
356
+ # Accepts the symbols :union, :intersection, :difference or :diff as
357
+ # first parameter.
358
+ #
359
+ # If the last element element passed to this method is the value 'false',
360
+ # the return value will the array of matching primary keys.
361
+ #
362
+ def search (type, *queries)
363
+
364
+ run_query = true
365
+ run_query = queries.pop if queries.last == false
366
+
367
+ raise(
368
+ ArgumentError.new("pass at least one prepared query")
369
+ ) if queries.size < 1
370
+
371
+ t = META_TYPES[type]
372
+
373
+ raise(
374
+ ArgumentError.new("no search type #{type.inspect}")
375
+ ) unless t
376
+
377
+ q = queries.shift.original
378
+ qs = queries.collect { |qq| qq.original }
379
+
380
+ pks = q.metasearch(qs, META_TYPES[type])
381
+
382
+ run_query ? lget(pks) : pks
383
+ end
384
+
275
385
  protected
276
386
 
387
+ META_TYPES = {
388
+ :union => 0, :intersection => 1, :difference => 2, :diff => 2
389
+ }
390
+
277
391
  # Returns the value (as a Ruby Hash) else nil
278
392
  #
279
393
  # (the actual #[] method is provided by HashMethods)
@@ -335,6 +449,13 @@ module Rufus::Edo
335
449
  @opts = {}
336
450
  end
337
451
 
452
+ # Returns the original, underlying RDBQUERY instance.
453
+ #
454
+ def original
455
+
456
+ @query
457
+ end
458
+
338
459
  # Adds a condition
339
460
  #
340
461
  # table.query { |q|
@@ -29,7 +29,7 @@ require 'ffi' # sudo gem install ffi
29
29
  module Rufus
30
30
  module Tokyo
31
31
 
32
- VERSION = '1.0.0'
32
+ VERSION = '1.0.1'
33
33
 
34
34
  #
35
35
  # A common error class
@@ -267,6 +267,19 @@ module Rufus::Tokyo
267
267
  @db, k, Rufus::Tokyo.blen(k), v, Rufus::Tokyo.blen(v)) == 1)
268
268
  end
269
269
 
270
+ # Appends the given string at the end of the current string value for key k.
271
+ # If there is no record for key k, a new record will be created.
272
+ #
273
+ # Returns true if successful.
274
+ #
275
+ def putcat (k, v)
276
+
277
+ k = k.to_s; v = v.to_s
278
+
279
+ (lib.abs_putcat(
280
+ @db, k, Rufus::Tokyo.blen(k), v, Rufus::Tokyo.blen(v)) == 1)
281
+ end
282
+
270
283
  # (The actual #[] method is provided by HashMethods
271
284
  #
272
285
  def get (k)
@@ -427,6 +440,8 @@ module Rufus::Tokyo
427
440
  Hash[*call_misc('getlist', Rufus::Tokyo::List.new(keys))]
428
441
  end
429
442
 
443
+ alias :mget :lget
444
+
430
445
  # Merges the given hash into this Cabinet (or Tyrant) and returns self.
431
446
  #
432
447
  def merge! (hash)
@@ -525,14 +540,55 @@ module Rufus::Tokyo
525
540
  libcall(:tcadbtranabort)
526
541
  end
527
542
 
543
+ #--
544
+ #
545
+ # BTREE methods
546
+ #
547
+ #++
548
+
549
+ # This is a B+ Tree method only, puts a value for a key who has
550
+ # [potentially] multiple values.
551
+ #
552
+ def putdup (k, v)
553
+
554
+ lib.tcbdbputdup(
555
+ as_btree, k, Rufus::Tokyo.blen(k), v, Rufus::Tokyo.blen(v))
556
+ end
557
+
558
+ # This is a B+ Tree method only, returns all the values for a given
559
+ # key.
560
+ #
561
+ def get4 (k)
562
+
563
+ l = lib.tcbdbget4(as_btree, k, Rufus::Tokyo.blen(k))
564
+
565
+ Rufus::Tokyo::List.new(l).release
566
+ end
567
+ alias :getdup :get4
568
+
528
569
  protected
529
570
 
571
+ # Returns the pointer to the btree hiding behind the abstract structure.
572
+ #
573
+ # Will raise an argument error if the structure behind the abstract db
574
+ # is not a B+ Tree structure.
575
+ #
576
+ def as_btree
577
+
578
+ raise(NoMethodError.new("cannot call B+ Tree function on #{@path}")) \
579
+ if ! @path.match(/\.tcb$/)
580
+
581
+ lib.tcadbreveal(@db)
582
+ end
583
+
584
+ #--
530
585
  #def check_transaction_support
531
586
  # raise(TokyoError.new(
532
587
  # "The version of Tokyo Cabinet you're using doesn't support " +
533
588
  # "transactions for non-table structures. Upgrade to TC >= 1.4.13.")
534
589
  # ) unless lib.respond_to?(:tcadbtranbegin)
535
590
  #end
591
+ #++
536
592
 
537
593
  # Wrapping tcadbmisc or tcrdbmisc
538
594
  # (and taking care of freeing the list_pointer)
@@ -35,14 +35,9 @@ module Rufus::Tokyo
35
35
  #
36
36
  # find Tokyo Cabinet lib
37
37
 
38
- paths = Array(ENV['TOKYO_CABINET_LIB'] || %w[
39
- /usr/lib/libtokyocabinet.so
40
- /usr/lib64/libtokyocabinet.so
41
- /opt/local/lib/libtokyocabinet.dylib
42
- /opt/local/lib/libtokyocabinet.so
43
- /usr/local/lib/libtokyocabinet.dylib
44
- /usr/local/lib/libtokyocabinet.so
45
- ])
38
+ paths =
39
+ Array(ENV['TOKYO_CABINET_LIB'] ||
40
+ Dir['/{opt,usr}/{,local/}lib{,64}/libtokyocabinet.{dylib,so*}'])
46
41
 
47
42
  begin
48
43
 
@@ -93,6 +88,7 @@ module Rufus::Tokyo
93
88
  attfunc :abs_out, :tcadbout, [ :pointer, :pointer, :int ], :int
94
89
 
95
90
  attfunc :abs_putkeep, :tcadbputkeep, [ :pointer, :pointer, :int, :pointer, :int ], :int
91
+ attfunc :abs_putcat, :tcadbputcat, [ :pointer, :pointer, :int, :pointer, :int ], :int
96
92
 
97
93
  attfunc :abs_iterinit, :tcadbiterinit, [ :pointer ], :int
98
94
  attfunc :abs_iternext, :tcadbiternext, [ :pointer, :pointer ], :pointer
@@ -109,6 +105,8 @@ module Rufus::Tokyo
109
105
  attfunc :addint, :tcadbaddint, [ :pointer, :string, :int, :int ], :int
110
106
  attfunc :adddouble, :tcadbadddouble, [ :pointer, :string, :int, :double ], :double
111
107
 
108
+ attfunc :tcadbreveal, [ :pointer ], :pointer
109
+
112
110
  # since TC 1.4.13
113
111
  attfunc :tcadbtranbegin, [ :pointer ], :int
114
112
  attfunc :tcadbtrancommit, [ :pointer ], :int
@@ -163,6 +161,8 @@ module Rufus::Tokyo
163
161
 
164
162
  attfunc :tab_fwmkeys, :tctdbfwmkeys, [ :pointer, :pointer, :int, :int ], :pointer
165
163
 
164
+ attfunc :tab_metasearch, :tctdbmetasearch, [ :pointer, :int, :int ], :pointer
165
+
166
166
  #
167
167
  # tctdbqry functions
168
168
  #
@@ -190,6 +190,14 @@ module Rufus::Tokyo
190
190
  # since TC 1.4.12
191
191
  attfunc :qry_count, :tctdbqrycount, [ :pointer ], :int
192
192
 
193
+ #
194
+ # tcbdb functions
195
+ #
196
+ # http://tokyocabinet.sourceforge.net/spex-en.html#tcbdbapi
197
+
198
+ attfunc :tcbdbputdup, [ :pointer, :pointer, :int, :pointer, :int ], :int
199
+ attfunc :tcbdbget4, [ :pointer, :pointer, :int ], :pointer
200
+
193
201
  #
194
202
  # tcmap functions
195
203
  #
@@ -354,6 +354,8 @@ module Rufus::Tokyo
354
354
  keys.inject({}) { |h, k| k = k.to_s; v = self[k]; h[k] = v if v; h }
355
355
  end
356
356
 
357
+ alias :mget :lget
358
+
357
359
  # Returns the number of records in this table db
358
360
  #
359
361
  def size
@@ -442,11 +444,132 @@ module Rufus::Tokyo
442
444
  # Returns the actual pointer to the Tokyo Cabinet table
443
445
  #
444
446
  def pointer
447
+
445
448
  @db
446
449
  end
447
450
 
451
+ # Returns the union of the listed queries
452
+ #
453
+ # r = table.union(
454
+ # @t.prepare_query { |q|
455
+ # q.add 'lang', :includes, 'es'
456
+ # },
457
+ # @t.prepare_query { |q|
458
+ # q.add 'lang', :includes, 'li'
459
+ # }
460
+ # )
461
+ #
462
+ # will return a hash { primary_key => record } of the values matching
463
+ # the first query OR the second.
464
+ #
465
+ # If the last element element passed to this method is the value 'false',
466
+ # the return value will the array of matching primary keys.
467
+ #
468
+ def union (*queries)
469
+
470
+ search(:union, *queries)
471
+ end
472
+
473
+ # Returns the intersection of the listed queries
474
+ #
475
+ # r = table.intersection(
476
+ # @t.prepare_query { |q|
477
+ # q.add 'lang', :includes, 'es'
478
+ # },
479
+ # @t.prepare_query { |q|
480
+ # q.add 'lang', :includes, 'li'
481
+ # }
482
+ # )
483
+ #
484
+ # will return a hash { primary_key => record } of the values matching
485
+ # the first query AND the second.
486
+ #
487
+ # If the last element element passed to this method is the value 'false',
488
+ # the return value will the array of matching primary keys.
489
+ #
490
+ def intersection (*queries)
491
+
492
+ search(:intersection, *queries)
493
+ end
494
+
495
+ # Returns the difference of the listed queries
496
+ #
497
+ # r = table.intersection(
498
+ # @t.prepare_query { |q|
499
+ # q.add 'lang', :includes, 'es'
500
+ # },
501
+ # @t.prepare_query { |q|
502
+ # q.add 'lang', :includes, 'li'
503
+ # }
504
+ # )
505
+ #
506
+ # will return a hash { primary_key => record } of the values matching
507
+ # the first query OR the second but not both.
508
+ #
509
+ # If the last element element passed to this method is the value 'false',
510
+ # the return value will the array of matching primary keys.
511
+ #
512
+ def difference (*queries)
513
+
514
+ search(:difference, *queries)
515
+ end
516
+
517
+ # A #search a la ruby-tokyotyrant
518
+ # (http://github.com/actsasflinn/ruby-tokyotyrant/tree)
519
+ #
520
+ # r = table.search(
521
+ # :intersection,
522
+ # @t.prepare_query { |q|
523
+ # q.add 'lang', :includes, 'es'
524
+ # },
525
+ # @t.prepare_query { |q|
526
+ # q.add 'lang', :includes, 'li'
527
+ # }
528
+ # )
529
+ #
530
+ # Accepts the symbols :union, :intersection, :difference or :diff as
531
+ # first parameter.
532
+ #
533
+ # If the last element element passed to this method is the value 'false',
534
+ # the return value will the array of matching primary keys.
535
+ #
536
+ def search (type, *queries)
537
+
538
+ run_query = true
539
+ run_query = queries.pop if queries.last == false
540
+
541
+ raise(
542
+ ArgumentError.new("pass at least one prepared query")
543
+ ) if queries.size < 1
544
+
545
+ raise(
546
+ ArgumentError.new("pass instances of Rufus::Tokyo::TableQuery only")
547
+ ) if queries.find { |q| q.class != TableQuery }
548
+
549
+ t = META_TYPES[type]
550
+
551
+ raise(
552
+ ArgumentError.new("no search type #{type.inspect}")
553
+ ) unless t
554
+
555
+ qs = FFI::MemoryPointer.new(:pointer, queries.size)
556
+ qs.write_array_of_pointer(queries.collect { |q| q.pointer })
557
+
558
+ r = lib.tab_metasearch(qs, queries.size, t)
559
+
560
+ qs.free
561
+
562
+ pks = Rufus::Tokyo::List.new(r).release
563
+
564
+ run_query ? lget(pks) : pks
565
+ end
566
+
448
567
  protected
449
568
 
569
+ META_TYPES = {
570
+ :union => 0, :intersection => 1, :difference => 2, :diff => 2
571
+ }
572
+
450
573
  # Returns the value (as a Ruby Hash) else nil
451
574
  #
452
575
  # (the actual #[] method is provided by HashMethods)
@@ -510,10 +633,20 @@ module Rufus::Tokyo
510
633
  @opts = {}
511
634
  end
512
635
 
636
+ # Returns the FFI lib the table uses.
637
+ #
513
638
  def lib
639
+
514
640
  @table.lib
515
641
  end
516
642
 
643
+ # Returns the underlying pointer.
644
+ #
645
+ def pointer
646
+
647
+ @query
648
+ end
649
+
517
650
  # Adds a condition
518
651
  #
519
652
  # table.query { |q|
@@ -35,14 +35,7 @@ module Rufus::Tokyo
35
35
  #
36
36
  # find Tokyo Dystopia lib
37
37
 
38
- paths = Array(ENV['TOKYO_DYSTOPIA_LIB'] || %w{
39
- /usr/lib/libtokyodystopia.so
40
- /usr/lib64/libtokyodystopia.so
41
- /opt/local/lib/libtokyodystopia.dylib
42
- /opt/local/lib/libtokyodystopia.so
43
- /usr/local/lib/libtokyodystopia.dylib
44
- /usr/local/lib/libtokyodystopia.so
45
- })
38
+ paths = Array(ENV['TOKYO_DYSTOPIA_LIB'] || Dir['/{opt,usr}/{,local/}lib{,64}/libtokyodystopia.{dylib,so*}'])
46
39
 
47
40
  path = paths.find { |path| File.exist?(path) }
48
41
 
@@ -54,8 +54,11 @@ module Tokyo
54
54
  tranbegin
55
55
  yield
56
56
  trancommit
57
+ rescue Rufus::Tokyo::Transactions::Abort
58
+ tranabort
57
59
  rescue Exception => e
58
60
  tranabort
61
+ raise e
59
62
  end
60
63
  end
61
64
 
@@ -65,8 +68,13 @@ module Tokyo
65
68
  # See #transaction
66
69
  #
67
70
  def abort
68
- raise "abort transaction !"
71
+ raise Abort, "abort transaction !"
69
72
  end
73
+
74
+ #
75
+ # Exception used to abort transactions
76
+ #
77
+ class Abort < RuntimeError; end
70
78
  end
71
79
 
72
80
  end
@@ -35,14 +35,7 @@ module Rufus::Tokyo
35
35
  #
36
36
  # find Tokyo Tyrant lib
37
37
 
38
- paths = Array(ENV['TOKYO_TYRANT_LIB'] || %w[
39
- /usr/lib/libtokyotyrant.so
40
- /usr/lib64/libtokyotyrant.so
41
- /opt/local/lib/libtokyotyrant.dylib
42
- /opt/local/lib/libtokyotyrant.so
43
- /usr/local/lib/libtokyotyrant.dylib
44
- /usr/local/lib/libtokyotyrant.so
45
- ])
38
+ paths = Array(ENV['TOKYO_TYRANT_LIB'] || Dir['/{opt,usr}/{,local/}lib{,64}/libtokyotyrant.{dylib,so*}'])
46
39
 
47
40
  begin
48
41
 
@@ -82,6 +75,7 @@ module Rufus::Tokyo
82
75
  attfunc :abs_out, :tcrdbout, [ :pointer, :pointer, :int ], :int
83
76
 
84
77
  attfunc :abs_putkeep, :tcrdbputkeep, [ :pointer, :pointer, :int, :pointer, :int ], :int
78
+ attfunc :abs_putcat, :tcrdbputcat, [ :pointer, :pointer, :int, :pointer, :int ], :int
85
79
 
86
80
  attfunc :abs_iterinit, :tcrdbiterinit, [ :pointer ], :int
87
81
  attfunc :abs_iternext, :tcrdbiternext, [ :pointer, :pointer ], :pointer
@@ -128,6 +122,8 @@ module Rufus::Tokyo
128
122
 
129
123
  attfunc :tab_fwmkeys, :tcrdbfwmkeys, [ :pointer, :pointer, :int, :int ], :pointer
130
124
 
125
+ attfunc :tab_metasearch, :tcrdbmetasearch, [ :pointer, :int, :int ], :pointer
126
+
131
127
  #
132
128
  # qry functions
133
129
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rufus-tokyo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mettraux
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-23 00:00:00 +09:00
12
+ date: 2009-09-18 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -94,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - ffi
96
96
  rubyforge_project: rufus
97
- rubygems_version: 1.3.2
97
+ rubygems_version: 1.3.5
98
98
  signing_key:
99
99
  specification_version: 3
100
100
  summary: ruby-ffi based lib to access Tokyo Cabinet and Tyrant