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.
Files changed (243) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +230 -0
  3. data/README.rdoc +31 -40
  4. data/Rakefile +1 -14
  5. data/doc/active_record.rdoc +29 -29
  6. data/doc/association_basics.rdoc +4 -13
  7. data/doc/cheat_sheet.rdoc +8 -6
  8. data/doc/code_order.rdoc +89 -0
  9. data/doc/core_extensions.rdoc +3 -3
  10. data/doc/dataset_basics.rdoc +7 -8
  11. data/doc/dataset_filtering.rdoc +7 -2
  12. data/doc/mass_assignment.rdoc +2 -3
  13. data/doc/migration.rdoc +8 -8
  14. data/doc/model_hooks.rdoc +11 -7
  15. data/doc/object_model.rdoc +2 -2
  16. data/doc/opening_databases.rdoc +5 -14
  17. data/doc/prepared_statements.rdoc +5 -9
  18. data/doc/querying.rdoc +23 -28
  19. data/doc/reflection.rdoc +11 -0
  20. data/doc/release_notes/3.48.0.txt +477 -0
  21. data/doc/schema_modification.rdoc +12 -5
  22. data/doc/security.rdoc +2 -2
  23. data/doc/sharding.rdoc +1 -2
  24. data/doc/sql.rdoc +10 -13
  25. data/doc/testing.rdoc +8 -4
  26. data/doc/transactions.rdoc +2 -2
  27. data/doc/validations.rdoc +40 -17
  28. data/doc/virtual_rows.rdoc +2 -2
  29. data/lib/sequel/adapters/ado.rb +25 -20
  30. data/lib/sequel/adapters/ado/access.rb +1 -0
  31. data/lib/sequel/adapters/ado/mssql.rb +1 -0
  32. data/lib/sequel/adapters/db2.rb +9 -7
  33. data/lib/sequel/adapters/dbi.rb +16 -16
  34. data/lib/sequel/adapters/do.rb +17 -18
  35. data/lib/sequel/adapters/do/mysql.rb +1 -0
  36. data/lib/sequel/adapters/do/postgres.rb +2 -0
  37. data/lib/sequel/adapters/do/sqlite.rb +1 -0
  38. data/lib/sequel/adapters/firebird.rb +5 -7
  39. data/lib/sequel/adapters/ibmdb.rb +23 -20
  40. data/lib/sequel/adapters/informix.rb +8 -2
  41. data/lib/sequel/adapters/jdbc.rb +39 -35
  42. data/lib/sequel/adapters/jdbc/as400.rb +1 -0
  43. data/lib/sequel/adapters/jdbc/cubrid.rb +1 -0
  44. data/lib/sequel/adapters/jdbc/db2.rb +1 -0
  45. data/lib/sequel/adapters/jdbc/derby.rb +1 -0
  46. data/lib/sequel/adapters/jdbc/firebird.rb +1 -0
  47. data/lib/sequel/adapters/jdbc/h2.rb +1 -0
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -0
  49. data/lib/sequel/adapters/jdbc/informix.rb +1 -0
  50. data/lib/sequel/adapters/jdbc/jtds.rb +1 -0
  51. data/lib/sequel/adapters/jdbc/mssql.rb +1 -0
  52. data/lib/sequel/adapters/jdbc/mysql.rb +1 -0
  53. data/lib/sequel/adapters/jdbc/oracle.rb +1 -0
  54. data/lib/sequel/adapters/jdbc/postgresql.rb +2 -0
  55. data/lib/sequel/adapters/jdbc/progress.rb +1 -0
  56. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -0
  57. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -0
  58. data/lib/sequel/adapters/mock.rb +30 -31
  59. data/lib/sequel/adapters/mysql.rb +6 -7
  60. data/lib/sequel/adapters/mysql2.rb +5 -6
  61. data/lib/sequel/adapters/odbc.rb +22 -20
  62. data/lib/sequel/adapters/odbc/mssql.rb +1 -0
  63. data/lib/sequel/adapters/openbase.rb +4 -1
  64. data/lib/sequel/adapters/oracle.rb +10 -8
  65. data/lib/sequel/adapters/postgres.rb +12 -10
  66. data/lib/sequel/adapters/shared/access.rb +6 -0
  67. data/lib/sequel/adapters/shared/cubrid.rb +2 -0
  68. data/lib/sequel/adapters/shared/db2.rb +2 -0
  69. data/lib/sequel/adapters/shared/firebird.rb +2 -0
  70. data/lib/sequel/adapters/shared/informix.rb +2 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +14 -8
  72. data/lib/sequel/adapters/shared/mysql.rb +6 -0
  73. data/lib/sequel/adapters/shared/oracle.rb +2 -0
  74. data/lib/sequel/adapters/shared/postgres.rb +14 -4
  75. data/lib/sequel/adapters/shared/progress.rb +1 -0
  76. data/lib/sequel/adapters/shared/sqlite.rb +4 -3
  77. data/lib/sequel/adapters/sqlite.rb +6 -7
  78. data/lib/sequel/adapters/swift.rb +20 -21
  79. data/lib/sequel/adapters/swift/mysql.rb +1 -0
  80. data/lib/sequel/adapters/swift/postgres.rb +2 -0
  81. data/lib/sequel/adapters/swift/sqlite.rb +1 -0
  82. data/lib/sequel/adapters/tinytds.rb +5 -6
  83. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +68 -0
  84. data/lib/sequel/connection_pool.rb +1 -1
  85. data/lib/sequel/core.rb +57 -50
  86. data/lib/sequel/database/connecting.rb +9 -10
  87. data/lib/sequel/database/dataset.rb +11 -6
  88. data/lib/sequel/database/dataset_defaults.rb +61 -69
  89. data/lib/sequel/database/features.rb +21 -0
  90. data/lib/sequel/database/misc.rb +23 -3
  91. data/lib/sequel/database/query.rb +13 -7
  92. data/lib/sequel/database/schema_methods.rb +6 -6
  93. data/lib/sequel/database/transactions.rb +1 -0
  94. data/lib/sequel/dataset/actions.rb +51 -38
  95. data/lib/sequel/dataset/features.rb +1 -0
  96. data/lib/sequel/dataset/graph.rb +9 -33
  97. data/lib/sequel/dataset/misc.rb +30 -5
  98. data/lib/sequel/dataset/mutation.rb +2 -3
  99. data/lib/sequel/dataset/prepared_statements.rb +1 -1
  100. data/lib/sequel/dataset/query.rb +91 -27
  101. data/lib/sequel/dataset/sql.rb +40 -6
  102. data/lib/sequel/deprecated.rb +74 -0
  103. data/lib/sequel/deprecated_core_extensions.rb +135 -0
  104. data/lib/sequel/extensions/columns_introspection.rb +1 -5
  105. data/lib/sequel/extensions/core_extensions.rb +10 -3
  106. data/lib/sequel/extensions/date_arithmetic.rb +1 -0
  107. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +33 -0
  108. data/lib/sequel/extensions/filter_having.rb +58 -0
  109. data/lib/sequel/extensions/graph_each.rb +63 -0
  110. data/lib/sequel/extensions/hash_aliases.rb +44 -0
  111. data/lib/sequel/extensions/looser_typecasting.rb +14 -3
  112. data/lib/sequel/extensions/migration.rb +2 -3
  113. data/lib/sequel/extensions/named_timezones.rb +14 -1
  114. data/lib/sequel/extensions/null_dataset.rb +7 -1
  115. data/lib/sequel/extensions/pagination.rb +15 -5
  116. data/lib/sequel/extensions/pg_auto_parameterize.rb +1 -0
  117. data/lib/sequel/extensions/pg_hstore_ops.rb +48 -14
  118. data/lib/sequel/extensions/pg_json.rb +7 -7
  119. data/lib/sequel/extensions/pg_range_ops.rb +8 -2
  120. data/lib/sequel/extensions/pg_statement_cache.rb +1 -0
  121. data/lib/sequel/extensions/pretty_table.rb +13 -4
  122. data/lib/sequel/extensions/query.rb +21 -4
  123. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +22 -0
  124. data/lib/sequel/extensions/schema_caching.rb +10 -7
  125. data/lib/sequel/extensions/schema_dumper.rb +35 -48
  126. data/lib/sequel/extensions/select_remove.rb +13 -4
  127. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +117 -0
  128. data/lib/sequel/extensions/set_overrides.rb +43 -0
  129. data/lib/sequel/extensions/to_dot.rb +6 -0
  130. data/lib/sequel/model.rb +12 -6
  131. data/lib/sequel/model/associations.rb +80 -38
  132. data/lib/sequel/model/base.rb +137 -52
  133. data/lib/sequel/model/errors.rb +7 -2
  134. data/lib/sequel/plugins/active_model.rb +13 -0
  135. data/lib/sequel/plugins/after_initialize.rb +43 -0
  136. data/lib/sequel/plugins/association_proxies.rb +63 -7
  137. data/lib/sequel/plugins/auto_validations.rb +56 -16
  138. data/lib/sequel/plugins/blacklist_security.rb +63 -0
  139. data/lib/sequel/plugins/class_table_inheritance.rb +9 -0
  140. data/lib/sequel/plugins/constraint_validations.rb +50 -8
  141. data/lib/sequel/plugins/dataset_associations.rb +2 -0
  142. data/lib/sequel/plugins/hook_class_methods.rb +7 -1
  143. data/lib/sequel/plugins/identity_map.rb +4 -0
  144. data/lib/sequel/plugins/json_serializer.rb +32 -13
  145. data/lib/sequel/plugins/optimistic_locking.rb +1 -1
  146. data/lib/sequel/plugins/rcte_tree.rb +4 -4
  147. data/lib/sequel/plugins/scissors.rb +33 -0
  148. data/lib/sequel/plugins/serialization.rb +1 -1
  149. data/lib/sequel/plugins/single_table_inheritance.rb +6 -0
  150. data/lib/sequel/plugins/tree.rb +5 -1
  151. data/lib/sequel/plugins/validation_class_methods.rb +2 -1
  152. data/lib/sequel/plugins/validation_helpers.rb +15 -11
  153. data/lib/sequel/plugins/xml_serializer.rb +12 -3
  154. data/lib/sequel/sql.rb +12 -2
  155. data/lib/sequel/timezones.rb +1 -1
  156. data/lib/sequel/version.rb +1 -1
  157. data/lib/sequel_core.rb +1 -0
  158. data/lib/sequel_model.rb +1 -0
  159. data/spec/adapters/mssql_spec.rb +24 -57
  160. data/spec/adapters/postgres_spec.rb +27 -55
  161. data/spec/adapters/spec_helper.rb +1 -1
  162. data/spec/adapters/sqlite_spec.rb +1 -1
  163. data/spec/bin_spec.rb +251 -0
  164. data/spec/core/database_spec.rb +46 -32
  165. data/spec/core/dataset_spec.rb +233 -181
  166. data/spec/core/deprecated_spec.rb +78 -0
  167. data/spec/core/expression_filters_spec.rb +3 -4
  168. data/spec/core/mock_adapter_spec.rb +9 -9
  169. data/spec/core/object_graph_spec.rb +9 -19
  170. data/spec/core/schema_spec.rb +3 -1
  171. data/spec/core/spec_helper.rb +19 -0
  172. data/spec/core_extensions_spec.rb +80 -30
  173. data/spec/extensions/after_initialize_spec.rb +24 -0
  174. data/spec/extensions/association_proxies_spec.rb +37 -1
  175. data/spec/extensions/auto_validations_spec.rb +20 -4
  176. data/spec/extensions/blacklist_security_spec.rb +87 -0
  177. data/spec/extensions/boolean_readers_spec.rb +2 -1
  178. data/spec/extensions/class_table_inheritance_spec.rb +7 -0
  179. data/spec/extensions/columns_introspection_spec.rb +3 -3
  180. data/spec/extensions/constraint_validations_plugin_spec.rb +83 -5
  181. data/spec/extensions/core_refinements_spec.rb +7 -7
  182. data/spec/extensions/dataset_associations_spec.rb +2 -2
  183. data/spec/extensions/date_arithmetic_spec.rb +1 -1
  184. data/spec/extensions/defaults_setter_spec.rb +2 -1
  185. data/spec/extensions/empty_array_ignore_nulls_spec.rb +24 -0
  186. data/spec/extensions/filter_having_spec.rb +40 -0
  187. data/spec/extensions/graph_each_spec.rb +109 -0
  188. data/spec/extensions/hash_aliases_spec.rb +16 -0
  189. data/spec/extensions/hook_class_methods_spec.rb +2 -2
  190. data/spec/extensions/identity_map_spec.rb +3 -3
  191. data/spec/extensions/json_serializer_spec.rb +19 -19
  192. data/spec/extensions/lazy_attributes_spec.rb +1 -0
  193. data/spec/extensions/list_spec.rb +13 -13
  194. data/spec/extensions/looser_typecasting_spec.rb +10 -3
  195. data/spec/extensions/many_through_many_spec.rb +1 -1
  196. data/spec/extensions/migration_spec.rb +7 -7
  197. data/spec/extensions/named_timezones_spec.rb +6 -0
  198. data/spec/extensions/nested_attributes_spec.rb +2 -2
  199. data/spec/extensions/null_dataset_spec.rb +1 -1
  200. data/spec/extensions/pagination_spec.rb +2 -2
  201. data/spec/extensions/pg_hstore_ops_spec.rb +75 -0
  202. data/spec/extensions/pg_range_ops_spec.rb +4 -2
  203. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  204. data/spec/extensions/pretty_table_spec.rb +1 -1
  205. data/spec/extensions/query_literals_spec.rb +1 -1
  206. data/spec/extensions/query_spec.rb +3 -3
  207. data/spec/extensions/schema_caching_spec.rb +3 -3
  208. data/spec/extensions/schema_dumper_spec.rb +27 -2
  209. data/spec/extensions/schema_spec.rb +2 -2
  210. data/spec/extensions/scissors_spec.rb +26 -0
  211. data/spec/extensions/select_remove_spec.rb +1 -1
  212. data/spec/extensions/sequel_3_dataset_methods_spec.rb +102 -0
  213. data/spec/extensions/set_overrides_spec.rb +45 -0
  214. data/spec/extensions/single_table_inheritance_spec.rb +10 -0
  215. data/spec/extensions/spec_helper.rb +24 -1
  216. data/spec/extensions/static_cache_spec.rb +1 -1
  217. data/spec/extensions/string_stripper_spec.rb +2 -1
  218. data/spec/extensions/to_dot_spec.rb +1 -1
  219. data/spec/extensions/typecast_on_load_spec.rb +3 -2
  220. data/spec/extensions/update_primary_key_spec.rb +2 -2
  221. data/spec/extensions/validation_class_methods_spec.rb +19 -19
  222. data/spec/extensions/validation_helpers_spec.rb +30 -21
  223. data/spec/extensions/xml_serializer_spec.rb +5 -5
  224. data/spec/integration/associations_test.rb +10 -30
  225. data/spec/integration/dataset_test.rb +20 -24
  226. data/spec/integration/eager_loader_test.rb +5 -5
  227. data/spec/integration/model_test.rb +3 -3
  228. data/spec/integration/plugin_test.rb +7 -39
  229. data/spec/integration/schema_test.rb +4 -38
  230. data/spec/integration/spec_helper.rb +2 -1
  231. data/spec/model/association_reflection_spec.rb +70 -5
  232. data/spec/model/associations_spec.rb +11 -11
  233. data/spec/model/base_spec.rb +25 -8
  234. data/spec/model/class_dataset_methods_spec.rb +143 -0
  235. data/spec/model/dataset_methods_spec.rb +1 -1
  236. data/spec/model/eager_loading_spec.rb +25 -25
  237. data/spec/model/hooks_spec.rb +1 -1
  238. data/spec/model/model_spec.rb +22 -7
  239. data/spec/model/plugins_spec.rb +1 -6
  240. data/spec/model/record_spec.rb +37 -29
  241. data/spec/model/spec_helper.rb +23 -1
  242. data/spec/model/validations_spec.rb +15 -17
  243. metadata +32 -3
@@ -84,6 +84,7 @@ module Sequel
84
84
  end
85
85
 
86
86
  module DatabaseMethods
87
+ extend Sequel::Database::ResetIdentifierMangling
87
88
  include Sequel::Access::DatabaseMethods
88
89
  include Sequel::Database::SplitAlterTable
89
90
 
@@ -6,6 +6,7 @@ module Sequel
6
6
  # support via ADO.
7
7
  module MSSQL
8
8
  module DatabaseMethods
9
+ extend Sequel::Database::ResetIdentifierMangling
9
10
  include Sequel::MSSQL::DatabaseMethods
10
11
  # Query to use to get the number of rows affected by an update or
11
12
  # delete query.
@@ -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
- alias do execute
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
@@ -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 do(sql, opts={})
64
+ def execute_dui(sql, opts={})
79
65
  synchronize(opts[:server]){|conn| log_yield(sql){conn.do(sql)}}
80
66
  end
81
- alias_method :execute_dui, :do
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
@@ -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
- Sequel.tsk_require 'do_postgres'
18
- Sequel.ts_require 'adapters/do/postgres'
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
- Sequel.tsk_require 'do_mysql'
24
- Sequel.ts_require 'adapters/do/mysql'
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
- Sequel.tsk_require 'do_sqlite3'
30
- Sequel.ts_require 'adapters/do/sqlite'
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
@@ -7,6 +7,7 @@ module Sequel
7
7
  module MySQL
8
8
  # Database instance methods for MySQL databases accessed via DataObjects.
9
9
  module DatabaseMethods
10
+ extend Sequel::Database::ResetIdentifierMangling
10
11
  include Sequel::MySQL::DatabaseMethods
11
12
 
12
13
  private
@@ -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
 
@@ -6,6 +6,7 @@ module Sequel
6
6
  module SQLite
7
7
  # Instance methods for SQLite Database objects accessed via DataObjects.
8
8
  module DatabaseMethods
9
+ extend Sequel::Database::ResetIdentifierMangling
9
10
  include Sequel::SQLite::DatabaseMethods
10
11
 
11
12
  private
@@ -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 result set.
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; stmt.free; 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
- stmt = log_yield(log_sql, args){conn.execute_prepared(ps_name, *args)}
255
- if block_given?
256
- begin
254
+ begin
255
+ stmt = log_yield(log_sql, args){conn.execute_prepared(ps_name, *args)}
256
+ if block_given?
257
257
  yield(stmt)
258
- ensure
259
- stmt.free
258
+ else
259
+ stmt.affected
260
260
  end
261
- else
262
- stmt.affected
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
- begin
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
- alias_method :do, :execute_dui
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
- alias_method :query, :execute
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
@@ -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.ts_require 'adapters/jdbc/postgresql'
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.ts_require 'adapters/jdbc/mysql'
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.ts_require 'adapters/jdbc/sqlite'
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.ts_require 'adapters/jdbc/oracle'
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.ts_require 'adapters/jdbc/sqlserver'
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.ts_require 'adapters/jdbc/jtds'
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.ts_require 'adapters/jdbc/h2'
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.ts_require 'adapters/jdbc/hsqldb'
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.ts_require 'adapters/jdbc/derby'
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.ts_require 'adapters/jdbc/as400'
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.ts_require 'adapters/jdbc/informix'
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.ts_require 'adapters/jdbc/db2'
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.ts_require 'adapters/jdbc/firebird'
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.ts_require 'adapters/jdbc/progress'
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.ts_require 'adapters/jdbc/cubrid'
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
- Sequel.tsk_require "jdbc/#{name.to_s.downcase}"
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 === name
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