sequel 4.44.0 → 4.45.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 (140) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +110 -0
  3. data/README.rdoc +8 -9
  4. data/doc/active_record.rdoc +2 -3
  5. data/doc/model_plugins.rdoc +1 -1
  6. data/doc/opening_databases.rdoc +0 -46
  7. data/doc/release_notes/4.45.0.txt +370 -0
  8. data/lib/sequel/adapters/cubrid.rb +2 -0
  9. data/lib/sequel/adapters/do.rb +2 -0
  10. data/lib/sequel/adapters/jdbc/as400.rb +2 -0
  11. data/lib/sequel/adapters/jdbc/cubrid.rb +2 -0
  12. data/lib/sequel/adapters/jdbc/firebirdsql.rb +2 -0
  13. data/lib/sequel/adapters/jdbc/informix-sqli.rb +2 -0
  14. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +2 -0
  15. data/lib/sequel/adapters/jdbc/mysql.rb +1 -0
  16. data/lib/sequel/adapters/jdbc/postgresql.rb +5 -0
  17. data/lib/sequel/adapters/mysql.rb +1 -0
  18. data/lib/sequel/adapters/mysql2.rb +1 -0
  19. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  20. data/lib/sequel/adapters/odbc/progress.rb +2 -0
  21. data/lib/sequel/adapters/postgres.rb +0 -2
  22. data/lib/sequel/adapters/shared/cubrid.rb +2 -0
  23. data/lib/sequel/adapters/shared/firebird.rb +2 -0
  24. data/lib/sequel/adapters/shared/informix.rb +2 -0
  25. data/lib/sequel/adapters/shared/mssql.rb +47 -7
  26. data/lib/sequel/adapters/shared/mysql.rb +16 -1
  27. data/lib/sequel/adapters/shared/postgres.rb +9 -1
  28. data/lib/sequel/adapters/shared/progress.rb +2 -0
  29. data/lib/sequel/adapters/shared/sqlanywhere.rb +1 -1
  30. data/lib/sequel/adapters/swift.rb +2 -0
  31. data/lib/sequel/ast_transformer.rb +13 -6
  32. data/lib/sequel/core.rb +13 -16
  33. data/lib/sequel/database/connecting.rb +25 -10
  34. data/lib/sequel/database/dataset.rb +6 -1
  35. data/lib/sequel/database/dataset_defaults.rb +9 -2
  36. data/lib/sequel/database/misc.rb +10 -3
  37. data/lib/sequel/database/schema_methods.rb +4 -0
  38. data/lib/sequel/dataset/mutation.rb +8 -20
  39. data/lib/sequel/dataset/prepared_statements.rb +2 -0
  40. data/lib/sequel/dataset/query.rb +32 -7
  41. data/lib/sequel/dataset/sql.rb +13 -3
  42. data/lib/sequel/deprecated.rb +9 -1
  43. data/lib/sequel/exceptions.rb +37 -8
  44. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +117 -0
  45. data/lib/sequel/extensions/date_arithmetic.rb +1 -0
  46. data/lib/sequel/extensions/identifier_mangling.rb +3 -2
  47. data/lib/sequel/extensions/pg_hstore.rb +1 -5
  48. data/lib/sequel/extensions/schema_dumper.rb +3 -1
  49. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +2 -2
  50. data/lib/sequel/extensions/string_agg.rb +1 -0
  51. data/lib/sequel/model.rb +23 -10
  52. data/lib/sequel/model/associations.rb +17 -5
  53. data/lib/sequel/model/base.rb +115 -62
  54. data/lib/sequel/model/dataset_module.rb +10 -3
  55. data/lib/sequel/model/exceptions.rb +7 -5
  56. data/lib/sequel/plugins/association_pks.rb +13 -1
  57. data/lib/sequel/plugins/association_proxies.rb +8 -1
  58. data/lib/sequel/plugins/before_after_save.rb +1 -0
  59. data/lib/sequel/plugins/class_table_inheritance.rb +7 -3
  60. data/lib/sequel/plugins/columns_updated.rb +42 -0
  61. data/lib/sequel/plugins/composition.rb +10 -5
  62. data/lib/sequel/plugins/error_splitter.rb +1 -1
  63. data/lib/sequel/plugins/hook_class_methods.rb +39 -5
  64. data/lib/sequel/plugins/instance_hooks.rb +58 -5
  65. data/lib/sequel/plugins/lazy_attributes.rb +10 -5
  66. data/lib/sequel/plugins/nested_attributes.rb +10 -5
  67. data/lib/sequel/plugins/prepared_statements.rb +7 -0
  68. data/lib/sequel/plugins/prepared_statements_associations.rb +2 -0
  69. data/lib/sequel/plugins/prepared_statements_with_pk.rb +2 -0
  70. data/lib/sequel/plugins/schema.rb +2 -0
  71. data/lib/sequel/plugins/scissors.rb +2 -0
  72. data/lib/sequel/plugins/serialization.rb +10 -5
  73. data/lib/sequel/plugins/split_values.rb +5 -1
  74. data/lib/sequel/plugins/static_cache.rb +2 -2
  75. data/lib/sequel/plugins/tactical_eager_loading.rb +1 -1
  76. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  77. data/lib/sequel/plugins/validation_helpers.rb +1 -0
  78. data/lib/sequel/sql.rb +1 -1
  79. data/lib/sequel/version.rb +1 -1
  80. data/spec/adapters/mssql_spec.rb +31 -0
  81. data/spec/adapters/mysql_spec.rb +20 -2
  82. data/spec/adapters/postgres_spec.rb +43 -12
  83. data/spec/adapters/spec_helper.rb +5 -8
  84. data/spec/core/database_spec.rb +47 -12
  85. data/spec/core/dataset_mutation_spec.rb +22 -22
  86. data/spec/core/dataset_spec.rb +88 -20
  87. data/spec/core/deprecated_spec.rb +1 -1
  88. data/spec/core/expression_filters_spec.rb +1 -1
  89. data/spec/core/mock_adapter_spec.rb +0 -3
  90. data/spec/core/placeholder_literalizer_spec.rb +1 -1
  91. data/spec/core/schema_spec.rb +8 -1
  92. data/spec/core/spec_helper.rb +6 -1
  93. data/spec/core_extensions_spec.rb +4 -0
  94. data/spec/deprecation_helper.rb +17 -0
  95. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +314 -0
  96. data/spec/extensions/association_pks_spec.rb +61 -13
  97. data/spec/extensions/association_proxies_spec.rb +3 -3
  98. data/spec/extensions/class_table_inheritance_spec.rb +39 -0
  99. data/spec/extensions/columns_updated_spec.rb +35 -0
  100. data/spec/extensions/composition_spec.rb +6 -1
  101. data/spec/extensions/hook_class_methods_spec.rb +114 -26
  102. data/spec/extensions/identifier_mangling_spec.rb +107 -73
  103. data/spec/extensions/instance_hooks_spec.rb +78 -14
  104. data/spec/extensions/lazy_attributes_spec.rb +8 -2
  105. data/spec/extensions/many_through_many_spec.rb +2 -2
  106. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  107. data/spec/extensions/nested_attributes_spec.rb +8 -2
  108. data/spec/extensions/pg_array_spec.rb +18 -4
  109. data/spec/extensions/prepared_statements_associations_spec.rb +48 -39
  110. data/spec/extensions/prepared_statements_with_pk_spec.rb +13 -11
  111. data/spec/extensions/query_spec.rb +1 -1
  112. data/spec/extensions/schema_dumper_spec.rb +34 -6
  113. data/spec/extensions/schema_spec.rb +13 -7
  114. data/spec/extensions/scissors_spec.rb +3 -1
  115. data/spec/extensions/sequel_3_dataset_methods_spec.rb +4 -4
  116. data/spec/extensions/serialization_spec.rb +7 -1
  117. data/spec/extensions/set_overrides_spec.rb +2 -2
  118. data/spec/extensions/shared_caching_spec.rb +19 -15
  119. data/spec/extensions/spec_helper.rb +7 -3
  120. data/spec/extensions/split_values_spec.rb +45 -10
  121. data/spec/extensions/string_agg_spec.rb +2 -2
  122. data/spec/extensions/subset_conditions_spec.rb +3 -3
  123. data/spec/extensions/tactical_eager_loading_spec.rb +1 -1
  124. data/spec/extensions/validation_contexts_spec.rb +31 -0
  125. data/spec/guards_helper.rb +2 -0
  126. data/spec/integration/associations_test.rb +22 -20
  127. data/spec/integration/dataset_test.rb +25 -2
  128. data/spec/integration/model_test.rb +1 -1
  129. data/spec/integration/plugin_test.rb +11 -16
  130. data/spec/integration/prepared_statement_test.rb +40 -32
  131. data/spec/integration/spec_helper.rb +5 -8
  132. data/spec/model/association_reflection_spec.rb +4 -0
  133. data/spec/model/associations_spec.rb +37 -10
  134. data/spec/model/base_spec.rb +6 -0
  135. data/spec/model/hooks_spec.rb +56 -35
  136. data/spec/model/model_spec.rb +21 -5
  137. data/spec/model/record_spec.rb +14 -11
  138. data/spec/model/spec_helper.rb +7 -1
  139. data/spec/sequel_warning.rb +11 -0
  140. metadata +13 -3
@@ -9,48 +9,72 @@ module Sequel
9
9
  attr_accessor :wrapped_exception
10
10
  end
11
11
 
12
+ (
12
13
  # Error raised when the adapter requested doesn't exist or can't be loaded.
13
14
  AdapterNotFound = Class.new(Error)
15
+ ).name
14
16
 
17
+ (
15
18
  # Generic error raised by the database adapters, indicating a
16
19
  # problem originating from the database server. Usually raised
17
20
  # because incorrect SQL syntax is used.
18
21
  DatabaseError = Class.new(Error)
22
+ ).name
19
23
 
24
+ (
20
25
  # Error raised when the Sequel is unable to connect to the database with the
21
26
  # connection parameters it was given.
22
27
  DatabaseConnectionError = Class.new(DatabaseError)
28
+ ).name
23
29
 
30
+ (
24
31
  # Error raised by adapters when they determine that the connection
25
32
  # to the database has been lost. Instructs the connection pool code to
26
33
  # remove that connection from the pool so that other connections can be acquired
27
34
  # automatically.
28
35
  DatabaseDisconnectError = Class.new(DatabaseError)
36
+ ).name
29
37
 
38
+ (
30
39
  # Generic error raised when Sequel determines a database constraint has been violated.
31
40
  ConstraintViolation = Class.new(DatabaseError)
41
+ ).name
32
42
 
43
+ (
33
44
  # Error raised when Sequel determines a database check constraint has been violated.
34
45
  CheckConstraintViolation = Class.new(ConstraintViolation)
46
+ ).name
35
47
 
48
+ (
36
49
  # Error raised when Sequel determines a database foreign key constraint has been violated.
37
50
  ForeignKeyConstraintViolation = Class.new(ConstraintViolation)
51
+ ).name
38
52
 
53
+ (
39
54
  # Error raised when Sequel determines a database NOT NULL constraint has been violated.
40
55
  NotNullConstraintViolation = Class.new(ConstraintViolation)
56
+ ).name
41
57
 
58
+ (
42
59
  # Error raised when Sequel determines a database unique constraint has been violated.
43
60
  UniqueConstraintViolation = Class.new(ConstraintViolation)
61
+ ).name
44
62
 
63
+ (
45
64
  # Error raised when Sequel determines a serialization failure/deadlock in the database.
46
65
  SerializationFailure = Class.new(DatabaseError)
66
+ ).name
47
67
 
68
+ (
48
69
  # Error raised on an invalid operation, such as trying to update or delete
49
70
  # a joined or grouped dataset.
50
71
  InvalidOperation = Class.new(Error)
72
+ ).name
51
73
 
74
+ (
52
75
  # Error raised when attempting an invalid type conversion.
53
76
  InvalidValue = Class.new(Error)
77
+ ).name
54
78
 
55
79
  # Error raised when the user requests a record via the first! or similar
56
80
  # method, and the dataset does not yield any rows.
@@ -69,27 +93,32 @@ module Sequel
69
93
  end
70
94
  end
71
95
 
96
+ (
72
97
  # Error raised when the connection pool cannot acquire a database connection
73
98
  # before the timeout.
74
99
  PoolTimeout = Class.new(Error)
100
+ ).name
75
101
 
102
+ (
76
103
  # Error that you should raise to signal a rollback of the current transaction.
77
104
  # The transaction block will catch this exception, rollback the current transaction,
78
105
  # and won't reraise it (unless a reraise is requested).
79
106
  Rollback = Class.new(Error)
107
+ ).name
80
108
 
81
- # Error raised when unbinding a dataset that has multiple different values
82
- # for a given variable.
83
- UnbindDuplicate = Class.new(Error)
84
-
85
- # Call name on each class to set the name for the class, so it gets cached.
86
- constants.map{|c| const_get(c)}.each do |c|
87
- Class === c && c.name
88
- end
109
+ # SEQUEL5: Remove
110
+ (UnbindDuplicate = Class.new(Error)).name
89
111
 
90
112
  Error::AdapterNotFound = AdapterNotFound
91
113
  Error::InvalidOperation = InvalidOperation
92
114
  Error::InvalidValue = InvalidValue
93
115
  Error::PoolTimeoutError = PoolTimeout
94
116
  Error::Rollback = Rollback
117
+
118
+ Sequel::Deprecation.deprecate_constant(self, :UnbindDuplicate)
119
+ Sequel::Deprecation.deprecate_constant(Error, :AdapterNotFound)
120
+ Sequel::Deprecation.deprecate_constant(Error, :InvalidOperation)
121
+ Sequel::Deprecation.deprecate_constant(Error, :InvalidValue)
122
+ Sequel::Deprecation.deprecate_constant(Error, :PoolTimeoutError)
123
+ Sequel::Deprecation.deprecate_constant(Error, :Rollback)
95
124
  end
@@ -0,0 +1,117 @@
1
+ # frozen-string-literal: true
2
+
3
+ #
4
+ module Sequel
5
+ module DeprecatedIdentifierMangling
6
+ module DatabaseMethods
7
+ def self.extended(db)
8
+ db.instance_exec do
9
+ @identifier_input_method = nil
10
+ @identifier_output_method = nil
11
+ @quote_identifiers = nil
12
+ reset_identifier_mangling
13
+ extend_datasets(DatasetMethods)
14
+ end
15
+ end
16
+
17
+ attr_reader :identifier_input_method
18
+ attr_reader :identifier_output_method
19
+
20
+ def identifier_input_method=(v)
21
+ Sequel::Deprecation.deprecate("Database#identifier_input_method=", "Explicitly load the identifier_mangling extension if you would like to use this")
22
+ reset_default_dataset
23
+ @identifier_input_method = v
24
+ end
25
+
26
+ def identifier_output_method=(v)
27
+ Sequel::Deprecation.deprecate("Database#identifier_output_method=", "Explicitly load the identifier_mangling extension if you would like to use this")
28
+ reset_default_dataset
29
+ @identifier_output_method = v
30
+ end
31
+
32
+ def quote_identifiers=(v)
33
+ Sequel::Deprecation.deprecate("Database#quote_identifiers=", "Explicitly load the identifier_mangling extension if you would like to use this")
34
+ reset_default_dataset
35
+ @quote_identifiers = v
36
+ end
37
+
38
+ def quote_identifiers?
39
+ @quote_identifiers
40
+ end
41
+
42
+ private
43
+
44
+ def _metadata_dataset
45
+ super.clone(:identifier_input_method=>identifier_input_method_default, :identifier_output_method=>identifier_output_method_default, :skip_symbol_cache=>true)
46
+ end
47
+
48
+ def identifier_input_method_default
49
+ return super if defined?(super)
50
+ :upcase if folds_unquoted_identifiers_to_uppercase?
51
+ end
52
+
53
+ def identifier_output_method_default
54
+ return super if defined?(super)
55
+ :downcase if folds_unquoted_identifiers_to_uppercase?
56
+ end
57
+
58
+ def reset_identifier_mangling
59
+ @quote_identifiers = @opts.fetch(:quote_identifiers){(qi = Database.quote_identifiers).nil? ? quote_identifiers_default : qi}
60
+ @identifier_input_method = @opts.fetch(:identifier_input_method){(iim = Database.identifier_input_method).nil? ? identifier_input_method_default : (iim if iim)}
61
+ @identifier_output_method = @opts.fetch(:identifier_output_method){(iom = Database.identifier_output_method).nil? ? identifier_output_method_default : (iom if iom)}
62
+ reset_default_dataset
63
+ end
64
+ end
65
+
66
+ module DatasetMethods
67
+ def identifier_input_method
68
+ @opts.fetch(:identifier_input_method, db.identifier_input_method)
69
+ end
70
+
71
+ def identifier_input_method=(v)
72
+ Sequel::Deprecation.deprecate("Dataset#identifier_input_method=", "Explicitly load the identifier_mangling extension if you would like to use this")
73
+ raise_if_frozen!("identifier_input_method=")
74
+ skip_symbol_cache!
75
+ @opts[:identifier_input_method] = v
76
+ end
77
+
78
+ def identifier_output_method
79
+ @opts.fetch(:identifier_output_method, db.identifier_output_method)
80
+ end
81
+
82
+ def identifier_output_method=(v)
83
+ Sequel::Deprecation.deprecate("Dataset#identifier_output_method=", "Explicitly load the identifier_mangling extension if you would like to use this")
84
+ raise_if_frozen!("identifier_output_method=")
85
+ @opts[:identifier_output_method] = v
86
+ end
87
+
88
+ def quote_identifiers?
89
+ @opts.fetch(:quote_identifiers, db.quote_identifiers?)
90
+ end
91
+
92
+ def with_identifier_input_method(meth)
93
+ Sequel::Deprecation.deprecate("Dataset#with_identifier_input_method", "Explicitly load the identifier_mangling extension if you would like to use this")
94
+ clone(:identifier_input_method=>meth, :skip_symbol_cache=>true)
95
+ end
96
+
97
+ def with_identifier_output_method(meth)
98
+ Sequel::Deprecation.deprecate("Dataset#with_identifier_output_method", "Explicitly load the identifier_mangling extension if you would like to use this")
99
+ clone(:identifier_output_method=>meth)
100
+ end
101
+
102
+ private
103
+
104
+ def input_identifier(v)
105
+ (i = identifier_input_method) ? v.to_s.send(i) : v.to_s
106
+ end
107
+
108
+ def output_identifier(v)
109
+ v = 'untitled' if v == ''
110
+ (i = identifier_output_method) ? v.to_s.send(i).to_sym : v.to_sym
111
+ end
112
+ end
113
+ end
114
+
115
+ Database.register_extension(:_deprecated_identifier_mangling, DeprecatedIdentifierMangling::DatabaseMethods)
116
+ end
117
+
@@ -92,6 +92,7 @@ module Sequel
92
92
  args << "#{value} #{sql_unit}"
93
93
  end
94
94
  return function_sql_append(sql, Sequel.function(:datetime, *args))
95
+ # SEQUEL5: Remove cubrid
95
96
  when :mysql, :hsqldb, :cubrid
96
97
  if db_type == :hsqldb
97
98
  # HSQLDB requires 2.2.9+ for the DATE_ADD function
@@ -127,6 +127,7 @@ module Sequel
127
127
  # Reset the identifier mangling options. Overrides any already set on
128
128
  # the instance. Only for internal use by shared adapters.
129
129
  def reset_identifier_mangling
130
+ # SEQUEL5: Stop checking Database.*
130
131
  @quote_identifiers = @opts.fetch(:quote_identifiers){(qi = Database.quote_identifiers).nil? ? quote_identifiers_default : qi}
131
132
  @identifier_input_method = @opts.fetch(:identifier_input_method){(iim = Database.identifier_input_method).nil? ? identifier_input_method_default : (iim if iim)}
132
133
  @identifier_output_method = @opts.fetch(:identifier_output_method){(iom = Database.identifier_output_method).nil? ? identifier_output_method_default : (iom if iom)}
@@ -143,7 +144,7 @@ module Sequel
143
144
 
144
145
  # Set the method to call on identifiers going into the database for this dataset
145
146
  def identifier_input_method=(v)
146
- raise_if_frozen!
147
+ raise_if_frozen!("identifier_input_method=")
147
148
  skip_symbol_cache!
148
149
  @opts[:identifier_input_method] = v
149
150
  end
@@ -156,7 +157,7 @@ module Sequel
156
157
 
157
158
  # Set the method to call on identifiers coming the database for this dataset
158
159
  def identifier_output_method=(v)
159
- raise_if_frozen!
160
+ raise_if_frozen!("identifier_output_method=")
160
161
  @opts[:identifier_output_method] = v
161
162
  end
162
163
 
@@ -141,7 +141,7 @@ module Sequel
141
141
  module DatabaseMethods
142
142
  def self.extended(db)
143
143
  db.instance_eval do
144
- add_named_conversion_proc(:hstore)
144
+ add_named_conversion_proc(:hstore, &HStore.method(:parse))
145
145
  @schema_type_classes[:hstore] = HStore
146
146
  end
147
147
  end
@@ -306,10 +306,6 @@ module Sequel
306
306
  k.to_s.gsub(ESCAPE_RE, ESCAPE_REPLACE)
307
307
  end
308
308
  end
309
-
310
- PG_NAMED_TYPES = {} unless defined?(PG_NAMED_TYPES)
311
- # Associate the named types by default.
312
- PG_NAMED_TYPES[:hstore] = HStore.method(:parse)
313
309
  end
314
310
 
315
311
  module SQL::Builders
@@ -170,6 +170,8 @@ END_MIG
170
170
  [:table, :key, :on_delete, :on_update, :deferrable].each{|f| type_hash[f] = schema[f] if schema[f]}
171
171
  if type_hash == {:type=>Integer} || type_hash == {:type=>"integer"}
172
172
  type_hash.delete(:type)
173
+ elsif options[:same_db] && type_hash == {:type=>type_literal_generic_bignum_symbol(type_hash).to_s}
174
+ type_hash[:type] = :Bignum
173
175
  end
174
176
 
175
177
  unless gen.columns.empty?
@@ -243,7 +245,7 @@ END_MIG
243
245
  # Return a Schema::Generator object that will recreate the
244
246
  # table's schema. Takes the same options as dump_schema_migration.
245
247
  def dump_table_generator(table, options=OPTS)
246
- s = schema(table).dup
248
+ s = schema(table, options).dup
247
249
  pks = s.find_all{|x| x.last[:primary_key] == true}.map(&:first)
248
250
  options = options.merge(:single_pk=>true) if pks.length == 1
249
251
  m = method(:recreate_column)
@@ -29,14 +29,14 @@ module Sequel
29
29
  COMMA = Dataset::COMMA
30
30
  # Change the database for this dataset.
31
31
  def db=(v)
32
- raise_if_frozen!
32
+ raise_if_frozen!("db=")
33
33
  @db = v
34
34
  @cache = {}
35
35
  end
36
36
 
37
37
  # Change the options for this dataset.
38
38
  def opts=(v)
39
- raise_if_frozen!
39
+ raise_if_frozen!("opts=")
40
40
  @opts = v
41
41
  @cache = {}
42
42
  end
@@ -104,6 +104,7 @@ module Sequel
104
104
  f = f.distinct
105
105
  end
106
106
  literal_append(sql, f)
107
+ # SEQUEL5: Remove cubrid
107
108
  when :mysql, :hsqldb, :cubrid, :h2
108
109
  sql << "GROUP_CONCAT("
109
110
  if distinct
data/lib/sequel/model.rb CHANGED
@@ -5,11 +5,13 @@ require 'sequel/core'
5
5
  module Sequel
6
6
  # Delegate to Sequel::Model, only for backwards compatibility.
7
7
  def self.cache_anonymous_models
8
+ Sequel::Deprecation.deprecate("Sequel.cache_anonymous_models", "Use Sequel::Model.cache_anonymous_models")
8
9
  Model.cache_anonymous_models
9
10
  end
10
11
 
11
12
  # Delegate to Sequel::Model, only for backwards compatibility.
12
13
  def self.cache_anonymous_models=(v)
14
+ Sequel::Deprecation.deprecate("Sequel.cache_anonymous_models=", "Use Sequel::Model.cache_anonymous_models=")
13
15
  Model.cache_anonymous_models = v
14
16
  end
15
17
 
@@ -29,13 +31,6 @@ module Sequel
29
31
  class Model
30
32
  OPTS = Sequel::OPTS
31
33
 
32
- # Map that stores model classes created with <tt>Sequel::Model()</tt>, to allow the reopening
33
- # of classes when dealing with code reloading.
34
- ANONYMOUS_MODEL_CLASSES = @Model_cache = {}
35
-
36
- # Mutex protecting access to ANONYMOUS_MODEL_CLASSES
37
- ANONYMOUS_MODEL_CLASSES_MUTEX = @Model_mutex = Mutex.new
38
-
39
34
  # Class methods added to model that call the method of the same name on the dataset
40
35
  DATASET_METHODS = (Dataset::ACTION_METHODS + Dataset::QUERY_METHODS + [:each_server, :where_all, :where_each, :where_single_value]) -
41
36
  [:and, :or, :[], :columns, :columns!, :delete, :update, :add_graph_aliases, :first, :first!]
@@ -51,8 +46,8 @@ module Sequel
51
46
 
52
47
  # Hooks that are called after an action. When overriding these, it is recommended to call
53
48
  # +super+ on the first line of your method, so later hooks are called after earlier hooks.
54
- AFTER_HOOKS = [:after_create, :after_update, :after_save, :after_destroy,
55
- :after_validation, :after_commit, :after_rollback, :after_destroy_commit, :after_destroy_rollback]
49
+ AFTER_HOOKS = [:after_create, :after_update, :after_save, :after_destroy, :after_validation,
50
+ :after_commit, :after_rollback, :after_destroy_commit, :after_destroy_rollback] # SEQUEL5: Remove commit/rollback hooks
56
51
 
57
52
  # Hooks that are called around an action. If overridden, these methods must call super
58
53
  # exactly once if the behavior they wrap is desired. The can be used to rescue exceptions
@@ -78,7 +73,7 @@ module Sequel
78
73
  :@use_after_commit_rollback=>nil, :@fast_pk_lookup_sql=>nil,
79
74
  :@fast_instance_delete_sql=>nil, :@finders=>:dup, :@finder_loaders=>:dup,
80
75
  :@db=>nil, :@default_set_fields_options=>:dup, :@require_valid_table=>nil,
81
- :@cache_anonymous_models=>nil, :@Model_mutex=>nil}
76
+ :@cache_anonymous_models=>nil, :@dataset_module_class=>nil}
82
77
 
83
78
  # Regular expression that determines if a method name is normal in the sense that
84
79
  # it could be used literally in ruby code without using send. Used to
@@ -129,5 +124,23 @@ module Sequel
129
124
  RESTRICTED_SETTER_METHODS = instance_methods.map(&:to_s).grep(SETTER_METHOD_REGEXP)
130
125
 
131
126
  def_Model(::Sequel)
127
+
128
+ # SEQUEL5: Remove
129
+ class DeprecatedColumnsUpdated # :nodoc:
130
+ def initialize(columns_updated)
131
+ @columns_updated = columns_updated
132
+ end
133
+
134
+ def method_missing(*args, &block)
135
+ Sequel::Deprecation.deprecate("Accessing @columns_updated directly", "Use the columns_updated plugin and switch to the columns_updated method")
136
+ @columns_updated.send(*args, &block)
137
+ end
138
+ end
139
+
140
+ ANONYMOUS_MODEL_CLASSES = @Model_cache # :nodoc:
141
+ Sequel::Deprecation.deprecate_constant(self, :ANONYMOUS_MODEL_CLASSES)
142
+
143
+ ANONYMOUS_MODEL_CLASSES_MUTEX = Mutex.new # :nodoc:
144
+ Sequel::Deprecation.deprecate_constant(self, :ANONYMOUS_MODEL_CLASSES_MUTEX)
132
145
  end
133
146
  end
@@ -15,9 +15,15 @@ module Sequel
15
15
  @autoreloading_associations = {}
16
16
  @cache_associations = true
17
17
  @default_association_options = {}
18
+ @dataset_module_class = DatasetModule
18
19
  end
19
20
  end
20
21
 
22
+ # The dataset module to use for classes using the associations plugin.
23
+ class DatasetModule < Model::DatasetModule
24
+ def_dataset_caching_method(self, :eager)
25
+ end
26
+
21
27
  # AssociationReflection is a Hash subclass that keeps information on Sequel::Model associations. It
22
28
  # provides methods to reduce internal code duplication. It should not
23
29
  # be instantiated by the user.
@@ -83,7 +89,7 @@ module Sequel
83
89
  end
84
90
  ds = ds.order(*self[:order]) if self[:order]
85
91
  ds = ds.limit(*self[:limit]) if self[:limit]
86
- ds = ds.limit(1) if limit_to_single_row?
92
+ ds = ds.limit(1).skip_limit_check if limit_to_single_row?
87
93
  ds = ds.eager(self[:eager]) if self[:eager]
88
94
  ds = ds.distinct if self[:distinct]
89
95
  ds
@@ -426,7 +432,7 @@ module Sequel
426
432
  if use_placeholder_loader?
427
433
  cached_fetch(:placeholder_loader) do
428
434
  Sequel::Dataset::PlaceholderLiteralizer.loader(associated_dataset) do |pl, ds|
429
- ds.where(*predicate_keys.map{|k| SQL::BooleanExpression.new(:'=', k, pl.arg)})
435
+ ds.where(Sequel.&(*predicate_keys.map{|k| SQL::BooleanExpression.new(:'=', k, pl.arg)}))
430
436
  end
431
437
  end
432
438
  end
@@ -451,7 +457,7 @@ module Sequel
451
457
  when Symbol, SQL::Identifier
452
458
  SQL::QualifiedIdentifier.new(table, k)
453
459
  else
454
- Sequel::Qualifier.new(self[:model].dataset, table).transform(k)
460
+ Sequel::Qualifier.new(table).transform(k)
455
461
  end
456
462
  end
457
463
  end
@@ -1891,7 +1897,10 @@ module Sequel
1891
1897
 
1892
1898
  # Adds the association method to the association methods module.
1893
1899
  def def_association_method(opts)
1894
- association_module_def(opts.association_method, opts){|*dynamic_opts, &block| load_associated_objects(opts, dynamic_opts[0], &block)}
1900
+ association_module_def(opts.association_method, opts) do |*dynamic_opts, &block|
1901
+ Sequel::Deprecation.deprecate("Passing multiple arguments to ##{opts.association_method}", "Additional arguments are currently ignored.") if dynamic_opts.length > 1
1902
+ load_associated_objects(opts, dynamic_opts.length == 0 ? OPTS : dynamic_opts[0], &block)
1903
+ end
1895
1904
  end
1896
1905
 
1897
1906
  # Define all of the association instance methods for this association.
@@ -2159,7 +2168,7 @@ module Sequel
2159
2168
  cks.zip(cpks).each{|k, pk| o.set_column_value(:"#{k}=", get_column_value(pk))}
2160
2169
  end
2161
2170
  checked_transaction do
2162
- up_ds.update(ck_nil_hash)
2171
+ up_ds.skip_limit_check.update(ck_nil_hash)
2163
2172
  o.save(save_opts) || raise(Sequel::Error, "invalid associated object, cannot save") if o
2164
2173
  end
2165
2174
  end
@@ -2384,13 +2393,16 @@ module Sequel
2384
2393
  def load_association_objects_options(dynamic_opts, &block)
2385
2394
  dynamic_opts = case dynamic_opts
2386
2395
  when true, false, nil
2396
+ Sequel::Deprecation.deprecate("Passing #{dynamic_opts.inspect} an argument to an association loading method", "Pass {:reload=>#{dynamic_opts.inspect}} instead")
2387
2397
  {:reload=>dynamic_opts}
2388
2398
  when Hash
2389
2399
  Hash[dynamic_opts]
2390
2400
  else
2391
2401
  if dynamic_opts.respond_to?(:call)
2402
+ Sequel::Deprecation.deprecate("Passing callbable argument #{dynamic_opts.inspect} to an association loading method", "Pass a block to the method to use a callback")
2392
2403
  {:callback=>dynamic_opts}
2393
2404
  else
2405
+ Sequel::Deprecation.deprecate("Passing #{dynamic_opts.inspect} an argument to an association loading method", "Pass {:reload=>true} if you would like to reload the association")
2394
2406
  {:reload=>true}
2395
2407
  end
2396
2408
  end