sequel 3.48.0 → 4.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.
- 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
|
@@ -8,18 +8,14 @@ end
|
|
|
8
8
|
|
|
9
9
|
unless Object.const_defined?('Sequel')
|
|
10
10
|
$:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
|
|
11
|
-
require 'sequel
|
|
11
|
+
require 'sequel'
|
|
12
12
|
end
|
|
13
13
|
begin
|
|
14
14
|
require File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'spec_config.rb')
|
|
15
15
|
rescue LoadError
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
if ENV['SEQUEL_COLUMNS_INTROSPECTION']
|
|
19
|
-
Sequel.extension :columns_introspection
|
|
20
|
-
Sequel::Dataset.introspect_all_columns
|
|
21
|
-
end
|
|
22
|
-
|
|
18
|
+
Sequel::Database.extension :columns_introspection if ENV['SEQUEL_COLUMNS_INTROSPECTION']
|
|
23
19
|
Sequel.cache_anonymous_models = false
|
|
24
20
|
|
|
25
21
|
class Sequel::Database
|
|
@@ -31,10 +27,10 @@ end
|
|
|
31
27
|
(defined?(RSpec) ? RSpec::Core::ExampleGroup : Spec::Example::ExampleGroup).class_eval do
|
|
32
28
|
def log
|
|
33
29
|
begin
|
|
34
|
-
|
|
30
|
+
DB.loggers << Logger.new(STDOUT)
|
|
35
31
|
yield
|
|
36
32
|
ensure
|
|
37
|
-
|
|
33
|
+
DB.loggers.pop
|
|
38
34
|
end
|
|
39
35
|
end
|
|
40
36
|
|
|
@@ -43,12 +39,12 @@ end
|
|
|
43
39
|
pending = false
|
|
44
40
|
checked.each do |c|
|
|
45
41
|
case c
|
|
46
|
-
when
|
|
42
|
+
when DB.adapter_scheme
|
|
47
43
|
pending = c
|
|
48
44
|
when Proc
|
|
49
|
-
pending = c if c.first.call(
|
|
45
|
+
pending = c if c.first.call(DB)
|
|
50
46
|
when Array
|
|
51
|
-
pending = c if c.first ==
|
|
47
|
+
pending = c if c.first == DB.adapter_scheme && c.last == DB.call(DB)
|
|
52
48
|
end
|
|
53
49
|
end
|
|
54
50
|
if pending
|
|
@@ -65,3 +61,9 @@ end
|
|
|
65
61
|
yield unless ENV['SEQUEL_NO_CHECK_SQLS']
|
|
66
62
|
end
|
|
67
63
|
end
|
|
64
|
+
|
|
65
|
+
unless defined?(DB)
|
|
66
|
+
env_var = "SEQUEL_#{SEQUEL_ADAPTER_TEST.to_s.upcase}_URL"
|
|
67
|
+
env_var = ENV.has_key?(env_var) ? env_var : 'SEQUEL_INTEGRATION_URL'
|
|
68
|
+
DB = Sequel.connect(ENV[env_var])
|
|
69
|
+
end
|
|
@@ -1,30 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
SEQUEL_ADAPTER_TEST = :sqlite
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
unless defined? SQLITE_URL
|
|
5
|
-
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
|
6
|
-
SQLITE_URL = 'jdbc:sqlite::memory:'
|
|
7
|
-
else
|
|
8
|
-
SQLITE_URL = 'sqlite:/'
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
SQLITE_DB = Sequel.connect(ENV['SEQUEL_SQLITE_SPEC_DB']||SQLITE_URL)
|
|
12
|
-
end
|
|
13
|
-
INTEGRATION_DB = SQLITE_DB unless defined?(INTEGRATION_DB)
|
|
3
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
|
14
4
|
|
|
15
5
|
describe "An SQLite database" do
|
|
16
6
|
before do
|
|
17
|
-
@db =
|
|
7
|
+
@db = DB
|
|
18
8
|
@fk = @db.foreign_keys
|
|
19
9
|
end
|
|
20
10
|
after do
|
|
21
11
|
@db.drop_table?(:fk)
|
|
22
12
|
@db.foreign_keys = @fk
|
|
23
13
|
@db.case_sensitive_like = true
|
|
14
|
+
@db.use_timestamp_timezones = false
|
|
24
15
|
Sequel.datetime_class = Time
|
|
25
16
|
end
|
|
26
17
|
|
|
27
|
-
if
|
|
18
|
+
if DB.auto_vacuum == :none
|
|
28
19
|
specify "should support getting pragma values" do
|
|
29
20
|
@db.pragma_get(:auto_vacuum).to_s.should == '0'
|
|
30
21
|
end
|
|
@@ -82,7 +73,7 @@ describe "An SQLite database" do
|
|
|
82
73
|
@db[:fk].insert(2, 1)
|
|
83
74
|
@db[:fk].insert(3, 3)
|
|
84
75
|
proc{@db[:fk].insert(4, 5)}.should raise_error(Sequel::Error)
|
|
85
|
-
end if
|
|
76
|
+
end if DB.sqlite_version >= 30619
|
|
86
77
|
|
|
87
78
|
specify "should not enforce foreign key integrity if foreign_keys pragma is unset" do
|
|
88
79
|
@db.foreign_keys = false
|
|
@@ -92,6 +83,7 @@ describe "An SQLite database" do
|
|
|
92
83
|
end
|
|
93
84
|
|
|
94
85
|
specify "should support a use_timestamp_timezones setting" do
|
|
86
|
+
@db.use_timestamp_timezones = true
|
|
95
87
|
@db.create_table!(:fk){Time :time}
|
|
96
88
|
@db[:fk].insert(Time.now)
|
|
97
89
|
@db[:fk].get(Sequel.cast(:time, String)).should =~ /[-+]\d\d\d\d\z/
|
|
@@ -99,7 +91,6 @@ describe "An SQLite database" do
|
|
|
99
91
|
@db[:fk].delete
|
|
100
92
|
@db[:fk].insert(Time.now)
|
|
101
93
|
@db[:fk].get(Sequel.cast(:time, String)).should_not =~ /[-+]\d\d\d\d\z/
|
|
102
|
-
@db.use_timestamp_timezones = true
|
|
103
94
|
end
|
|
104
95
|
|
|
105
96
|
specify "should provide a list of existing tables" do
|
|
@@ -134,6 +125,7 @@ describe "An SQLite database" do
|
|
|
134
125
|
|
|
135
126
|
cspecify "should support timestamps and datetimes and respect datetime_class", :do, :jdbc, :amalgalite, :swift do
|
|
136
127
|
@db.create_table!(:fk){timestamp :t; datetime :d}
|
|
128
|
+
@db.use_timestamp_timezones = true
|
|
137
129
|
t1 = Time.at(1)
|
|
138
130
|
@db[:fk] << {:t => t1, :d => t1}
|
|
139
131
|
@db[:fk].map(:t).should == [t1]
|
|
@@ -162,8 +154,8 @@ describe "An SQLite database" do
|
|
|
162
154
|
end
|
|
163
155
|
|
|
164
156
|
specify "should handle and return BigDecimal values for numeric columns" do
|
|
165
|
-
|
|
166
|
-
d =
|
|
157
|
+
DB.create_table!(:fk){numeric :d}
|
|
158
|
+
d = DB[:fk]
|
|
167
159
|
d.insert(:d=>BigDecimal.new('80.0'))
|
|
168
160
|
d.insert(:d=>BigDecimal.new('NaN'))
|
|
169
161
|
d.insert(:d=>BigDecimal.new('Infinity'))
|
|
@@ -171,13 +163,13 @@ describe "An SQLite database" do
|
|
|
171
163
|
ds = d.all
|
|
172
164
|
ds.shift.should == {:d=>BigDecimal.new('80.0')}
|
|
173
165
|
ds.map{|x| x[:d].to_s}.should == %w'NaN Infinity -Infinity'
|
|
174
|
-
|
|
166
|
+
DB
|
|
175
167
|
end
|
|
176
168
|
end
|
|
177
169
|
|
|
178
170
|
describe "SQLite temporary views" do
|
|
179
171
|
before do
|
|
180
|
-
@db =
|
|
172
|
+
@db = DB
|
|
181
173
|
@db.drop_view(:items) rescue nil
|
|
182
174
|
@db.create_table!(:items){Integer :number}
|
|
183
175
|
@db[:items].insert(10)
|
|
@@ -197,7 +189,7 @@ end
|
|
|
197
189
|
|
|
198
190
|
describe "SQLite type conversion" do
|
|
199
191
|
before do
|
|
200
|
-
@db =
|
|
192
|
+
@db = DB
|
|
201
193
|
@integer_booleans = @db.integer_booleans
|
|
202
194
|
@db.integer_booleans = true
|
|
203
195
|
@ds = @db[:items]
|
|
@@ -280,11 +272,11 @@ describe "SQLite type conversion" do
|
|
|
280
272
|
@db[:items].update(:a=>'1.1')
|
|
281
273
|
@db[:items].first.should == {:a=>Sequel::SQL::Blob.new(1.1.to_s)}
|
|
282
274
|
end
|
|
283
|
-
end if
|
|
275
|
+
end if DB.adapter_scheme == :sqlite
|
|
284
276
|
|
|
285
277
|
describe "An SQLite dataset" do
|
|
286
278
|
before do
|
|
287
|
-
@d =
|
|
279
|
+
@d = DB[:items]
|
|
288
280
|
end
|
|
289
281
|
|
|
290
282
|
specify "should raise errors if given a regexp pattern match" do
|
|
@@ -297,38 +289,38 @@ end
|
|
|
297
289
|
|
|
298
290
|
describe "An SQLite dataset AS clause" do
|
|
299
291
|
specify "should use a string literal for :col___alias" do
|
|
300
|
-
|
|
292
|
+
DB.literal(:c___a).should == "`c` AS 'a'"
|
|
301
293
|
end
|
|
302
294
|
|
|
303
295
|
specify "should use a string literal for :table__col___alias" do
|
|
304
|
-
|
|
296
|
+
DB.literal(:t__c___a).should == "`t`.`c` AS 'a'"
|
|
305
297
|
end
|
|
306
298
|
|
|
307
299
|
specify "should use a string literal for :column.as(:alias)" do
|
|
308
|
-
|
|
300
|
+
DB.literal(Sequel.as(:c, :a)).should == "`c` AS 'a'"
|
|
309
301
|
end
|
|
310
302
|
|
|
311
303
|
specify "should use a string literal in the SELECT clause" do
|
|
312
|
-
|
|
304
|
+
DB[:t].select(:c___a).sql.should == "SELECT `c` AS 'a' FROM `t`"
|
|
313
305
|
end
|
|
314
306
|
|
|
315
307
|
specify "should use a string literal in the FROM clause" do
|
|
316
|
-
|
|
308
|
+
DB[:t___a].sql.should == "SELECT * FROM `t` AS 'a'"
|
|
317
309
|
end
|
|
318
310
|
|
|
319
311
|
specify "should use a string literal in the JOIN clause" do
|
|
320
|
-
|
|
312
|
+
DB[:t].join_table(:natural, :j, nil, :table_alias=>:a).sql.should == "SELECT * FROM `t` NATURAL JOIN `j` AS 'a'"
|
|
321
313
|
end
|
|
322
314
|
end
|
|
323
315
|
|
|
324
316
|
describe "SQLite::Dataset#delete" do
|
|
325
317
|
before do
|
|
326
|
-
|
|
318
|
+
DB.create_table! :items do
|
|
327
319
|
primary_key :id
|
|
328
320
|
String :name
|
|
329
321
|
Float :value
|
|
330
322
|
end
|
|
331
|
-
@d =
|
|
323
|
+
@d = DB[:items]
|
|
332
324
|
@d.delete # remove all records
|
|
333
325
|
@d << {:name => 'abc', :value => 1.23}
|
|
334
326
|
@d << {:name => 'def', :value => 4.56}
|
|
@@ -355,12 +347,12 @@ end
|
|
|
355
347
|
|
|
356
348
|
describe "SQLite::Dataset#update" do
|
|
357
349
|
before do
|
|
358
|
-
|
|
350
|
+
DB.create_table! :items do
|
|
359
351
|
primary_key :id
|
|
360
352
|
String :name
|
|
361
353
|
Float :value
|
|
362
354
|
end
|
|
363
|
-
@d =
|
|
355
|
+
@d = DB[:items]
|
|
364
356
|
@d.delete # remove all records
|
|
365
357
|
@d << {:name => 'abc', :value => 1.23}
|
|
366
358
|
@d << {:name => 'def', :value => 4.56}
|
|
@@ -378,38 +370,38 @@ end
|
|
|
378
370
|
|
|
379
371
|
describe "SQLite dataset" do
|
|
380
372
|
before do
|
|
381
|
-
|
|
373
|
+
DB.create_table! :test do
|
|
382
374
|
primary_key :id
|
|
383
375
|
String :name
|
|
384
376
|
Float :value
|
|
385
377
|
end
|
|
386
|
-
|
|
378
|
+
DB.create_table! :items do
|
|
387
379
|
primary_key :id
|
|
388
380
|
String :name
|
|
389
381
|
Float :value
|
|
390
382
|
end
|
|
391
|
-
@d =
|
|
383
|
+
@d = DB[:items]
|
|
392
384
|
@d << {:name => 'abc', :value => 1.23}
|
|
393
385
|
@d << {:name => 'def', :value => 4.56}
|
|
394
386
|
@d << {:name => 'ghi', :value => 7.89}
|
|
395
387
|
end
|
|
396
388
|
after do
|
|
397
|
-
|
|
389
|
+
DB.drop_table?(:test, :items)
|
|
398
390
|
end
|
|
399
391
|
|
|
400
392
|
specify "should be able to insert from a subquery" do
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
393
|
+
DB[:test] << @d
|
|
394
|
+
DB[:test].count.should == 3
|
|
395
|
+
DB[:test].select(:name, :value).order(:value).to_a.should == \
|
|
404
396
|
@d.select(:name, :value).order(:value).to_a
|
|
405
397
|
end
|
|
406
398
|
|
|
407
399
|
specify "should support #explain" do
|
|
408
|
-
|
|
400
|
+
DB[:test].explain.should be_a_kind_of(String)
|
|
409
401
|
end
|
|
410
402
|
|
|
411
403
|
specify "should have #explain work when identifier_output_method is modified" do
|
|
412
|
-
ds =
|
|
404
|
+
ds = DB[:test]
|
|
413
405
|
ds.identifier_output_method = :upcase
|
|
414
406
|
ds.explain.should be_a_kind_of(String)
|
|
415
407
|
end
|
|
@@ -417,7 +409,7 @@ end
|
|
|
417
409
|
|
|
418
410
|
describe "A SQLite database" do
|
|
419
411
|
before do
|
|
420
|
-
@db =
|
|
412
|
+
@db = DB
|
|
421
413
|
@db.create_table! :test2 do
|
|
422
414
|
text :name
|
|
423
415
|
integer :value
|
|
@@ -478,7 +470,7 @@ describe "A SQLite database" do
|
|
|
478
470
|
@db[:test3].select(:id).all.should == [{:id => 1}, {:id => 3}]
|
|
479
471
|
end
|
|
480
472
|
|
|
481
|
-
if
|
|
473
|
+
if DB.foreign_keys
|
|
482
474
|
specify "should keep foreign keys when dropping a column" do
|
|
483
475
|
@db.create_table! :test do
|
|
484
476
|
primary_key :id
|
|
@@ -367,7 +367,8 @@ shared_examples_for "A threaded connection pool" do
|
|
|
367
367
|
@pool.allocated.should be_empty
|
|
368
368
|
end
|
|
369
369
|
|
|
370
|
-
specify "should store connections in a stack
|
|
370
|
+
specify "should store connections in a stack if :connection_handling=>:stack" do
|
|
371
|
+
@pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:connection_handling=>:stack))
|
|
371
372
|
c2 = nil
|
|
372
373
|
c = @pool.hold{|cc| Thread.new{@pool.hold{|cc2| c2 = cc2}}.join; cc}
|
|
373
374
|
@pool.size.should == 2
|
data/spec/core/database_spec.rb
CHANGED
|
@@ -226,12 +226,6 @@ describe "Sequel.extension" do
|
|
|
226
226
|
end
|
|
227
227
|
end
|
|
228
228
|
|
|
229
|
-
describe "Database#connect" do
|
|
230
|
-
qspecify "should raise Sequel::NotImplemented" do
|
|
231
|
-
proc {Sequel::Database.new.connect(:default)}.should raise_error(Sequel::NotImplemented)
|
|
232
|
-
end
|
|
233
|
-
end
|
|
234
|
-
|
|
235
229
|
describe "Database#log_info" do
|
|
236
230
|
before do
|
|
237
231
|
@o = Object.new
|
|
@@ -416,9 +410,9 @@ describe "Database#dataset_class" do
|
|
|
416
410
|
end
|
|
417
411
|
|
|
418
412
|
specify "should have getter return the class to use to create datasets" do
|
|
419
|
-
@db.dataset_class.should
|
|
413
|
+
[@db.dataset_class, @db.dataset_class.superclass].should include(Sequel::Dataset)
|
|
420
414
|
@db.dataset_class = @dsc
|
|
421
|
-
@db.dataset_class.should
|
|
415
|
+
[@db.dataset_class, @db.dataset_class.superclass].should include(@dsc)
|
|
422
416
|
end
|
|
423
417
|
end
|
|
424
418
|
|
|
@@ -504,36 +498,6 @@ describe "Database#valid_connection?" do
|
|
|
504
498
|
end
|
|
505
499
|
end
|
|
506
500
|
|
|
507
|
-
describe "Database#execute" do
|
|
508
|
-
qspecify "should raise Sequel::NotImplemented" do
|
|
509
|
-
proc {Sequel::Database.new.execute('blah blah')}.should raise_error(Sequel::NotImplemented)
|
|
510
|
-
end
|
|
511
|
-
end
|
|
512
|
-
|
|
513
|
-
describe "Database#tables" do
|
|
514
|
-
qspecify "should raise Sequel::NotImplemented" do
|
|
515
|
-
proc {Sequel::Database.new.tables}.should raise_error(Sequel::NotImplemented)
|
|
516
|
-
end
|
|
517
|
-
end
|
|
518
|
-
|
|
519
|
-
describe "Database#views" do
|
|
520
|
-
qspecify "should raise Sequel::NotImplemented" do
|
|
521
|
-
proc {Sequel::Database.new.views}.should raise_error(Sequel::NotImplemented)
|
|
522
|
-
end
|
|
523
|
-
end
|
|
524
|
-
|
|
525
|
-
describe "Database#indexes" do
|
|
526
|
-
qspecify "should raise Sequel::NotImplemented" do
|
|
527
|
-
proc {Sequel::Database.new.indexes(:table)}.should raise_error(Sequel::NotImplemented)
|
|
528
|
-
end
|
|
529
|
-
end
|
|
530
|
-
|
|
531
|
-
describe "Database#foreign_key_list" do
|
|
532
|
-
qspecify "should raise Sequel::NotImplemented" do
|
|
533
|
-
proc {Sequel::Database.new.foreign_key_list(:table)}.should raise_error(Sequel::NotImplemented)
|
|
534
|
-
end
|
|
535
|
-
end
|
|
536
|
-
|
|
537
501
|
describe "Database#run" do
|
|
538
502
|
before do
|
|
539
503
|
@db = Sequel.mock(:servers=>{:s1=>{}})
|
|
@@ -655,13 +619,6 @@ shared_examples_for "Database#transaction" do
|
|
|
655
619
|
'BEGIN', 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE', 'DROP TABLE serializable', 'COMMIT']
|
|
656
620
|
end
|
|
657
621
|
|
|
658
|
-
qspecify "should support :disconnect=>:retry option for automatically retrying on disconnect" do
|
|
659
|
-
a = []
|
|
660
|
-
@db.transaction(:disconnect=>:retry){a << 1; raise Sequel::DatabaseDisconnectError if a.length < 2}
|
|
661
|
-
@db.sqls.should == ['BEGIN', 'ROLLBACK', 'BEGIN', 'COMMIT']
|
|
662
|
-
a.should == [1, 1]
|
|
663
|
-
end
|
|
664
|
-
|
|
665
622
|
specify "should support :retry_on option for automatically retrying transactions" do
|
|
666
623
|
a = []
|
|
667
624
|
@db.transaction(:retry_on=>Sequel::DatabaseDisconnectError){a << 1; raise Sequel::DatabaseDisconnectError if a.length < 2}
|
|
@@ -704,12 +661,7 @@ shared_examples_for "Database#transaction" do
|
|
|
704
661
|
a.should == [1] * 100
|
|
705
662
|
end
|
|
706
663
|
|
|
707
|
-
|
|
708
|
-
proc{@db.transaction(:disconnect=>:retry, :retry_on=>Sequel::ConstraintViolation){}}.should raise_error(Sequel::Error)
|
|
709
|
-
@db.sqls.should == []
|
|
710
|
-
end
|
|
711
|
-
|
|
712
|
-
specify "should raise an error if attempting to use :disconnect=>:retry or :retry_on inside another transaction" do
|
|
664
|
+
specify "should raise an error if attempting to use :retry_on inside another transaction" do
|
|
713
665
|
proc{@db.transaction{@db.transaction(:retry_on=>Sequel::ConstraintViolation){}}}.should raise_error(Sequel::Error)
|
|
714
666
|
@db.sqls.should == ['BEGIN', 'ROLLBACK']
|
|
715
667
|
end
|
|
@@ -1522,9 +1474,9 @@ describe "Database#get" do
|
|
|
1522
1474
|
@db.sqls.should == ['SELECT version(a) AS version LIMIT 1']
|
|
1523
1475
|
end
|
|
1524
1476
|
|
|
1525
|
-
|
|
1477
|
+
specify "should work when an alias cannot be determined" do
|
|
1526
1478
|
@db.get(1).should == 1
|
|
1527
|
-
@db.sqls.should == ['SELECT 1 LIMIT 1']
|
|
1479
|
+
@db.sqls.should == ['SELECT 1 AS v LIMIT 1']
|
|
1528
1480
|
end
|
|
1529
1481
|
end
|
|
1530
1482
|
|
|
@@ -2041,9 +1993,9 @@ describe "Database#typecast_value" do
|
|
|
2041
1993
|
end
|
|
2042
1994
|
end
|
|
2043
1995
|
|
|
2044
|
-
|
|
1996
|
+
specify "should raise errors when typecasting hash and array values to String" do
|
|
2045
1997
|
[[], {}].each do |i|
|
|
2046
|
-
@db.typecast_value(:string, i).should
|
|
1998
|
+
proc{@db.typecast_value(:string, i)}.should raise_error(Sequel::InvalidValue)
|
|
2047
1999
|
end
|
|
2048
2000
|
end
|
|
2049
2001
|
|
|
@@ -2129,6 +2081,54 @@ describe "Database#supports_schema_parsing?" do
|
|
|
2129
2081
|
end
|
|
2130
2082
|
end
|
|
2131
2083
|
|
|
2084
|
+
describe "Database#supports_foreign_key_parsing?" do
|
|
2085
|
+
specify "should be false by default" do
|
|
2086
|
+
Sequel::Database.new.supports_foreign_key_parsing?.should == false
|
|
2087
|
+
end
|
|
2088
|
+
|
|
2089
|
+
specify "should be true if the database implements foreign_key_list" do
|
|
2090
|
+
db = Sequel::Database.new
|
|
2091
|
+
def db.foreign_key_list(*) end
|
|
2092
|
+
db.supports_foreign_key_parsing?.should == true
|
|
2093
|
+
end
|
|
2094
|
+
end
|
|
2095
|
+
|
|
2096
|
+
describe "Database#supports_index_parsing?" do
|
|
2097
|
+
specify "should be false by default" do
|
|
2098
|
+
Sequel::Database.new.supports_index_parsing?.should == false
|
|
2099
|
+
end
|
|
2100
|
+
|
|
2101
|
+
specify "should be true if the database implements indexes" do
|
|
2102
|
+
db = Sequel::Database.new
|
|
2103
|
+
def db.indexes(*) end
|
|
2104
|
+
db.supports_index_parsing?.should == true
|
|
2105
|
+
end
|
|
2106
|
+
end
|
|
2107
|
+
|
|
2108
|
+
describe "Database#supports_table_listing?" do
|
|
2109
|
+
specify "should be false by default" do
|
|
2110
|
+
Sequel::Database.new.supports_table_listing?.should == false
|
|
2111
|
+
end
|
|
2112
|
+
|
|
2113
|
+
specify "should be true if the database implements tables" do
|
|
2114
|
+
db = Sequel::Database.new
|
|
2115
|
+
def db.tables(*) end
|
|
2116
|
+
db.supports_table_listing?.should == true
|
|
2117
|
+
end
|
|
2118
|
+
end
|
|
2119
|
+
|
|
2120
|
+
describe "Database#supports_view_listing?" do
|
|
2121
|
+
specify "should be false by default" do
|
|
2122
|
+
Sequel::Database.new.supports_view_listing?.should == false
|
|
2123
|
+
end
|
|
2124
|
+
|
|
2125
|
+
specify "should be true if the database implements views" do
|
|
2126
|
+
db = Sequel::Database.new
|
|
2127
|
+
def db.views(*) end
|
|
2128
|
+
db.supports_view_listing?.should == true
|
|
2129
|
+
end
|
|
2130
|
+
end
|
|
2131
|
+
|
|
2132
2132
|
describe "Database#supports_deferrable_constraints?" do
|
|
2133
2133
|
specify "should be false by default" do
|
|
2134
2134
|
Sequel::Database.new.supports_deferrable_constraints?.should == false
|