sequel 3.48.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +114 -0
- data/Rakefile +10 -7
- data/doc/association_basics.rdoc +25 -23
- data/doc/code_order.rdoc +7 -0
- data/doc/core_extensions.rdoc +0 -10
- data/doc/object_model.rdoc +4 -1
- data/doc/querying.rdoc +3 -3
- data/doc/release_notes/4.0.0.txt +262 -0
- data/doc/security.rdoc +0 -28
- data/doc/testing.rdoc +8 -14
- data/lib/sequel/adapters/ado.rb +7 -11
- data/lib/sequel/adapters/ado/access.rb +8 -8
- data/lib/sequel/adapters/ado/mssql.rb +4 -4
- data/lib/sequel/adapters/amalgalite.rb +6 -6
- data/lib/sequel/adapters/cubrid.rb +7 -7
- data/lib/sequel/adapters/db2.rb +5 -9
- data/lib/sequel/adapters/dbi.rb +2 -6
- data/lib/sequel/adapters/do.rb +4 -4
- data/lib/sequel/adapters/firebird.rb +4 -4
- data/lib/sequel/adapters/ibmdb.rb +8 -8
- data/lib/sequel/adapters/informix.rb +2 -10
- data/lib/sequel/adapters/jdbc.rb +17 -17
- data/lib/sequel/adapters/jdbc/as400.rb +2 -2
- data/lib/sequel/adapters/jdbc/cubrid.rb +1 -1
- data/lib/sequel/adapters/jdbc/db2.rb +1 -1
- data/lib/sequel/adapters/jdbc/derby.rb +1 -1
- data/lib/sequel/adapters/jdbc/h2.rb +2 -2
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -1
- data/lib/sequel/adapters/jdbc/informix.rb +1 -1
- data/lib/sequel/adapters/jdbc/mssql.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +5 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +3 -3
- data/lib/sequel/adapters/jdbc/sqlite.rb +3 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +3 -3
- data/lib/sequel/adapters/mock.rb +7 -7
- data/lib/sequel/adapters/mysql.rb +3 -3
- data/lib/sequel/adapters/mysql2.rb +4 -4
- data/lib/sequel/adapters/odbc.rb +2 -6
- data/lib/sequel/adapters/odbc/mssql.rb +1 -1
- data/lib/sequel/adapters/openbase.rb +1 -5
- data/lib/sequel/adapters/oracle.rb +13 -17
- data/lib/sequel/adapters/postgres.rb +20 -25
- data/lib/sequel/adapters/shared/cubrid.rb +3 -3
- data/lib/sequel/adapters/shared/db2.rb +2 -2
- data/lib/sequel/adapters/shared/firebird.rb +7 -7
- data/lib/sequel/adapters/shared/mssql.rb +9 -9
- data/lib/sequel/adapters/shared/mysql.rb +29 -13
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +7 -7
- data/lib/sequel/adapters/shared/oracle.rb +22 -13
- data/lib/sequel/adapters/shared/postgres.rb +61 -46
- data/lib/sequel/adapters/shared/sqlite.rb +9 -9
- data/lib/sequel/adapters/sqlite.rb +17 -11
- data/lib/sequel/adapters/swift.rb +3 -3
- data/lib/sequel/adapters/swift/mysql.rb +1 -1
- data/lib/sequel/adapters/swift/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +8 -8
- data/lib/sequel/ast_transformer.rb +3 -1
- data/lib/sequel/connection_pool.rb +4 -2
- data/lib/sequel/connection_pool/sharded_single.rb +2 -2
- data/lib/sequel/connection_pool/sharded_threaded.rb +5 -5
- data/lib/sequel/connection_pool/threaded.rb +7 -7
- data/lib/sequel/core.rb +4 -67
- data/lib/sequel/database.rb +1 -0
- data/lib/sequel/database/connecting.rb +2 -8
- data/lib/sequel/database/dataset.rb +2 -7
- data/lib/sequel/database/dataset_defaults.rb +0 -18
- data/lib/sequel/database/features.rb +4 -4
- data/lib/sequel/database/misc.rb +6 -8
- data/lib/sequel/database/query.rb +5 -61
- data/lib/sequel/database/schema_generator.rb +22 -20
- data/lib/sequel/database/schema_methods.rb +48 -20
- data/lib/sequel/database/transactions.rb +7 -17
- data/lib/sequel/dataset.rb +2 -0
- data/lib/sequel/dataset/actions.rb +23 -91
- data/lib/sequel/dataset/features.rb +1 -4
- data/lib/sequel/dataset/graph.rb +3 -47
- data/lib/sequel/dataset/misc.rb +4 -33
- data/lib/sequel/dataset/prepared_statements.rb +3 -1
- data/lib/sequel/dataset/query.rb +116 -240
- data/lib/sequel/dataset/sql.rb +19 -97
- data/lib/sequel/deprecated.rb +0 -16
- data/lib/sequel/exceptions.rb +0 -3
- data/lib/sequel/extensions/_pretty_table.rb +1 -1
- data/lib/sequel/extensions/columns_introspection.rb +1 -12
- data/lib/sequel/extensions/constraint_validations.rb +3 -3
- data/lib/sequel/extensions/core_extensions.rb +0 -9
- data/lib/sequel/extensions/date_arithmetic.rb +1 -2
- data/lib/sequel/extensions/graph_each.rb +11 -0
- data/lib/sequel/extensions/migration.rb +5 -5
- data/lib/sequel/extensions/null_dataset.rb +11 -13
- data/lib/sequel/extensions/pagination.rb +3 -6
- data/lib/sequel/extensions/pg_array.rb +6 -4
- data/lib/sequel/extensions/pg_array_ops.rb +35 -1
- data/lib/sequel/extensions/pg_json.rb +12 -2
- data/lib/sequel/extensions/pg_json_ops.rb +266 -0
- data/lib/sequel/extensions/pg_range.rb +2 -2
- data/lib/sequel/extensions/pg_range_ops.rb +0 -8
- data/lib/sequel/extensions/pg_row.rb +2 -2
- data/lib/sequel/extensions/pretty_table.rb +0 -4
- data/lib/sequel/extensions/query.rb +3 -8
- data/lib/sequel/extensions/schema_caching.rb +0 -7
- data/lib/sequel/extensions/schema_dumper.rb +10 -17
- data/lib/sequel/extensions/select_remove.rb +0 -4
- data/lib/sequel/extensions/set_overrides.rb +28 -0
- data/lib/sequel/extensions/to_dot.rb +6 -10
- data/lib/sequel/model.rb +6 -7
- data/lib/sequel/model/associations.rb +127 -182
- data/lib/sequel/model/base.rb +88 -211
- data/lib/sequel/model/errors.rb +0 -13
- data/lib/sequel/model/plugins.rb +2 -2
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/after_initialize.rb +11 -17
- data/lib/sequel/plugins/association_autoreloading.rb +1 -47
- data/lib/sequel/plugins/association_dependencies.rb +2 -2
- data/lib/sequel/plugins/auto_validations.rb +2 -8
- data/lib/sequel/plugins/blacklist_security.rb +32 -2
- data/lib/sequel/plugins/caching.rb +1 -1
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/composition.rb +10 -8
- data/lib/sequel/plugins/constraint_validations.rb +2 -2
- data/lib/sequel/plugins/dataset_associations.rb +4 -0
- data/lib/sequel/plugins/defaults_setter.rb +8 -6
- data/lib/sequel/plugins/dirty.rb +6 -6
- data/lib/sequel/plugins/force_encoding.rb +13 -8
- data/lib/sequel/plugins/hook_class_methods.rb +1 -7
- data/lib/sequel/plugins/json_serializer.rb +13 -74
- data/lib/sequel/plugins/lazy_attributes.rb +2 -4
- data/lib/sequel/plugins/list.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +4 -11
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +1 -49
- data/lib/sequel/plugins/nested_attributes.rb +1 -1
- data/lib/sequel/plugins/optimistic_locking.rb +3 -5
- data/lib/sequel/plugins/pg_array_associations.rb +453 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +23 -7
- data/lib/sequel/plugins/prepared_statements.rb +1 -1
- data/lib/sequel/plugins/prepared_statements_associations.rb +20 -14
- data/lib/sequel/plugins/prepared_statements_safe.rb +2 -2
- data/lib/sequel/plugins/rcte_tree.rb +1 -1
- data/lib/sequel/plugins/serialization.rb +5 -4
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +7 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/touch.rb +2 -2
- data/lib/sequel/plugins/tree.rb +1 -1
- data/lib/sequel/plugins/typecast_on_load.rb +19 -4
- data/lib/sequel/plugins/validation_class_methods.rb +0 -30
- data/lib/sequel/plugins/validation_helpers.rb +13 -31
- data/lib/sequel/plugins/xml_serializer.rb +18 -57
- data/lib/sequel/sql.rb +20 -22
- data/lib/sequel/version.rb +2 -2
- data/spec/adapters/db2_spec.rb +14 -23
- data/spec/adapters/firebird_spec.rb +25 -29
- data/spec/adapters/informix_spec.rb +11 -14
- data/spec/adapters/mssql_spec.rb +71 -77
- data/spec/adapters/mysql_spec.rb +165 -172
- data/spec/adapters/oracle_spec.rb +36 -39
- data/spec/adapters/postgres_spec.rb +175 -100
- data/spec/adapters/spec_helper.rb +13 -11
- data/spec/adapters/sqlite_spec.rb +36 -44
- data/spec/core/connection_pool_spec.rb +2 -1
- data/spec/core/database_spec.rb +55 -55
- data/spec/core/dataset_spec.rb +45 -249
- data/spec/core/deprecated_spec.rb +0 -8
- data/spec/core/expression_filters_spec.rb +23 -5
- data/spec/core/object_graph_spec.rb +4 -66
- data/spec/core/schema_spec.rb +35 -12
- data/spec/core/spec_helper.rb +3 -2
- data/spec/core_extensions_spec.rb +17 -19
- data/spec/extensions/arbitrary_servers_spec.rb +2 -3
- data/spec/extensions/association_dependencies_spec.rb +14 -14
- data/spec/extensions/auto_validations_spec.rb +7 -0
- data/spec/extensions/blacklist_security_spec.rb +5 -5
- data/spec/extensions/blank_spec.rb +2 -0
- data/spec/extensions/class_table_inheritance_spec.rb +2 -2
- data/spec/extensions/columns_introspection_spec.rb +2 -29
- data/spec/extensions/composition_spec.rb +10 -17
- data/spec/extensions/core_refinements_spec.rb +5 -1
- data/spec/extensions/dataset_associations_spec.rb +18 -0
- data/spec/extensions/date_arithmetic_spec.rb +2 -2
- data/spec/extensions/defaults_setter_spec.rb +9 -9
- data/spec/extensions/dirty_spec.rb +0 -5
- data/spec/extensions/eval_inspect_spec.rb +2 -0
- data/spec/extensions/force_encoding_spec.rb +2 -18
- data/spec/extensions/hash_aliases_spec.rb +8 -0
- data/spec/extensions/hook_class_methods_spec.rb +39 -58
- data/spec/extensions/inflector_spec.rb +2 -0
- data/spec/extensions/instance_filters_spec.rb +8 -8
- data/spec/extensions/json_serializer_spec.rb +1 -41
- data/spec/extensions/list_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +106 -109
- data/spec/extensions/migration_spec.rb +2 -0
- data/spec/extensions/named_timezones_spec.rb +1 -0
- data/spec/extensions/pg_array_associations_spec.rb +603 -0
- data/spec/extensions/pg_array_ops_spec.rb +25 -0
- data/spec/extensions/pg_array_spec.rb +9 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +13 -0
- data/spec/extensions/pg_hstore_spec.rb +1 -0
- data/spec/extensions/pg_json_ops_spec.rb +131 -0
- data/spec/extensions/pg_json_spec.rb +10 -4
- data/spec/extensions/pg_range_ops_spec.rb +2 -5
- data/spec/extensions/pg_range_spec.rb +6 -2
- data/spec/extensions/pg_row_ops_spec.rb +2 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +26 -5
- data/spec/extensions/rcte_tree_spec.rb +15 -15
- data/spec/extensions/schema_dumper_spec.rb +0 -1
- data/spec/extensions/schema_spec.rb +9 -9
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +18 -29
- data/spec/extensions/set_overrides_spec.rb +4 -0
- data/spec/extensions/{many_to_one_pk_lookup_spec.rb → shared_caching_spec.rb} +1 -4
- data/spec/extensions/single_table_inheritance_spec.rb +4 -4
- data/spec/extensions/spec_helper.rb +8 -9
- data/spec/extensions/sql_expr_spec.rb +2 -0
- data/spec/extensions/string_date_time_spec.rb +2 -0
- data/spec/extensions/string_stripper_spec.rb +2 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +12 -12
- data/spec/extensions/thread_local_timezones_spec.rb +2 -0
- data/spec/extensions/timestamps_spec.rb +1 -1
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +24 -24
- data/spec/extensions/tree_spec.rb +7 -7
- data/spec/extensions/typecast_on_load_spec.rb +8 -1
- data/spec/extensions/update_primary_key_spec.rb +10 -10
- data/spec/extensions/validation_class_methods_spec.rb +10 -39
- data/spec/extensions/validation_helpers_spec.rb +29 -47
- data/spec/extensions/xml_serializer_spec.rb +1 -23
- data/spec/integration/associations_test.rb +231 -40
- data/spec/integration/database_test.rb +1 -1
- data/spec/integration/dataset_test.rb +64 -64
- data/spec/integration/eager_loader_test.rb +28 -28
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +2 -2
- data/spec/integration/plugin_test.rb +21 -21
- data/spec/integration/prepared_statement_test.rb +7 -7
- data/spec/integration/schema_test.rb +115 -110
- data/spec/integration/spec_helper.rb +17 -27
- data/spec/integration/timezone_test.rb +1 -1
- data/spec/integration/transaction_test.rb +10 -10
- data/spec/integration/type_test.rb +2 -2
- data/spec/model/association_reflection_spec.rb +2 -28
- data/spec/model/associations_spec.rb +239 -188
- data/spec/model/base_spec.rb +27 -68
- data/spec/model/dataset_methods_spec.rb +4 -4
- data/spec/model/eager_loading_spec.rb +160 -172
- data/spec/model/hooks_spec.rb +62 -79
- data/spec/model/model_spec.rb +36 -51
- data/spec/model/plugins_spec.rb +5 -19
- data/spec/model/record_spec.rb +125 -151
- data/spec/model/spec_helper.rb +8 -6
- data/spec/model/validations_spec.rb +4 -17
- data/spec/spec_config.rb +2 -10
- metadata +50 -56
- data/lib/sequel/deprecated_core_extensions.rb +0 -135
- data/lib/sequel/extensions/pg_auto_parameterize.rb +0 -185
- data/lib/sequel/extensions/pg_statement_cache.rb +0 -318
- data/lib/sequel/plugins/identity_map.rb +0 -260
- data/lib/sequel_core.rb +0 -2
- data/lib/sequel_model.rb +0 -2
- data/spec/extensions/association_autoreloading_spec.rb +0 -102
- data/spec/extensions/identity_map_spec.rb +0 -337
- data/spec/extensions/pg_auto_parameterize_spec.rb +0 -70
- data/spec/extensions/pg_statement_cache_spec.rb +0 -208
- data/spec/rcov.opts +0 -8
- data/spec/spec_config.rb.example +0 -10
@@ -1,14 +1,11 @@
|
|
1
|
-
|
1
|
+
SEQUEL_ADAPTER_TEST = :informix
|
2
2
|
|
3
|
-
|
4
|
-
INFORMIX_DB = Sequel.connect('informix://localhost/mydb')
|
5
|
-
end
|
6
|
-
INTEGRATION_DB = INFORMIX_DB unless defined?(INTEGRATION_DB)
|
3
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
7
4
|
|
8
|
-
if
|
9
|
-
|
5
|
+
if DB.table_exists?(:test)
|
6
|
+
DB.drop_table :test
|
10
7
|
end
|
11
|
-
|
8
|
+
DB.create_table :test do
|
12
9
|
text :name
|
13
10
|
integer :value
|
14
11
|
|
@@ -17,16 +14,16 @@ end
|
|
17
14
|
|
18
15
|
describe "A Informix database" do
|
19
16
|
specify "should provide disconnect functionality" do
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
DB.execute("select user from dual")
|
18
|
+
DB.pool.size.should == 1
|
19
|
+
DB.disconnect
|
20
|
+
DB.pool.size.should == 0
|
24
21
|
end
|
25
22
|
end
|
26
23
|
|
27
24
|
describe "A Informix dataset" do
|
28
25
|
before do
|
29
|
-
@d =
|
26
|
+
@d = DB[:test]
|
30
27
|
@d.delete # remove all records
|
31
28
|
end
|
32
29
|
|
@@ -79,7 +76,7 @@ describe "A Informix dataset" do
|
|
79
76
|
end
|
80
77
|
|
81
78
|
specify "should support transactions" do
|
82
|
-
|
79
|
+
DB.transaction do
|
83
80
|
@d << {:name => 'abc', :value => 1}
|
84
81
|
end
|
85
82
|
|
data/spec/adapters/mssql_spec.rb
CHANGED
@@ -1,25 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require ENV['SEQUEL_MSSQL_SPEC_REQUIRE'] if ENV['SEQUEL_MSSQL_SPEC_REQUIRE']
|
1
|
+
SEQUEL_ADAPTER_TEST = :mssql
|
4
2
|
|
5
|
-
|
6
|
-
MSSQL_URL = 'jdbc:sqlserver://localhost;integratedSecurity=true;database=sandbox' unless defined? MSSQL_URL
|
7
|
-
MSSQL_DB = Sequel.connect(ENV['SEQUEL_MSSQL_SPEC_DB']||MSSQL_URL)
|
8
|
-
end
|
9
|
-
INTEGRATION_DB = MSSQL_DB unless defined?(INTEGRATION_DB)
|
3
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
10
4
|
|
11
|
-
def
|
5
|
+
def DB.sqls
|
12
6
|
(@sqls ||= [])
|
13
7
|
end
|
14
8
|
logger = Object.new
|
15
9
|
def logger.method_missing(m, msg)
|
16
|
-
|
10
|
+
DB.sqls << msg
|
17
11
|
end
|
18
|
-
|
12
|
+
DB.loggers = [logger]
|
19
13
|
|
20
14
|
describe "A MSSQL database" do
|
21
15
|
before do
|
22
|
-
@db =
|
16
|
+
@db = DB
|
23
17
|
end
|
24
18
|
|
25
19
|
cspecify "should be able to read fractional part of timestamp", :odbc do
|
@@ -40,7 +34,7 @@ end
|
|
40
34
|
|
41
35
|
describe "A MSSQL database" do
|
42
36
|
before do
|
43
|
-
@db =
|
37
|
+
@db = DB
|
44
38
|
@db.create_table! :test3 do
|
45
39
|
Integer :value
|
46
40
|
Time :time
|
@@ -57,7 +51,7 @@ end
|
|
57
51
|
|
58
52
|
describe "MSSQL" do
|
59
53
|
before(:all) do
|
60
|
-
@db =
|
54
|
+
@db = DB
|
61
55
|
@db.create_table!(:test3){Integer :v3}
|
62
56
|
@db.create_table!(:test4){Integer :v4}
|
63
57
|
@db[:test3].import([:v3], [[1], [2]])
|
@@ -82,7 +76,7 @@ end
|
|
82
76
|
# CREATE FULLTEXT CATALOG ftscd AS DEFAULT
|
83
77
|
describe "MSSQL full_text_search" do
|
84
78
|
before do
|
85
|
-
@db =
|
79
|
+
@db = DB
|
86
80
|
@db.drop_table?(:posts)
|
87
81
|
end
|
88
82
|
after do
|
@@ -107,19 +101,19 @@ end if false
|
|
107
101
|
|
108
102
|
describe "MSSQL Dataset#join_table" do
|
109
103
|
specify "should emulate the USING clause with ON" do
|
110
|
-
|
104
|
+
DB[:items].join(:categories, [:id]).sql.should ==
|
111
105
|
'SELECT * FROM [ITEMS] INNER JOIN [CATEGORIES] ON ([CATEGORIES].[ID] = [ITEMS].[ID])'
|
112
106
|
['SELECT * FROM [ITEMS] INNER JOIN [CATEGORIES] ON (([CATEGORIES].[ID1] = [ITEMS].[ID1]) AND ([CATEGORIES].[ID2] = [ITEMS].[ID2]))',
|
113
107
|
'SELECT * FROM [ITEMS] INNER JOIN [CATEGORIES] ON (([CATEGORIES].[ID2] = [ITEMS].[ID2]) AND ([CATEGORIES].[ID1] = [ITEMS].[ID1]))'].
|
114
|
-
should include(
|
115
|
-
|
108
|
+
should include(DB[:items].join(:categories, [:id1, :id2]).sql)
|
109
|
+
DB[:items___i].join(:categories___c, [:id]).sql.should ==
|
116
110
|
'SELECT * FROM [ITEMS] AS [I] INNER JOIN [CATEGORIES] AS [C] ON ([C].[ID] = [I].[ID])'
|
117
111
|
end
|
118
112
|
end
|
119
113
|
|
120
114
|
describe "MSSQL Dataset#output" do
|
121
115
|
before do
|
122
|
-
@db =
|
116
|
+
@db = DB
|
123
117
|
@db.create_table!(:items){String :name; Integer :value}
|
124
118
|
@db.create_table!(:out){String :name; Integer :value}
|
125
119
|
@ds = @db[:items]
|
@@ -197,8 +191,8 @@ end
|
|
197
191
|
|
198
192
|
describe "MSSQL dataset using #with and #with_recursive" do
|
199
193
|
before do
|
200
|
-
@db =
|
201
|
-
@ds =
|
194
|
+
@db = DB
|
195
|
+
@ds = DB[:t]
|
202
196
|
@ds1 = @ds.with(:t, @db[:x])
|
203
197
|
@ds2 = @ds.with_recursive(:t, @db[:x], @db[:t])
|
204
198
|
end
|
@@ -226,7 +220,7 @@ end
|
|
226
220
|
|
227
221
|
describe "MSSQL::Dataset#import" do
|
228
222
|
before do
|
229
|
-
@db =
|
223
|
+
@db = DB
|
230
224
|
@db.sqls.clear
|
231
225
|
@ds = @db[:test]
|
232
226
|
end
|
@@ -249,7 +243,7 @@ end
|
|
249
243
|
|
250
244
|
describe "MSSQL joined datasets" do
|
251
245
|
before do
|
252
|
-
@db =
|
246
|
+
@db = DB
|
253
247
|
end
|
254
248
|
|
255
249
|
specify "should format DELETE statements" do
|
@@ -265,7 +259,7 @@ end
|
|
265
259
|
|
266
260
|
describe "Offset support" do
|
267
261
|
before do
|
268
|
-
@db =
|
262
|
+
@db = DB
|
269
263
|
@db.create_table!(:i){Integer :id; Integer :parent_id}
|
270
264
|
@ds = @db[:i].order(:id)
|
271
265
|
@hs = []
|
@@ -288,7 +282,7 @@ end
|
|
288
282
|
|
289
283
|
describe "Common Table Expressions" do
|
290
284
|
before do
|
291
|
-
@db =
|
285
|
+
@db = DB
|
292
286
|
@db.create_table!(:i1){Integer :id; Integer :parent_id}
|
293
287
|
@db.create_table!(:i2){Integer :id; Integer :parent_id}
|
294
288
|
@ds = @db[:i1]
|
@@ -360,7 +354,7 @@ end
|
|
360
354
|
|
361
355
|
describe "MSSSQL::Dataset#insert" do
|
362
356
|
before do
|
363
|
-
@db =
|
357
|
+
@db = DB
|
364
358
|
@db.create_table!(:test5){primary_key :xid; Integer :value}
|
365
359
|
@db.create_table! :test4 do
|
366
360
|
String :name, :size => 20
|
@@ -397,13 +391,13 @@ describe "MSSSQL::Dataset#insert" do
|
|
397
391
|
end
|
398
392
|
|
399
393
|
specify "should play nicely with simple_select_all?" do
|
400
|
-
|
394
|
+
DB[:test4].disable_insert_output.send(:simple_select_all?).should == true
|
401
395
|
end
|
402
396
|
end
|
403
397
|
|
404
398
|
describe "MSSSQL::Dataset#into" do
|
405
399
|
before do
|
406
|
-
@db =
|
400
|
+
@db = DB
|
407
401
|
end
|
408
402
|
|
409
403
|
specify "should format SELECT statement" do
|
@@ -421,7 +415,7 @@ end
|
|
421
415
|
|
422
416
|
describe "A MSSQL database" do
|
423
417
|
before do
|
424
|
-
@db =
|
418
|
+
@db = DB
|
425
419
|
end
|
426
420
|
after do
|
427
421
|
@db.drop_table?(:a)
|
@@ -447,68 +441,68 @@ end
|
|
447
441
|
|
448
442
|
describe "MSSQL::Database#rename_table" do
|
449
443
|
after do
|
450
|
-
|
444
|
+
DB.drop_table?(:foo)
|
451
445
|
end
|
452
446
|
|
453
447
|
specify "should work on non-schema bound tables which need escaping" do
|
454
|
-
|
455
|
-
|
448
|
+
DB.quote_identifiers = true
|
449
|
+
DB.create_table! :'foo bar' do
|
456
450
|
text :name
|
457
451
|
end
|
458
|
-
|
459
|
-
proc {
|
452
|
+
DB.drop_table? :foo
|
453
|
+
proc { DB.rename_table 'foo bar', 'foo' }.should_not raise_error
|
460
454
|
end
|
461
455
|
|
462
456
|
specify "should work on schema bound tables" do
|
463
|
-
|
457
|
+
DB.execute(<<-SQL)
|
464
458
|
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'MY')
|
465
459
|
EXECUTE sp_executesql N'create schema MY'
|
466
460
|
SQL
|
467
|
-
|
461
|
+
DB.create_table! :MY__foo do
|
468
462
|
text :name
|
469
463
|
end
|
470
|
-
proc {
|
471
|
-
proc {
|
464
|
+
proc { DB.rename_table :MY__foo, :MY__bar }.should_not raise_error
|
465
|
+
proc { DB.rename_table :MY__bar, :foo }.should_not raise_error
|
472
466
|
end
|
473
467
|
end
|
474
468
|
|
475
469
|
describe "MSSQL::Dataset#count" do
|
476
470
|
specify "should work with a distinct query with an order clause" do
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
471
|
+
DB.create_table!(:items){String :name; Integer :value}
|
472
|
+
DB[:items].insert(:name => "name", :value => 1)
|
473
|
+
DB[:items].insert(:name => "name", :value => 1)
|
474
|
+
DB[:items].select(:name, :value).distinct.order(:name).count.should == 1
|
475
|
+
DB[:items].select(:name, :value).group(:name, :value).order(:name).count.should == 1
|
482
476
|
end
|
483
477
|
end
|
484
478
|
|
485
479
|
describe "MSSQL::Database#create_table" do
|
486
480
|
specify "should support collate with various other column options" do
|
487
|
-
|
488
|
-
|
489
|
-
|
481
|
+
DB.create_table!(:items){ String :name, :size => 128, :collate => :sql_latin1_general_cp1_ci_as, :default => 'foo', :null => false, :unique => true}
|
482
|
+
DB[:items].insert
|
483
|
+
DB[:items].select_map(:name).should == ["foo"]
|
490
484
|
end
|
491
485
|
end
|
492
486
|
|
493
487
|
describe "MSSQL::Database#mssql_unicode_strings = false" do
|
494
488
|
before do
|
495
|
-
|
489
|
+
DB.mssql_unicode_strings = false
|
496
490
|
end
|
497
491
|
after do
|
498
|
-
|
499
|
-
|
492
|
+
DB.drop_table?(:items)
|
493
|
+
DB.mssql_unicode_strings = true
|
500
494
|
end
|
501
495
|
|
502
496
|
specify "should work correctly" do
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
497
|
+
DB.create_table!(:items){String :name}
|
498
|
+
DB[:items].mssql_unicode_strings.should == false
|
499
|
+
DB[:items].insert(:name=>'foo')
|
500
|
+
DB[:items].select_map(:name).should == ['foo']
|
507
501
|
end
|
508
502
|
|
509
503
|
specify "should be overridable at the dataset level" do
|
510
|
-
|
511
|
-
ds =
|
504
|
+
DB.create_table!(:items){String :name}
|
505
|
+
ds = DB[:items]
|
512
506
|
ds.mssql_unicode_strings.should == false
|
513
507
|
ds.mssql_unicode_strings = true
|
514
508
|
ds.mssql_unicode_strings.should == true
|
@@ -520,7 +514,7 @@ end
|
|
520
514
|
describe "A MSSQL database adds index with include" do
|
521
515
|
before :all do
|
522
516
|
@table_name = :test_index_include
|
523
|
-
@db =
|
517
|
+
@db = DB
|
524
518
|
@db.create_table! @table_name do
|
525
519
|
integer :col1
|
526
520
|
integer :col2
|
@@ -542,34 +536,34 @@ end
|
|
542
536
|
|
543
537
|
describe "MSSQL::Database#drop_column with a schema" do
|
544
538
|
before do
|
545
|
-
|
539
|
+
DB.run "create schema test" rescue nil
|
546
540
|
end
|
547
541
|
after do
|
548
|
-
|
549
|
-
|
542
|
+
DB.drop_table(:test__items)
|
543
|
+
DB.run "drop schema test" rescue nil
|
550
544
|
end
|
551
545
|
|
552
546
|
specify "drops columns with a default value" do
|
553
|
-
|
554
|
-
|
555
|
-
|
547
|
+
DB.create_table!(:test__items){ Integer :id; String :name, :default => 'widget' }
|
548
|
+
DB.drop_column(:test__items, :name)
|
549
|
+
DB[:test__items].columns.should == [:id]
|
556
550
|
end
|
557
551
|
end
|
558
552
|
|
559
553
|
describe "Database#foreign_key_list" do
|
560
554
|
before(:all) do
|
561
|
-
|
555
|
+
DB.create_table! :items do
|
562
556
|
primary_key :id
|
563
557
|
integer :sku
|
564
558
|
end
|
565
|
-
|
559
|
+
DB.create_table! :prices do
|
566
560
|
integer :item_id
|
567
561
|
datetime :valid_from
|
568
562
|
float :price
|
569
563
|
primary_key [:item_id, :valid_from]
|
570
564
|
foreign_key [:item_id], :items, :key => :id, :name => :fk_prices_items
|
571
565
|
end
|
572
|
-
|
566
|
+
DB.create_table! :sales do
|
573
567
|
integer :id
|
574
568
|
integer :price_item_id
|
575
569
|
datetime :price_valid_from
|
@@ -577,12 +571,12 @@ describe "Database#foreign_key_list" do
|
|
577
571
|
end
|
578
572
|
end
|
579
573
|
after(:all) do
|
580
|
-
|
581
|
-
|
582
|
-
|
574
|
+
DB.drop_table :sales
|
575
|
+
DB.drop_table :prices
|
576
|
+
DB.drop_table :items
|
583
577
|
end
|
584
578
|
it "should support typical foreign keys" do
|
585
|
-
|
579
|
+
DB.foreign_key_list(:prices).should == [{:name => :fk_prices_items,
|
586
580
|
:table => :items,
|
587
581
|
:columns => [:item_id],
|
588
582
|
:key => [:id],
|
@@ -590,7 +584,7 @@ describe "Database#foreign_key_list" do
|
|
590
584
|
:on_delete => :no_action }]
|
591
585
|
end
|
592
586
|
it "should support a foreign key with multiple columns" do
|
593
|
-
|
587
|
+
DB.foreign_key_list(:sales).should == [{:name => :fk_sales_prices,
|
594
588
|
:table => :prices,
|
595
589
|
:columns => [:price_item_id, :price_valid_from],
|
596
590
|
:key => [:item_id, :valid_from],
|
@@ -600,12 +594,12 @@ describe "Database#foreign_key_list" do
|
|
600
594
|
|
601
595
|
context "with multiple schemas" do
|
602
596
|
before(:all) do
|
603
|
-
|
604
|
-
|
597
|
+
DB.execute_ddl "create schema vendor"
|
598
|
+
DB.create_table! :vendor__vendors do
|
605
599
|
primary_key :id
|
606
600
|
varchar :name
|
607
601
|
end
|
608
|
-
|
602
|
+
DB.create_table! :vendor__mapping do
|
609
603
|
integer :vendor_id
|
610
604
|
integer :item_id
|
611
605
|
foreign_key [:vendor_id], :vendor__vendors, :name => :fk_mapping_vendor
|
@@ -613,12 +607,12 @@ describe "Database#foreign_key_list" do
|
|
613
607
|
end
|
614
608
|
end
|
615
609
|
after(:all) do
|
616
|
-
|
617
|
-
|
618
|
-
|
610
|
+
DB.drop_table :vendor__mapping
|
611
|
+
DB.drop_table :vendor__vendors
|
612
|
+
DB.execute_ddl "drop schema vendor"
|
619
613
|
end
|
620
614
|
it "should support mixed schema bound tables" do
|
621
|
-
|
615
|
+
DB.foreign_key_list(:vendor__mapping).sort_by{|h| h[:name].to_s}.should == [{:name => :fk_mapping_item, :table => :items, :columns => [:item_id], :key => [:id], :on_update => :no_action, :on_delete => :no_action }, {:name => :fk_mapping_vendor, :table => :vendor__vendors, :columns => [:vendor_id], :key => [:id], :on_update => :no_action, :on_delete => :no_action }]
|
622
616
|
end
|
623
617
|
end
|
624
618
|
end
|
data/spec/adapters/mysql_spec.rb
CHANGED
@@ -1,28 +1,21 @@
|
|
1
|
+
SEQUEL_ADAPTER_TEST = :mysql
|
2
|
+
|
1
3
|
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
2
4
|
|
3
|
-
unless defined?(MYSQL_USER)
|
4
|
-
MYSQL_USER = 'root'
|
5
|
-
end
|
6
|
-
unless defined?(MYSQL_DB)
|
7
|
-
MYSQL_URL = (ENV['SEQUEL_MY_SPEC_DB']||"mysql://#{MYSQL_USER}@localhost/sandbox") unless defined? MYSQL_URL
|
8
|
-
MYSQL_DB = Sequel.connect(MYSQL_URL)
|
9
|
-
end
|
10
5
|
unless defined?(MYSQL_SOCKET_FILE)
|
11
6
|
MYSQL_SOCKET_FILE = '/tmp/mysql.sock'
|
12
7
|
end
|
13
|
-
|
14
|
-
|
15
|
-
MYSQL_URI = URI.parse(MYSQL_DB.uri)
|
8
|
+
MYSQL_URI = URI.parse(DB.uri)
|
16
9
|
|
17
|
-
def
|
10
|
+
def DB.sqls
|
18
11
|
(@sqls ||= [])
|
19
12
|
end
|
20
13
|
logger = Object.new
|
21
14
|
def logger.method_missing(m, msg)
|
22
|
-
|
15
|
+
DB.sqls << msg
|
23
16
|
end
|
24
|
-
|
25
|
-
|
17
|
+
DB.loggers = [logger]
|
18
|
+
DB.drop_table?(:items, :dolls, :booltest)
|
26
19
|
|
27
20
|
SQL_BEGIN = 'BEGIN'
|
28
21
|
SQL_ROLLBACK = 'ROLLBACK'
|
@@ -30,8 +23,8 @@ SQL_COMMIT = 'COMMIT'
|
|
30
23
|
|
31
24
|
describe "MySQL", '#create_table' do
|
32
25
|
before do
|
33
|
-
@db =
|
34
|
-
|
26
|
+
@db = DB
|
27
|
+
DB.sqls.clear
|
35
28
|
end
|
36
29
|
after do
|
37
30
|
@db.drop_table?(:dolls)
|
@@ -99,10 +92,10 @@ describe "MySQL", '#create_table' do
|
|
99
92
|
end
|
100
93
|
end
|
101
94
|
|
102
|
-
if [:mysql, :mysql2].include?(
|
95
|
+
if [:mysql, :mysql2].include?(DB.adapter_scheme)
|
103
96
|
describe "Sequel::MySQL::Database#convert_tinyint_to_bool" do
|
104
97
|
before do
|
105
|
-
@db =
|
98
|
+
@db = DB
|
106
99
|
@db.create_table(:booltest){column :b, 'tinyint(1)'; column :i, 'tinyint(4)'}
|
107
100
|
@ds = @db[:booltest]
|
108
101
|
end
|
@@ -162,12 +155,12 @@ end
|
|
162
155
|
|
163
156
|
describe "A MySQL dataset" do
|
164
157
|
before do
|
165
|
-
|
166
|
-
@d =
|
167
|
-
|
158
|
+
DB.create_table(:items){String :name; Integer :value}
|
159
|
+
@d = DB[:items]
|
160
|
+
DB.sqls.clear
|
168
161
|
end
|
169
162
|
after do
|
170
|
-
|
163
|
+
DB.drop_table?(:items)
|
171
164
|
end
|
172
165
|
|
173
166
|
specify "should quote columns and tables using back-ticks if quoting identifiers" do
|
@@ -237,7 +230,7 @@ end
|
|
237
230
|
|
238
231
|
describe "MySQL datasets" do
|
239
232
|
before do
|
240
|
-
@d =
|
233
|
+
@d = DB[:orders]
|
241
234
|
end
|
242
235
|
|
243
236
|
specify "should correctly quote column references" do
|
@@ -253,7 +246,7 @@ end
|
|
253
246
|
|
254
247
|
describe "Dataset#distinct" do
|
255
248
|
before do
|
256
|
-
@db =
|
249
|
+
@db = DB
|
257
250
|
@db.create_table!(:a) do
|
258
251
|
Integer :a
|
259
252
|
Integer :b
|
@@ -276,7 +269,7 @@ end
|
|
276
269
|
|
277
270
|
describe "MySQL join expressions" do
|
278
271
|
before do
|
279
|
-
@ds =
|
272
|
+
@ds = DB[:nodes]
|
280
273
|
end
|
281
274
|
|
282
275
|
specify "should raise error for :full_outer join requests." do
|
@@ -326,7 +319,7 @@ end
|
|
326
319
|
|
327
320
|
describe "Joined MySQL dataset" do
|
328
321
|
before do
|
329
|
-
@ds =
|
322
|
+
@ds = DB[:nodes]
|
330
323
|
end
|
331
324
|
|
332
325
|
specify "should quote fields correctly" do
|
@@ -350,17 +343,17 @@ end
|
|
350
343
|
|
351
344
|
describe "A MySQL database" do
|
352
345
|
after do
|
353
|
-
|
346
|
+
DB.drop_table?(:test_innodb)
|
354
347
|
end
|
355
348
|
|
356
349
|
specify "should handle the creation and dropping of an InnoDB table with foreign keys" do
|
357
|
-
proc{
|
350
|
+
proc{DB.create_table!(:test_innodb, :engine=>:InnoDB){primary_key :id; foreign_key :fk, :test_innodb, :key=>:id}}.should_not raise_error
|
358
351
|
end
|
359
352
|
end
|
360
353
|
|
361
354
|
describe "A MySQL database" do
|
362
355
|
before(:all) do
|
363
|
-
@db =
|
356
|
+
@db = DB
|
364
357
|
@db.create_table! :test2 do
|
365
358
|
text :name
|
366
359
|
integer :value
|
@@ -457,10 +450,10 @@ describe "A MySQL database with table options" do
|
|
457
450
|
Sequel::MySQL.default_charset = 'utf8'
|
458
451
|
Sequel::MySQL.default_collate = 'utf8_general_ci'
|
459
452
|
|
460
|
-
@db =
|
453
|
+
@db = DB
|
461
454
|
@db.drop_table?(:items)
|
462
455
|
|
463
|
-
|
456
|
+
DB.sqls.clear
|
464
457
|
end
|
465
458
|
after do
|
466
459
|
@db.drop_table?(:items)
|
@@ -494,9 +487,9 @@ end
|
|
494
487
|
|
495
488
|
describe "A MySQL database" do
|
496
489
|
before do
|
497
|
-
@db =
|
490
|
+
@db = DB
|
498
491
|
@db.drop_table?(:items)
|
499
|
-
|
492
|
+
DB.sqls.clear
|
500
493
|
end
|
501
494
|
after do
|
502
495
|
@db.drop_table?(:items, :users)
|
@@ -596,20 +589,20 @@ describe "A MySQL database" do
|
|
596
589
|
end
|
597
590
|
|
598
591
|
# Socket tests should only be run if the MySQL server is on localhost
|
599
|
-
if %w'localhost 127.0.0.1 ::1'.include?(MYSQL_URI.host) and
|
592
|
+
if %w'localhost 127.0.0.1 ::1'.include?(MYSQL_URI.host) and DB.adapter_scheme == :mysql
|
600
593
|
describe "A MySQL database" do
|
601
594
|
specify "should accept a socket option" do
|
602
|
-
db = Sequel.mysql(
|
595
|
+
db = Sequel.mysql(DB.opts[:database], :host => 'localhost', :user => DB.opts[:user], :password => DB.opts[:password], :socket => MYSQL_SOCKET_FILE)
|
603
596
|
proc {db.test_connection}.should_not raise_error
|
604
597
|
end
|
605
598
|
|
606
599
|
specify "should accept a socket option without host option" do
|
607
|
-
db = Sequel.mysql(
|
600
|
+
db = Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket => MYSQL_SOCKET_FILE)
|
608
601
|
proc {db.test_connection}.should_not raise_error
|
609
602
|
end
|
610
603
|
|
611
604
|
specify "should fail to connect with invalid socket" do
|
612
|
-
db = Sequel.mysql(
|
605
|
+
db = Sequel.mysql(DB.opts[:database], :user => DB.opts[:user], :password => DB.opts[:password], :socket =>'blah')
|
613
606
|
proc {db.test_connection}.should raise_error
|
614
607
|
end
|
615
608
|
end
|
@@ -617,93 +610,93 @@ end
|
|
617
610
|
|
618
611
|
describe "A MySQL database" do
|
619
612
|
specify "should accept a read_timeout option when connecting" do
|
620
|
-
db = Sequel.connect(
|
613
|
+
db = Sequel.connect(DB.opts.merge(:read_timeout=>22342))
|
621
614
|
proc {db.test_connection}.should_not raise_error
|
622
615
|
end
|
623
616
|
|
624
617
|
specify "should accept a connect_timeout option when connecting" do
|
625
|
-
db = Sequel.connect(
|
618
|
+
db = Sequel.connect(DB.opts.merge(:connect_timeout=>22342))
|
626
619
|
proc {db.test_connection}.should_not raise_error
|
627
620
|
end
|
628
621
|
end
|
629
622
|
|
630
623
|
describe "MySQL foreign key support" do
|
631
624
|
after do
|
632
|
-
|
625
|
+
DB.drop_table?(:testfk, :testpk)
|
633
626
|
end
|
634
627
|
|
635
628
|
specify "should create table without :key" do
|
636
|
-
|
637
|
-
|
629
|
+
DB.create_table!(:testpk){primary_key :id}
|
630
|
+
DB.create_table!(:testfk){foreign_key :fk, :testpk}
|
638
631
|
end
|
639
632
|
|
640
633
|
specify "should create table with composite keys without :key" do
|
641
|
-
|
642
|
-
|
634
|
+
DB.create_table!(:testpk){Integer :id; Integer :id2; primary_key([:id, :id2])}
|
635
|
+
DB.create_table!(:testfk){Integer :fk; Integer :fk2; foreign_key([:fk, :fk2], :testpk)}
|
643
636
|
end
|
644
637
|
|
645
638
|
specify "should create table with self referential without :key" do
|
646
|
-
|
639
|
+
DB.create_table!(:testfk){primary_key :id; foreign_key :fk, :testfk}
|
647
640
|
end
|
648
641
|
|
649
642
|
specify "should create table with self referential with composite keys without :key" do
|
650
|
-
|
643
|
+
DB.create_table!(:testfk){Integer :id; Integer :id2; Integer :fk; Integer :fk2; primary_key([:id, :id2]); foreign_key([:fk, :fk2], :testfk)}
|
651
644
|
end
|
652
645
|
|
653
646
|
specify "should alter table without :key" do
|
654
|
-
|
655
|
-
|
656
|
-
|
647
|
+
DB.create_table!(:testpk){primary_key :id}
|
648
|
+
DB.create_table!(:testfk){Integer :id}
|
649
|
+
DB.alter_table(:testfk){add_foreign_key :fk, :testpk}
|
657
650
|
end
|
658
651
|
|
659
652
|
specify "should alter table with composite keys without :key" do
|
660
|
-
|
661
|
-
|
662
|
-
|
653
|
+
DB.create_table!(:testpk){Integer :id; Integer :id2; primary_key([:id, :id2])}
|
654
|
+
DB.create_table!(:testfk){Integer :fk; Integer :fk2}
|
655
|
+
DB.alter_table(:testfk){add_foreign_key([:fk, :fk2], :testpk)}
|
663
656
|
end
|
664
657
|
|
665
658
|
specify "should alter table with self referential without :key" do
|
666
|
-
|
667
|
-
|
659
|
+
DB.create_table!(:testfk){primary_key :id}
|
660
|
+
DB.alter_table(:testfk){add_foreign_key :fk, :testfk}
|
668
661
|
end
|
669
662
|
|
670
663
|
specify "should alter table with self referential with composite keys without :key" do
|
671
|
-
|
672
|
-
|
664
|
+
DB.create_table!(:testfk){Integer :id; Integer :id2; Integer :fk; Integer :fk2; primary_key([:id, :id2])}
|
665
|
+
DB.alter_table(:testfk){add_foreign_key [:fk, :fk2], :testfk}
|
673
666
|
end
|
674
667
|
end
|
675
668
|
|
676
669
|
describe "A grouped MySQL dataset" do
|
677
670
|
before do
|
678
|
-
|
671
|
+
DB.create_table! :test2 do
|
679
672
|
text :name
|
680
673
|
integer :value
|
681
674
|
end
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
675
|
+
DB[:test2] << {:name => '11', :value => 10}
|
676
|
+
DB[:test2] << {:name => '11', :value => 20}
|
677
|
+
DB[:test2] << {:name => '11', :value => 30}
|
678
|
+
DB[:test2] << {:name => '12', :value => 10}
|
679
|
+
DB[:test2] << {:name => '12', :value => 20}
|
680
|
+
DB[:test2] << {:name => '13', :value => 10}
|
688
681
|
end
|
689
682
|
after do
|
690
|
-
|
683
|
+
DB.drop_table?(:test2)
|
691
684
|
end
|
692
685
|
|
693
686
|
specify "should return the correct count for raw sql query" do
|
694
|
-
ds =
|
687
|
+
ds = DB["select name FROM test2 WHERE name = '11' GROUP BY name"]
|
695
688
|
ds.count.should == 1
|
696
689
|
end
|
697
690
|
|
698
691
|
specify "should return the correct count for a normal dataset" do
|
699
|
-
ds =
|
692
|
+
ds = DB[:test2].select(:name).where(:name => '11').group(:name)
|
700
693
|
ds.count.should == 1
|
701
694
|
end
|
702
695
|
end
|
703
696
|
|
704
697
|
describe "A MySQL database" do
|
705
698
|
before do
|
706
|
-
@db =
|
699
|
+
@db = DB
|
707
700
|
@db.drop_table?(:posts)
|
708
701
|
@db.sqls.clear
|
709
702
|
end
|
@@ -785,18 +778,18 @@ end
|
|
785
778
|
|
786
779
|
describe "MySQL::Dataset#insert and related methods" do
|
787
780
|
before do
|
788
|
-
|
789
|
-
@d =
|
790
|
-
|
781
|
+
DB.create_table(:items){String :name; Integer :value}
|
782
|
+
@d = DB[:items]
|
783
|
+
DB.sqls.clear
|
791
784
|
end
|
792
785
|
after do
|
793
|
-
|
786
|
+
DB.drop_table?(:items)
|
794
787
|
end
|
795
788
|
|
796
789
|
specify "#insert should insert record with default values when no arguments given" do
|
797
790
|
@d.insert
|
798
791
|
check_sqls do
|
799
|
-
|
792
|
+
DB.sqls.should == ["INSERT INTO `items` () VALUES ()"]
|
800
793
|
end
|
801
794
|
@d.all.should == [{:name => nil, :value => nil}]
|
802
795
|
end
|
@@ -804,7 +797,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
804
797
|
specify "#insert should insert record with default values when empty hash given" do
|
805
798
|
@d.insert({})
|
806
799
|
check_sqls do
|
807
|
-
|
800
|
+
DB.sqls.should == ["INSERT INTO `items` () VALUES ()"]
|
808
801
|
end
|
809
802
|
@d.all.should == [{:name => nil, :value => nil}]
|
810
803
|
end
|
@@ -812,23 +805,23 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
812
805
|
specify "#insert should insert record with default values when empty array given" do
|
813
806
|
@d.insert []
|
814
807
|
check_sqls do
|
815
|
-
|
808
|
+
DB.sqls.should == ["INSERT INTO `items` () VALUES ()"]
|
816
809
|
end
|
817
810
|
@d.all.should == [{:name => nil, :value => nil}]
|
818
811
|
end
|
819
812
|
|
820
813
|
specify "#on_duplicate_key_update should work with regular inserts" do
|
821
|
-
|
822
|
-
|
814
|
+
DB.add_index :items, :name, :unique=>true
|
815
|
+
DB.sqls.clear
|
823
816
|
@d.insert(:name => 'abc', :value => 1)
|
824
817
|
@d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'abc', :value => 1)
|
825
818
|
@d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'def', :value => 2)
|
826
819
|
|
827
820
|
check_sqls do
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
821
|
+
DB.sqls.length.should == 3
|
822
|
+
DB.sqls[0].should =~ /\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('abc'|1), (1|'abc')\)\z/
|
823
|
+
DB.sqls[1].should =~ /\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('abc'|1), (1|'abc')\) ON DUPLICATE KEY UPDATE `name`=VALUES\(`name`\), `value`=6\z/
|
824
|
+
DB.sqls[2].should =~ /\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('def'|2), (2|'def')\) ON DUPLICATE KEY UPDATE `name`=VALUES\(`name`\), `value`=6\z/
|
832
825
|
end
|
833
826
|
|
834
827
|
@d.all.should == [{:name => 'abc', :value => 6}, {:name => 'def', :value => 2}]
|
@@ -838,7 +831,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
838
831
|
@d.multi_replace([{:name => 'abc'}, {:name => 'def'}])
|
839
832
|
|
840
833
|
check_sqls do
|
841
|
-
|
834
|
+
DB.sqls.should == [
|
842
835
|
SQL_BEGIN,
|
843
836
|
"REPLACE INTO `items` (`name`) VALUES ('abc'), ('def')",
|
844
837
|
SQL_COMMIT
|
@@ -855,7 +848,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
855
848
|
:commit_every => 2)
|
856
849
|
|
857
850
|
check_sqls do
|
858
|
-
|
851
|
+
DB.sqls.should == [
|
859
852
|
SQL_BEGIN,
|
860
853
|
"REPLACE INTO `items` (`value`) VALUES (1), (2)",
|
861
854
|
SQL_COMMIT,
|
@@ -878,7 +871,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
878
871
|
:slice => 2)
|
879
872
|
|
880
873
|
check_sqls do
|
881
|
-
|
874
|
+
DB.sqls.should == [
|
882
875
|
SQL_BEGIN,
|
883
876
|
"REPLACE INTO `items` (`value`) VALUES (1), (2)",
|
884
877
|
SQL_COMMIT,
|
@@ -900,7 +893,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
900
893
|
@d.multi_insert([{:name => 'abc'}, {:name => 'def'}])
|
901
894
|
|
902
895
|
check_sqls do
|
903
|
-
|
896
|
+
DB.sqls.should == [
|
904
897
|
SQL_BEGIN,
|
905
898
|
"INSERT INTO `items` (`name`) VALUES ('abc'), ('def')",
|
906
899
|
SQL_COMMIT
|
@@ -917,7 +910,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
917
910
|
:commit_every => 2)
|
918
911
|
|
919
912
|
check_sqls do
|
920
|
-
|
913
|
+
DB.sqls.should == [
|
921
914
|
SQL_BEGIN,
|
922
915
|
"INSERT INTO `items` (`value`) VALUES (1), (2)",
|
923
916
|
SQL_COMMIT,
|
@@ -940,7 +933,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
940
933
|
:slice => 2)
|
941
934
|
|
942
935
|
check_sqls do
|
943
|
-
|
936
|
+
DB.sqls.should == [
|
944
937
|
SQL_BEGIN,
|
945
938
|
"INSERT INTO `items` (`value`) VALUES (1), (2)",
|
946
939
|
SQL_COMMIT,
|
@@ -962,7 +955,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
962
955
|
@d.import([:name, :value], [['abc', 1], ['def', 2]])
|
963
956
|
|
964
957
|
check_sqls do
|
965
|
-
|
958
|
+
DB.sqls.should == [
|
966
959
|
SQL_BEGIN,
|
967
960
|
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2)",
|
968
961
|
SQL_COMMIT
|
@@ -979,7 +972,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
979
972
|
@d.insert_ignore.multi_insert([{:name => 'abc'}, {:name => 'def'}])
|
980
973
|
|
981
974
|
check_sqls do
|
982
|
-
|
975
|
+
DB.sqls.should == [
|
983
976
|
SQL_BEGIN,
|
984
977
|
"INSERT IGNORE INTO `items` (`name`) VALUES ('abc'), ('def')",
|
985
978
|
SQL_COMMIT
|
@@ -994,7 +987,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
994
987
|
specify "#insert_ignore should add the IGNORE keyword for single inserts" do
|
995
988
|
@d.insert_ignore.insert(:name => 'ghi')
|
996
989
|
check_sqls do
|
997
|
-
|
990
|
+
DB.sqls.should == ["INSERT IGNORE INTO `items` (`name`) VALUES ('ghi')"]
|
998
991
|
end
|
999
992
|
@d.all.should == [{:name => 'ghi', :value => nil}]
|
1000
993
|
end
|
@@ -1003,7 +996,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
1003
996
|
@d.on_duplicate_key_update.import([:name,:value], [['abc', 1], ['def',2]])
|
1004
997
|
|
1005
998
|
check_sqls do
|
1006
|
-
|
999
|
+
DB.sqls.should == [
|
1007
1000
|
"SELECT * FROM `items` LIMIT 1",
|
1008
1001
|
SQL_BEGIN,
|
1009
1002
|
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2) ON DUPLICATE KEY UPDATE `name`=VALUES(`name`), `value`=VALUES(`value`)",
|
@@ -1022,7 +1015,7 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
1022
1015
|
)
|
1023
1016
|
|
1024
1017
|
check_sqls do
|
1025
|
-
|
1018
|
+
DB.sqls.should == [
|
1026
1019
|
SQL_BEGIN,
|
1027
1020
|
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2) ON DUPLICATE KEY UPDATE `value`=VALUES(`value`)",
|
1028
1021
|
SQL_COMMIT
|
@@ -1038,21 +1031,21 @@ end
|
|
1038
1031
|
|
1039
1032
|
describe "MySQL::Dataset#update and related methods" do
|
1040
1033
|
before do
|
1041
|
-
|
1042
|
-
@d =
|
1034
|
+
DB.create_table(:items){String :name; Integer :value; index :name, :unique=>true}
|
1035
|
+
@d = DB[:items]
|
1043
1036
|
end
|
1044
1037
|
after do
|
1045
|
-
|
1038
|
+
DB.drop_table?(:items)
|
1046
1039
|
end
|
1047
1040
|
|
1048
1041
|
specify "#update_ignore should not raise error where normal update would fail" do
|
1049
1042
|
@d.insert(:name => 'cow', :value => 0)
|
1050
1043
|
@d.insert(:name => 'cat', :value => 1)
|
1051
1044
|
proc{@d.where(:value => 1).update(:name => 'cow')}.should raise_error(Sequel::DatabaseError)
|
1052
|
-
|
1045
|
+
DB.sqls.clear
|
1053
1046
|
@d.update_ignore.where(:value => 1).update(:name => 'cow')
|
1054
1047
|
check_sqls do
|
1055
|
-
|
1048
|
+
DB.sqls.should == ["UPDATE IGNORE `items` SET `name` = 'cow' WHERE (`value` = 1)"]
|
1056
1049
|
end
|
1057
1050
|
@d.order(:name).all.should == [{:name => 'cat', :value => 1}, {:name => 'cow', :value => 0}]
|
1058
1051
|
end
|
@@ -1060,16 +1053,16 @@ end
|
|
1060
1053
|
|
1061
1054
|
describe "MySQL::Dataset#replace" do
|
1062
1055
|
before do
|
1063
|
-
|
1064
|
-
@d =
|
1065
|
-
|
1056
|
+
DB.create_table(:items){Integer :id, :unique=>true; Integer :value}
|
1057
|
+
@d = DB[:items]
|
1058
|
+
DB.sqls.clear
|
1066
1059
|
end
|
1067
1060
|
after do
|
1068
|
-
|
1061
|
+
DB.drop_table?(:items)
|
1069
1062
|
end
|
1070
1063
|
|
1071
1064
|
specify "should use default values if they exist" do
|
1072
|
-
|
1065
|
+
DB.alter_table(:items){set_column_default :id, 1; set_column_default :value, 2}
|
1073
1066
|
@d.replace
|
1074
1067
|
@d.all.should == [{:id=>1, :value=>2}]
|
1075
1068
|
@d.replace([])
|
@@ -1102,7 +1095,7 @@ end
|
|
1102
1095
|
|
1103
1096
|
describe "MySQL::Dataset#complex_expression_sql" do
|
1104
1097
|
before do
|
1105
|
-
@d =
|
1098
|
+
@d = DB.dataset
|
1106
1099
|
end
|
1107
1100
|
|
1108
1101
|
specify "should handle string concatenation with CONCAT if more than one record" do
|
@@ -1119,28 +1112,28 @@ end
|
|
1119
1112
|
|
1120
1113
|
describe "MySQL::Dataset#calc_found_rows" do
|
1121
1114
|
before do
|
1122
|
-
|
1115
|
+
DB.create_table!(:items){Integer :a}
|
1123
1116
|
end
|
1124
1117
|
after do
|
1125
|
-
|
1118
|
+
DB.drop_table?(:items)
|
1126
1119
|
end
|
1127
1120
|
|
1128
1121
|
specify "should add the SQL_CALC_FOUND_ROWS keyword when selecting" do
|
1129
|
-
|
1122
|
+
DB[:items].select(:a).calc_found_rows.limit(1).sql.should == \
|
1130
1123
|
'SELECT SQL_CALC_FOUND_ROWS `a` FROM `items` LIMIT 1'
|
1131
1124
|
end
|
1132
1125
|
|
1133
1126
|
specify "should count matching rows disregarding LIMIT clause" do
|
1134
|
-
|
1135
|
-
|
1127
|
+
DB[:items].multi_insert([{:a => 1}, {:a => 1}, {:a => 2}])
|
1128
|
+
DB.sqls.clear
|
1136
1129
|
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
1130
|
+
DB.synchronize do
|
1131
|
+
DB[:items].calc_found_rows.filter(:a => 1).limit(1).all.should == [{:a => 1}]
|
1132
|
+
DB.dataset.select(Sequel.function(:FOUND_ROWS).as(:rows)).all.should == [{:rows => 2 }]
|
1140
1133
|
end
|
1141
1134
|
|
1142
1135
|
check_sqls do
|
1143
|
-
|
1136
|
+
DB.sqls.should == [
|
1144
1137
|
'SELECT SQL_CALC_FOUND_ROWS * FROM `items` WHERE (`a` = 1) LIMIT 1',
|
1145
1138
|
'SELECT FOUND_ROWS() AS `rows`',
|
1146
1139
|
]
|
@@ -1148,34 +1141,34 @@ describe "MySQL::Dataset#calc_found_rows" do
|
|
1148
1141
|
end
|
1149
1142
|
end
|
1150
1143
|
|
1151
|
-
if
|
1144
|
+
if DB.adapter_scheme == :mysql or DB.adapter_scheme == :jdbc or DB.adapter_scheme == :mysql2
|
1152
1145
|
describe "MySQL Stored Procedures" do
|
1153
1146
|
before do
|
1154
|
-
|
1155
|
-
@d =
|
1156
|
-
|
1147
|
+
DB.create_table(:items){Integer :id; Integer :value}
|
1148
|
+
@d = DB[:items]
|
1149
|
+
DB.sqls.clear
|
1157
1150
|
end
|
1158
1151
|
after do
|
1159
|
-
|
1160
|
-
|
1152
|
+
DB.drop_table?(:items)
|
1153
|
+
DB.execute('DROP PROCEDURE test_sproc')
|
1161
1154
|
end
|
1162
1155
|
|
1163
1156
|
specify "should be callable on the database object" do
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1157
|
+
DB.execute_ddl('CREATE PROCEDURE test_sproc() BEGIN DELETE FROM items; END')
|
1158
|
+
DB[:items].delete
|
1159
|
+
DB[:items].insert(:value=>1)
|
1160
|
+
DB[:items].count.should == 1
|
1161
|
+
DB.call_sproc(:test_sproc)
|
1162
|
+
DB[:items].count.should == 0
|
1170
1163
|
end
|
1171
1164
|
|
1172
1165
|
# Mysql2 doesn't support stored procedures that return result sets, probably because
|
1173
1166
|
# CLIENT_MULTI_RESULTS is not set.
|
1174
|
-
unless
|
1167
|
+
unless DB.adapter_scheme == :mysql2
|
1175
1168
|
specify "should be callable on the dataset object" do
|
1176
|
-
|
1177
|
-
|
1178
|
-
@d =
|
1169
|
+
DB.execute_ddl('CREATE PROCEDURE test_sproc(a INTEGER) BEGIN SELECT *, a AS b FROM items; END')
|
1170
|
+
DB[:items].delete
|
1171
|
+
@d = DB[:items]
|
1179
1172
|
@d.call_sproc(:select, :test_sproc, 3).should == []
|
1180
1173
|
@d.insert(:value=>1)
|
1181
1174
|
@d.call_sproc(:select, :test_sproc, 4).should == [{:id=>nil, :value=>1, :b=>4}]
|
@@ -1184,9 +1177,9 @@ if MYSQL_DB.adapter_scheme == :mysql or MYSQL_DB.adapter_scheme == :jdbc or MYSQ
|
|
1184
1177
|
end
|
1185
1178
|
|
1186
1179
|
specify "should be callable on the dataset object with multiple arguments" do
|
1187
|
-
|
1188
|
-
|
1189
|
-
@d =
|
1180
|
+
DB.execute_ddl('CREATE PROCEDURE test_sproc(a INTEGER, c INTEGER) BEGIN SELECT *, a AS b, c AS d FROM items; END')
|
1181
|
+
DB[:items].delete
|
1182
|
+
@d = DB[:items]
|
1190
1183
|
@d.call_sproc(:select, :test_sproc, 3, 4).should == []
|
1191
1184
|
@d.insert(:value=>1)
|
1192
1185
|
@d.call_sproc(:select, :test_sproc, 4, 5).should == [{:id=>nil, :value=>1, :b=>4, :d=>5}]
|
@@ -1196,58 +1189,58 @@ if MYSQL_DB.adapter_scheme == :mysql or MYSQL_DB.adapter_scheme == :jdbc or MYSQ
|
|
1196
1189
|
end
|
1197
1190
|
|
1198
1191
|
specify "should deal with nil values" do
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1192
|
+
DB.execute_ddl('CREATE PROCEDURE test_sproc(i INTEGER, v INTEGER) BEGIN INSERT INTO items VALUES (i, v); END')
|
1193
|
+
DB[:items].delete
|
1194
|
+
DB.call_sproc(:test_sproc, :args=>[1, nil])
|
1195
|
+
DB[:items].all.should == [{:id=>1, :value=>nil}]
|
1203
1196
|
end
|
1204
1197
|
end
|
1205
1198
|
end
|
1206
1199
|
|
1207
|
-
if
|
1200
|
+
if DB.adapter_scheme == :mysql
|
1208
1201
|
describe "MySQL bad date/time conversions" do
|
1209
1202
|
after do
|
1210
|
-
|
1203
|
+
DB.convert_invalid_date_time = false
|
1211
1204
|
end
|
1212
1205
|
|
1213
1206
|
specify "should raise an exception when a bad date/time is used and convert_invalid_date_time is false" do
|
1214
|
-
|
1215
|
-
proc{
|
1216
|
-
proc{
|
1217
|
-
proc{
|
1207
|
+
DB.convert_invalid_date_time = false
|
1208
|
+
proc{DB["SELECT CAST('0000-00-00' AS date)"].single_value}.should raise_error(Sequel::InvalidValue)
|
1209
|
+
proc{DB["SELECT CAST('0000-00-00 00:00:00' AS datetime)"].single_value}.should raise_error(Sequel::InvalidValue)
|
1210
|
+
proc{DB["SELECT CAST('25:00:00' AS time)"].single_value}.should raise_error(Sequel::InvalidValue)
|
1218
1211
|
end
|
1219
1212
|
|
1220
1213
|
specify "should not use a nil value bad date/time is used and convert_invalid_date_time is nil or :nil" do
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1214
|
+
DB.convert_invalid_date_time = nil
|
1215
|
+
DB["SELECT CAST('0000-00-00' AS date)"].single_value.should == nil
|
1216
|
+
DB["SELECT CAST('0000-00-00 00:00:00' AS datetime)"].single_value.should == nil
|
1217
|
+
DB["SELECT CAST('25:00:00' AS time)"].single_value.should == nil
|
1218
|
+
DB.convert_invalid_date_time = :nil
|
1219
|
+
DB["SELECT CAST('0000-00-00' AS date)"].single_value.should == nil
|
1220
|
+
DB["SELECT CAST('0000-00-00 00:00:00' AS datetime)"].single_value.should == nil
|
1221
|
+
DB["SELECT CAST('25:00:00' AS time)"].single_value.should == nil
|
1229
1222
|
end
|
1230
1223
|
|
1231
1224
|
specify "should not use a nil value bad date/time is used and convert_invalid_date_time is :string" do
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1225
|
+
DB.convert_invalid_date_time = :string
|
1226
|
+
DB["SELECT CAST('0000-00-00' AS date)"].single_value.should == '0000-00-00'
|
1227
|
+
DB["SELECT CAST('0000-00-00 00:00:00' AS datetime)"].single_value.should == '0000-00-00 00:00:00'
|
1228
|
+
DB["SELECT CAST('25:00:00' AS time)"].single_value.should == '25:00:00'
|
1236
1229
|
end
|
1237
1230
|
end
|
1238
1231
|
|
1239
1232
|
describe "MySQL multiple result sets" do
|
1240
1233
|
before do
|
1241
|
-
|
1242
|
-
|
1243
|
-
@ds =
|
1244
|
-
|
1245
|
-
|
1246
|
-
|
1247
|
-
|
1234
|
+
DB.create_table!(:a){Integer :a}
|
1235
|
+
DB.create_table!(:b){Integer :b}
|
1236
|
+
@ds = DB['SELECT * FROM a; SELECT * FROM b']
|
1237
|
+
DB[:a].insert(10)
|
1238
|
+
DB[:a].insert(15)
|
1239
|
+
DB[:b].insert(20)
|
1240
|
+
DB[:b].insert(25)
|
1248
1241
|
end
|
1249
1242
|
after do
|
1250
|
-
|
1243
|
+
DB.drop_table?(:a, :b)
|
1251
1244
|
end
|
1252
1245
|
|
1253
1246
|
specify "should combine all results by default" do
|
@@ -1255,14 +1248,14 @@ if MYSQL_DB.adapter_scheme == :mysql
|
|
1255
1248
|
end
|
1256
1249
|
|
1257
1250
|
specify "should work with Database#run" do
|
1258
|
-
proc{
|
1259
|
-
proc{
|
1251
|
+
proc{DB.run('SELECT * FROM a; SELECT * FROM b')}.should_not raise_error
|
1252
|
+
proc{DB.run('SELECT * FROM a; SELECT * FROM b')}.should_not raise_error
|
1260
1253
|
end
|
1261
1254
|
|
1262
1255
|
specify "should work with Database#run and other statements" do
|
1263
|
-
proc{
|
1264
|
-
|
1265
|
-
|
1256
|
+
proc{DB.run('UPDATE a SET a = 1; SELECT * FROM a; DELETE FROM b')}.should_not raise_error
|
1257
|
+
DB[:a].select_order_map(:a).should == [1, 1]
|
1258
|
+
DB[:b].all.should == []
|
1266
1259
|
end
|
1267
1260
|
|
1268
1261
|
specify "should split results returned into arrays if split_multiple_result_sets is used" do
|
@@ -1283,24 +1276,24 @@ if MYSQL_DB.adapter_scheme == :mysql
|
|
1283
1276
|
end
|
1284
1277
|
|
1285
1278
|
specify "should not allow splitting a graphed dataset" do
|
1286
|
-
proc{
|
1279
|
+
proc{DB[:a].graph(:b, :b=>:a).split_multiple_result_sets}.should raise_error(Sequel::Error)
|
1287
1280
|
end
|
1288
1281
|
end
|
1289
1282
|
end
|
1290
1283
|
|
1291
|
-
if
|
1284
|
+
if DB.adapter_scheme == :mysql2
|
1292
1285
|
describe "Mysql2 streaming" do
|
1293
1286
|
before(:all) do
|
1294
|
-
|
1295
|
-
|
1287
|
+
DB.create_table!(:a){Integer :a}
|
1288
|
+
DB.transaction do
|
1296
1289
|
1000.times do |i|
|
1297
|
-
|
1290
|
+
DB[:a].insert(i)
|
1298
1291
|
end
|
1299
1292
|
end
|
1300
|
-
@ds =
|
1293
|
+
@ds = DB[:a].stream.order(:a)
|
1301
1294
|
end
|
1302
1295
|
after(:all) do
|
1303
|
-
|
1296
|
+
DB.drop_table?(:a)
|
1304
1297
|
end
|
1305
1298
|
|
1306
1299
|
specify "should correctly stream results" do
|