sequel 3.47.0 → 3.48.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 +230 -0
- data/README.rdoc +31 -40
- data/Rakefile +1 -14
- data/doc/active_record.rdoc +29 -29
- data/doc/association_basics.rdoc +4 -13
- data/doc/cheat_sheet.rdoc +8 -6
- data/doc/code_order.rdoc +89 -0
- data/doc/core_extensions.rdoc +3 -3
- data/doc/dataset_basics.rdoc +7 -8
- data/doc/dataset_filtering.rdoc +7 -2
- data/doc/mass_assignment.rdoc +2 -3
- data/doc/migration.rdoc +8 -8
- data/doc/model_hooks.rdoc +11 -7
- data/doc/object_model.rdoc +2 -2
- data/doc/opening_databases.rdoc +5 -14
- data/doc/prepared_statements.rdoc +5 -9
- data/doc/querying.rdoc +23 -28
- data/doc/reflection.rdoc +11 -0
- data/doc/release_notes/3.48.0.txt +477 -0
- data/doc/schema_modification.rdoc +12 -5
- data/doc/security.rdoc +2 -2
- data/doc/sharding.rdoc +1 -2
- data/doc/sql.rdoc +10 -13
- data/doc/testing.rdoc +8 -4
- data/doc/transactions.rdoc +2 -2
- data/doc/validations.rdoc +40 -17
- data/doc/virtual_rows.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +25 -20
- data/lib/sequel/adapters/ado/access.rb +1 -0
- data/lib/sequel/adapters/ado/mssql.rb +1 -0
- data/lib/sequel/adapters/db2.rb +9 -7
- data/lib/sequel/adapters/dbi.rb +16 -16
- data/lib/sequel/adapters/do.rb +17 -18
- data/lib/sequel/adapters/do/mysql.rb +1 -0
- data/lib/sequel/adapters/do/postgres.rb +2 -0
- data/lib/sequel/adapters/do/sqlite.rb +1 -0
- data/lib/sequel/adapters/firebird.rb +5 -7
- data/lib/sequel/adapters/ibmdb.rb +23 -20
- data/lib/sequel/adapters/informix.rb +8 -2
- data/lib/sequel/adapters/jdbc.rb +39 -35
- data/lib/sequel/adapters/jdbc/as400.rb +1 -0
- data/lib/sequel/adapters/jdbc/cubrid.rb +1 -0
- data/lib/sequel/adapters/jdbc/db2.rb +1 -0
- data/lib/sequel/adapters/jdbc/derby.rb +1 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +1 -0
- data/lib/sequel/adapters/jdbc/h2.rb +1 -0
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -0
- data/lib/sequel/adapters/jdbc/informix.rb +1 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +1 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -0
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -0
- data/lib/sequel/adapters/jdbc/oracle.rb +1 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -0
- data/lib/sequel/adapters/jdbc/progress.rb +1 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -0
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -0
- data/lib/sequel/adapters/mock.rb +30 -31
- data/lib/sequel/adapters/mysql.rb +6 -7
- data/lib/sequel/adapters/mysql2.rb +5 -6
- data/lib/sequel/adapters/odbc.rb +22 -20
- data/lib/sequel/adapters/odbc/mssql.rb +1 -0
- data/lib/sequel/adapters/openbase.rb +4 -1
- data/lib/sequel/adapters/oracle.rb +10 -8
- data/lib/sequel/adapters/postgres.rb +12 -10
- data/lib/sequel/adapters/shared/access.rb +6 -0
- data/lib/sequel/adapters/shared/cubrid.rb +2 -0
- data/lib/sequel/adapters/shared/db2.rb +2 -0
- data/lib/sequel/adapters/shared/firebird.rb +2 -0
- data/lib/sequel/adapters/shared/informix.rb +2 -0
- data/lib/sequel/adapters/shared/mssql.rb +14 -8
- data/lib/sequel/adapters/shared/mysql.rb +6 -0
- data/lib/sequel/adapters/shared/oracle.rb +2 -0
- data/lib/sequel/adapters/shared/postgres.rb +14 -4
- data/lib/sequel/adapters/shared/progress.rb +1 -0
- data/lib/sequel/adapters/shared/sqlite.rb +4 -3
- data/lib/sequel/adapters/sqlite.rb +6 -7
- data/lib/sequel/adapters/swift.rb +20 -21
- data/lib/sequel/adapters/swift/mysql.rb +1 -0
- data/lib/sequel/adapters/swift/postgres.rb +2 -0
- data/lib/sequel/adapters/swift/sqlite.rb +1 -0
- data/lib/sequel/adapters/tinytds.rb +5 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +68 -0
- data/lib/sequel/connection_pool.rb +1 -1
- data/lib/sequel/core.rb +57 -50
- data/lib/sequel/database/connecting.rb +9 -10
- data/lib/sequel/database/dataset.rb +11 -6
- data/lib/sequel/database/dataset_defaults.rb +61 -69
- data/lib/sequel/database/features.rb +21 -0
- data/lib/sequel/database/misc.rb +23 -3
- data/lib/sequel/database/query.rb +13 -7
- data/lib/sequel/database/schema_methods.rb +6 -6
- data/lib/sequel/database/transactions.rb +1 -0
- data/lib/sequel/dataset/actions.rb +51 -38
- data/lib/sequel/dataset/features.rb +1 -0
- data/lib/sequel/dataset/graph.rb +9 -33
- data/lib/sequel/dataset/misc.rb +30 -5
- data/lib/sequel/dataset/mutation.rb +2 -3
- data/lib/sequel/dataset/prepared_statements.rb +1 -1
- data/lib/sequel/dataset/query.rb +91 -27
- data/lib/sequel/dataset/sql.rb +40 -6
- data/lib/sequel/deprecated.rb +74 -0
- data/lib/sequel/deprecated_core_extensions.rb +135 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -5
- data/lib/sequel/extensions/core_extensions.rb +10 -3
- data/lib/sequel/extensions/date_arithmetic.rb +1 -0
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +33 -0
- data/lib/sequel/extensions/filter_having.rb +58 -0
- data/lib/sequel/extensions/graph_each.rb +63 -0
- data/lib/sequel/extensions/hash_aliases.rb +44 -0
- data/lib/sequel/extensions/looser_typecasting.rb +14 -3
- data/lib/sequel/extensions/migration.rb +2 -3
- data/lib/sequel/extensions/named_timezones.rb +14 -1
- data/lib/sequel/extensions/null_dataset.rb +7 -1
- data/lib/sequel/extensions/pagination.rb +15 -5
- data/lib/sequel/extensions/pg_auto_parameterize.rb +1 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +48 -14
- data/lib/sequel/extensions/pg_json.rb +7 -7
- data/lib/sequel/extensions/pg_range_ops.rb +8 -2
- data/lib/sequel/extensions/pg_statement_cache.rb +1 -0
- data/lib/sequel/extensions/pretty_table.rb +13 -4
- data/lib/sequel/extensions/query.rb +21 -4
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +22 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -7
- data/lib/sequel/extensions/schema_dumper.rb +35 -48
- data/lib/sequel/extensions/select_remove.rb +13 -4
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +117 -0
- data/lib/sequel/extensions/set_overrides.rb +43 -0
- data/lib/sequel/extensions/to_dot.rb +6 -0
- data/lib/sequel/model.rb +12 -6
- data/lib/sequel/model/associations.rb +80 -38
- data/lib/sequel/model/base.rb +137 -52
- data/lib/sequel/model/errors.rb +7 -2
- data/lib/sequel/plugins/active_model.rb +13 -0
- data/lib/sequel/plugins/after_initialize.rb +43 -0
- data/lib/sequel/plugins/association_proxies.rb +63 -7
- data/lib/sequel/plugins/auto_validations.rb +56 -16
- data/lib/sequel/plugins/blacklist_security.rb +63 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +9 -0
- data/lib/sequel/plugins/constraint_validations.rb +50 -8
- data/lib/sequel/plugins/dataset_associations.rb +2 -0
- data/lib/sequel/plugins/hook_class_methods.rb +7 -1
- data/lib/sequel/plugins/identity_map.rb +4 -0
- data/lib/sequel/plugins/json_serializer.rb +32 -13
- data/lib/sequel/plugins/optimistic_locking.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +4 -4
- data/lib/sequel/plugins/scissors.rb +33 -0
- data/lib/sequel/plugins/serialization.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +6 -0
- data/lib/sequel/plugins/tree.rb +5 -1
- data/lib/sequel/plugins/validation_class_methods.rb +2 -1
- data/lib/sequel/plugins/validation_helpers.rb +15 -11
- data/lib/sequel/plugins/xml_serializer.rb +12 -3
- data/lib/sequel/sql.rb +12 -2
- data/lib/sequel/timezones.rb +1 -1
- data/lib/sequel/version.rb +1 -1
- data/lib/sequel_core.rb +1 -0
- data/lib/sequel_model.rb +1 -0
- data/spec/adapters/mssql_spec.rb +24 -57
- data/spec/adapters/postgres_spec.rb +27 -55
- data/spec/adapters/spec_helper.rb +1 -1
- data/spec/adapters/sqlite_spec.rb +1 -1
- data/spec/bin_spec.rb +251 -0
- data/spec/core/database_spec.rb +46 -32
- data/spec/core/dataset_spec.rb +233 -181
- data/spec/core/deprecated_spec.rb +78 -0
- data/spec/core/expression_filters_spec.rb +3 -4
- data/spec/core/mock_adapter_spec.rb +9 -9
- data/spec/core/object_graph_spec.rb +9 -19
- data/spec/core/schema_spec.rb +3 -1
- data/spec/core/spec_helper.rb +19 -0
- data/spec/core_extensions_spec.rb +80 -30
- data/spec/extensions/after_initialize_spec.rb +24 -0
- data/spec/extensions/association_proxies_spec.rb +37 -1
- data/spec/extensions/auto_validations_spec.rb +20 -4
- data/spec/extensions/blacklist_security_spec.rb +87 -0
- data/spec/extensions/boolean_readers_spec.rb +2 -1
- data/spec/extensions/class_table_inheritance_spec.rb +7 -0
- data/spec/extensions/columns_introspection_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +83 -5
- data/spec/extensions/core_refinements_spec.rb +7 -7
- data/spec/extensions/dataset_associations_spec.rb +2 -2
- data/spec/extensions/date_arithmetic_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -1
- data/spec/extensions/empty_array_ignore_nulls_spec.rb +24 -0
- data/spec/extensions/filter_having_spec.rb +40 -0
- data/spec/extensions/graph_each_spec.rb +109 -0
- data/spec/extensions/hash_aliases_spec.rb +16 -0
- data/spec/extensions/hook_class_methods_spec.rb +2 -2
- data/spec/extensions/identity_map_spec.rb +3 -3
- data/spec/extensions/json_serializer_spec.rb +19 -19
- data/spec/extensions/lazy_attributes_spec.rb +1 -0
- data/spec/extensions/list_spec.rb +13 -13
- data/spec/extensions/looser_typecasting_spec.rb +10 -3
- data/spec/extensions/many_through_many_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +7 -7
- data/spec/extensions/named_timezones_spec.rb +6 -0
- data/spec/extensions/nested_attributes_spec.rb +2 -2
- data/spec/extensions/null_dataset_spec.rb +1 -1
- data/spec/extensions/pagination_spec.rb +2 -2
- data/spec/extensions/pg_hstore_ops_spec.rb +75 -0
- data/spec/extensions/pg_range_ops_spec.rb +4 -2
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_literals_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +3 -3
- data/spec/extensions/schema_caching_spec.rb +3 -3
- data/spec/extensions/schema_dumper_spec.rb +27 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/scissors_spec.rb +26 -0
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +102 -0
- data/spec/extensions/set_overrides_spec.rb +45 -0
- data/spec/extensions/single_table_inheritance_spec.rb +10 -0
- data/spec/extensions/spec_helper.rb +24 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +2 -1
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +3 -2
- data/spec/extensions/update_primary_key_spec.rb +2 -2
- data/spec/extensions/validation_class_methods_spec.rb +19 -19
- data/spec/extensions/validation_helpers_spec.rb +30 -21
- data/spec/extensions/xml_serializer_spec.rb +5 -5
- data/spec/integration/associations_test.rb +10 -30
- data/spec/integration/dataset_test.rb +20 -24
- data/spec/integration/eager_loader_test.rb +5 -5
- data/spec/integration/model_test.rb +3 -3
- data/spec/integration/plugin_test.rb +7 -39
- data/spec/integration/schema_test.rb +4 -38
- data/spec/integration/spec_helper.rb +2 -1
- data/spec/model/association_reflection_spec.rb +70 -5
- data/spec/model/associations_spec.rb +11 -11
- data/spec/model/base_spec.rb +25 -8
- data/spec/model/class_dataset_methods_spec.rb +143 -0
- data/spec/model/dataset_methods_spec.rb +1 -1
- data/spec/model/eager_loading_spec.rb +25 -25
- data/spec/model/hooks_spec.rb +1 -1
- data/spec/model/model_spec.rb +22 -7
- data/spec/model/plugins_spec.rb +1 -6
- data/spec/model/record_spec.rb +37 -29
- data/spec/model/spec_helper.rb +23 -1
- data/spec/model/validations_spec.rb +15 -17
- metadata +32 -3
data/lib/sequel/adapters/db2.rb
CHANGED
|
@@ -44,12 +44,6 @@ module Sequel
|
|
|
44
44
|
# Hash of connection procs for converting
|
|
45
45
|
attr_reader :conversion_procs
|
|
46
46
|
|
|
47
|
-
def initialize(opts={})
|
|
48
|
-
super
|
|
49
|
-
@conversion_procs = DB2_TYPES.dup
|
|
50
|
-
@conversion_procs[DB2CLI::SQL_TYPE_TIMESTAMP] = method(:to_application_timestamp_db2)
|
|
51
|
-
end
|
|
52
|
-
|
|
53
47
|
def connect(server)
|
|
54
48
|
opts = server_opts(server)
|
|
55
49
|
dbc = checked_error("Could not allocate database connection"){DB2CLI.SQLAllocHandle(DB2CLI::SQL_HANDLE_DBC, NullHandle)}
|
|
@@ -65,7 +59,10 @@ module Sequel
|
|
|
65
59
|
def execute(sql, opts={}, &block)
|
|
66
60
|
synchronize(opts[:server]){|conn| log_connection_execute(conn, sql, &block)}
|
|
67
61
|
end
|
|
68
|
-
|
|
62
|
+
def do(*a, &block)
|
|
63
|
+
Sequel::Deprecation.deprecate('Database#do', 'Please use Database#execute')
|
|
64
|
+
execute(*a, &block)
|
|
65
|
+
end
|
|
69
66
|
|
|
70
67
|
def execute_insert(sql, opts={})
|
|
71
68
|
synchronize(opts[:server]) do |conn|
|
|
@@ -116,6 +113,11 @@ module Sequel
|
|
|
116
113
|
|
|
117
114
|
private
|
|
118
115
|
|
|
116
|
+
def adapter_initialize
|
|
117
|
+
@conversion_procs = DB2_TYPES.dup
|
|
118
|
+
@conversion_procs[DB2CLI::SQL_TYPE_TIMESTAMP] = method(:to_application_timestamp_db2)
|
|
119
|
+
end
|
|
120
|
+
|
|
119
121
|
def database_error_classes
|
|
120
122
|
[DB2Error]
|
|
121
123
|
end
|
data/lib/sequel/adapters/dbi.rb
CHANGED
|
@@ -20,20 +20,6 @@ module Sequel
|
|
|
20
20
|
:sqlrelay => "SQLRelay"
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
def initialize(opts)
|
|
24
|
-
super
|
|
25
|
-
case @opts[:db_type]
|
|
26
|
-
when 'mssql'
|
|
27
|
-
Sequel.ts_require 'adapters/shared/mssql'
|
|
28
|
-
extend Sequel::MSSQL::DatabaseMethods
|
|
29
|
-
def self.dataset(*args)
|
|
30
|
-
ds = super
|
|
31
|
-
ds.extend Sequel::MSSQL::DatasetMethods
|
|
32
|
-
ds
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
23
|
# Converts a uri to an options hash. These options are then passed
|
|
38
24
|
# to a newly created database object.
|
|
39
25
|
def self.uri_to_options(uri) # :nodoc:
|
|
@@ -75,10 +61,24 @@ module Sequel
|
|
|
75
61
|
end
|
|
76
62
|
end
|
|
77
63
|
|
|
78
|
-
def
|
|
64
|
+
def execute_dui(sql, opts={})
|
|
79
65
|
synchronize(opts[:server]){|conn| log_yield(sql){conn.do(sql)}}
|
|
80
66
|
end
|
|
81
|
-
|
|
67
|
+
def do(*a, &block)
|
|
68
|
+
Sequel::Deprecation.deprecate('Database#do', 'Please use Database#execute_dui')
|
|
69
|
+
execute_dui(*a, &block)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def adapter_initialize
|
|
75
|
+
case @opts[:db_type]
|
|
76
|
+
when 'mssql'
|
|
77
|
+
Sequel.require 'adapters/shared/mssql'
|
|
78
|
+
extend Sequel::MSSQL::DatabaseMethods
|
|
79
|
+
extend_datasets Sequel::MSSQL::DatasetMethods
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
82
|
end
|
|
83
83
|
|
|
84
84
|
class Dataset < Sequel::Dataset
|
data/lib/sequel/adapters/do.rb
CHANGED
|
@@ -14,20 +14,20 @@ module Sequel
|
|
|
14
14
|
# Contains procs keyed on sub adapter type that extend the
|
|
15
15
|
# given database object so it supports the correct database type.
|
|
16
16
|
DATABASE_SETUP = {:postgres=>proc do |db|
|
|
17
|
-
|
|
18
|
-
Sequel.
|
|
17
|
+
require 'do_postgres'
|
|
18
|
+
Sequel.require 'adapters/do/postgres'
|
|
19
19
|
db.extend(Sequel::DataObjects::Postgres::DatabaseMethods)
|
|
20
20
|
db.extend_datasets Sequel::Postgres::DatasetMethods
|
|
21
21
|
end,
|
|
22
22
|
:mysql=>proc do |db|
|
|
23
|
-
|
|
24
|
-
Sequel.
|
|
23
|
+
require 'do_mysql'
|
|
24
|
+
Sequel.require 'adapters/do/mysql'
|
|
25
25
|
db.extend(Sequel::DataObjects::MySQL::DatabaseMethods)
|
|
26
26
|
db.dataset_class = Sequel::DataObjects::MySQL::Dataset
|
|
27
27
|
end,
|
|
28
28
|
:sqlite3=>proc do |db|
|
|
29
|
-
|
|
30
|
-
Sequel.
|
|
29
|
+
require 'do_sqlite3'
|
|
30
|
+
Sequel.require 'adapters/do/sqlite'
|
|
31
31
|
db.extend(Sequel::DataObjects::SQLite::DatabaseMethods)
|
|
32
32
|
db.extend_datasets Sequel::SQLite::DatasetMethods
|
|
33
33
|
db.set_integer_booleans
|
|
@@ -44,18 +44,6 @@ module Sequel
|
|
|
44
44
|
|
|
45
45
|
set_adapter_scheme :do
|
|
46
46
|
|
|
47
|
-
# Call the DATABASE_SETUP proc directly after initialization,
|
|
48
|
-
# so the object always uses sub adapter specific code. Also,
|
|
49
|
-
# raise an error immediately if the connection doesn't have a
|
|
50
|
-
# uri, since DataObjects requires one.
|
|
51
|
-
def initialize(opts)
|
|
52
|
-
super
|
|
53
|
-
raise(Error, "No connection string specified") unless uri
|
|
54
|
-
if prok = DATABASE_SETUP[subadapter.to_sym]
|
|
55
|
-
prok.call(self)
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
47
|
# Setup a DataObjects::Connection to the database.
|
|
60
48
|
def connect(server)
|
|
61
49
|
setup_connection(::DataObjects::Connection.new(uri(server_opts(server))))
|
|
@@ -119,6 +107,17 @@ module Sequel
|
|
|
119
107
|
|
|
120
108
|
private
|
|
121
109
|
|
|
110
|
+
# Call the DATABASE_SETUP proc directly after initialization,
|
|
111
|
+
# so the object always uses sub adapter specific code. Also,
|
|
112
|
+
# raise an error immediately if the connection doesn't have a
|
|
113
|
+
# uri, since DataObjects requires one.
|
|
114
|
+
def adapter_initialize
|
|
115
|
+
raise(Error, "No connection string specified") unless uri
|
|
116
|
+
if prok = DATABASE_SETUP[subadapter.to_sym]
|
|
117
|
+
prok.call(self)
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
122
121
|
# Method to call on a statement object to execute SQL that does
|
|
123
122
|
# not return any rows.
|
|
124
123
|
def connection_execute_method
|
|
@@ -10,11 +10,13 @@ module Sequel
|
|
|
10
10
|
# Methods to add to Database instances that access PostgreSQL via
|
|
11
11
|
# DataObjects.
|
|
12
12
|
module DatabaseMethods
|
|
13
|
+
extend Sequel::Database::ResetIdentifierMangling
|
|
13
14
|
include Sequel::Postgres::DatabaseMethods
|
|
14
15
|
|
|
15
16
|
# Add the primary_keys and primary_key_sequences instance variables,
|
|
16
17
|
# so we can get the correct return values for inserted rows.
|
|
17
18
|
def self.extended(db)
|
|
19
|
+
super
|
|
18
20
|
db.send(:initialize_postgres_adapter)
|
|
19
21
|
end
|
|
20
22
|
|
|
@@ -12,13 +12,6 @@ module Sequel
|
|
|
12
12
|
|
|
13
13
|
DISCONNECT_ERRORS = /Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements/
|
|
14
14
|
|
|
15
|
-
# Add the primary_keys instance variables.
|
|
16
|
-
# so we can get the correct return values for inserted rows.
|
|
17
|
-
def initialize(*args)
|
|
18
|
-
super
|
|
19
|
-
@primary_keys = {}
|
|
20
|
-
end
|
|
21
|
-
|
|
22
15
|
def connect(server)
|
|
23
16
|
opts = server_opts(server)
|
|
24
17
|
|
|
@@ -54,6 +47,11 @@ module Sequel
|
|
|
54
47
|
|
|
55
48
|
private
|
|
56
49
|
|
|
50
|
+
# Add the primary_keys instance variable so we can get the correct return values for inserted rows.
|
|
51
|
+
def adapter_initialize
|
|
52
|
+
@primary_keys = {}
|
|
53
|
+
end
|
|
54
|
+
|
|
57
55
|
def begin_transaction(conn, opts={})
|
|
58
56
|
log_yield(TRANSACTION_BEGIN) do
|
|
59
57
|
begin
|
|
@@ -157,8 +157,14 @@ module Sequel
|
|
|
157
157
|
IBM_DB.field_precision(@stmt, key)
|
|
158
158
|
end
|
|
159
159
|
|
|
160
|
-
# Free the memory related to this
|
|
160
|
+
# Free the memory related to this statement.
|
|
161
161
|
def free
|
|
162
|
+
IBM_DB.free_stmt(@stmt)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# Free the memory related to this result set, only useful for prepared
|
|
166
|
+
# statements which have a different result set on every call.
|
|
167
|
+
def free_result
|
|
162
168
|
IBM_DB.free_result(@stmt)
|
|
163
169
|
end
|
|
164
170
|
|
|
@@ -176,12 +182,6 @@ module Sequel
|
|
|
176
182
|
# Hash of connection procs for converting
|
|
177
183
|
attr_reader :conversion_procs
|
|
178
184
|
|
|
179
|
-
def initialize(opts={})
|
|
180
|
-
super
|
|
181
|
-
@conversion_procs = DB2_TYPES.dup
|
|
182
|
-
@conversion_procs[:timestamp] = method(:to_application_timestamp)
|
|
183
|
-
end
|
|
184
|
-
|
|
185
185
|
# REORG the related table whenever it is altered. This is not always
|
|
186
186
|
# required, but it is necessary for compatibilty with other Sequel
|
|
187
187
|
# code in many cases.
|
|
@@ -229,7 +229,7 @@ module Sequel
|
|
|
229
229
|
else
|
|
230
230
|
_execute(c, sql, opts)
|
|
231
231
|
end
|
|
232
|
-
_execute(c, "SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1", opts){|stmt| i = stmt.fetch_array.first.to_i;
|
|
232
|
+
_execute(c, "SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1", opts){|stmt| i = stmt.fetch_array.first.to_i; i}
|
|
233
233
|
end
|
|
234
234
|
rescue Connection::Error => e
|
|
235
235
|
raise_error(e)
|
|
@@ -251,15 +251,15 @@ module Sequel
|
|
|
251
251
|
log_sql << sql
|
|
252
252
|
log_sql << ")"
|
|
253
253
|
end
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
254
|
+
begin
|
|
255
|
+
stmt = log_yield(log_sql, args){conn.execute_prepared(ps_name, *args)}
|
|
256
|
+
if block_given?
|
|
257
257
|
yield(stmt)
|
|
258
|
-
|
|
259
|
-
stmt.
|
|
258
|
+
else
|
|
259
|
+
stmt.affected
|
|
260
260
|
end
|
|
261
|
-
|
|
262
|
-
stmt.
|
|
261
|
+
ensure
|
|
262
|
+
stmt.free_result if stmt
|
|
263
263
|
end
|
|
264
264
|
end
|
|
265
265
|
end
|
|
@@ -289,14 +289,17 @@ module Sequel
|
|
|
289
289
|
def _execute(conn, sql, opts)
|
|
290
290
|
stmt = log_yield(sql){conn.execute(sql)}
|
|
291
291
|
if block_given?
|
|
292
|
-
|
|
293
|
-
yield(stmt)
|
|
294
|
-
ensure
|
|
295
|
-
stmt.free
|
|
296
|
-
end
|
|
292
|
+
yield(stmt)
|
|
297
293
|
else
|
|
298
294
|
stmt.affected
|
|
299
295
|
end
|
|
296
|
+
ensure
|
|
297
|
+
stmt.free if stmt
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
def adapter_initialize
|
|
301
|
+
@conversion_procs = DB2_TYPES.dup
|
|
302
|
+
@conversion_procs[:timestamp] = method(:to_application_timestamp)
|
|
300
303
|
end
|
|
301
304
|
|
|
302
305
|
# IBM_DB uses an autocommit setting instead of sending SQL queries.
|
|
@@ -17,12 +17,18 @@ module Sequel
|
|
|
17
17
|
def execute_dui(sql, opts={})
|
|
18
18
|
synchronize(opts[:server]){|c| log_yield(sql){c.immediate(sql)}}
|
|
19
19
|
end
|
|
20
|
-
|
|
20
|
+
def do(*a, &block)
|
|
21
|
+
Sequel::Deprecation.deprecate('Database#do', 'Please use Database#execute_dui')
|
|
22
|
+
execute_dui(*a, &block)
|
|
23
|
+
end
|
|
21
24
|
|
|
22
25
|
def execute(sql, opts={})
|
|
23
26
|
synchronize(opts[:server]){|c| yield log_yield(sql){c.cursor(sql)}}
|
|
24
27
|
end
|
|
25
|
-
|
|
28
|
+
def query(*a, &block)
|
|
29
|
+
Sequel::Deprecation.deprecate('Database#query', 'Please use Database#execute')
|
|
30
|
+
execute(*a, &block)
|
|
31
|
+
end
|
|
26
32
|
end
|
|
27
33
|
|
|
28
34
|
class Dataset < Sequel::Dataset
|
data/lib/sequel/adapters/jdbc.rb
CHANGED
|
@@ -32,7 +32,7 @@ module Sequel
|
|
|
32
32
|
DATABASE_SETUP = {:postgresql=>proc do |db|
|
|
33
33
|
JDBC.load_gem(:Postgres)
|
|
34
34
|
org.postgresql.Driver
|
|
35
|
-
Sequel.
|
|
35
|
+
Sequel.require 'adapters/jdbc/postgresql'
|
|
36
36
|
db.extend(Sequel::JDBC::Postgres::DatabaseMethods)
|
|
37
37
|
db.dataset_class = Sequel::JDBC::Postgres::Dataset
|
|
38
38
|
org.postgresql.Driver
|
|
@@ -40,7 +40,7 @@ module Sequel
|
|
|
40
40
|
:mysql=>proc do |db|
|
|
41
41
|
JDBC.load_gem(:MySQL)
|
|
42
42
|
com.mysql.jdbc.Driver
|
|
43
|
-
Sequel.
|
|
43
|
+
Sequel.require 'adapters/jdbc/mysql'
|
|
44
44
|
db.extend(Sequel::JDBC::MySQL::DatabaseMethods)
|
|
45
45
|
db.extend_datasets Sequel::MySQL::DatasetMethods
|
|
46
46
|
com.mysql.jdbc.Driver
|
|
@@ -48,7 +48,7 @@ module Sequel
|
|
|
48
48
|
:sqlite=>proc do |db|
|
|
49
49
|
JDBC.load_gem(:SQLite3)
|
|
50
50
|
org.sqlite.JDBC
|
|
51
|
-
Sequel.
|
|
51
|
+
Sequel.require 'adapters/jdbc/sqlite'
|
|
52
52
|
db.extend(Sequel::JDBC::SQLite::DatabaseMethods)
|
|
53
53
|
db.extend_datasets Sequel::SQLite::DatasetMethods
|
|
54
54
|
db.set_integer_booleans
|
|
@@ -56,14 +56,14 @@ module Sequel
|
|
|
56
56
|
end,
|
|
57
57
|
:oracle=>proc do |db|
|
|
58
58
|
Java::oracle.jdbc.driver.OracleDriver
|
|
59
|
-
Sequel.
|
|
59
|
+
Sequel.require 'adapters/jdbc/oracle'
|
|
60
60
|
db.extend(Sequel::JDBC::Oracle::DatabaseMethods)
|
|
61
61
|
db.dataset_class = Sequel::JDBC::Oracle::Dataset
|
|
62
62
|
Java::oracle.jdbc.driver.OracleDriver
|
|
63
63
|
end,
|
|
64
64
|
:sqlserver=>proc do |db|
|
|
65
65
|
com.microsoft.sqlserver.jdbc.SQLServerDriver
|
|
66
|
-
Sequel.
|
|
66
|
+
Sequel.require 'adapters/jdbc/sqlserver'
|
|
67
67
|
db.extend(Sequel::JDBC::SQLServer::DatabaseMethods)
|
|
68
68
|
db.extend_datasets Sequel::MSSQL::DatasetMethods
|
|
69
69
|
db.send(:set_mssql_unicode_strings)
|
|
@@ -72,7 +72,7 @@ module Sequel
|
|
|
72
72
|
:jtds=>proc do |db|
|
|
73
73
|
JDBC.load_gem(:JTDS)
|
|
74
74
|
Java::net.sourceforge.jtds.jdbc.Driver
|
|
75
|
-
Sequel.
|
|
75
|
+
Sequel.require 'adapters/jdbc/jtds'
|
|
76
76
|
db.extend(Sequel::JDBC::JTDS::DatabaseMethods)
|
|
77
77
|
db.dataset_class = Sequel::JDBC::JTDS::Dataset
|
|
78
78
|
db.send(:set_mssql_unicode_strings)
|
|
@@ -81,7 +81,7 @@ module Sequel
|
|
|
81
81
|
:h2=>proc do |db|
|
|
82
82
|
JDBC.load_gem(:H2)
|
|
83
83
|
org.h2.Driver
|
|
84
|
-
Sequel.
|
|
84
|
+
Sequel.require 'adapters/jdbc/h2'
|
|
85
85
|
db.extend(Sequel::JDBC::H2::DatabaseMethods)
|
|
86
86
|
db.dataset_class = Sequel::JDBC::H2::Dataset
|
|
87
87
|
org.h2.Driver
|
|
@@ -89,7 +89,7 @@ module Sequel
|
|
|
89
89
|
:hsqldb=>proc do |db|
|
|
90
90
|
JDBC.load_gem(:HSQLDB)
|
|
91
91
|
org.hsqldb.jdbcDriver
|
|
92
|
-
Sequel.
|
|
92
|
+
Sequel.require 'adapters/jdbc/hsqldb'
|
|
93
93
|
db.extend(Sequel::JDBC::HSQLDB::DatabaseMethods)
|
|
94
94
|
db.dataset_class = Sequel::JDBC::HSQLDB::Dataset
|
|
95
95
|
org.hsqldb.jdbcDriver
|
|
@@ -97,49 +97,49 @@ module Sequel
|
|
|
97
97
|
:derby=>proc do |db|
|
|
98
98
|
JDBC.load_gem(:Derby)
|
|
99
99
|
org.apache.derby.jdbc.EmbeddedDriver
|
|
100
|
-
Sequel.
|
|
100
|
+
Sequel.require 'adapters/jdbc/derby'
|
|
101
101
|
db.extend(Sequel::JDBC::Derby::DatabaseMethods)
|
|
102
102
|
db.dataset_class = Sequel::JDBC::Derby::Dataset
|
|
103
103
|
org.apache.derby.jdbc.EmbeddedDriver
|
|
104
104
|
end,
|
|
105
105
|
:as400=>proc do |db|
|
|
106
106
|
com.ibm.as400.access.AS400JDBCDriver
|
|
107
|
-
Sequel.
|
|
107
|
+
Sequel.require 'adapters/jdbc/as400'
|
|
108
108
|
db.extend(Sequel::JDBC::AS400::DatabaseMethods)
|
|
109
109
|
db.dataset_class = Sequel::JDBC::AS400::Dataset
|
|
110
110
|
com.ibm.as400.access.AS400JDBCDriver
|
|
111
111
|
end,
|
|
112
112
|
:"informix-sqli"=>proc do |db|
|
|
113
113
|
com.informix.jdbc.IfxDriver
|
|
114
|
-
Sequel.
|
|
114
|
+
Sequel.require 'adapters/jdbc/informix'
|
|
115
115
|
db.extend(Sequel::JDBC::Informix::DatabaseMethods)
|
|
116
116
|
db.extend_datasets Sequel::Informix::DatasetMethods
|
|
117
117
|
com.informix.jdbc.IfxDriver
|
|
118
118
|
end,
|
|
119
119
|
:db2=>proc do |db|
|
|
120
120
|
com.ibm.db2.jcc.DB2Driver
|
|
121
|
-
Sequel.
|
|
121
|
+
Sequel.require 'adapters/jdbc/db2'
|
|
122
122
|
db.extend(Sequel::JDBC::DB2::DatabaseMethods)
|
|
123
123
|
db.dataset_class = Sequel::JDBC::DB2::Dataset
|
|
124
124
|
com.ibm.db2.jcc.DB2Driver
|
|
125
125
|
end,
|
|
126
126
|
:firebirdsql=>proc do |db|
|
|
127
127
|
org.firebirdsql.jdbc.FBDriver
|
|
128
|
-
Sequel.
|
|
128
|
+
Sequel.require 'adapters/jdbc/firebird'
|
|
129
129
|
db.extend(Sequel::JDBC::Firebird::DatabaseMethods)
|
|
130
130
|
db.extend_datasets Sequel::Firebird::DatasetMethods
|
|
131
131
|
org.firebirdsql.jdbc.FBDriver
|
|
132
132
|
end,
|
|
133
133
|
:jdbcprogress=>proc do |db|
|
|
134
134
|
com.progress.sql.jdbc.JdbcProgressDriver
|
|
135
|
-
Sequel.
|
|
135
|
+
Sequel.require 'adapters/jdbc/progress'
|
|
136
136
|
db.extend(Sequel::JDBC::Progress::DatabaseMethods)
|
|
137
137
|
db.extend_datasets Sequel::Progress::DatasetMethods
|
|
138
138
|
com.progress.sql.jdbc.JdbcProgressDriver
|
|
139
139
|
end,
|
|
140
140
|
:cubrid=>proc do |db|
|
|
141
141
|
Java::cubrid.jdbc.driver.CUBRIDDriver
|
|
142
|
-
Sequel.
|
|
142
|
+
Sequel.require 'adapters/jdbc/cubrid'
|
|
143
143
|
db.extend(Sequel::JDBC::Cubrid::DatabaseMethods)
|
|
144
144
|
db.extend_datasets Sequel::Cubrid::DatasetMethods
|
|
145
145
|
Java::cubrid.jdbc.driver.CUBRIDDriver
|
|
@@ -150,7 +150,7 @@ module Sequel
|
|
|
150
150
|
# works for PostgreSQL, MySQL, and SQLite.
|
|
151
151
|
def self.load_gem(name)
|
|
152
152
|
begin
|
|
153
|
-
|
|
153
|
+
require "jdbc/#{name.to_s.downcase}"
|
|
154
154
|
rescue LoadError
|
|
155
155
|
# jdbc gem not used, hopefully the user has the .jar in their CLASSPATH
|
|
156
156
|
else
|
|
@@ -177,24 +177,6 @@ module Sequel
|
|
|
177
177
|
# fetching rows.
|
|
178
178
|
attr_accessor :convert_types
|
|
179
179
|
|
|
180
|
-
# Call the DATABASE_SETUP proc directly after initialization,
|
|
181
|
-
# so the object always uses sub adapter specific code. Also,
|
|
182
|
-
# raise an error immediately if the connection doesn't have a
|
|
183
|
-
# uri, since JDBC requires one.
|
|
184
|
-
def initialize(opts)
|
|
185
|
-
super
|
|
186
|
-
@connection_prepared_statements = {}
|
|
187
|
-
@connection_prepared_statements_mutex = Mutex.new
|
|
188
|
-
@convert_types = typecast_value_boolean(@opts.fetch(:convert_types, true))
|
|
189
|
-
raise(Error, "No connection string specified") unless uri
|
|
190
|
-
|
|
191
|
-
resolved_uri = jndi? ? get_uri_from_jndi : uri
|
|
192
|
-
|
|
193
|
-
if match = /\Ajdbc:([^:]+)/.match(resolved_uri) and prok = DATABASE_SETUP[match[1].to_sym]
|
|
194
|
-
@driver = prok.call(self)
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
|
|
198
180
|
# Execute the given stored procedure with the give name. If a block is
|
|
199
181
|
# given, the stored procedure should return rows.
|
|
200
182
|
def call_sproc(name, opts = {})
|
|
@@ -350,6 +332,23 @@ module Sequel
|
|
|
350
332
|
|
|
351
333
|
private
|
|
352
334
|
|
|
335
|
+
# Call the DATABASE_SETUP proc directly after initialization,
|
|
336
|
+
# so the object always uses sub adapter specific code. Also,
|
|
337
|
+
# raise an error immediately if the connection doesn't have a
|
|
338
|
+
# uri, since JDBC requires one.
|
|
339
|
+
def adapter_initialize
|
|
340
|
+
@connection_prepared_statements = {}
|
|
341
|
+
@connection_prepared_statements_mutex = Mutex.new
|
|
342
|
+
@convert_types = typecast_value_boolean(@opts.fetch(:convert_types, true))
|
|
343
|
+
raise(Error, "No connection string specified") unless uri
|
|
344
|
+
|
|
345
|
+
resolved_uri = jndi? ? get_uri_from_jndi : uri
|
|
346
|
+
|
|
347
|
+
if match = /\Ajdbc:([^:]+)/.match(resolved_uri) and prok = DATABASE_SETUP[match[1].to_sym]
|
|
348
|
+
@driver = prok.call(self)
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
|
|
353
352
|
# Yield the native prepared statements hash for the given connection
|
|
354
353
|
# to the block in a thread-safe manner.
|
|
355
354
|
def cps_sync(conn, &block)
|
|
@@ -390,7 +389,7 @@ module Sequel
|
|
|
390
389
|
# variables, and execute it.
|
|
391
390
|
def execute_prepared_statement(name, opts={})
|
|
392
391
|
args = opts[:arguments]
|
|
393
|
-
if Dataset
|
|
392
|
+
if name.is_a?(Dataset)
|
|
394
393
|
ps = name
|
|
395
394
|
name = ps.prepared_statement_name
|
|
396
395
|
else
|
|
@@ -575,14 +574,19 @@ module Sequel
|
|
|
575
574
|
next if schema_parse_table_skip?(h, schema)
|
|
576
575
|
pks << h[:column_name]
|
|
577
576
|
end
|
|
577
|
+
schemas = []
|
|
578
578
|
metadata(:getColumns, nil, schema, table, nil) do |h|
|
|
579
579
|
next if schema_parse_table_skip?(h, schema)
|
|
580
580
|
s = {:type=>schema_column_type(h[:type_name]), :db_type=>h[:type_name], :default=>(h[:column_def] == '' ? nil : h[:column_def]), :allow_null=>(h[:nullable] != 0), :primary_key=>pks.include?(h[:column_name]), :column_size=>h[:column_size], :scale=>h[:decimal_digits]}
|
|
581
581
|
if s[:db_type] =~ DECIMAL_TYPE_RE && s[:scale] == 0
|
|
582
582
|
s[:type] = :integer
|
|
583
583
|
end
|
|
584
|
+
schemas << h[:table_schem] unless schemas.include?(h[:table_schem])
|
|
584
585
|
ts << [m.call(h[:column_name]), s]
|
|
585
586
|
end
|
|
587
|
+
if schemas.length > 1
|
|
588
|
+
Sequel::Deprecation.deprecate('Schema parsing in the jdbc adapter resulted in columns being returned for a table with the same name in multiple schemas. This will raise an Error starting in Sequel 4. Please explicitly qualify your table with a schema.')
|
|
589
|
+
end
|
|
586
590
|
ts
|
|
587
591
|
end
|
|
588
592
|
|