sequel_core 1.5.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +116 -0
- data/COPYING +19 -19
- data/README +83 -32
- data/Rakefile +9 -20
- data/bin/sequel +43 -112
- data/doc/cheat_sheet.rdoc +225 -0
- data/doc/dataset_filtering.rdoc +257 -0
- data/lib/sequel_core/adapters/adapter_skeleton.rb +4 -2
- data/lib/sequel_core/adapters/ado.rb +3 -1
- data/lib/sequel_core/adapters/db2.rb +4 -2
- data/lib/sequel_core/adapters/dbi.rb +127 -113
- data/lib/sequel_core/adapters/informix.rb +4 -2
- data/lib/sequel_core/adapters/jdbc.rb +5 -3
- data/lib/sequel_core/adapters/mysql.rb +112 -46
- data/lib/sequel_core/adapters/odbc.rb +5 -7
- data/lib/sequel_core/adapters/odbc_mssql.rb +12 -3
- data/lib/sequel_core/adapters/openbase.rb +3 -1
- data/lib/sequel_core/adapters/oracle.rb +11 -9
- data/lib/sequel_core/adapters/postgres.rb +261 -262
- data/lib/sequel_core/adapters/sqlite.rb +72 -22
- data/lib/sequel_core/connection_pool.rb +140 -73
- data/lib/sequel_core/core_ext.rb +201 -66
- data/lib/sequel_core/core_sql.rb +123 -153
- data/lib/sequel_core/database/schema.rb +156 -0
- data/lib/sequel_core/database.rb +321 -338
- data/lib/sequel_core/dataset/callback.rb +11 -12
- data/lib/sequel_core/dataset/convenience.rb +213 -240
- data/lib/sequel_core/dataset/pagination.rb +58 -43
- data/lib/sequel_core/dataset/parse_tree_sequelizer.rb +331 -0
- data/lib/sequel_core/dataset/query.rb +41 -0
- data/lib/sequel_core/dataset/schema.rb +15 -0
- data/lib/sequel_core/dataset/sequelizer.rb +41 -373
- data/lib/sequel_core/dataset/sql.rb +741 -632
- data/lib/sequel_core/dataset.rb +183 -168
- data/lib/sequel_core/deprecated.rb +1 -169
- data/lib/sequel_core/exceptions.rb +24 -19
- data/lib/sequel_core/migration.rb +44 -52
- data/lib/sequel_core/object_graph.rb +43 -42
- data/lib/sequel_core/pretty_table.rb +71 -76
- data/lib/sequel_core/schema/generator.rb +163 -105
- data/lib/sequel_core/schema/sql.rb +250 -93
- data/lib/sequel_core/schema.rb +2 -8
- data/lib/sequel_core/sql.rb +394 -0
- data/lib/sequel_core/worker.rb +37 -27
- data/lib/sequel_core.rb +99 -45
- data/spec/adapters/informix_spec.rb +0 -1
- data/spec/adapters/mysql_spec.rb +177 -124
- data/spec/adapters/oracle_spec.rb +0 -1
- data/spec/adapters/postgres_spec.rb +98 -58
- data/spec/adapters/sqlite_spec.rb +45 -4
- data/spec/blockless_filters_spec.rb +269 -0
- data/spec/connection_pool_spec.rb +21 -18
- data/spec/core_ext_spec.rb +169 -19
- data/spec/core_sql_spec.rb +56 -49
- data/spec/database_spec.rb +78 -17
- data/spec/dataset_spec.rb +300 -428
- data/spec/migration_spec.rb +1 -1
- data/spec/object_graph_spec.rb +5 -11
- data/spec/rcov.opts +1 -1
- data/spec/schema_generator_spec.rb +16 -4
- data/spec/schema_spec.rb +89 -10
- data/spec/sequelizer_spec.rb +56 -56
- data/spec/spec.opts +0 -5
- data/spec/spec_config.rb +7 -0
- data/spec/spec_config.rb.example +5 -5
- data/spec/spec_helper.rb +6 -0
- data/spec/worker_spec.rb +1 -1
- metadata +78 -63
@@ -1,23 +1,19 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '../../lib/sequel_core')
|
2
1
|
require File.join(File.dirname(__FILE__), '../spec_helper.rb')
|
3
2
|
|
4
3
|
unless defined?(POSTGRES_DB)
|
5
|
-
|
4
|
+
POSTGRES_URL = 'postgres://postgres:postgres@localhost:5432/reality_spec' unless defined? POSTGRES_URL
|
5
|
+
POSTGRES_DB = Sequel.connect(ENV['SEQUEL_PG_SPEC_DB']||POSTGRES_URL)
|
6
6
|
end
|
7
7
|
|
8
|
-
POSTGRES_DB.
|
9
|
-
POSTGRES_DB.drop_table(:test2) if POSTGRES_DB.table_exists?(:test2)
|
10
|
-
POSTGRES_DB.drop_table(:test3) if POSTGRES_DB.table_exists?(:test3)
|
11
|
-
|
12
|
-
POSTGRES_DB.create_table :test do
|
8
|
+
POSTGRES_DB.create_table! :test do
|
13
9
|
text :name
|
14
10
|
integer :value, :index => true
|
15
11
|
end
|
16
|
-
POSTGRES_DB.create_table :test2 do
|
12
|
+
POSTGRES_DB.create_table! :test2 do
|
17
13
|
text :name
|
18
14
|
integer :value
|
19
15
|
end
|
20
|
-
POSTGRES_DB.create_table :test3 do
|
16
|
+
POSTGRES_DB.create_table! :test3 do
|
21
17
|
integer :value
|
22
18
|
timestamp :time
|
23
19
|
end
|
@@ -37,6 +33,18 @@ context "A PostgreSQL database" do
|
|
37
33
|
specify "should provide the server version" do
|
38
34
|
@db.server_version.should > 70000
|
39
35
|
end
|
36
|
+
|
37
|
+
specify "should raise Sequel::Error on error" do
|
38
|
+
proc{@db << "SELECT 1 + 'a'"}.should raise_error(Sequel::Error)
|
39
|
+
end
|
40
|
+
|
41
|
+
specify "should correctly parse the schema" do
|
42
|
+
@db.schema(:test3, :reload=>true).should == [[:value, {:type=>:integer, :allow_null=>true, :max_chars=>0, :default=>nil, :db_type=>"integer", :numeric_precision=>32}], [:time, {:type=>:datetime, :allow_null=>true, :max_chars=>0, :default=>nil, :db_type=>"timestamp without time zone", :numeric_precision=>0}]]
|
43
|
+
end
|
44
|
+
|
45
|
+
specify "should get the schema all database tables if no table name is used" do
|
46
|
+
@db.schema(:test3, :reload=>true).should == @db.schema(nil, :reload=>true)[:test3]
|
47
|
+
end
|
40
48
|
end
|
41
49
|
|
42
50
|
context "A PostgreSQL dataset" do
|
@@ -93,62 +101,64 @@ context "A PostgreSQL dataset" do
|
|
93
101
|
proc {@d.literal(false)}.should_not raise_error
|
94
102
|
end
|
95
103
|
|
96
|
-
specify "should quote columns using double quotes" do
|
104
|
+
specify "should quote columns and tables using double quotes if quoting identifiers" do
|
105
|
+
@d.quote_identifiers = true
|
97
106
|
@d.select(:name).sql.should == \
|
98
|
-
'SELECT "name" FROM test'
|
107
|
+
'SELECT "name" FROM "test"'
|
99
108
|
|
100
109
|
@d.select('COUNT(*)'.lit).sql.should == \
|
101
|
-
'SELECT COUNT(*) FROM test'
|
110
|
+
'SELECT COUNT(*) FROM "test"'
|
102
111
|
|
103
112
|
@d.select(:max[:value]).sql.should == \
|
104
|
-
'SELECT max("value") FROM test'
|
113
|
+
'SELECT max("value") FROM "test"'
|
105
114
|
|
106
115
|
@d.select(:NOW[]).sql.should == \
|
107
|
-
'SELECT NOW() FROM test'
|
116
|
+
'SELECT NOW() FROM "test"'
|
108
117
|
|
109
118
|
@d.select(:max[:items__value]).sql.should == \
|
110
|
-
'SELECT max(items."value") FROM test'
|
119
|
+
'SELECT max("items"."value") FROM "test"'
|
111
120
|
|
112
121
|
@d.order(:name.desc).sql.should == \
|
113
|
-
'SELECT * FROM test ORDER BY "name" DESC'
|
122
|
+
'SELECT * FROM "test" ORDER BY "name" DESC'
|
114
123
|
|
115
124
|
@d.select('test.name AS item_name'.lit).sql.should == \
|
116
|
-
'SELECT test.name AS item_name FROM test'
|
125
|
+
'SELECT test.name AS item_name FROM "test"'
|
117
126
|
|
118
127
|
@d.select('"name"'.lit).sql.should == \
|
119
|
-
'SELECT "name" FROM test'
|
128
|
+
'SELECT "name" FROM "test"'
|
120
129
|
|
121
130
|
@d.select('max(test."name") AS "max_name"'.lit).sql.should == \
|
122
|
-
'SELECT max(test."name") AS "max_name" FROM test'
|
131
|
+
'SELECT max(test."name") AS "max_name" FROM "test"'
|
123
132
|
|
124
133
|
@d.select(:test[:abc, 'hello']).sql.should == \
|
125
|
-
"SELECT test(\"abc\", 'hello') FROM test"
|
134
|
+
"SELECT test(\"abc\", 'hello') FROM \"test\""
|
126
135
|
|
127
136
|
@d.select(:test[:abc__def, 'hello']).sql.should == \
|
128
|
-
"SELECT test(abc.\"def\", 'hello') FROM test"
|
137
|
+
"SELECT test(\"abc\".\"def\", 'hello') FROM \"test\""
|
129
138
|
|
130
139
|
@d.select(:test[:abc__def, 'hello'].as(:x2)).sql.should == \
|
131
|
-
"SELECT test(abc.\"def\", 'hello') AS \"x2\" FROM test"
|
140
|
+
"SELECT test(\"abc\".\"def\", 'hello') AS \"x2\" FROM \"test\""
|
132
141
|
|
133
142
|
@d.insert_sql(:value => 333).should == \
|
134
|
-
'INSERT INTO test ("value") VALUES (333)'
|
143
|
+
'INSERT INTO "test" ("value") VALUES (333)'
|
135
144
|
|
136
145
|
@d.insert_sql(:x => :y).should == \
|
137
|
-
'INSERT INTO test ("x") VALUES ("y")'
|
146
|
+
'INSERT INTO "test" ("x") VALUES ("y")'
|
138
147
|
end
|
139
148
|
|
140
|
-
specify "should quote fields correctly when reversing the order" do
|
149
|
+
specify "should quote fields correctly when reversing the order if quoting identifiers" do
|
150
|
+
@d.quote_identifiers = true
|
141
151
|
@d.reverse_order(:name).sql.should == \
|
142
|
-
'SELECT * FROM test ORDER BY "name" DESC'
|
152
|
+
'SELECT * FROM "test" ORDER BY "name" DESC'
|
143
153
|
|
144
154
|
@d.reverse_order(:name.desc).sql.should == \
|
145
|
-
'SELECT * FROM test ORDER BY "name"'
|
155
|
+
'SELECT * FROM "test" ORDER BY "name"'
|
146
156
|
|
147
157
|
@d.reverse_order(:name, :test.desc).sql.should == \
|
148
|
-
'SELECT * FROM test ORDER BY "name" DESC, "test"'
|
158
|
+
'SELECT * FROM "test" ORDER BY "name" DESC, "test"'
|
149
159
|
|
150
160
|
@d.reverse_order(:name.desc, :test).sql.should == \
|
151
|
-
'SELECT * FROM test ORDER BY "name", "test" DESC'
|
161
|
+
'SELECT * FROM "test" ORDER BY "name", "test" DESC'
|
152
162
|
end
|
153
163
|
|
154
164
|
specify "should support transactions" do
|
@@ -159,6 +169,39 @@ context "A PostgreSQL dataset" do
|
|
159
169
|
@d.count.should == 1
|
160
170
|
end
|
161
171
|
|
172
|
+
specify "should correctly rollback transactions" do
|
173
|
+
proc do
|
174
|
+
POSTGRES_DB.transaction do
|
175
|
+
@d << {:name => 'abc', :value => 1}
|
176
|
+
raise Interrupt, 'asdf'
|
177
|
+
end
|
178
|
+
end.should raise_error(Interrupt)
|
179
|
+
|
180
|
+
@d.count.should == 0
|
181
|
+
end
|
182
|
+
|
183
|
+
specify "should handle returning inside of the block by committing" do
|
184
|
+
def POSTGRES_DB.ret_commit
|
185
|
+
transaction do
|
186
|
+
self[:test] << {:name => 'abc'}
|
187
|
+
return
|
188
|
+
self[:test] << {:name => 'd'}
|
189
|
+
end
|
190
|
+
end
|
191
|
+
@d.count.should == 0
|
192
|
+
POSTGRES_DB.ret_commit
|
193
|
+
@d.count.should == 1
|
194
|
+
POSTGRES_DB.ret_commit
|
195
|
+
@d.count.should == 2
|
196
|
+
proc do
|
197
|
+
POSTGRES_DB.transaction do
|
198
|
+
raise Interrupt, 'asdf'
|
199
|
+
end
|
200
|
+
end.should raise_error(Interrupt)
|
201
|
+
|
202
|
+
@d.count.should == 2
|
203
|
+
end
|
204
|
+
|
162
205
|
specify "should support regexps" do
|
163
206
|
@d << {:name => 'abc', :value => 1}
|
164
207
|
@d << {:name => 'bcd', :value => 2}
|
@@ -167,8 +210,8 @@ context "A PostgreSQL dataset" do
|
|
167
210
|
end
|
168
211
|
|
169
212
|
specify "should consider strings containing backslashes to be escaped string literals" do
|
170
|
-
|
171
|
-
|
213
|
+
@d.literal("\\dingo").should == "'\\\\dingo'" # literally, E'\\dingo'
|
214
|
+
@d.literal("dingo").should == "'dingo'"
|
172
215
|
end
|
173
216
|
end
|
174
217
|
|
@@ -191,22 +234,21 @@ context "A PostgreSQL database" do
|
|
191
234
|
@db = POSTGRES_DB
|
192
235
|
end
|
193
236
|
|
194
|
-
specify "should support
|
237
|
+
specify "should support column operations" do
|
238
|
+
@db.create_table!(:test2){text :name; integer :value}
|
239
|
+
@db[:test2] << {}
|
240
|
+
@db[:test2].columns.should == [:name, :value]
|
241
|
+
|
195
242
|
@db.add_column :test2, :xyz, :text, :default => '000'
|
196
|
-
|
197
243
|
@db[:test2].columns.should == [:name, :value, :xyz]
|
198
244
|
@db[:test2] << {:name => 'mmm', :value => 111}
|
199
245
|
@db[:test2].first[:xyz].should == '000'
|
200
|
-
end
|
201
246
|
|
202
|
-
specify "should support drop_column operations" do
|
203
247
|
@db[:test2].columns.should == [:name, :value, :xyz]
|
204
248
|
@db.drop_column :test2, :xyz
|
205
249
|
|
206
250
|
@db[:test2].columns.should == [:name, :value]
|
207
|
-
end
|
208
251
|
|
209
|
-
specify "should support rename_column operations" do
|
210
252
|
@db[:test2].delete
|
211
253
|
@db.add_column :test2, :xyz, :text, :default => '000'
|
212
254
|
@db[:test2] << {:name => 'mmm', :value => 111, :xyz => 'qqqq'}
|
@@ -215,9 +257,7 @@ context "A PostgreSQL database" do
|
|
215
257
|
@db.rename_column :test2, :xyz, :zyx
|
216
258
|
@db[:test2].columns.should == [:name, :value, :zyx]
|
217
259
|
@db[:test2].first[:zyx].should == 'qqqq'
|
218
|
-
end
|
219
260
|
|
220
|
-
specify "should support set_column_type operations" do
|
221
261
|
@db.add_column :test2, :xyz, :float
|
222
262
|
@db[:test2].delete
|
223
263
|
@db[:test2] << {:name => 'mmm', :value => 111, :xyz => 56.78}
|
@@ -238,8 +278,8 @@ context "A PostgreSQL database" do
|
|
238
278
|
full_text_index [:title, :body]
|
239
279
|
end
|
240
280
|
POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
241
|
-
"CREATE TABLE posts (
|
242
|
-
"CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector(
|
281
|
+
"CREATE TABLE posts (title text, body text)",
|
282
|
+
"CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector(title || body))"
|
243
283
|
]
|
244
284
|
end
|
245
285
|
|
@@ -250,20 +290,20 @@ context "A PostgreSQL database" do
|
|
250
290
|
full_text_index [:title, :body], :language => 'french'
|
251
291
|
end
|
252
292
|
POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
253
|
-
"CREATE TABLE posts (
|
254
|
-
"CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector('french',
|
293
|
+
"CREATE TABLE posts (title text, body text)",
|
294
|
+
"CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector('french', title || body))"
|
255
295
|
]
|
256
296
|
end
|
257
297
|
|
258
298
|
specify "should support full_text_search" do
|
259
299
|
POSTGRES_DB[:posts].full_text_search(:title, 'ruby').sql.should ==
|
260
|
-
"SELECT * FROM posts WHERE (to_tsvector(
|
300
|
+
"SELECT * FROM posts WHERE (to_tsvector(title) @@ to_tsquery('ruby'))"
|
261
301
|
|
262
302
|
POSTGRES_DB[:posts].full_text_search([:title, :body], ['ruby', 'sequel']).sql.should ==
|
263
|
-
"SELECT * FROM posts WHERE (to_tsvector(
|
303
|
+
"SELECT * FROM posts WHERE (to_tsvector(title || body) @@ to_tsquery('ruby | sequel'))"
|
264
304
|
|
265
305
|
POSTGRES_DB[:posts].full_text_search(:title, 'ruby', :language => 'french').sql.should ==
|
266
|
-
"SELECT * FROM posts WHERE (to_tsvector('french',
|
306
|
+
"SELECT * FROM posts WHERE (to_tsvector('french', title) @@ to_tsquery('french', 'ruby'))"
|
267
307
|
end
|
268
308
|
|
269
309
|
specify "should support spatial indexes" do
|
@@ -272,8 +312,8 @@ context "A PostgreSQL database" do
|
|
272
312
|
spatial_index [:geom]
|
273
313
|
end
|
274
314
|
POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
275
|
-
"CREATE TABLE posts (
|
276
|
-
"CREATE INDEX posts_geom_index ON posts USING gist (
|
315
|
+
"CREATE TABLE posts (geom geometry)",
|
316
|
+
"CREATE INDEX posts_geom_index ON posts USING gist (geom)"
|
277
317
|
]
|
278
318
|
end
|
279
319
|
|
@@ -283,8 +323,8 @@ context "A PostgreSQL database" do
|
|
283
323
|
index :title, :type => 'hash'
|
284
324
|
end
|
285
325
|
POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
286
|
-
"CREATE TABLE posts (
|
287
|
-
"CREATE INDEX posts_title_index ON posts USING hash (
|
326
|
+
"CREATE TABLE posts (title varchar(5))",
|
327
|
+
"CREATE INDEX posts_title_index ON posts USING hash (title)"
|
288
328
|
]
|
289
329
|
end
|
290
330
|
|
@@ -294,8 +334,8 @@ context "A PostgreSQL database" do
|
|
294
334
|
index :title, :type => 'hash', :unique => true
|
295
335
|
end
|
296
336
|
POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
297
|
-
"CREATE TABLE posts (
|
298
|
-
"CREATE UNIQUE INDEX posts_title_index ON posts USING hash (
|
337
|
+
"CREATE TABLE posts (title varchar(5))",
|
338
|
+
"CREATE UNIQUE INDEX posts_title_index ON posts USING hash (title)"
|
299
339
|
]
|
300
340
|
end
|
301
341
|
|
@@ -305,8 +345,8 @@ context "A PostgreSQL database" do
|
|
305
345
|
index :title, :where => {:something => 5}
|
306
346
|
end
|
307
347
|
POSTGRES_DB.create_table_sql_list(:posts, *g.create_info).should == [
|
308
|
-
"CREATE TABLE posts (
|
309
|
-
"CREATE INDEX posts_title_index ON posts (
|
348
|
+
"CREATE TABLE posts (title varchar(5))",
|
349
|
+
"CREATE INDEX posts_title_index ON posts (title) WHERE (something = 5)"
|
310
350
|
]
|
311
351
|
end
|
312
352
|
end
|
@@ -320,8 +360,8 @@ context "Postgres::Dataset#multi_insert_sql / #import" do
|
|
320
360
|
@ds.db.meta_def(:server_version) {80199}
|
321
361
|
|
322
362
|
@ds.multi_insert_sql([:x, :y], [[1, 2], [3, 4]]).should == [
|
323
|
-
'INSERT INTO test (
|
324
|
-
'INSERT INTO test (
|
363
|
+
'INSERT INTO test (x, y) VALUES (1, 2)',
|
364
|
+
'INSERT INTO test (x, y) VALUES (3, 4)'
|
325
365
|
]
|
326
366
|
end
|
327
367
|
|
@@ -329,13 +369,13 @@ context "Postgres::Dataset#multi_insert_sql / #import" do
|
|
329
369
|
@ds.db.meta_def(:server_version) {80200}
|
330
370
|
|
331
371
|
@ds.multi_insert_sql([:x, :y], [[1, 2], [3, 4]]).should == [
|
332
|
-
'INSERT INTO test (
|
372
|
+
'INSERT INTO test (x, y) VALUES (1, 2), (3, 4)'
|
333
373
|
]
|
334
374
|
|
335
375
|
@ds.db.meta_def(:server_version) {80201}
|
336
376
|
|
337
377
|
@ds.multi_insert_sql([:x, :y], [[1, 2], [3, 4]]).should == [
|
338
|
-
'INSERT INTO test (
|
378
|
+
'INSERT INTO test (x, y) VALUES (1, 2), (3, 4)'
|
339
379
|
]
|
340
380
|
end
|
341
381
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '../../lib/sequel_core')
|
2
1
|
require File.join(File.dirname(__FILE__), '../spec_helper.rb')
|
3
2
|
|
4
3
|
unless defined?(SQLITE_DB)
|
@@ -17,9 +16,12 @@ end
|
|
17
16
|
SQLITE_DB.create_table(:time) {timestamp :t}
|
18
17
|
|
19
18
|
context "An SQLite database" do
|
20
|
-
|
19
|
+
before do
|
21
20
|
@db = Sequel.connect('sqlite:/')
|
22
21
|
end
|
22
|
+
after do
|
23
|
+
@db.disconnect
|
24
|
+
end
|
23
25
|
|
24
26
|
specify "should provide a list of existing tables" do
|
25
27
|
@db.tables.should == []
|
@@ -37,13 +39,15 @@ context "An SQLite database" do
|
|
37
39
|
specify "should support setting pragma values" do
|
38
40
|
@db.pragma_set(:auto_vacuum, '1')
|
39
41
|
@db.pragma_get(:auto_vacuum).should == '1'
|
42
|
+
@db.pragma_set(:auto_vacuum, '2')
|
43
|
+
@db.pragma_get(:auto_vacuum).should == '2'
|
40
44
|
end
|
41
45
|
|
42
46
|
specify "should support getting and setting the auto_vacuum pragma" do
|
43
47
|
@db.auto_vacuum = :full
|
44
48
|
@db.auto_vacuum.should == :full
|
45
|
-
@db.auto_vacuum = :
|
46
|
-
@db.auto_vacuum.should == :
|
49
|
+
@db.auto_vacuum = :incremental
|
50
|
+
@db.auto_vacuum.should == :incremental
|
47
51
|
|
48
52
|
proc {@db.auto_vacuum = :invalid}.should raise_error(Sequel::Error)
|
49
53
|
end
|
@@ -123,6 +127,29 @@ context "An SQLite database" do
|
|
123
127
|
@db.tables.should == [:t]
|
124
128
|
end
|
125
129
|
|
130
|
+
specify "should handle returning inside of transaction by committing" do
|
131
|
+
@db.create_table(:items){text :name}
|
132
|
+
def @db.ret_commit
|
133
|
+
transaction do
|
134
|
+
self[:items] << {:name => 'abc'}
|
135
|
+
return
|
136
|
+
self[:items] << {:name => 'd'}
|
137
|
+
end
|
138
|
+
end
|
139
|
+
@db[:items].count.should == 0
|
140
|
+
@db.ret_commit
|
141
|
+
@db[:items].count.should == 1
|
142
|
+
@db.ret_commit
|
143
|
+
@db[:items].count.should == 2
|
144
|
+
proc do
|
145
|
+
@db.transaction do
|
146
|
+
raise Interrupt, 'asdf'
|
147
|
+
end
|
148
|
+
end.should raise_error(Interrupt)
|
149
|
+
|
150
|
+
@db[:items].count.should == 2
|
151
|
+
end
|
152
|
+
|
126
153
|
specify "should provide disconnect functionality" do
|
127
154
|
@db.tables
|
128
155
|
@db.pool.size.should == 1
|
@@ -162,6 +189,20 @@ context "An SQLite database" do
|
|
162
189
|
proc {@db.single_value 'blah blah'}.should raise_error(
|
163
190
|
Sequel::Error::InvalidStatement, "blah blah\r\nnear \"blah\": syntax error")
|
164
191
|
end
|
192
|
+
|
193
|
+
specify "should not swallow non-SQLite based exceptions" do
|
194
|
+
proc {@db.pool.hold{raise Interrupt, "test"}}.should raise_error(Interrupt)
|
195
|
+
end
|
196
|
+
|
197
|
+
specify "should correctly parse the schema" do
|
198
|
+
@db.create_table(:time) {timestamp :t}
|
199
|
+
@db.schema(:time, :reload=>true).should == [[:t, {:type=>:datetime, :allow_null=>true, :max_chars=>nil, :default=>nil, :db_type=>"timestamp", :numeric_precision=>nil, :primary_key=>false}]]
|
200
|
+
end
|
201
|
+
|
202
|
+
specify "should get the schema all database tables if no table name is used" do
|
203
|
+
@db.create_table(:time) {timestamp :t}
|
204
|
+
@db.schema(:time, :reload=>true).should == @db.schema(nil, :reload=>true)[:time]
|
205
|
+
end
|
165
206
|
end
|
166
207
|
|
167
208
|
context "An SQLite dataset" do
|