rufus-tokyo 1.0.3 → 1.0.4
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/.gitignore +4 -0
- data/CHANGELOG.txt +6 -0
- data/Rakefile +91 -0
- data/doc/decision_table.numbers +0 -0
- data/lib/rufus/edo/README.txt +101 -0
- data/lib/rufus/edo/tabcore.rb +1 -3
- data/lib/rufus/tokyo.rb +1 -2
- data/lib/rufus/tokyo/cabinet/lib.rb +4 -7
- data/lib/rufus/tokyo/cabinet/table.rb +10 -13
- data/lib/rufus/tokyo/cabinet/util.rb +4 -1
- data/lib/rufus/tokyo/hmethods.rb +4 -4
- data/lib/rufus/tokyo/outlen.rb +5 -1
- data/lib/rufus/tokyo/tyrant/abstract.rb +8 -0
- data/lib/rufus/tokyo/tyrant/lib.rb +6 -6
- data/lib/rufus/tokyo/tyrant/table.rb +9 -1
- data/lib/rufus/tokyo/version.rb +32 -0
- data/rufus-tokyo.gemspec +135 -0
- data/spec/cabinet_btree_spec.rb +92 -0
- data/spec/cabinet_fixed_spec.rb +33 -0
- data/spec/cabinet_spec.rb +291 -0
- data/spec/cabinetconfig_spec.rb +82 -0
- data/spec/dystopia_core_spec.rb +124 -0
- data/spec/edo_cabinet_btree_spec.rb +123 -0
- data/spec/edo_cabinet_fixed_spec.rb +42 -0
- data/spec/edo_cabinet_spec.rb +286 -0
- data/spec/edo_ntyrant_spec.rb +224 -0
- data/spec/edo_ntyrant_table_spec.rb +296 -0
- data/spec/edo_table_spec.rb +292 -0
- data/spec/hmethods_spec.rb +73 -0
- data/spec/incr.lua +23 -0
- data/spec/openable_spec.rb +51 -0
- data/spec/shared_abstract_spec.rb +426 -0
- data/spec/shared_table_spec.rb +675 -0
- data/spec/shared_tyrant_spec.rb +42 -0
- data/spec/spec_base.rb +23 -0
- data/spec/start_tyrants.sh +28 -0
- data/spec/stop_tyrants.sh +9 -0
- data/spec/table_spec.rb +267 -0
- data/spec/tyrant_spec.rb +218 -0
- data/spec/tyrant_table_spec.rb +298 -0
- data/spec/util_list_spec.rb +197 -0
- data/spec/util_map_spec.rb +130 -0
- data/tasks/dev.rb +70 -0
- data/test/bm0.rb +353 -0
- data/test/bm1_compression.rb +54 -0
- data/test/con0.rb +30 -0
- data/test/mem.rb +49 -0
- data/test/mem1.rb +44 -0
- data/test/readme0.rb +17 -0
- data/test/readme1.rb +21 -0
- data/test/readme2.rb +15 -0
- data/test/readme3.rb +24 -0
- data/test/readmes_test.sh +17 -0
- metadata +81 -21
- data/MIGRATED.txt +0 -1
@@ -0,0 +1,224 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# Specifying rufus-tokyo
|
4
|
+
#
|
5
|
+
# Mon Feb 23 23:24:45 JST 2009
|
6
|
+
#
|
7
|
+
|
8
|
+
require File.dirname(__FILE__) + '/spec_base'
|
9
|
+
require File.dirname(__FILE__) + '/shared_abstract_spec'
|
10
|
+
require File.dirname(__FILE__) + '/shared_tyrant_spec'
|
11
|
+
|
12
|
+
begin
|
13
|
+
require 'rufus/edo/ntyrant'
|
14
|
+
rescue LoadError
|
15
|
+
puts "'TokyoTyrant' ruby lib not available on this ruby platform"
|
16
|
+
end
|
17
|
+
|
18
|
+
if defined?(Rufus::Edo)
|
19
|
+
|
20
|
+
describe 'a missing Rufus::Edo::NetTyrant' do
|
21
|
+
|
22
|
+
it 'should raise an error' do
|
23
|
+
|
24
|
+
lambda {
|
25
|
+
Rufus::Edo::NetTyrant.new('tyrant.example.com', 45000)
|
26
|
+
}.should.raise(Rufus::Edo::EdoError).message.should.equal(
|
27
|
+
'(err 2) host not found')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe Rufus::Edo::NetTyrant do
|
32
|
+
|
33
|
+
it 'should use open with a block will auto close the db correctly' do
|
34
|
+
|
35
|
+
res = Rufus::Edo::NetTyrant.open('127.0.0.1', 45000) do |cab|
|
36
|
+
cab.clear
|
37
|
+
10.times { |i| cab["key #{i}"] = "val #{i}" }
|
38
|
+
cab.size.should.equal(10)
|
39
|
+
:result
|
40
|
+
end
|
41
|
+
|
42
|
+
res.should.equal(:result)
|
43
|
+
|
44
|
+
cab = Rufus::Edo::NetTyrant.new('127.0.0.1', 45000)
|
45
|
+
10.times do |i|
|
46
|
+
cab["key #{i}"].should.equal("val #{i}")
|
47
|
+
end
|
48
|
+
cab.close
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
it 'should use open without a block just like calling new correctly' do
|
53
|
+
|
54
|
+
cab = Rufus::Edo::NetTyrant.open('127.0.0.1', 45000)
|
55
|
+
cab.clear
|
56
|
+
10.times { |i| cab["key #{i}"] = "val #{i}" }
|
57
|
+
cab.size.should.equal(10)
|
58
|
+
cab.close
|
59
|
+
|
60
|
+
cab = Rufus::Edo::NetTyrant.new('127.0.0.1', 45000)
|
61
|
+
10.times do |i|
|
62
|
+
cab["key #{i}"].should.equal("val #{i}")
|
63
|
+
end
|
64
|
+
cab.close
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe Rufus::Edo::NetTyrant do
|
69
|
+
|
70
|
+
it 'should open and close' do
|
71
|
+
|
72
|
+
should.not.raise {
|
73
|
+
t = Rufus::Edo::NetTyrant.new('127.0.0.1', 45000)
|
74
|
+
t.close
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should refuse to connect to a TyrantTable' do
|
79
|
+
|
80
|
+
lambda {
|
81
|
+
t = Rufus::Edo::NetTyrant.new('127.0.0.1', 45001)
|
82
|
+
}.should.raise(ArgumentError)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe Rufus::Edo::NetTyrant do
|
87
|
+
|
88
|
+
before do
|
89
|
+
@db = Rufus::Edo::NetTyrant.new('127.0.0.1', 45000)
|
90
|
+
#puts @t.stat.inject('') { |s, (k, v)| s << "#{k} => #{v}\n" }
|
91
|
+
@db.clear
|
92
|
+
end
|
93
|
+
after do
|
94
|
+
@db.close
|
95
|
+
end
|
96
|
+
|
97
|
+
behaves_like "an abstract structure"
|
98
|
+
|
99
|
+
it 'should respond to stat' do
|
100
|
+
|
101
|
+
stat = @db.stat
|
102
|
+
stat['type'].should.equal('hash')
|
103
|
+
end
|
104
|
+
|
105
|
+
behaves_like 'a Tyrant structure (no transactions)'
|
106
|
+
behaves_like 'a Tyrant structure (copy method)'
|
107
|
+
end
|
108
|
+
|
109
|
+
describe Rufus::Edo::NetTyrant do
|
110
|
+
|
111
|
+
before do
|
112
|
+
@n = 50
|
113
|
+
@db = Rufus::Edo::NetTyrant.new('127.0.0.1', 45000)
|
114
|
+
@db.clear
|
115
|
+
@n.times { |i| @db["person#{i}"] = 'whoever' }
|
116
|
+
@n.times { |i| @db["animal#{i}"] = 'whichever' }
|
117
|
+
@db["toto#{0.chr}5"] = 'toto'
|
118
|
+
end
|
119
|
+
after do
|
120
|
+
@db.close
|
121
|
+
end
|
122
|
+
|
123
|
+
behaves_like 'abstract structure #keys'
|
124
|
+
end
|
125
|
+
|
126
|
+
describe 'Rufus::Edo::NetTyrant lget/lput/ldelete' do
|
127
|
+
|
128
|
+
before do
|
129
|
+
@db = Rufus::Edo::NetTyrant.new('127.0.0.1', 45000)
|
130
|
+
@db.clear
|
131
|
+
3.times { |i| @db[i.to_s] = "val#{i}" }
|
132
|
+
end
|
133
|
+
after do
|
134
|
+
@db.close
|
135
|
+
end
|
136
|
+
|
137
|
+
behaves_like 'abstract structure #lget/lput/ldelete'
|
138
|
+
end
|
139
|
+
|
140
|
+
describe 'Rufus::Edo::NetTyrant#add{int|double}' do
|
141
|
+
|
142
|
+
before do
|
143
|
+
@db = Rufus::Edo::NetTyrant.new('127.0.0.1', 45000)
|
144
|
+
@db.clear
|
145
|
+
end
|
146
|
+
after do
|
147
|
+
@db.close
|
148
|
+
end
|
149
|
+
|
150
|
+
behaves_like 'abstract structure #add{int|double}'
|
151
|
+
end
|
152
|
+
|
153
|
+
describe Rufus::Edo::NetTyrant do
|
154
|
+
|
155
|
+
before do
|
156
|
+
@db = Rufus::Edo::NetTyrant.new('127.0.0.1', 45000)
|
157
|
+
@db.clear
|
158
|
+
end
|
159
|
+
after do
|
160
|
+
@db.close
|
161
|
+
end
|
162
|
+
|
163
|
+
behaves_like 'abstract structure #putkeep'
|
164
|
+
behaves_like 'abstract structure #putcat'
|
165
|
+
end
|
166
|
+
|
167
|
+
describe 'Rufus::Edo::NetTyrant (lua extensions)' do
|
168
|
+
|
169
|
+
before do
|
170
|
+
@db = Rufus::Edo::NetTyrant.new('127.0.0.1', 45000)
|
171
|
+
@db.clear
|
172
|
+
end
|
173
|
+
after do
|
174
|
+
@db.close
|
175
|
+
end
|
176
|
+
|
177
|
+
behaves_like 'tyrant with embedded lua'
|
178
|
+
end
|
179
|
+
|
180
|
+
describe Rufus::Edo::NetTyrant do
|
181
|
+
|
182
|
+
before do
|
183
|
+
@db = Rufus::Edo::NetTyrant.new('127.0.0.1', 45000)
|
184
|
+
@db.clear
|
185
|
+
end
|
186
|
+
after do
|
187
|
+
@db.close
|
188
|
+
end
|
189
|
+
|
190
|
+
behaves_like 'an abstract structure flattening keys and values'
|
191
|
+
end
|
192
|
+
|
193
|
+
describe 'Rufus::Edo::NetTyrant with a default value' do
|
194
|
+
|
195
|
+
before do
|
196
|
+
@db = Rufus::Edo::NetTyrant.new('127.0.0.1', 45000, :default => 'Nemo')
|
197
|
+
@db.clear
|
198
|
+
@db['known'] = 'Ulysse'
|
199
|
+
end
|
200
|
+
after do
|
201
|
+
@db.close
|
202
|
+
end
|
203
|
+
|
204
|
+
behaves_like 'an abstract structure with a default value'
|
205
|
+
end
|
206
|
+
|
207
|
+
describe 'Rufus::Edo::Tyrant with a default_proc' do
|
208
|
+
|
209
|
+
before do
|
210
|
+
@db = Rufus::Edo::NetTyrant.new(
|
211
|
+
'127.0.0.1',
|
212
|
+
45000,
|
213
|
+
:default_proc => lambda { |db, k| "default:#{k}" })
|
214
|
+
@db.clear
|
215
|
+
@db['known'] = 'Ulysse'
|
216
|
+
end
|
217
|
+
after do
|
218
|
+
@db.close
|
219
|
+
end
|
220
|
+
|
221
|
+
behaves_like 'an abstract structure with a default_proc'
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
@@ -0,0 +1,296 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# Specifying rufus-tokyo
|
4
|
+
#
|
5
|
+
# Wed Feb 25 10:38:42 JST 2009
|
6
|
+
#
|
7
|
+
|
8
|
+
require File.join(File.dirname(__FILE__), 'spec_base')
|
9
|
+
require File.join(File.dirname(__FILE__), 'shared_table_spec')
|
10
|
+
require File.join(File.dirname(__FILE__), 'shared_tyrant_spec')
|
11
|
+
|
12
|
+
require 'rufus/edo/ntyrant'
|
13
|
+
|
14
|
+
|
15
|
+
describe 'a missing Rufus::Edo::NetTyrantTable' do
|
16
|
+
|
17
|
+
it 'should raise an error' do
|
18
|
+
|
19
|
+
lambda {
|
20
|
+
Rufus::Edo::NetTyrantTable.new('127.0.0.1', 1)
|
21
|
+
}.should.raise(Rufus::Edo::EdoError).message.should.equal(
|
22
|
+
'(err 3) connection refused')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'Rufus::Edo::NetTyrantTable' do
|
27
|
+
|
28
|
+
it 'should refuse to connect to a plain Tyrant' do
|
29
|
+
|
30
|
+
lambda {
|
31
|
+
t = Rufus::Edo::NetTyrantTable.new('127.0.0.1', 45000)
|
32
|
+
}.should.raise(ArgumentError)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'Rufus::Edo::NetTyrantTable' do
|
37
|
+
|
38
|
+
before do
|
39
|
+
@t = Rufus::Edo::NetTyrantTable.new('127.0.0.1', 45001)
|
40
|
+
#puts @t.stat.inject('') { |s, (k, v)| s << "#{k} => #{v}\n" }
|
41
|
+
@t.clear
|
42
|
+
end
|
43
|
+
after do
|
44
|
+
@t.close
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should respond to stat' do
|
48
|
+
|
49
|
+
@t.stat['type'].should.equal('table')
|
50
|
+
end
|
51
|
+
|
52
|
+
behaves_like 'table'
|
53
|
+
behaves_like 'a Tyrant structure (no transactions)'
|
54
|
+
end
|
55
|
+
|
56
|
+
describe Rufus::Edo::NetTyrantTable do
|
57
|
+
|
58
|
+
it 'should use open with a block will auto close the db correctly' do
|
59
|
+
|
60
|
+
res = Rufus::Edo::NetTyrantTable.open('127.0.0.1', 45001) do |table|
|
61
|
+
table.clear
|
62
|
+
10.times { |i| table["key #{i}"] = {:val => i} }
|
63
|
+
table.size.should.equal(10)
|
64
|
+
:result
|
65
|
+
end
|
66
|
+
|
67
|
+
res.should.equal(:result)
|
68
|
+
|
69
|
+
table = Rufus::Edo::NetTyrantTable.new('127.0.0.1', 45001)
|
70
|
+
10.times do |i|
|
71
|
+
table["key #{i}"].should.equal({"val" => i.to_s})
|
72
|
+
end
|
73
|
+
table.close
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
it 'should use open without a block just like calling new correctly' do
|
78
|
+
|
79
|
+
table = Rufus::Edo::NetTyrantTable.open('127.0.0.1', 45001)
|
80
|
+
table.clear
|
81
|
+
10.times { |i| table["key #{i}"] = {:val => i} }
|
82
|
+
table.size.should.equal(10)
|
83
|
+
table.close
|
84
|
+
|
85
|
+
table = Rufus::Edo::NetTyrantTable.new('127.0.0.1', 45001)
|
86
|
+
10.times do |i|
|
87
|
+
table["key #{i}"].should.equal({"val" => i.to_s})
|
88
|
+
end
|
89
|
+
table.close
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe Rufus::Edo::NetTyrantTable do
|
94
|
+
|
95
|
+
before do
|
96
|
+
@t = Rufus::Edo::NetTyrantTable.new('127.0.0.1', 45001)
|
97
|
+
@t.clear
|
98
|
+
end
|
99
|
+
after do
|
100
|
+
@t.close
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should not support transactions' do
|
104
|
+
lambda {
|
105
|
+
@t.transaction {}
|
106
|
+
}.should.raise(NoMethodError)
|
107
|
+
lambda {
|
108
|
+
@t.abort
|
109
|
+
}.should.raise(NoMethodError)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe 'Rufus::Edo::NetTyrantTable #keys' do
|
114
|
+
|
115
|
+
before do
|
116
|
+
@n = 50
|
117
|
+
@t = Rufus::Edo::NetTyrantTable.new('127.0.0.1', 45001)
|
118
|
+
@t.clear
|
119
|
+
@n.times { |i| @t["person#{i}"] = { 'name' => 'whoever' } }
|
120
|
+
@n.times { |i| @t["animal#{i}"] = { 'name' => 'whichever' } }
|
121
|
+
@t["toto#{0.chr}5"] = { 'name' => 'toto' }
|
122
|
+
end
|
123
|
+
after do
|
124
|
+
@t.close
|
125
|
+
end
|
126
|
+
|
127
|
+
behaves_like 'table #keys'
|
128
|
+
end
|
129
|
+
|
130
|
+
def prepare_table_with_data (port)
|
131
|
+
t = Rufus::Edo::NetTyrantTable.new('127.0.0.1', port)
|
132
|
+
t.clear
|
133
|
+
t['pk0'] = { 'name' => 'jim', 'age' => '25', 'lang' => 'ja,en' }
|
134
|
+
t['pk1'] = { 'name' => 'jeff', 'age' => '32', 'lang' => 'en,es' }
|
135
|
+
t['pk2'] = { 'name' => 'jack', 'age' => '44', 'lang' => 'en' }
|
136
|
+
t['pk3'] = { 'name' => 'jake', 'age' => '45', 'lang' => 'en,li' }
|
137
|
+
t
|
138
|
+
end
|
139
|
+
|
140
|
+
describe 'a Tokyo Tyrant table' do
|
141
|
+
|
142
|
+
before do
|
143
|
+
@t = prepare_table_with_data(45001)
|
144
|
+
end
|
145
|
+
after do
|
146
|
+
@t.close
|
147
|
+
# TODO : well there are trailing indexes now... :(
|
148
|
+
end
|
149
|
+
|
150
|
+
behaves_like 'table indexes'
|
151
|
+
end
|
152
|
+
|
153
|
+
describe 'Rufus::Edo::NetTyrantTable#lget' do
|
154
|
+
|
155
|
+
before do
|
156
|
+
@t = prepare_table_with_data(45001)
|
157
|
+
end
|
158
|
+
after do
|
159
|
+
@t.close
|
160
|
+
end
|
161
|
+
|
162
|
+
behaves_like 'table lget'
|
163
|
+
end
|
164
|
+
|
165
|
+
describe 'Rufus::Edo::NetTyrantTable, like a Ruby Hash,' do
|
166
|
+
|
167
|
+
before do
|
168
|
+
@t = prepare_table_with_data(45001)
|
169
|
+
end
|
170
|
+
after do
|
171
|
+
@t.close
|
172
|
+
end
|
173
|
+
|
174
|
+
behaves_like 'table like a hash'
|
175
|
+
end
|
176
|
+
|
177
|
+
describe 'queries on Rufus::Edo::NetTyrantTable' do
|
178
|
+
|
179
|
+
before do
|
180
|
+
@t = prepare_table_with_data(45001)
|
181
|
+
end
|
182
|
+
after do
|
183
|
+
@t.close
|
184
|
+
end
|
185
|
+
|
186
|
+
behaves_like 'table query'
|
187
|
+
end
|
188
|
+
|
189
|
+
describe 'Queries on Tokyo Tyrant tables (via Rufus::Edo)' do
|
190
|
+
|
191
|
+
before do
|
192
|
+
@t = Rufus::Edo::NetTyrantTable.new('127.0.0.1', 45001)
|
193
|
+
@t.clear
|
194
|
+
[
|
195
|
+
"consul readableness choleric hopperdozer juckies",
|
196
|
+
"fume overharshness besprinkler whirling erythrene",
|
197
|
+
"trumper defiable detractively cattiness superioress",
|
198
|
+
"vivificative consul agglomerated Peterloo way",
|
199
|
+
"unkilned bituminate antimatrimonial uran polyphony",
|
200
|
+
"kurumaya unannexed renownedly apetaloid consul",
|
201
|
+
"overdare nescience seronegative nagster overfatten",
|
202
|
+
].each_with_index { |w, i|
|
203
|
+
@t["pk#{i}"] = { 'name' => "lambda#{i}", 'words' => w }
|
204
|
+
}
|
205
|
+
end
|
206
|
+
after do
|
207
|
+
@t.close
|
208
|
+
end
|
209
|
+
|
210
|
+
behaves_like 'table query (fts)'
|
211
|
+
end
|
212
|
+
|
213
|
+
describe 'Rufus::Edo::NetTyrantTable and TableQuery#process' do
|
214
|
+
|
215
|
+
before do
|
216
|
+
@t = prepare_table_with_data(45001)
|
217
|
+
end
|
218
|
+
after do
|
219
|
+
@t.close
|
220
|
+
end
|
221
|
+
|
222
|
+
# TODO : orly ?
|
223
|
+
|
224
|
+
it 'should not work' do
|
225
|
+
|
226
|
+
lambda {
|
227
|
+
@t.prepare_query { |q|
|
228
|
+
q.add 'lang', :includes, 'en'
|
229
|
+
}.process { |k, v|
|
230
|
+
}.free
|
231
|
+
}.should.raise(NoMethodError)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
describe 'results from Rufus::Edo::NetTyrantTable queries' do
|
236
|
+
|
237
|
+
before do
|
238
|
+
@t = prepare_table_with_data(45001)
|
239
|
+
end
|
240
|
+
after do
|
241
|
+
@t.close
|
242
|
+
end
|
243
|
+
|
244
|
+
behaves_like 'table query results'
|
245
|
+
end
|
246
|
+
|
247
|
+
describe 'Rufus::Edo::NetTyrantTable (lua extensions)' do
|
248
|
+
|
249
|
+
before do
|
250
|
+
@t = Rufus::Edo::NetTyrantTable.new('127.0.0.1', 45001)
|
251
|
+
@t.clear
|
252
|
+
end
|
253
|
+
after do
|
254
|
+
@t.close
|
255
|
+
end
|
256
|
+
|
257
|
+
behaves_like 'tyrant table with embedded lua'
|
258
|
+
end
|
259
|
+
|
260
|
+
describe Rufus::Edo::NetTyrantTable do
|
261
|
+
|
262
|
+
before do
|
263
|
+
@t = Rufus::Edo::NetTyrantTable.new('127.0.0.1', 45001)
|
264
|
+
@t.clear
|
265
|
+
end
|
266
|
+
after do
|
267
|
+
@t.close
|
268
|
+
end
|
269
|
+
|
270
|
+
behaves_like 'a table structure flattening keys and values'
|
271
|
+
end
|
272
|
+
|
273
|
+
describe 'Rufus::Edo::NetTyrantTable\'s queries' do
|
274
|
+
|
275
|
+
before do
|
276
|
+
@t = prepare_table_with_data(45001)
|
277
|
+
end
|
278
|
+
after do
|
279
|
+
@t.close
|
280
|
+
end
|
281
|
+
|
282
|
+
behaves_like 'a table structure to_s-ing query stuff'
|
283
|
+
end
|
284
|
+
|
285
|
+
describe 'Rufus::Edo::Table and metasearch' do
|
286
|
+
|
287
|
+
before do
|
288
|
+
@t = prepare_table_with_data(45001)
|
289
|
+
end
|
290
|
+
after do
|
291
|
+
@t.close
|
292
|
+
end
|
293
|
+
|
294
|
+
behaves_like 'table query metasearch'
|
295
|
+
end
|
296
|
+
|