sequel_core 1.5.1 → 2.0.0

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.
Files changed (68) hide show
  1. data/CHANGELOG +116 -0
  2. data/COPYING +19 -19
  3. data/README +83 -32
  4. data/Rakefile +9 -20
  5. data/bin/sequel +43 -112
  6. data/doc/cheat_sheet.rdoc +225 -0
  7. data/doc/dataset_filtering.rdoc +257 -0
  8. data/lib/sequel_core/adapters/adapter_skeleton.rb +4 -2
  9. data/lib/sequel_core/adapters/ado.rb +3 -1
  10. data/lib/sequel_core/adapters/db2.rb +4 -2
  11. data/lib/sequel_core/adapters/dbi.rb +127 -113
  12. data/lib/sequel_core/adapters/informix.rb +4 -2
  13. data/lib/sequel_core/adapters/jdbc.rb +5 -3
  14. data/lib/sequel_core/adapters/mysql.rb +112 -46
  15. data/lib/sequel_core/adapters/odbc.rb +5 -7
  16. data/lib/sequel_core/adapters/odbc_mssql.rb +12 -3
  17. data/lib/sequel_core/adapters/openbase.rb +3 -1
  18. data/lib/sequel_core/adapters/oracle.rb +11 -9
  19. data/lib/sequel_core/adapters/postgres.rb +261 -262
  20. data/lib/sequel_core/adapters/sqlite.rb +72 -22
  21. data/lib/sequel_core/connection_pool.rb +140 -73
  22. data/lib/sequel_core/core_ext.rb +201 -66
  23. data/lib/sequel_core/core_sql.rb +123 -153
  24. data/lib/sequel_core/database/schema.rb +156 -0
  25. data/lib/sequel_core/database.rb +321 -338
  26. data/lib/sequel_core/dataset/callback.rb +11 -12
  27. data/lib/sequel_core/dataset/convenience.rb +213 -240
  28. data/lib/sequel_core/dataset/pagination.rb +58 -43
  29. data/lib/sequel_core/dataset/parse_tree_sequelizer.rb +331 -0
  30. data/lib/sequel_core/dataset/query.rb +41 -0
  31. data/lib/sequel_core/dataset/schema.rb +15 -0
  32. data/lib/sequel_core/dataset/sequelizer.rb +41 -373
  33. data/lib/sequel_core/dataset/sql.rb +741 -632
  34. data/lib/sequel_core/dataset.rb +183 -168
  35. data/lib/sequel_core/deprecated.rb +1 -169
  36. data/lib/sequel_core/exceptions.rb +24 -19
  37. data/lib/sequel_core/migration.rb +44 -52
  38. data/lib/sequel_core/object_graph.rb +43 -42
  39. data/lib/sequel_core/pretty_table.rb +71 -76
  40. data/lib/sequel_core/schema/generator.rb +163 -105
  41. data/lib/sequel_core/schema/sql.rb +250 -93
  42. data/lib/sequel_core/schema.rb +2 -8
  43. data/lib/sequel_core/sql.rb +394 -0
  44. data/lib/sequel_core/worker.rb +37 -27
  45. data/lib/sequel_core.rb +99 -45
  46. data/spec/adapters/informix_spec.rb +0 -1
  47. data/spec/adapters/mysql_spec.rb +177 -124
  48. data/spec/adapters/oracle_spec.rb +0 -1
  49. data/spec/adapters/postgres_spec.rb +98 -58
  50. data/spec/adapters/sqlite_spec.rb +45 -4
  51. data/spec/blockless_filters_spec.rb +269 -0
  52. data/spec/connection_pool_spec.rb +21 -18
  53. data/spec/core_ext_spec.rb +169 -19
  54. data/spec/core_sql_spec.rb +56 -49
  55. data/spec/database_spec.rb +78 -17
  56. data/spec/dataset_spec.rb +300 -428
  57. data/spec/migration_spec.rb +1 -1
  58. data/spec/object_graph_spec.rb +5 -11
  59. data/spec/rcov.opts +1 -1
  60. data/spec/schema_generator_spec.rb +16 -4
  61. data/spec/schema_spec.rb +89 -10
  62. data/spec/sequelizer_spec.rb +56 -56
  63. data/spec/spec.opts +0 -5
  64. data/spec/spec_config.rb +7 -0
  65. data/spec/spec_config.rb.example +5 -5
  66. data/spec/spec_helper.rb +6 -0
  67. data/spec/worker_spec.rb +1 -1
  68. 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
- POSTGRES_DB = Sequel.connect(ENV['SEQUEL_PG_SPEC_DB']||'postgres://postgres:postgres@localhost:5432/reality_spec')
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.drop_table(:test) if POSTGRES_DB.table_exists?(:test)
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
- PGconn.quote("\\dingo").should == "E'\\\\dingo'" # literally, E'\\dingo'
171
- PGconn.quote("dingo").should == "'dingo'"
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 add_column operations" do
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 (\"title\" text, \"body\" text)",
242
- "CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector(\"title\" || \"body\"))"
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 (\"title\" text, \"body\" text)",
254
- "CREATE INDEX posts_title_body_index ON posts USING gin (to_tsvector('french', \"title\" || \"body\"))"
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(\"title\") @@ to_tsquery('ruby'))"
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(\"title\" || \"body\") @@ to_tsquery('ruby | sequel'))"
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', \"title\") @@ to_tsquery('french', 'ruby'))"
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 (\"geom\" geometry)",
276
- "CREATE INDEX posts_geom_index ON posts USING gist (\"geom\")"
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 (\"title\" varchar(5))",
287
- "CREATE INDEX posts_title_index ON posts USING hash (\"title\")"
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 (\"title\" varchar(5))",
298
- "CREATE UNIQUE INDEX posts_title_index ON posts USING hash (\"title\")"
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 (\"title\" varchar(5))",
309
- "CREATE INDEX posts_title_index ON posts (\"title\") WHERE (\"something\" = 5)"
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 ("x", "y") VALUES (1, 2)',
324
- 'INSERT INTO test ("x", "y") VALUES (3, 4)'
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 ("x", "y") VALUES (1, 2), (3, 4)'
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 ("x", "y") VALUES (1, 2), (3, 4)'
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
- setup do
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 = :none
46
- @db.auto_vacuum.should == :none
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