sequel 4.44.0 → 4.45.0

Sign up to get free protection for your applications and to get access to all the features.
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