sequel 3.48.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +114 -0
  3. data/Rakefile +10 -7
  4. data/doc/association_basics.rdoc +25 -23
  5. data/doc/code_order.rdoc +7 -0
  6. data/doc/core_extensions.rdoc +0 -10
  7. data/doc/object_model.rdoc +4 -1
  8. data/doc/querying.rdoc +3 -3
  9. data/doc/release_notes/4.0.0.txt +262 -0
  10. data/doc/security.rdoc +0 -28
  11. data/doc/testing.rdoc +8 -14
  12. data/lib/sequel/adapters/ado.rb +7 -11
  13. data/lib/sequel/adapters/ado/access.rb +8 -8
  14. data/lib/sequel/adapters/ado/mssql.rb +4 -4
  15. data/lib/sequel/adapters/amalgalite.rb +6 -6
  16. data/lib/sequel/adapters/cubrid.rb +7 -7
  17. data/lib/sequel/adapters/db2.rb +5 -9
  18. data/lib/sequel/adapters/dbi.rb +2 -6
  19. data/lib/sequel/adapters/do.rb +4 -4
  20. data/lib/sequel/adapters/firebird.rb +4 -4
  21. data/lib/sequel/adapters/ibmdb.rb +8 -8
  22. data/lib/sequel/adapters/informix.rb +2 -10
  23. data/lib/sequel/adapters/jdbc.rb +17 -17
  24. data/lib/sequel/adapters/jdbc/as400.rb +2 -2
  25. data/lib/sequel/adapters/jdbc/cubrid.rb +1 -1
  26. data/lib/sequel/adapters/jdbc/db2.rb +1 -1
  27. data/lib/sequel/adapters/jdbc/derby.rb +1 -1
  28. data/lib/sequel/adapters/jdbc/h2.rb +2 -2
  29. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -1
  30. data/lib/sequel/adapters/jdbc/informix.rb +1 -1
  31. data/lib/sequel/adapters/jdbc/mssql.rb +2 -2
  32. data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
  33. data/lib/sequel/adapters/jdbc/oracle.rb +5 -1
  34. data/lib/sequel/adapters/jdbc/postgresql.rb +3 -3
  35. data/lib/sequel/adapters/jdbc/sqlite.rb +3 -3
  36. data/lib/sequel/adapters/jdbc/transactions.rb +3 -3
  37. data/lib/sequel/adapters/mock.rb +7 -7
  38. data/lib/sequel/adapters/mysql.rb +3 -3
  39. data/lib/sequel/adapters/mysql2.rb +4 -4
  40. data/lib/sequel/adapters/odbc.rb +2 -6
  41. data/lib/sequel/adapters/odbc/mssql.rb +1 -1
  42. data/lib/sequel/adapters/openbase.rb +1 -5
  43. data/lib/sequel/adapters/oracle.rb +13 -17
  44. data/lib/sequel/adapters/postgres.rb +20 -25
  45. data/lib/sequel/adapters/shared/cubrid.rb +3 -3
  46. data/lib/sequel/adapters/shared/db2.rb +2 -2
  47. data/lib/sequel/adapters/shared/firebird.rb +7 -7
  48. data/lib/sequel/adapters/shared/mssql.rb +9 -9
  49. data/lib/sequel/adapters/shared/mysql.rb +29 -13
  50. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +7 -7
  51. data/lib/sequel/adapters/shared/oracle.rb +22 -13
  52. data/lib/sequel/adapters/shared/postgres.rb +61 -46
  53. data/lib/sequel/adapters/shared/sqlite.rb +9 -9
  54. data/lib/sequel/adapters/sqlite.rb +17 -11
  55. data/lib/sequel/adapters/swift.rb +3 -3
  56. data/lib/sequel/adapters/swift/mysql.rb +1 -1
  57. data/lib/sequel/adapters/swift/sqlite.rb +1 -1
  58. data/lib/sequel/adapters/tinytds.rb +8 -8
  59. data/lib/sequel/ast_transformer.rb +3 -1
  60. data/lib/sequel/connection_pool.rb +4 -2
  61. data/lib/sequel/connection_pool/sharded_single.rb +2 -2
  62. data/lib/sequel/connection_pool/sharded_threaded.rb +5 -5
  63. data/lib/sequel/connection_pool/threaded.rb +7 -7
  64. data/lib/sequel/core.rb +4 -67
  65. data/lib/sequel/database.rb +1 -0
  66. data/lib/sequel/database/connecting.rb +2 -8
  67. data/lib/sequel/database/dataset.rb +2 -7
  68. data/lib/sequel/database/dataset_defaults.rb +0 -18
  69. data/lib/sequel/database/features.rb +4 -4
  70. data/lib/sequel/database/misc.rb +6 -8
  71. data/lib/sequel/database/query.rb +5 -61
  72. data/lib/sequel/database/schema_generator.rb +22 -20
  73. data/lib/sequel/database/schema_methods.rb +48 -20
  74. data/lib/sequel/database/transactions.rb +7 -17
  75. data/lib/sequel/dataset.rb +2 -0
  76. data/lib/sequel/dataset/actions.rb +23 -91
  77. data/lib/sequel/dataset/features.rb +1 -4
  78. data/lib/sequel/dataset/graph.rb +3 -47
  79. data/lib/sequel/dataset/misc.rb +4 -33
  80. data/lib/sequel/dataset/prepared_statements.rb +3 -1
  81. data/lib/sequel/dataset/query.rb +116 -240
  82. data/lib/sequel/dataset/sql.rb +19 -97
  83. data/lib/sequel/deprecated.rb +0 -16
  84. data/lib/sequel/exceptions.rb +0 -3
  85. data/lib/sequel/extensions/_pretty_table.rb +1 -1
  86. data/lib/sequel/extensions/columns_introspection.rb +1 -12
  87. data/lib/sequel/extensions/constraint_validations.rb +3 -3
  88. data/lib/sequel/extensions/core_extensions.rb +0 -9
  89. data/lib/sequel/extensions/date_arithmetic.rb +1 -2
  90. data/lib/sequel/extensions/graph_each.rb +11 -0
  91. data/lib/sequel/extensions/migration.rb +5 -5
  92. data/lib/sequel/extensions/null_dataset.rb +11 -13
  93. data/lib/sequel/extensions/pagination.rb +3 -6
  94. data/lib/sequel/extensions/pg_array.rb +6 -4
  95. data/lib/sequel/extensions/pg_array_ops.rb +35 -1
  96. data/lib/sequel/extensions/pg_json.rb +12 -2
  97. data/lib/sequel/extensions/pg_json_ops.rb +266 -0
  98. data/lib/sequel/extensions/pg_range.rb +2 -2
  99. data/lib/sequel/extensions/pg_range_ops.rb +0 -8
  100. data/lib/sequel/extensions/pg_row.rb +2 -2
  101. data/lib/sequel/extensions/pretty_table.rb +0 -4
  102. data/lib/sequel/extensions/query.rb +3 -8
  103. data/lib/sequel/extensions/schema_caching.rb +0 -7
  104. data/lib/sequel/extensions/schema_dumper.rb +10 -17
  105. data/lib/sequel/extensions/select_remove.rb +0 -4
  106. data/lib/sequel/extensions/set_overrides.rb +28 -0
  107. data/lib/sequel/extensions/to_dot.rb +6 -10
  108. data/lib/sequel/model.rb +6 -7
  109. data/lib/sequel/model/associations.rb +127 -182
  110. data/lib/sequel/model/base.rb +88 -211
  111. data/lib/sequel/model/errors.rb +0 -13
  112. data/lib/sequel/model/plugins.rb +2 -2
  113. data/lib/sequel/no_core_ext.rb +0 -1
  114. data/lib/sequel/plugins/after_initialize.rb +11 -17
  115. data/lib/sequel/plugins/association_autoreloading.rb +1 -47
  116. data/lib/sequel/plugins/association_dependencies.rb +2 -2
  117. data/lib/sequel/plugins/auto_validations.rb +2 -8
  118. data/lib/sequel/plugins/blacklist_security.rb +32 -2
  119. data/lib/sequel/plugins/caching.rb +1 -1
  120. data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
  121. data/lib/sequel/plugins/composition.rb +10 -8
  122. data/lib/sequel/plugins/constraint_validations.rb +2 -2
  123. data/lib/sequel/plugins/dataset_associations.rb +4 -0
  124. data/lib/sequel/plugins/defaults_setter.rb +8 -6
  125. data/lib/sequel/plugins/dirty.rb +6 -6
  126. data/lib/sequel/plugins/force_encoding.rb +13 -8
  127. data/lib/sequel/plugins/hook_class_methods.rb +1 -7
  128. data/lib/sequel/plugins/json_serializer.rb +13 -74
  129. data/lib/sequel/plugins/lazy_attributes.rb +2 -4
  130. data/lib/sequel/plugins/list.rb +1 -1
  131. data/lib/sequel/plugins/many_through_many.rb +4 -11
  132. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +1 -49
  133. data/lib/sequel/plugins/nested_attributes.rb +1 -1
  134. data/lib/sequel/plugins/optimistic_locking.rb +3 -5
  135. data/lib/sequel/plugins/pg_array_associations.rb +453 -0
  136. data/lib/sequel/plugins/pg_typecast_on_load.rb +23 -7
  137. data/lib/sequel/plugins/prepared_statements.rb +1 -1
  138. data/lib/sequel/plugins/prepared_statements_associations.rb +20 -14
  139. data/lib/sequel/plugins/prepared_statements_safe.rb +2 -2
  140. data/lib/sequel/plugins/rcte_tree.rb +1 -1
  141. data/lib/sequel/plugins/serialization.rb +5 -4
  142. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  143. data/lib/sequel/plugins/sharding.rb +7 -1
  144. data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
  145. data/lib/sequel/plugins/timestamps.rb +1 -1
  146. data/lib/sequel/plugins/touch.rb +2 -2
  147. data/lib/sequel/plugins/tree.rb +1 -1
  148. data/lib/sequel/plugins/typecast_on_load.rb +19 -4
  149. data/lib/sequel/plugins/validation_class_methods.rb +0 -30
  150. data/lib/sequel/plugins/validation_helpers.rb +13 -31
  151. data/lib/sequel/plugins/xml_serializer.rb +18 -57
  152. data/lib/sequel/sql.rb +20 -22
  153. data/lib/sequel/version.rb +2 -2
  154. data/spec/adapters/db2_spec.rb +14 -23
  155. data/spec/adapters/firebird_spec.rb +25 -29
  156. data/spec/adapters/informix_spec.rb +11 -14
  157. data/spec/adapters/mssql_spec.rb +71 -77
  158. data/spec/adapters/mysql_spec.rb +165 -172
  159. data/spec/adapters/oracle_spec.rb +36 -39
  160. data/spec/adapters/postgres_spec.rb +175 -100
  161. data/spec/adapters/spec_helper.rb +13 -11
  162. data/spec/adapters/sqlite_spec.rb +36 -44
  163. data/spec/core/connection_pool_spec.rb +2 -1
  164. data/spec/core/database_spec.rb +55 -55
  165. data/spec/core/dataset_spec.rb +45 -249
  166. data/spec/core/deprecated_spec.rb +0 -8
  167. data/spec/core/expression_filters_spec.rb +23 -5
  168. data/spec/core/object_graph_spec.rb +4 -66
  169. data/spec/core/schema_spec.rb +35 -12
  170. data/spec/core/spec_helper.rb +3 -2
  171. data/spec/core_extensions_spec.rb +17 -19
  172. data/spec/extensions/arbitrary_servers_spec.rb +2 -3
  173. data/spec/extensions/association_dependencies_spec.rb +14 -14
  174. data/spec/extensions/auto_validations_spec.rb +7 -0
  175. data/spec/extensions/blacklist_security_spec.rb +5 -5
  176. data/spec/extensions/blank_spec.rb +2 -0
  177. data/spec/extensions/class_table_inheritance_spec.rb +2 -2
  178. data/spec/extensions/columns_introspection_spec.rb +2 -29
  179. data/spec/extensions/composition_spec.rb +10 -17
  180. data/spec/extensions/core_refinements_spec.rb +5 -1
  181. data/spec/extensions/dataset_associations_spec.rb +18 -0
  182. data/spec/extensions/date_arithmetic_spec.rb +2 -2
  183. data/spec/extensions/defaults_setter_spec.rb +9 -9
  184. data/spec/extensions/dirty_spec.rb +0 -5
  185. data/spec/extensions/eval_inspect_spec.rb +2 -0
  186. data/spec/extensions/force_encoding_spec.rb +2 -18
  187. data/spec/extensions/hash_aliases_spec.rb +8 -0
  188. data/spec/extensions/hook_class_methods_spec.rb +39 -58
  189. data/spec/extensions/inflector_spec.rb +2 -0
  190. data/spec/extensions/instance_filters_spec.rb +8 -8
  191. data/spec/extensions/json_serializer_spec.rb +1 -41
  192. data/spec/extensions/list_spec.rb +1 -1
  193. data/spec/extensions/many_through_many_spec.rb +106 -109
  194. data/spec/extensions/migration_spec.rb +2 -0
  195. data/spec/extensions/named_timezones_spec.rb +1 -0
  196. data/spec/extensions/pg_array_associations_spec.rb +603 -0
  197. data/spec/extensions/pg_array_ops_spec.rb +25 -0
  198. data/spec/extensions/pg_array_spec.rb +9 -1
  199. data/spec/extensions/pg_hstore_ops_spec.rb +13 -0
  200. data/spec/extensions/pg_hstore_spec.rb +1 -0
  201. data/spec/extensions/pg_json_ops_spec.rb +131 -0
  202. data/spec/extensions/pg_json_spec.rb +10 -4
  203. data/spec/extensions/pg_range_ops_spec.rb +2 -5
  204. data/spec/extensions/pg_range_spec.rb +6 -2
  205. data/spec/extensions/pg_row_ops_spec.rb +2 -0
  206. data/spec/extensions/prepared_statements_associations_spec.rb +26 -5
  207. data/spec/extensions/rcte_tree_spec.rb +15 -15
  208. data/spec/extensions/schema_dumper_spec.rb +0 -1
  209. data/spec/extensions/schema_spec.rb +9 -9
  210. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  211. data/spec/extensions/serialization_spec.rb +18 -29
  212. data/spec/extensions/set_overrides_spec.rb +4 -0
  213. data/spec/extensions/{many_to_one_pk_lookup_spec.rb → shared_caching_spec.rb} +1 -4
  214. data/spec/extensions/single_table_inheritance_spec.rb +4 -4
  215. data/spec/extensions/spec_helper.rb +8 -9
  216. data/spec/extensions/sql_expr_spec.rb +2 -0
  217. data/spec/extensions/string_date_time_spec.rb +2 -0
  218. data/spec/extensions/string_stripper_spec.rb +2 -0
  219. data/spec/extensions/tactical_eager_loading_spec.rb +12 -12
  220. data/spec/extensions/thread_local_timezones_spec.rb +2 -0
  221. data/spec/extensions/timestamps_spec.rb +1 -1
  222. data/spec/extensions/to_dot_spec.rb +1 -1
  223. data/spec/extensions/touch_spec.rb +24 -24
  224. data/spec/extensions/tree_spec.rb +7 -7
  225. data/spec/extensions/typecast_on_load_spec.rb +8 -1
  226. data/spec/extensions/update_primary_key_spec.rb +10 -10
  227. data/spec/extensions/validation_class_methods_spec.rb +10 -39
  228. data/spec/extensions/validation_helpers_spec.rb +29 -47
  229. data/spec/extensions/xml_serializer_spec.rb +1 -23
  230. data/spec/integration/associations_test.rb +231 -40
  231. data/spec/integration/database_test.rb +1 -1
  232. data/spec/integration/dataset_test.rb +64 -64
  233. data/spec/integration/eager_loader_test.rb +28 -28
  234. data/spec/integration/migrator_test.rb +1 -1
  235. data/spec/integration/model_test.rb +2 -2
  236. data/spec/integration/plugin_test.rb +21 -21
  237. data/spec/integration/prepared_statement_test.rb +7 -7
  238. data/spec/integration/schema_test.rb +115 -110
  239. data/spec/integration/spec_helper.rb +17 -27
  240. data/spec/integration/timezone_test.rb +1 -1
  241. data/spec/integration/transaction_test.rb +10 -10
  242. data/spec/integration/type_test.rb +2 -2
  243. data/spec/model/association_reflection_spec.rb +2 -28
  244. data/spec/model/associations_spec.rb +239 -188
  245. data/spec/model/base_spec.rb +27 -68
  246. data/spec/model/dataset_methods_spec.rb +4 -4
  247. data/spec/model/eager_loading_spec.rb +160 -172
  248. data/spec/model/hooks_spec.rb +62 -79
  249. data/spec/model/model_spec.rb +36 -51
  250. data/spec/model/plugins_spec.rb +5 -19
  251. data/spec/model/record_spec.rb +125 -151
  252. data/spec/model/spec_helper.rb +8 -6
  253. data/spec/model/validations_spec.rb +4 -17
  254. data/spec/spec_config.rb +2 -10
  255. metadata +50 -56
  256. data/lib/sequel/deprecated_core_extensions.rb +0 -135
  257. data/lib/sequel/extensions/pg_auto_parameterize.rb +0 -185
  258. data/lib/sequel/extensions/pg_statement_cache.rb +0 -318
  259. data/lib/sequel/plugins/identity_map.rb +0 -260
  260. data/lib/sequel_core.rb +0 -2
  261. data/lib/sequel_model.rb +0 -2
  262. data/spec/extensions/association_autoreloading_spec.rb +0 -102
  263. data/spec/extensions/identity_map_spec.rb +0 -337
  264. data/spec/extensions/pg_auto_parameterize_spec.rb +0 -70
  265. data/spec/extensions/pg_statement_cache_spec.rb +0 -208
  266. data/spec/rcov.opts +0 -8
  267. data/spec/spec_config.rb.example +0 -10
@@ -8,19 +8,15 @@ end
8
8
 
9
9
  unless Object.const_defined?('Sequel')
10
10
  $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
11
- require 'sequel/no_core_ext'
11
+ require 'sequel'
12
12
  end
13
13
  begin
14
- require File.join(File.dirname(File.dirname(__FILE__)), 'spec_config.rb') unless defined?(INTEGRATION_DB)
14
+ require File.join(File.dirname(File.dirname(__FILE__)), 'spec_config.rb') unless defined?(DB)
15
15
  rescue LoadError
16
16
  end
17
17
  Sequel::Deprecation.backtrace_filter = lambda{|line, lineno| lineno < 4 || line =~ /_(spec|test)\.rb/}
18
18
 
19
- if ENV['SEQUEL_COLUMNS_INTROSPECTION']
20
- Sequel.extension :columns_introspection
21
- Sequel::Dataset.introspect_all_columns
22
- end
23
-
19
+ Sequel::Database.extension :columns_introspection if ENV['SEQUEL_COLUMNS_INTROSPECTION']
24
20
  Sequel::Model.use_transactions = false
25
21
  Sequel.cache_anonymous_models = false
26
22
 
@@ -41,22 +37,22 @@ def Sequel.guarded?(*checked)
41
37
  unless ENV['SEQUEL_NO_PENDING']
42
38
  checked.each do |c|
43
39
  case c
44
- when INTEGRATION_DB.database_type
40
+ when DB.database_type
45
41
  return c
46
42
  when Array
47
43
  case c.length
48
44
  when 1
49
- return c if c.first == INTEGRATION_DB.adapter_scheme
45
+ return c if c.first == DB.adapter_scheme
50
46
  when 2
51
47
  if c.first.is_a?(Proc)
52
- return c if c.last == INTEGRATION_DB.database_type && c.first.call(INTEGRATION_DB)
48
+ return c if c.last == DB.database_type && c.first.call(DB)
53
49
  elsif c.last.is_a?(Proc)
54
- return c if c.first == INTEGRATION_DB.adapter_scheme && c.last.call(INTEGRATION_DB)
50
+ return c if c.first == DB.adapter_scheme && c.last.call(DB)
55
51
  else
56
- return c if c.first == INTEGRATION_DB.adapter_scheme && c.last == INTEGRATION_DB.database_type
52
+ return c if c.first == DB.adapter_scheme && c.last == DB.database_type
57
53
  end
58
54
  when 3
59
- return c if c[0] == INTEGRATION_DB.adapter_scheme && c[1] == INTEGRATION_DB.database_type && c[2].call(INTEGRATION_DB)
55
+ return c if c[0] == DB.adapter_scheme && c[1] == DB.database_type && c[2].call(DB)
60
56
  end
61
57
  end
62
58
  end
@@ -67,10 +63,10 @@ end
67
63
  (defined?(RSpec) ? RSpec::Core::ExampleGroup : Spec::Example::ExampleGroup).class_eval do
68
64
  def log
69
65
  begin
70
- INTEGRATION_DB.loggers << Logger.new(STDOUT)
66
+ DB.loggers << Logger.new(STDOUT)
71
67
  yield
72
68
  ensure
73
- INTEGRATION_DB.loggers.pop
69
+ DB.loggers.pop
74
70
  end
75
71
  end
76
72
 
@@ -83,18 +79,12 @@ end
83
79
  end
84
80
  end
85
81
 
86
- if defined?(INTEGRATION_DB) || defined?(INTEGRATION_URL) || ENV['SEQUEL_INTEGRATION_URL']
87
- unless defined?(INTEGRATION_DB)
88
- url = defined?(INTEGRATION_URL) ? INTEGRATION_URL : ENV['SEQUEL_INTEGRATION_URL']
89
- INTEGRATION_DB = Sequel.connect(url)
90
- #INTEGRATION_DB.instance_variable_set(:@server_version, 80100)
91
- end
92
- else
93
- INTEGRATION_DB = Sequel.sqlite
82
+ unless defined?(DB)
83
+ DB = Sequel.connect(ENV['SEQUEL_INTEGRATION_URL'])
94
84
  end
95
85
 
96
- if INTEGRATION_DB.adapter_scheme == :ibmdb || (INTEGRATION_DB.adapter_scheme == :ado && INTEGRATION_DB.database_type == :access)
97
- def INTEGRATION_DB.drop_table(*tables)
86
+ if DB.adapter_scheme == :ibmdb || (DB.adapter_scheme == :ado && DB.database_type == :access)
87
+ def DB.drop_table(*tables)
98
88
  super
99
89
  rescue Sequel::DatabaseError
100
90
  disconnect
@@ -104,7 +94,7 @@ end
104
94
 
105
95
  if ENV['SEQUEL_CONNECTION_VALIDATOR']
106
96
  ENV['SEQUEL_NO_CHECK_SQLS'] = '1'
107
- INTEGRATION_DB.extension(:connection_validator)
108
- INTEGRATION_DB.pool.connection_validation_timeout = -1
97
+ DB.extension(:connection_validator)
98
+ DB.pool.connection_validation_timeout = -1
109
99
  end
110
100
 
@@ -29,7 +29,7 @@ describe "Sequel timezone support" do
29
29
  end
30
30
 
31
31
  before do
32
- @db = INTEGRATION_DB
32
+ @db = DB
33
33
  @db.create_table!(:t){DateTime :t}
34
34
  end
35
35
  after do
@@ -2,7 +2,7 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
2
 
3
3
  describe "Database transactions" do
4
4
  before(:all) do
5
- @db = INTEGRATION_DB
5
+ @db = DB
6
6
  @db.create_table!(:items, :engine=>'InnoDB'){String :name; Integer :value}
7
7
  @d = @db[:items]
8
8
  end
@@ -83,7 +83,7 @@ describe "Database transactions" do
83
83
  @d.count.should == 0
84
84
  end
85
85
 
86
- if INTEGRATION_DB.supports_savepoints?
86
+ if DB.supports_savepoints?
87
87
  cspecify "should support nested transactions through savepoints using the savepoint option", [:jdbc, :sqlite] do
88
88
  @db.transaction do
89
89
  @d << {:name => '1'}
@@ -131,7 +131,7 @@ describe "Database transactions" do
131
131
  @d.count.should == 2
132
132
  end
133
133
 
134
- if INTEGRATION_DB.supports_prepared_transactions?
134
+ if DB.supports_prepared_transactions?
135
135
  specify "should allow saving and destroying of model objects" do
136
136
  c = Class.new(Sequel::Model(@d))
137
137
  c.set_primary_key :name
@@ -154,7 +154,7 @@ describe "Database transactions" do
154
154
  @d.select_order_map(:name).should == []
155
155
  end
156
156
 
157
- if INTEGRATION_DB.supports_savepoints_in_prepared_transactions?
157
+ if DB.supports_savepoints_in_prepared_transactions?
158
158
  specify "should support savepoints when using prepared transactions" do
159
159
  @db.transaction(:prepare=>'XYZ'){@db.transaction(:savepoint=>true){@d << {:name => '1'}}}
160
160
  @db.commit_prepared_transaction('XYZ')
@@ -230,7 +230,7 @@ describe "Database transactions" do
230
230
  c.should == 1
231
231
  end
232
232
 
233
- if INTEGRATION_DB.supports_savepoints?
233
+ if DB.supports_savepoints?
234
234
  specify "should support after_commit inside savepoints" do
235
235
  c = nil
236
236
  @db.transaction{@db.transaction(:savepoint=>true){@db.after_commit{c = 1}}; c.should be_nil}
@@ -244,13 +244,13 @@ describe "Database transactions" do
244
244
  end
245
245
  end
246
246
 
247
- if INTEGRATION_DB.supports_prepared_transactions?
247
+ if DB.supports_prepared_transactions?
248
248
  specify "should raise an error if you attempt to use after_commit or after_rollback inside a prepared transaction" do
249
249
  proc{@db.transaction(:prepare=>'XYZ'){@db.after_commit{}}}.should raise_error(Sequel::Error)
250
250
  proc{@db.transaction(:prepare=>'XYZ'){@db.after_rollback{}}}.should raise_error(Sequel::Error)
251
251
  end
252
252
 
253
- if INTEGRATION_DB.supports_savepoints_in_prepared_transactions?
253
+ if DB.supports_savepoints_in_prepared_transactions?
254
254
  specify "should raise an error if you attempt to use after_commit or after rollback inside a savepoint in a prepared transaction" do
255
255
  proc{@db.transaction(:prepare=>'XYZ'){@db.transaction(:savepoint=>true){@db.after_commit{}}}}.should raise_error(Sequel::Error)
256
256
  proc{@db.transaction(:prepare=>'XYZ'){@db.transaction(:savepoint=>true){@db.after_rollback{}}}}.should raise_error(Sequel::Error)
@@ -262,7 +262,7 @@ end
262
262
  if (! defined?(RUBY_ENGINE) or RUBY_ENGINE == 'ruby' or (RUBY_ENGINE == 'rbx' && !Sequel.guarded?([:do, :sqlite], [:tinytds, :mssql]))) and RUBY_VERSION < '1.9'
263
263
  describe "Database transactions and Thread#kill" do
264
264
  before do
265
- @db = INTEGRATION_DB
265
+ @db = DB
266
266
  @db.create_table!(:items, :engine=>'InnoDB'){String :name; Integer :value}
267
267
  @d = @db[:items]
268
268
  end
@@ -286,7 +286,7 @@ if (! defined?(RUBY_ENGINE) or RUBY_ENGINE == 'ruby' or (RUBY_ENGINE == 'rbx' &&
286
286
  @d.count.should == 0
287
287
  end
288
288
 
289
- if INTEGRATION_DB.supports_savepoints?
289
+ if DB.supports_savepoints?
290
290
  specify "should handle transactions with savepoints inside threads" do
291
291
  q = Queue.new
292
292
  q1 = Queue.new
@@ -312,7 +312,7 @@ end
312
312
 
313
313
  describe "Database transaction retrying" do
314
314
  before(:all) do
315
- @db = INTEGRATION_DB
315
+ @db = DB
316
316
  @db.create_table!(:items, :engine=>'InnoDB'){String :a, :unique=>true, :null=>false}
317
317
  @d = @db[:items]
318
318
  end
@@ -2,8 +2,8 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
2
 
3
3
  describe "Supported types" do
4
4
  def create_items_table_with_column(name, type, opts={})
5
- INTEGRATION_DB.create_table!(:items){column name, type, opts}
6
- INTEGRATION_DB[:items]
5
+ DB.create_table!(:items){column name, type, opts}
6
+ DB[:items]
7
7
  end
8
8
 
9
9
  specify "should support casting correctly" do
@@ -116,20 +116,6 @@ describe Sequel::Model::Associations::AssociationReflection, "#reciprocal" do
116
116
  ParParentThree.association_reflection(:par_parents).reciprocal.should == :par_parent_threes
117
117
  end
118
118
 
119
- qspecify "should handle ambiguous reciprocals" do
120
- ParParent.many_to_one :par_parent_two, :class=>ParParentTwo, :key=>:par_parent_two_id
121
- ParParent.many_to_one :par_parent_two2, :clone=>:par_parent_two
122
- ParParentTwo.one_to_many :par_parents, :class=>ParParent, :key=>:par_parent_two_id
123
- ParParentTwo.one_to_many :par_parents2, :clone=>:par_parents
124
- ParParent.many_to_many :par_parent_threes, :class=>ParParentThree, :right_key=>:par_parent_three_id
125
- ParParent.many_to_many :par_parent_threes2, :clone=>:par_parent_threes
126
- ParParentThree.many_to_many :par_parents
127
-
128
- [:par_parent_two, :par_parent_two2].should include(ParParentTwo.association_reflection(:par_parents).reciprocal)
129
- [:par_parents, :par_parents2].should include(ParParent.association_reflection(:par_parent_two).reciprocal)
130
- [:par_parent_threes, :par_parent_threes2].should include(ParParentThree.association_reflection(:par_parents).reciprocal)
131
- end
132
-
133
119
  it "should handle ambiguous reciprocals where only one doesn't have conditions/blocks" do
134
120
  ParParent.many_to_one :par_parent_two, :class=>ParParentTwo, :key=>:par_parent_two_id
135
121
  ParParent.many_to_one :par_parent_two2, :clone=>:par_parent_two, :conditions=>{:id=>:id}
@@ -172,18 +158,6 @@ describe Sequel::Model::Associations::AssociationReflection, "#reciprocal" do
172
158
  ParParent.association_reflection(:par_parent_two).reciprocal.should == :par_parents
173
159
  ParParent.association_reflection(:par_parent_threes).reciprocal.should == :par_parents
174
160
  end
175
-
176
- qspecify "should handle reciprocals where reciprocal association has conditions/block" do
177
- ParParent.many_to_one :par_parent_two, :conditions=>{:id=>:id}
178
- ParParentTwo.one_to_many :par_parents
179
- ParParent.many_to_many :par_parent_threes do |ds|
180
- ds
181
- end
182
- ParParentThree.many_to_many :par_parents
183
-
184
- ParParentTwo.association_reflection(:par_parents).reciprocal.should == :par_parent_two
185
- ParParentThree.association_reflection(:par_parents).reciprocal.should == :par_parent_threes
186
- end
187
161
  end
188
162
 
189
163
  describe Sequel::Model::Associations::AssociationReflection, "#select" do
@@ -313,7 +287,7 @@ describe Sequel::Model::Associations::AssociationReflection, "#eager_limit_strat
313
287
  @c = Class.new(Sequel::Model(:a))
314
288
  end
315
289
  after do
316
- Sequel::Model.default_eager_limit_strategy = nil
290
+ Sequel::Model.default_eager_limit_strategy = true
317
291
  end
318
292
 
319
293
  it "should be nil by default for *_one associations" do
@@ -401,7 +375,7 @@ describe Sequel::Model, " association reflection methods" do
401
375
  def self.name; 'Node'; end
402
376
  def self.to_s; 'Node'; end
403
377
  end
404
- MODEL_DB.reset
378
+ DB.reset
405
379
  end
406
380
 
407
381
  it "#all_association_reflections should include all association reflection hashes" do
@@ -138,15 +138,6 @@ describe Sequel::Model, "associate" do
138
138
  proc{c.one_to_one :c2, :clone=>:cs}.should_not raise_error(Sequel::Error)
139
139
  end
140
140
 
141
- it "should clear associations cache when using set_values" do
142
- c = Class.new(Sequel::Model(:c))
143
- c.many_to_one :c
144
- o = c.new
145
- o.associations[:c] = 1
146
- o.set_values(:id=>1)
147
- o.associations.should == {}
148
- end
149
-
150
141
  it "should clear associations cache when refreshing object manually" do
151
142
  c = Class.new(Sequel::Model(:c))
152
143
  c.many_to_one :c
@@ -156,16 +147,16 @@ describe Sequel::Model, "associate" do
156
147
  o.associations.should == {}
157
148
  end
158
149
 
159
- it "should clear associations cache when refreshing object after save" do
150
+ it "should not clear associations cache when refreshing object after save" do
160
151
  c = Class.new(Sequel::Model(:c))
161
152
  c.many_to_one :c
162
153
  o = c.new
163
154
  o.associations[:c] = 1
164
155
  o.save
165
- o.associations.should == {}
156
+ o.associations.should == {:c=>1}
166
157
  end
167
158
 
168
- it "should clear associations cache when saving with insert_select" do
159
+ it "should not clear associations cache when saving with insert_select" do
169
160
  ds = Sequel::Model.db[:c]
170
161
  def ds.supports_insert_select?() true end
171
162
  def ds.insert_select(*) {:id=>1} end
@@ -174,7 +165,7 @@ describe Sequel::Model, "associate" do
174
165
  o = c.new
175
166
  o.associations[:c] = 1
176
167
  o.save
177
- o.associations.should == {}
168
+ o.associations.should == {:c=>1}
178
169
  end
179
170
 
180
171
  end
@@ -186,7 +177,7 @@ describe Sequel::Model, "many_to_one" do
186
177
  columns :id, :parent_id, :par_parent_id, :blah
187
178
  end
188
179
  @dataset = @c2.dataset
189
- MODEL_DB.reset
180
+ DB.reset
190
181
  end
191
182
 
192
183
  it "should use implicit key if omitted" do
@@ -197,7 +188,7 @@ describe Sequel::Model, "many_to_one" do
197
188
  p.class.should == @c2
198
189
  p.values.should == {:x => 1, :id => 1}
199
190
 
200
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.id = 234) LIMIT 1"]
191
+ DB.sqls.should == ["SELECT * FROM nodes WHERE id = 234"]
201
192
  end
202
193
 
203
194
  it "should allow association with the same name as the key if :key_column is given" do
@@ -208,7 +199,7 @@ describe Sequel::Model, "many_to_one" do
208
199
  d.parent_id.should == @c2.load(:x => 1, :id => 1)
209
200
  d.parent_id_id.should == 234
210
201
  d[:parent_id].should == 234
211
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.id = 234) LIMIT 1"]
202
+ DB.sqls.should == ["SELECT * FROM nodes WHERE id = 234"]
212
203
 
213
204
  d.parent_id_id = 3
214
205
  d.parent_id_id.should == 3
@@ -220,7 +211,7 @@ describe Sequel::Model, "many_to_one" do
220
211
  class ::ParParent < Sequel::Model; end
221
212
  @c2.many_to_one :par_parent
222
213
  @c2.new(:id => 1, :par_parent_id => 234).par_parent.class.should == ParParent
223
- MODEL_DB.sqls.should == ["SELECT * FROM par_parents WHERE (par_parents.id = 234) LIMIT 1"]
214
+ DB.sqls.should == ["SELECT * FROM par_parents WHERE id = 234"]
224
215
  ensure
225
216
  Object.send(:remove_const, :ParParent)
226
217
  end
@@ -233,7 +224,7 @@ describe Sequel::Model, "many_to_one" do
233
224
  end
234
225
  @c2.many_to_one :par_parent, :class=>"Par::Parent"
235
226
  @c2.new(:id => 1, :par_parent_id => 234).par_parent.class.should == Par::Parent
236
- MODEL_DB.sqls.should == ["SELECT * FROM parents WHERE (parents.id = 234) LIMIT 1"]
227
+ DB.sqls.should == ["SELECT * FROM parents WHERE id = 234"]
237
228
  ensure
238
229
  Object.send(:remove_const, :Par)
239
230
  end
@@ -247,31 +238,31 @@ describe Sequel::Model, "many_to_one" do
247
238
  p.class.should == @c2
248
239
  p.values.should == {:x => 1, :id => 1}
249
240
 
250
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.id = 567) LIMIT 1"]
241
+ DB.sqls.should == ["SELECT * FROM nodes WHERE id = 567"]
251
242
  end
252
243
 
253
244
  it "should respect :qualify => false option" do
254
245
  @c2.many_to_one :parent, :class => @c2, :key => :blah, :qualify=>false
255
246
  @c2.new(:id => 1, :blah => 567).parent
256
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (id = 567) LIMIT 1"]
247
+ DB.sqls.should == ["SELECT * FROM nodes WHERE id = 567"]
257
248
  end
258
249
 
259
250
  it "should use :primary_key option if given" do
260
251
  @c2.many_to_one :parent, :class => @c2, :key => :blah, :primary_key => :pk
261
252
  @c2.new(:id => 1, :blah => 567).parent
262
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.pk = 567) LIMIT 1"]
253
+ DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.pk = 567) LIMIT 1"]
263
254
  end
264
255
 
265
256
  it "should support composite keys" do
266
257
  @c2.many_to_one :parent, :class => @c2, :key=>[:id, :parent_id], :primary_key=>[:parent_id, :id]
267
258
  @c2.new(:id => 1, :parent_id => 234).parent
268
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE ((nodes.parent_id = 1) AND (nodes.id = 234)) LIMIT 1"]
259
+ DB.sqls.should == ["SELECT * FROM nodes WHERE ((nodes.parent_id = 1) AND (nodes.id = 234)) LIMIT 1"]
269
260
  end
270
261
 
271
262
  it "should not issue query if not all keys have values" do
272
263
  @c2.many_to_one :parent, :class => @c2, :key=>[:id, :parent_id], :primary_key=>[:parent_id, :id]
273
264
  @c2.new(:id => 1, :parent_id => nil).parent.should == nil
274
- MODEL_DB.sqls.should == []
265
+ DB.sqls.should == []
275
266
  end
276
267
 
277
268
  it "should raise an Error unless same number of composite keys used" do
@@ -284,17 +275,17 @@ describe Sequel::Model, "many_to_one" do
284
275
  it "should use :select option if given" do
285
276
  @c2.many_to_one :parent, :class => @c2, :key => :blah, :select=>[:id, :name]
286
277
  @c2.new(:id => 1, :blah => 567).parent
287
- MODEL_DB.sqls.should == ["SELECT id, name FROM nodes WHERE (nodes.id = 567) LIMIT 1"]
278
+ DB.sqls.should == ["SELECT id, name FROM nodes WHERE (nodes.id = 567) LIMIT 1"]
288
279
  end
289
280
 
290
281
  it "should use :conditions option if given" do
291
282
  @c2.many_to_one :parent, :class => @c2, :key => :blah, :conditions=>{:a=>32}
292
283
  @c2.new(:id => 1, :blah => 567).parent
293
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE ((a = 32) AND (nodes.id = 567)) LIMIT 1"]
284
+ DB.sqls.should == ["SELECT * FROM nodes WHERE ((a = 32) AND (nodes.id = 567)) LIMIT 1"]
294
285
 
295
286
  @c2.many_to_one :parent, :class => @c2, :key => :blah, :conditions=>:a
296
287
  @c2.new(:id => 1, :blah => 567).parent
297
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (a AND (nodes.id = 567)) LIMIT 1"]
288
+ DB.sqls.should == ["SELECT * FROM nodes WHERE (a AND (nodes.id = 567)) LIMIT 1"]
298
289
  end
299
290
 
300
291
  it "should support :order, :limit (only for offset), and :dataset options, as well as a block" do
@@ -302,24 +293,24 @@ describe Sequel::Model, "many_to_one" do
302
293
  ds.filter{x > 1}
303
294
  end
304
295
  @c2.load(:id => 100).child_20
305
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE ((parent_id = 100) AND (x > 1)) ORDER BY name LIMIT 1 OFFSET 20"]
296
+ DB.sqls.should == ["SELECT * FROM nodes WHERE ((parent_id = 100) AND (x > 1)) ORDER BY name LIMIT 1 OFFSET 20"]
306
297
  end
307
298
 
308
299
  it "should return nil if key value is nil" do
309
300
  @c2.many_to_one :parent, :class => @c2
310
301
  @c2.new(:id => 1).parent.should == nil
311
- MODEL_DB.sqls.should == []
302
+ DB.sqls.should == []
312
303
  end
313
304
 
314
305
  it "should cache negative lookup" do
315
306
  @c2.many_to_one :parent, :class => @c2
316
307
  @c2.dataset._fetch = []
317
308
  d = @c2.new(:id => 1, :parent_id=>555)
318
- MODEL_DB.sqls.should == []
309
+ DB.sqls.should == []
319
310
  d.parent.should == nil
320
- MODEL_DB.sqls.should == ['SELECT * FROM nodes WHERE (nodes.id = 555) LIMIT 1']
311
+ DB.sqls.should == ['SELECT * FROM nodes WHERE id = 555']
321
312
  d.parent.should == nil
322
- MODEL_DB.sqls.should == []
313
+ DB.sqls.should == []
323
314
  end
324
315
 
325
316
  it "should define a setter method" do
@@ -371,11 +362,11 @@ describe Sequel::Model, "many_to_one" do
371
362
  @c2.many_to_one :parent, :class => @c2
372
363
 
373
364
  d = @c2.load(:id => 1)
374
- MODEL_DB.reset
365
+ DB.reset
375
366
  d.parent = @c2.new(:id => 345)
376
- MODEL_DB.sqls.should == []
367
+ DB.sqls.should == []
377
368
  d.save_changes
378
- MODEL_DB.sqls.should == ['UPDATE nodes SET parent_id = 345 WHERE (id = 1)']
369
+ DB.sqls.should == ['UPDATE nodes SET parent_id = 345 WHERE (id = 1)']
379
370
  end
380
371
 
381
372
  it "should populate cache when accessed" do
@@ -386,7 +377,7 @@ describe Sequel::Model, "many_to_one" do
386
377
  d.associations[:parent].should == nil
387
378
  @c2.dataset._fetch = {:id=>234}
388
379
  e = d.parent
389
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.id = 234) LIMIT 1"]
380
+ DB.sqls.should == ["SELECT * FROM nodes WHERE id = 234"]
390
381
  d.associations[:parent].should == e
391
382
  end
392
383
 
@@ -394,55 +385,55 @@ describe Sequel::Model, "many_to_one" do
394
385
  @c2.many_to_one :parent, :class => @c2
395
386
 
396
387
  d = @c2.create(:id => 1)
397
- MODEL_DB.reset
388
+ DB.reset
398
389
  d.associations[:parent].should == nil
399
390
  d.parent = @c2.new(:id => 234)
400
391
  e = d.parent
401
392
  d.associations[:parent].should == e
402
- MODEL_DB.sqls.should == []
393
+ DB.sqls.should == []
403
394
  end
404
395
 
405
396
  it "should use cache if available" do
406
397
  @c2.many_to_one :parent, :class => @c2
407
398
 
408
399
  d = @c2.create(:id => 1, :parent_id => 234)
409
- MODEL_DB.reset
400
+ DB.reset
410
401
  d.associations[:parent] = 42
411
402
  d.parent.should == 42
412
- MODEL_DB.sqls.should == []
403
+ DB.sqls.should == []
413
404
  end
414
405
 
415
406
  it "should not use cache if asked to reload" do
416
407
  @c2.many_to_one :parent, :class => @c2
417
408
 
418
409
  d = @c2.create(:id => 1)
419
- MODEL_DB.reset
410
+ DB.reset
420
411
  d.parent_id = 234
421
412
  d.associations[:parent] = 42
422
413
  d.parent(true).should_not == 42
423
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.id = 234) LIMIT 1"]
414
+ DB.sqls.should == ["SELECT * FROM nodes WHERE id = 234"]
424
415
  end
425
416
 
426
417
  it "should use a callback if given one as the argument" do
427
418
  @c2.many_to_one :parent, :class => @c2
428
419
 
429
420
  d = @c2.create(:id => 1)
430
- MODEL_DB.reset
421
+ DB.reset
431
422
  d.parent_id = 234
432
423
  d.associations[:parent] = 42
433
424
  d.parent(proc{|ds| ds.filter{name > 'M'}}).should_not == 42
434
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE ((nodes.id = 234) AND (name > 'M')) LIMIT 1"]
425
+ DB.sqls.should == ["SELECT * FROM nodes WHERE ((nodes.id = 234) AND (name > 'M')) LIMIT 1"]
435
426
  end
436
427
 
437
428
  it "should use a block given to the association method as a callback" do
438
429
  @c2.many_to_one :parent, :class => @c2
439
430
 
440
431
  d = @c2.create(:id => 1)
441
- MODEL_DB.reset
432
+ DB.reset
442
433
  d.parent_id = 234
443
434
  d.associations[:parent] = 42
444
435
  d.parent{|ds| ds.filter{name > 'M'}}.should_not == 42
445
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE ((nodes.id = 234) AND (name > 'M')) LIMIT 1"]
436
+ DB.sqls.should == ["SELECT * FROM nodes WHERE ((nodes.id = 234) AND (name > 'M')) LIMIT 1"]
446
437
  end
447
438
 
448
439
  it "should have the setter add to the reciprocal one_to_many cached association array if it exists" do
@@ -452,18 +443,18 @@ describe Sequel::Model, "many_to_one" do
452
443
 
453
444
  d = @c2.new(:id => 1)
454
445
  e = @c2.new(:id => 2)
455
- MODEL_DB.sqls.should == []
446
+ DB.sqls.should == []
456
447
  d.parent = e
457
448
  e.children.should_not(include(d))
458
- MODEL_DB.sqls.should == ['SELECT * FROM nodes WHERE (nodes.parent_id = 2)']
449
+ DB.sqls.should == ['SELECT * FROM nodes WHERE (nodes.parent_id = 2)']
459
450
 
460
451
  d = @c2.new(:id => 1)
461
452
  e = @c2.new(:id => 2)
462
453
  e.children.should_not(include(d))
463
- MODEL_DB.sqls.should == ['SELECT * FROM nodes WHERE (nodes.parent_id = 2)']
454
+ DB.sqls.should == ['SELECT * FROM nodes WHERE (nodes.parent_id = 2)']
464
455
  d.parent = e
465
456
  e.children.should(include(d))
466
- MODEL_DB.sqls.should == []
457
+ DB.sqls.should == []
467
458
  end
468
459
 
469
460
  it "should have setter deal with a one_to_one reciprocal" do
@@ -498,7 +489,7 @@ describe Sequel::Model, "many_to_one" do
498
489
  f = @c2.new(:id => 3)
499
490
  e.children.should_not(include(d))
500
491
  f.children.should_not(include(d))
501
- MODEL_DB.reset
492
+ DB.reset
502
493
  d.parent = e
503
494
  e.children.should(include(d))
504
495
  d.parent = f
@@ -506,7 +497,7 @@ describe Sequel::Model, "many_to_one" do
506
497
  e.children.should_not(include(d))
507
498
  d.parent = nil
508
499
  f.children.should_not(include(d))
509
- MODEL_DB.sqls.should == []
500
+ DB.sqls.should == []
510
501
  end
511
502
 
512
503
  it "should have the setter not modify the reciprocal if set to same value as current" do
@@ -520,7 +511,7 @@ describe Sequel::Model, "many_to_one" do
520
511
  c2.associations[:parent] = c1
521
512
  c2.parent = c1
522
513
  c1.children.should == [c2, c3]
523
- MODEL_DB.sqls.should == []
514
+ DB.sqls.should == []
524
515
  end
525
516
 
526
517
  it "should get all matching records and only return the first if :key option is set to nil" do
@@ -529,7 +520,7 @@ describe Sequel::Model, "many_to_one" do
529
520
  @c2.dataset.columns(:id, :parent_id, :par_parent_id, :blah)._fetch = [{:id=>1, :parent_id=>0, :par_parent_id=>3, :blah=>4, :children_id=>2, :children_parent_id=>1, :children_par_parent_id=>5, :children_blah=>6}, {}]
530
521
  p = @c2.new(:parent_id=>2)
531
522
  fgp = p.first_grand_parent
532
- MODEL_DB.sqls.should == ["SELECT nodes.id, nodes.parent_id, nodes.par_parent_id, nodes.blah, children.id AS children_id, children.parent_id AS children_parent_id, children.par_parent_id AS children_par_parent_id, children.blah AS children_blah FROM nodes LEFT OUTER JOIN nodes AS children ON (children.parent_id = nodes.id) WHERE (children_id = 2)"]
523
+ DB.sqls.should == ["SELECT nodes.id, nodes.parent_id, nodes.par_parent_id, nodes.blah, children.id AS children_id, children.parent_id AS children_parent_id, children.par_parent_id AS children_par_parent_id, children.blah AS children_blah FROM nodes LEFT OUTER JOIN nodes AS children ON (children.parent_id = nodes.id) WHERE (children_id = 2)"]
533
524
  fgp.values.should == {:id=>1, :parent_id=>0, :par_parent_id=>3, :blah=>4}
534
525
  fgp.children.first.values.should == {:id=>2, :parent_id=>1, :par_parent_id=>5, :blah=>6}
535
526
  end
@@ -685,13 +676,13 @@ describe Sequel::Model, "one_to_one" do
685
676
  @dataset = @c2.dataset
686
677
  @dataset._fetch = {}
687
678
  @c1.dataset._fetch = {}
688
- MODEL_DB.reset
679
+ DB.reset
689
680
  end
690
681
 
691
682
  it "should have the getter method return a single object if the :one_to_one option is true" do
692
683
  @c2.one_to_one :attribute, :class => @c1
693
684
  att = @c2.new(:id => 1234).attribute
694
- MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE (attributes.node_id = 1234) LIMIT 1']
685
+ DB.sqls.should == ['SELECT * FROM attributes WHERE (attributes.node_id = 1234) LIMIT 1']
695
686
  att.should be_a_kind_of(@c1)
696
687
  att.values.should == {}
697
688
  end
@@ -708,7 +699,7 @@ describe Sequel::Model, "one_to_one" do
708
699
  attrib = @c1.new(:id=>3)
709
700
  @c1.dataset._fetch = @c1.instance_dataset._fetch = {:id=>3}
710
701
  @c2.new(:id => 1234).attribute = attrib
711
- sqls = MODEL_DB.sqls
702
+ sqls = DB.sqls
712
703
  ['INSERT INTO attributes (node_id, id) VALUES (1234, 3)',
713
704
  'INSERT INTO attributes (id, node_id) VALUES (3, 1234)'].should(include(sqls.slice! 1))
714
705
  sqls.should == ['UPDATE attributes SET node_id = NULL WHERE (node_id = 1234)', "SELECT * FROM attributes WHERE (id = 3) LIMIT 1"]
@@ -716,7 +707,7 @@ describe Sequel::Model, "one_to_one" do
716
707
  @c2.new(:id => 1234).attribute.should == attrib
717
708
  attrib = @c1.load(:id=>3)
718
709
  @c2.new(:id => 1234).attribute = attrib
719
- MODEL_DB.sqls.should == ["SELECT * FROM attributes WHERE (attributes.node_id = 1234) LIMIT 1",
710
+ DB.sqls.should == ["SELECT * FROM attributes WHERE (attributes.node_id = 1234) LIMIT 1",
720
711
  'UPDATE attributes SET node_id = NULL WHERE ((node_id = 1234) AND (id != 3))',
721
712
  "UPDATE attributes SET node_id = 1234 WHERE (id = 3)"]
722
713
  end
@@ -726,7 +717,7 @@ describe Sequel::Model, "one_to_one" do
726
717
  @c2.use_transactions = true
727
718
  attrib = @c1.load(:id=>3)
728
719
  @c2.new(:id => 1234).attribute = attrib
729
- MODEL_DB.sqls.should == ['BEGIN',
720
+ DB.sqls.should == ['BEGIN',
730
721
  'UPDATE attributes SET node_id = NULL WHERE ((node_id = 1234) AND (id != 3))',
731
722
  "UPDATE attributes SET node_id = 1234 WHERE (id = 3)",
732
723
  'COMMIT']
@@ -738,7 +729,7 @@ describe Sequel::Model, "one_to_one" do
738
729
  end
739
730
  attrib = @c1.load(:id=>3)
740
731
  @c2.new(:id => 1234).attribute = attrib
741
- MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = NULL WHERE ((a = 1) AND (node_id = 1234) AND (b = 2) AND (id != 3))',
732
+ DB.sqls.should == ['UPDATE attributes SET node_id = NULL WHERE ((a = 1) AND (node_id = 1234) AND (b = 2) AND (id != 3))',
742
733
  "UPDATE attributes SET node_id = 1234 WHERE (id = 3)"]
743
734
  end
744
735
 
@@ -747,7 +738,7 @@ describe Sequel::Model, "one_to_one" do
747
738
  attrib = @c1.new(:id=>3)
748
739
  @c1.dataset._fetch = @c1.instance_dataset._fetch = {:id=>3}
749
740
  @c2.new(:id => 1234, :xxx=>5).attribute = attrib
750
- sqls = MODEL_DB.sqls
741
+ sqls = DB.sqls
751
742
  ['INSERT INTO attributes (node_id, id) VALUES (5, 3)',
752
743
  'INSERT INTO attributes (id, node_id) VALUES (3, 5)'].should(include(sqls.slice! 1))
753
744
  sqls.should == ['UPDATE attributes SET node_id = NULL WHERE (node_id = 5)', "SELECT * FROM attributes WHERE (id = 3) LIMIT 1"]
@@ -755,7 +746,7 @@ describe Sequel::Model, "one_to_one" do
755
746
  @c2.new(:id => 321, :xxx=>5).attribute.should == attrib
756
747
  attrib = @c1.load(:id=>3)
757
748
  @c2.new(:id => 621, :xxx=>5).attribute = attrib
758
- MODEL_DB.sqls.should == ["SELECT * FROM attributes WHERE (attributes.node_id = 5) LIMIT 1",
749
+ DB.sqls.should == ["SELECT * FROM attributes WHERE (attributes.node_id = 5) LIMIT 1",
759
750
  'UPDATE attributes SET node_id = NULL WHERE ((node_id = 5) AND (id != 3))',
760
751
  'UPDATE attributes SET node_id = 5 WHERE (id = 3)']
761
752
  end
@@ -765,7 +756,7 @@ describe Sequel::Model, "one_to_one" do
765
756
  attrib = @c1.load(:id=>3, :y=>6)
766
757
  @c1.dataset._fetch = {:id=>3, :y=>6}
767
758
  @c2.load(:id => 1234, :x=>5).attribute = attrib
768
- sqls = MODEL_DB.sqls
759
+ sqls = DB.sqls
769
760
  sqls.last.should =~ /UPDATE attributes SET (node_id = 1234|y = 5), (node_id = 1234|y = 5) WHERE \(id = 3\)/
770
761
  sqls.first.should =~ /UPDATE attributes SET (node_id|y) = NULL, (node_id|y) = NULL WHERE \(\(node_id = 1234\) AND \(y = 5\) AND \(id != 3\)\)/
771
762
  sqls.length.should == 2
@@ -779,7 +770,7 @@ describe Sequel::Model, "one_to_one" do
779
770
  p.class.should == @c2
780
771
  p.values.should == {}
781
772
 
782
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.node_id = 234) LIMIT 1"]
773
+ DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.node_id = 234) LIMIT 1"]
783
774
  end
784
775
 
785
776
  it "should use implicit class if omitted" do
@@ -787,7 +778,7 @@ describe Sequel::Model, "one_to_one" do
787
778
  class ::ParParent < Sequel::Model; end
788
779
  @c2.one_to_one :par_parent
789
780
  @c2.new(:id => 234).par_parent.class.should == ParParent
790
- MODEL_DB.sqls.should == ["SELECT * FROM par_parents WHERE (par_parents.node_id = 234) LIMIT 1"]
781
+ DB.sqls.should == ["SELECT * FROM par_parents WHERE (par_parents.node_id = 234) LIMIT 1"]
791
782
  ensure
792
783
  Object.send(:remove_const, :ParParent)
793
784
  end
@@ -800,7 +791,7 @@ describe Sequel::Model, "one_to_one" do
800
791
  end
801
792
  @c2.one_to_one :par_parent, :class=>"Par::Parent"
802
793
  @c2.new(:id => 234).par_parent.class.should == Par::Parent
803
- MODEL_DB.sqls.should == ["SELECT * FROM parents WHERE (parents.node_id = 234) LIMIT 1"]
794
+ DB.sqls.should == ["SELECT * FROM parents WHERE (parents.node_id = 234) LIMIT 1"]
804
795
  ensure
805
796
  Object.send(:remove_const, :Par)
806
797
  end
@@ -814,25 +805,25 @@ describe Sequel::Model, "one_to_one" do
814
805
  p.class.should == @c2
815
806
  p.values.should == {}
816
807
 
817
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.blah = 234) LIMIT 1"]
808
+ DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.blah = 234) LIMIT 1"]
818
809
  end
819
810
 
820
811
  it "should use :primary_key option if given" do
821
812
  @c2.one_to_one :parent, :class => @c2, :key => :pk, :primary_key => :blah
822
813
  @c2.new(:id => 1, :blah => 567).parent
823
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.pk = 567) LIMIT 1"]
814
+ DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.pk = 567) LIMIT 1"]
824
815
  end
825
816
 
826
817
  it "should support composite keys" do
827
818
  @c2.one_to_one :parent, :class => @c2, :primary_key=>[:id, :parent_id], :key=>[:parent_id, :id]
828
819
  @c2.new(:id => 1, :parent_id => 234).parent
829
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE ((nodes.parent_id = 1) AND (nodes.id = 234)) LIMIT 1"]
820
+ DB.sqls.should == ["SELECT * FROM nodes WHERE ((nodes.parent_id = 1) AND (nodes.id = 234)) LIMIT 1"]
830
821
  end
831
822
 
832
823
  it "should not issue query if not all keys have values" do
833
824
  @c2.one_to_one :parent, :class => @c2, :key=>[:id, :parent_id], :primary_key=>[:parent_id, :id]
834
825
  @c2.new(:id => 1, :parent_id => nil).parent.should == nil
835
- MODEL_DB.sqls.should == []
826
+ DB.sqls.should == []
836
827
  end
837
828
 
838
829
  it "should raise an Error unless same number of composite keys used" do
@@ -845,17 +836,17 @@ describe Sequel::Model, "one_to_one" do
845
836
  it "should use :select option if given" do
846
837
  @c2.one_to_one :parent, :class => @c2, :select=>[:id, :name]
847
838
  @c2.new(:id => 567).parent
848
- MODEL_DB.sqls.should == ["SELECT id, name FROM nodes WHERE (nodes.node_id = 567) LIMIT 1"]
839
+ DB.sqls.should == ["SELECT id, name FROM nodes WHERE (nodes.node_id = 567) LIMIT 1"]
849
840
  end
850
841
 
851
842
  it "should use :conditions option if given" do
852
843
  @c2.one_to_one :parent, :class => @c2, :conditions=>{:a=>32}
853
844
  @c2.new(:id => 567).parent
854
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE ((a = 32) AND (nodes.node_id = 567)) LIMIT 1"]
845
+ DB.sqls.should == ["SELECT * FROM nodes WHERE ((a = 32) AND (nodes.node_id = 567)) LIMIT 1"]
855
846
 
856
847
  @c2.one_to_one :parent, :class => @c2, :conditions=>:a
857
848
  @c2.new(:id => 567).parent
858
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (a AND (nodes.node_id = 567)) LIMIT 1"]
849
+ DB.sqls.should == ["SELECT * FROM nodes WHERE (a AND (nodes.node_id = 567)) LIMIT 1"]
859
850
  end
860
851
 
861
852
  it "should support :order, :limit (only for offset), and :dataset options, as well as a block" do
@@ -863,25 +854,25 @@ describe Sequel::Model, "one_to_one" do
863
854
  ds.filter{x > 1}
864
855
  end
865
856
  @c2.load(:id => 100).child_20
866
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE ((parent_id = 100) AND (x > 1)) ORDER BY name LIMIT 1 OFFSET 20"]
857
+ DB.sqls.should == ["SELECT * FROM nodes WHERE ((parent_id = 100) AND (x > 1)) ORDER BY name LIMIT 1 OFFSET 20"]
867
858
  end
868
859
 
869
860
  it "should return nil if primary_key value is nil" do
870
861
  @c2.one_to_one :parent, :class => @c2, :primary_key=>:node_id
871
862
 
872
863
  @c2.new(:id => 1).parent.should be_nil
873
- MODEL_DB.sqls.should == []
864
+ DB.sqls.should == []
874
865
  end
875
866
 
876
867
  it "should cache negative lookup" do
877
868
  @c2.one_to_one :parent, :class => @c2
878
869
  @c2.dataset._fetch = []
879
870
  d = @c2.new(:id => 555)
880
- MODEL_DB.sqls.should == []
871
+ DB.sqls.should == []
881
872
  d.parent.should == nil
882
- MODEL_DB.sqls.should == ['SELECT * FROM nodes WHERE (nodes.node_id = 555) LIMIT 1']
873
+ DB.sqls.should == ['SELECT * FROM nodes WHERE (nodes.node_id = 555) LIMIT 1']
883
874
  d.parent.should == nil
884
- MODEL_DB.sqls.should == []
875
+ DB.sqls.should == []
885
876
  end
886
877
 
887
878
  it "should have the setter method respect the :key option" do
@@ -891,7 +882,7 @@ describe Sequel::Model, "one_to_one" do
891
882
  @c2.dataset._fetch = @c2.instance_dataset._fetch = {:id => 4321, :blah => 3}
892
883
  d.parent = e
893
884
  e.values.should == {:id => 4321, :blah => 3}
894
- sqls = MODEL_DB.sqls
885
+ sqls = DB.sqls
895
886
  ["INSERT INTO nodes (blah, id) VALUES (3, 4321)",
896
887
  "INSERT INTO nodes (id, blah) VALUES (4321, 3)"].should include(sqls.slice! 1)
897
888
  sqls.should == ["UPDATE nodes SET blah = NULL WHERE (blah = 3)", "SELECT * FROM nodes WHERE (id = 4321) LIMIT 1"]
@@ -901,7 +892,7 @@ describe Sequel::Model, "one_to_one" do
901
892
  @c2.one_to_one :parent, :class => @c2
902
893
  d = @c2.load(:id => 1)
903
894
  d.parent = @c2.load(:id => 3, :node_id=>345)
904
- MODEL_DB.sqls.should == ["UPDATE nodes SET node_id = NULL WHERE ((node_id = 1) AND (id != 3))",
895
+ DB.sqls.should == ["UPDATE nodes SET node_id = NULL WHERE ((node_id = 1) AND (id != 3))",
905
896
  "UPDATE nodes SET node_id = 1 WHERE (id = 3)"]
906
897
  end
907
898
 
@@ -912,9 +903,9 @@ describe Sequel::Model, "one_to_one" do
912
903
  d.associations[:parent].should == nil
913
904
  @c2.dataset._fetch = {:id=>234}
914
905
  e = d.parent
915
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.node_id = 1) LIMIT 1"]
906
+ DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.node_id = 1) LIMIT 1"]
916
907
  d.parent
917
- MODEL_DB.sqls.should == []
908
+ DB.sqls.should == []
918
909
  d.associations[:parent].should == e
919
910
  end
920
911
 
@@ -935,7 +926,7 @@ describe Sequel::Model, "one_to_one" do
935
926
  d = @c2.load(:id => 1, :parent_id => 234)
936
927
  d.associations[:parent] = 42
937
928
  d.parent.should == 42
938
- MODEL_DB.sqls.should == []
929
+ DB.sqls.should == []
939
930
  end
940
931
 
941
932
  it "should not use cache if asked to reload" do
@@ -943,7 +934,7 @@ describe Sequel::Model, "one_to_one" do
943
934
  d = @c2.load(:id => 1)
944
935
  d.associations[:parent] = [42]
945
936
  d.parent(true).should_not == 42
946
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.node_id = 1) LIMIT 1"]
937
+ DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.node_id = 1) LIMIT 1"]
947
938
  end
948
939
 
949
940
  it "should have the setter set the reciprocal many_to_one cached association" do
@@ -954,11 +945,11 @@ describe Sequel::Model, "one_to_one" do
954
945
  e = @c2.load(:id => 2)
955
946
  d.parent = e
956
947
  e.child.should == d
957
- MODEL_DB.sqls.should == ["UPDATE nodes SET parent_id = NULL WHERE ((parent_id = 1) AND (id != 2))",
948
+ DB.sqls.should == ["UPDATE nodes SET parent_id = NULL WHERE ((parent_id = 1) AND (id != 2))",
958
949
  "UPDATE nodes SET parent_id = 1 WHERE (id = 2)"]
959
950
  d.parent = nil
960
951
  e.child.should == nil
961
- MODEL_DB.sqls.should == ["UPDATE nodes SET parent_id = NULL WHERE (parent_id = 1)"]
952
+ DB.sqls.should == ["UPDATE nodes SET parent_id = NULL WHERE (parent_id = 1)"]
962
953
  end
963
954
 
964
955
  it "should have the setter remove the object from the previous associated object's reciprocal many_to_one cached association array if it exists" do
@@ -990,7 +981,7 @@ describe Sequel::Model, "one_to_one" do
990
981
  c2.associations[:parent] = c1
991
982
  c2.parent = c1
992
983
  c1.child.should == c2
993
- MODEL_DB.sqls.should == []
984
+ DB.sqls.should == []
994
985
  end
995
986
 
996
987
  it "should not add associations methods directly to class" do
@@ -1092,7 +1083,7 @@ describe Sequel::Model, "one_to_one" do
1092
1083
  it "should work_correctly when used with associate" do
1093
1084
  @c2.associate :one_to_one, :parent, :class => @c2
1094
1085
  @c2.load(:id => 567).parent.should == @c2.load({})
1095
- MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.node_id = 567) LIMIT 1"]
1086
+ DB.sqls.should == ["SELECT * FROM nodes WHERE (nodes.node_id = 567) LIMIT 1"]
1096
1087
  end
1097
1088
  end
1098
1089
 
@@ -1115,7 +1106,7 @@ describe Sequel::Model, "one_to_many" do
1115
1106
  @dataset = @c2.dataset
1116
1107
  @dataset._fetch = {}
1117
1108
  @c1.dataset._fetch = proc{|sql| sql =~ /SELECT 1/ ? {:a=>1} : {}}
1118
- MODEL_DB.reset
1109
+ DB.reset
1119
1110
  end
1120
1111
 
1121
1112
  it "should use implicit key if omitted" do
@@ -1159,7 +1150,7 @@ describe Sequel::Model, "one_to_many" do
1159
1150
  d = @c2.load(:id => 1234)
1160
1151
  d.associations[:attributes] = []
1161
1152
  d.attributes(proc{|ds| ds.filter{name > 'M'}}).should_not == []
1162
- MODEL_DB.sqls.should == ["SELECT * FROM attributes WHERE ((attributes.nodeid = 1234) AND (name > 'M'))"]
1153
+ DB.sqls.should == ["SELECT * FROM attributes WHERE ((attributes.nodeid = 1234) AND (name > 'M'))"]
1163
1154
  end
1164
1155
 
1165
1156
  it "should use explicit key if given" do
@@ -1175,7 +1166,7 @@ describe Sequel::Model, "one_to_many" do
1175
1166
  it "should not issue query if not all keys have values" do
1176
1167
  @c2.one_to_many :attributes, :class => @c1, :key =>[:node_id, :id], :primary_key=>[:id, :x]
1177
1168
  @c2.load(:id => 1234, :x=>nil).attributes.should == []
1178
- MODEL_DB.sqls.should == []
1169
+ DB.sqls.should == []
1179
1170
  end
1180
1171
 
1181
1172
  it "should raise an Error unless same number of composite keys used" do
@@ -1193,7 +1184,7 @@ describe Sequel::Model, "one_to_many" do
1193
1184
  a = @c1.load(:id => 2345)
1194
1185
  a.should == n.add_attribute(a)
1195
1186
  a.values.should == {:node_id => 1234, :id => 2345}
1196
- MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = 1234 WHERE (id = 2345)']
1187
+ DB.sqls.should == ['UPDATE attributes SET node_id = 1234 WHERE (id = 2345)']
1197
1188
  end
1198
1189
 
1199
1190
  it "should define an add_ method that works on new records" do
@@ -1203,7 +1194,7 @@ describe Sequel::Model, "one_to_many" do
1203
1194
  a = @c1.new(:id => 234)
1204
1195
  @c1.dataset._fetch = @c1.instance_dataset._fetch = {:node_id => 1234, :id => 234}
1205
1196
  a.should == n.add_attribute(a)
1206
- sqls = MODEL_DB.sqls
1197
+ sqls = DB.sqls
1207
1198
  sqls.shift.should =~ /INSERT INTO attributes \((node_)?id, (node_)?id\) VALUES \(1?234, 1?234\)/
1208
1199
  sqls.should == ["SELECT * FROM attributes WHERE (id = 234) LIMIT 1"]
1209
1200
  a.values.should == {:node_id => 1234, :id => 234}
@@ -1216,7 +1207,7 @@ describe Sequel::Model, "one_to_many" do
1216
1207
  a = @c1.load(:id => 2345, :node_id => 1234)
1217
1208
  a.should == n.remove_attribute(a)
1218
1209
  a.values.should == {:node_id => nil, :id => 2345}
1219
- MODEL_DB.sqls.should == ["SELECT 1 AS one FROM attributes WHERE ((attributes.node_id = 1234) AND (id = 2345)) LIMIT 1", 'UPDATE attributes SET node_id = NULL WHERE (id = 2345)']
1210
+ DB.sqls.should == ["SELECT 1 AS one FROM attributes WHERE ((attributes.node_id = 1234) AND (id = 2345)) LIMIT 1", 'UPDATE attributes SET node_id = NULL WHERE (id = 2345)']
1220
1211
  end
1221
1212
 
1222
1213
  it "should have the remove_ method raise an error if the passed object is not already associated" do
@@ -1226,16 +1217,16 @@ describe Sequel::Model, "one_to_many" do
1226
1217
  a = @c1.load(:id => 2345, :node_id => 1234)
1227
1218
  @c1.dataset._fetch = []
1228
1219
  proc{n.remove_attribute(a)}.should raise_error(Sequel::Error)
1229
- MODEL_DB.sqls.should == ["SELECT 1 AS one FROM attributes WHERE ((attributes.node_id = 1234) AND (id = 2345)) LIMIT 1"]
1220
+ DB.sqls.should == ["SELECT 1 AS one FROM attributes WHERE ((attributes.node_id = 1234) AND (id = 2345)) LIMIT 1"]
1230
1221
  end
1231
1222
 
1232
1223
  it "should accept a hash for the add_ method and create a new record" do
1233
1224
  @c2.one_to_many :attributes, :class => @c1
1234
1225
  n = @c2.new(:id => 1234)
1235
- MODEL_DB.reset
1226
+ DB.reset
1236
1227
  @c1.dataset._fetch = @c1.instance_dataset._fetch = {:node_id => 1234, :id => 234}
1237
1228
  n.add_attribute(:id => 234).should == @c1.load(:node_id => 1234, :id => 234)
1238
- sqls = MODEL_DB.sqls
1229
+ sqls = DB.sqls
1239
1230
  sqls.shift.should =~ /INSERT INTO attributes \((node_)?id, (node_)?id\) VALUES \(1?234, 1?234\)/
1240
1231
  sqls.should == ["SELECT * FROM attributes WHERE (id = 234) LIMIT 1"]
1241
1232
  end
@@ -1245,7 +1236,7 @@ describe Sequel::Model, "one_to_many" do
1245
1236
  n = @c2.new(:id => 1234)
1246
1237
  @c1.dataset._fetch = {:id=>234, :node_id=>nil}
1247
1238
  n.add_attribute(234).should == @c1.load(:node_id => 1234, :id => 234)
1248
- MODEL_DB.sqls.should == ["SELECT * FROM attributes WHERE id = 234", "UPDATE attributes SET node_id = 1234 WHERE (id = 234)"]
1239
+ DB.sqls.should == ["SELECT * FROM attributes WHERE id = 234", "UPDATE attributes SET node_id = 1234 WHERE (id = 234)"]
1249
1240
  end
1250
1241
 
1251
1242
  it "should raise an error in the add_ method if the passed associated object is not of the correct type" do
@@ -1258,7 +1249,7 @@ describe Sequel::Model, "one_to_many" do
1258
1249
  n = @c2.new(:id => 1234)
1259
1250
  @c1.dataset._fetch = {:id=>234, :node_id=>1234}
1260
1251
  n.remove_attribute(234).should == @c1.load(:node_id => nil, :id => 234)
1261
- MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE ((attributes.node_id = 1234) AND (attributes.id = 234)) LIMIT 1',
1252
+ DB.sqls.should == ['SELECT * FROM attributes WHERE ((attributes.node_id = 1234) AND (attributes.id = 234)) LIMIT 1',
1262
1253
  'UPDATE attributes SET node_id = NULL WHERE (id = 234)']
1263
1254
  end
1264
1255
 
@@ -1273,7 +1264,7 @@ describe Sequel::Model, "one_to_many" do
1273
1264
  n = @c2.new(:id => 1234, :xxx=>5)
1274
1265
  a = @c1.load(:id => 2345)
1275
1266
  n.add_attribute(a).should == a
1276
- MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = 5 WHERE (id = 2345)']
1267
+ DB.sqls.should == ['UPDATE attributes SET node_id = 5 WHERE (id = 2345)']
1277
1268
  end
1278
1269
 
1279
1270
  it "should have add_ method not add the same object to the cached association array if the object is already in the array" do
@@ -1286,7 +1277,7 @@ describe Sequel::Model, "one_to_many" do
1286
1277
  a.should == n.add_attribute(a)
1287
1278
  a.values.should == {:node_id => 1234, :id => 2345}
1288
1279
  n.attributes.should == [a]
1289
- MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = 1234 WHERE (id = 2345)'] * 2
1280
+ DB.sqls.should == ['UPDATE attributes SET node_id = 1234 WHERE (id = 2345)'] * 2
1290
1281
  end
1291
1282
 
1292
1283
  it "should have add_ method respect composite keys" do
@@ -1295,7 +1286,7 @@ describe Sequel::Model, "one_to_many" do
1295
1286
  n = @c2.load(:id => 1234, :x=>5)
1296
1287
  a = @c1.load(:id => 2345)
1297
1288
  n.add_attribute(a).should == a
1298
- sqls = MODEL_DB.sqls
1289
+ sqls = DB.sqls
1299
1290
  sqls.shift.should =~ /UPDATE attributes SET (node_id = 1234|y = 5), (node_id = 1234|y = 5) WHERE \(id = 2345\)/
1300
1291
  sqls.should == []
1301
1292
  end
@@ -1308,7 +1299,7 @@ describe Sequel::Model, "one_to_many" do
1308
1299
  n = @c2.load(:id => 1234, :x=>5)
1309
1300
  a = @c1.load(:id => 2345, :z => 8, :node_id => 1234, :y=>5)
1310
1301
  n.add_attribute([2345, 8]).should == a
1311
- sqls = MODEL_DB.sqls
1302
+ sqls = DB.sqls
1312
1303
  sqls.shift.should =~ /SELECT \* FROM attributes WHERE \(\((id|z) = (2345|8)\) AND \((id|z) = (2345|8)\)\) LIMIT 1/
1313
1304
  sqls.shift.should =~ /UPDATE attributes SET (node_id|y) = (1234|5), (node_id|y) = (1234|5) WHERE \(\((id|z) = (2345|8)\) AND \((id|z) = (2345|8)\)\)/
1314
1305
  sqls.should == []
@@ -1320,7 +1311,7 @@ describe Sequel::Model, "one_to_many" do
1320
1311
  n = @c2.load(:id => 1234, :x=>5)
1321
1312
  a = @c1.load(:id => 2345, :node_id=>1234, :y=>5)
1322
1313
  n.remove_attribute(a).should == a
1323
- sqls = MODEL_DB.sqls
1314
+ sqls = DB.sqls
1324
1315
  sqls.pop.should =~ /UPDATE attributes SET (node_id|y) = NULL, (node_id|y) = NULL WHERE \(id = 2345\)/
1325
1316
  sqls.should == ["SELECT 1 AS one FROM attributes WHERE ((attributes.node_id = 1234) AND (attributes.y = 5) AND (id = 2345)) LIMIT 1"]
1326
1317
  end
@@ -1331,7 +1322,7 @@ describe Sequel::Model, "one_to_many" do
1331
1322
  n = @c2.new(:id => 123)
1332
1323
  @c1.dataset._fetch = {:id=>234, :node_id=>123, :y=>5}
1333
1324
  n.remove_attribute([234, 5]).should == @c1.load(:node_id => nil, :y => 5, :id => 234)
1334
- sqls = MODEL_DB.sqls
1325
+ sqls = DB.sqls
1335
1326
  sqls.length.should == 2
1336
1327
  sqls.first.should =~ /SELECT \* FROM attributes WHERE \(\(attributes.node_id = 123\) AND \(attributes\.(id|y) = (234|5)\) AND \(attributes\.(id|y) = (234|5)\)\) LIMIT 1/
1337
1328
  sqls.last.should =~ /UPDATE attributes SET node_id = NULL WHERE \(\((id|y) = (234|5)\) AND \((id|y) = (234|5)\)\)/
@@ -1425,7 +1416,7 @@ describe Sequel::Model, "one_to_many" do
1425
1416
  end
1426
1417
  @c2.new(:id => 1234).all_other_attributes_dataset.sql.should == 'SELECT * FROM attributes WHERE ((nodeid != 1234) AND (xxx = 5)) ORDER BY a LIMIT 10'
1427
1418
  @c2.new(:id => 1234).all_other_attributes.should == [@c1.load({})]
1428
- MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE ((nodeid != 1234) AND (xxx = 5)) ORDER BY a LIMIT 10']
1419
+ DB.sqls.should == ['SELECT * FROM attributes WHERE ((nodeid != 1234) AND (xxx = 5)) ORDER BY a LIMIT 10']
1429
1420
  end
1430
1421
 
1431
1422
  it "should support a :limit option" do
@@ -1446,7 +1437,7 @@ describe Sequel::Model, "one_to_many" do
1446
1437
  n.associations.include?(:attributes).should == false
1447
1438
  atts = n.attributes
1448
1439
  atts.should == n.associations[:attributes]
1449
- MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE (attributes.node_id = 1234)']
1440
+ DB.sqls.should == ['SELECT * FROM attributes WHERE (attributes.node_id = 1234)']
1450
1441
  end
1451
1442
 
1452
1443
  it "should use cache if available" do
@@ -1454,7 +1445,7 @@ describe Sequel::Model, "one_to_many" do
1454
1445
  n = @c2.new(:id => 1234)
1455
1446
  n.associations[:attributes] = 42
1456
1447
  n.attributes.should == 42
1457
- MODEL_DB.sqls.should == []
1448
+ DB.sqls.should == []
1458
1449
  end
1459
1450
 
1460
1451
  it "should not use cache if asked to reload" do
@@ -1462,7 +1453,7 @@ describe Sequel::Model, "one_to_many" do
1462
1453
  n = @c2.new(:id => 1234)
1463
1454
  n.associations[:attributes] = 42
1464
1455
  n.attributes(true).should_not == 42
1465
- MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE (attributes.node_id = 1234)']
1456
+ DB.sqls.should == ['SELECT * FROM attributes WHERE (attributes.node_id = 1234)']
1466
1457
  end
1467
1458
 
1468
1459
  it "should add item to cache if it exists when calling add_" do
@@ -1540,10 +1531,10 @@ describe Sequel::Model, "one_to_many" do
1540
1531
 
1541
1532
  n = @c2.new(:id => 1234)
1542
1533
  atts = n.attributes
1543
- MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE (attributes.node_id = 1234)']
1534
+ DB.sqls.should == ['SELECT * FROM attributes WHERE (attributes.node_id = 1234)']
1544
1535
  atts.should == [@c1.load({})]
1545
1536
  atts.map{|a| a.node}.should == [n]
1546
- MODEL_DB.sqls.should == []
1537
+ DB.sqls.should == []
1547
1538
  end
1548
1539
 
1549
1540
  it "should use an explicit :reciprocal option if given" do
@@ -1551,16 +1542,16 @@ describe Sequel::Model, "one_to_many" do
1551
1542
 
1552
1543
  n = @c2.new(:id => 1234)
1553
1544
  atts = n.attributes
1554
- MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE (attributes.node_id = 1234)']
1545
+ DB.sqls.should == ['SELECT * FROM attributes WHERE (attributes.node_id = 1234)']
1555
1546
  atts.should == [@c1.load({})]
1556
1547
  atts.map{|a| a.associations[:wxyz]}.should == [n]
1557
- MODEL_DB.sqls.should == []
1548
+ DB.sqls.should == []
1558
1549
  end
1559
1550
 
1560
1551
  it "should have an remove_all_ method that removes all associated objects" do
1561
1552
  @c2.one_to_many :attributes, :class => @c1
1562
1553
  @c2.new(:id => 1234).remove_all_attributes
1563
- MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = NULL WHERE (node_id = 1234)']
1554
+ DB.sqls.should == ['UPDATE attributes SET node_id = NULL WHERE (node_id = 1234)']
1564
1555
  end
1565
1556
 
1566
1557
  it "should have remove_all method respect association filters" do
@@ -1568,19 +1559,19 @@ describe Sequel::Model, "one_to_many" do
1568
1559
  ds.filter(:b=>2)
1569
1560
  end
1570
1561
  @c2.new(:id => 1234).remove_all_attributes
1571
- MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = NULL WHERE ((a = 1) AND (node_id = 1234) AND (b = 2))']
1562
+ DB.sqls.should == ['UPDATE attributes SET node_id = NULL WHERE ((a = 1) AND (node_id = 1234) AND (b = 2))']
1572
1563
  end
1573
1564
 
1574
1565
  it "should have the remove_all_ method respect the :primary_key option" do
1575
1566
  @c2.one_to_many :attributes, :class => @c1, :primary_key=>:xxx
1576
1567
  @c2.new(:id => 1234, :xxx=>5).remove_all_attributes
1577
- MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = NULL WHERE (node_id = 5)']
1568
+ DB.sqls.should == ['UPDATE attributes SET node_id = NULL WHERE (node_id = 5)']
1578
1569
  end
1579
1570
 
1580
1571
  it "should have the remove_all_ method respect composite keys" do
1581
1572
  @c2.one_to_many :attributes, :class => @c1, :key=>[:node_id, :y], :primary_key=>[:id, :x]
1582
1573
  @c2.new(:id => 1234, :x=>5).remove_all_attributes
1583
- sqls = MODEL_DB.sqls
1574
+ sqls = DB.sqls
1584
1575
  sqls.pop.should =~ /UPDATE attributes SET (node_id|y) = NULL, (node_id|y) = NULL WHERE \(\(node_id = 1234\) AND \(y = 5\)\)/
1585
1576
  sqls.should == []
1586
1577
  end
@@ -1800,11 +1791,6 @@ describe Sequel::Model, "one_to_many" do
1800
1791
  p.remove_attribute(c).should == nil
1801
1792
  p.attributes.should == [c]
1802
1793
  end
1803
-
1804
- qspecify "should raise an error if trying to use the :one_to_one option" do
1805
- proc{@c2.one_to_many :attribute, :class => @c1, :one_to_one=>true}.should raise_error(Sequel::Error)
1806
- proc{@c2.associate :one_to_many, :attribute, :class => @c1, :one_to_one=>true}.should raise_error(Sequel::Error)
1807
- end
1808
1794
  end
1809
1795
 
1810
1796
  describe Sequel::Model, "many_to_many" do
@@ -1829,7 +1815,7 @@ describe Sequel::Model, "many_to_many" do
1829
1815
  @c1.dataset.autoid = 1
1830
1816
 
1831
1817
  [@c1, @c2].each{|c| c.dataset._fetch = {}}
1832
- MODEL_DB.reset
1818
+ DB.reset
1833
1819
  end
1834
1820
 
1835
1821
  it "should use implicit key values and join table if omitted" do
@@ -1901,7 +1887,7 @@ describe Sequel::Model, "many_to_many" do
1901
1887
  it "should not issue query if not all keys have values" do
1902
1888
  @c2.many_to_many :attributes, :class => @c1, :left_key=>[:l1, :l2], :right_key=>[:r1, :r2], :left_primary_key=>[:id, :x], :right_primary_key=>[:id, :y]
1903
1889
  @c2.load(:id => 1234, :x=>nil).attributes.should == []
1904
- MODEL_DB.sqls.should == []
1890
+ DB.sqls.should == []
1905
1891
  end
1906
1892
 
1907
1893
  it "should raise an Error unless same number of composite keys used" do
@@ -1959,7 +1945,7 @@ describe Sequel::Model, "many_to_many" do
1959
1945
  n.xxx = 555
1960
1946
  n.attributes_dataset.sql.should == 'SELECT * FROM attributes NATURAL JOIN an WHERE ((an.nodeid = 1234) AND (xxx = 555)) ORDER BY a LIMIT 10'
1961
1947
  n.attributes.should == [@c1.load({})]
1962
- MODEL_DB.sqls.should == ['SELECT * FROM attributes NATURAL JOIN an WHERE ((an.nodeid = 1234) AND (xxx = 555)) ORDER BY a LIMIT 10']
1948
+ DB.sqls.should == ['SELECT * FROM attributes NATURAL JOIN an WHERE ((an.nodeid = 1234) AND (xxx = 555)) ORDER BY a LIMIT 10']
1963
1949
  end
1964
1950
 
1965
1951
  it "should support a :dataset option that accepts the reflection as an argument" do
@@ -1971,7 +1957,7 @@ describe Sequel::Model, "many_to_many" do
1971
1957
  n.xxx = 555
1972
1958
  n.attributes_dataset.sql.should == 'SELECT * FROM attributes NATURAL JOIN an WHERE ((an.nodeid = 1234) AND (xxx = 555)) ORDER BY a LIMIT 10'
1973
1959
  n.attributes.should == [@c1.load({})]
1974
- MODEL_DB.sqls.should == ['SELECT * FROM attributes NATURAL JOIN an WHERE ((an.nodeid = 1234) AND (xxx = 555)) ORDER BY a LIMIT 10']
1960
+ DB.sqls.should == ['SELECT * FROM attributes NATURAL JOIN an WHERE ((an.nodeid = 1234) AND (xxx = 555)) ORDER BY a LIMIT 10']
1975
1961
  end
1976
1962
 
1977
1963
  it "should support a :limit option" do
@@ -1994,7 +1980,7 @@ describe Sequel::Model, "many_to_many" do
1994
1980
  a.should == n.add_attribute(a)
1995
1981
  a.should == n.remove_attribute(a)
1996
1982
  n.remove_all_attributes
1997
- sqls = MODEL_DB.sqls
1983
+ sqls = DB.sqls
1998
1984
  ['INSERT INTO attribute2node (node_id, attribute_id) VALUES (1234, 2345)',
1999
1985
  'INSERT INTO attribute2node (attribute_id, node_id) VALUES (2345, 1234)'].should(include(sqls.shift))
2000
1986
  ["DELETE FROM attribute2node WHERE ((node_id = 1234) AND (attribute_id = 2345))",
@@ -2008,7 +1994,7 @@ describe Sequel::Model, "many_to_many" do
2008
1994
  n = @c2.load(:id => 1234)
2009
1995
  a = @c1.load(:id => 2345)
2010
1996
  n.add_attribute(a).should == a
2011
- sqls = MODEL_DB.sqls
1997
+ sqls = DB.sqls
2012
1998
  ['INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (1234, 2345)',
2013
1999
  'INSERT INTO attributes_nodes (attribute_id, node_id) VALUES (2345, 1234)'].should(include(sqls.shift))
2014
2000
  sqls.should == []
@@ -2021,7 +2007,7 @@ describe Sequel::Model, "many_to_many" do
2021
2007
  a = @c1.load(:id => 2345)
2022
2008
  @c1.dataset._fetch = {:id=>2345}
2023
2009
  n.add_attribute(2345).should == a
2024
- sqls = MODEL_DB.sqls
2010
+ sqls = DB.sqls
2025
2011
  ['INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (1234, 2345)',
2026
2012
  'INSERT INTO attributes_nodes (attribute_id, node_id) VALUES (2345, 1234)'].should(include(sqls.pop))
2027
2013
  sqls.should == ["SELECT * FROM attributes WHERE id = 2345"]
@@ -2033,7 +2019,7 @@ describe Sequel::Model, "many_to_many" do
2033
2019
  n = @c2.load(:id => 1234)
2034
2020
  @c1.dataset._fetch = @c1.instance_dataset._fetch = {:id=>1}
2035
2021
  n.add_attribute(:id => 1).should == @c1.load(:id => 1)
2036
- sqls = MODEL_DB.sqls
2022
+ sqls = DB.sqls
2037
2023
  ['INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (1234, 1)',
2038
2024
  'INSERT INTO attributes_nodes (attribute_id, node_id) VALUES (1, 1234)'
2039
2025
  ].should(include(sqls.pop))
@@ -2046,7 +2032,7 @@ describe Sequel::Model, "many_to_many" do
2046
2032
  n = @c2.new(:id => 1234)
2047
2033
  a = @c1.new(:id => 2345)
2048
2034
  n.remove_attribute(a).should == a
2049
- MODEL_DB.sqls.should == ['DELETE FROM attributes_nodes WHERE ((node_id = 1234) AND (attribute_id = 2345))']
2035
+ DB.sqls.should == ['DELETE FROM attributes_nodes WHERE ((node_id = 1234) AND (attribute_id = 2345))']
2050
2036
  end
2051
2037
 
2052
2038
  it "should raise an error in the add_ method if the passed associated object is not of the correct type" do
@@ -2059,7 +2045,7 @@ describe Sequel::Model, "many_to_many" do
2059
2045
  n = @c2.new(:id => 1234)
2060
2046
  @c1.dataset._fetch = {:id=>234}
2061
2047
  n.remove_attribute(234).should == @c1.load(:id => 234)
2062
- MODEL_DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) WHERE (attributes.id = 234) LIMIT 1",
2048
+ DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) WHERE (attributes.id = 234) LIMIT 1",
2063
2049
  "DELETE FROM attributes_nodes WHERE ((node_id = 1234) AND (attribute_id = 234))"]
2064
2050
  end
2065
2051
 
@@ -2074,7 +2060,7 @@ describe Sequel::Model, "many_to_many" do
2074
2060
  n = @c2.load(:id => 1234).set(:xxx=>5)
2075
2061
  a = @c1.load(:id => 2345).set(:yyy=>8)
2076
2062
  n.add_attribute(a).should == a
2077
- sqls = MODEL_DB.sqls
2063
+ sqls = DB.sqls
2078
2064
  ['INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (5, 8)',
2079
2065
  'INSERT INTO attributes_nodes (attribute_id, node_id) VALUES (8, 5)'
2080
2066
  ].should(include(sqls.pop))
@@ -2097,7 +2083,7 @@ describe Sequel::Model, "many_to_many" do
2097
2083
  n = @c2.load(:id => 1234, :x=>5)
2098
2084
  a = @c1.load(:id => 2345, :z=>8)
2099
2085
  a.should == n.add_attribute(a)
2100
- sqls = MODEL_DB.sqls
2086
+ sqls = DB.sqls
2101
2087
  m = /INSERT INTO attributes_nodes \((\w+), (\w+), (\w+), (\w+)\) VALUES \((\d+), (\d+), (\d+), (\d+)\)/.match(sqls.pop)
2102
2088
  sqls.should == []
2103
2089
  m.should_not == nil
@@ -2121,7 +2107,7 @@ describe Sequel::Model, "many_to_many" do
2121
2107
  a = @c1.load(:id => 2345, :z=>8)
2122
2108
  @c1.dataset._fetch = {:id => 2345, :z=>8}
2123
2109
  n.add_attribute([2345, 8]).should == a
2124
- sqls = MODEL_DB.sqls
2110
+ sqls = DB.sqls
2125
2111
  sqls.shift.should =~ /SELECT \* FROM attributes WHERE \(\((id|z) = (8|2345)\) AND \((id|z) = (8|2345)\)\) LIMIT 1/
2126
2112
  sqls.pop.should =~ /INSERT INTO attributes_nodes \([lr][12], [lr][12], [lr][12], [lr][12]\) VALUES \((1234|5|2345|8), (1234|5|2345|8), (1234|5|2345|8), (1234|5|2345|8)\)/
2127
2113
  sqls.should == []
@@ -2133,7 +2119,7 @@ describe Sequel::Model, "many_to_many" do
2133
2119
  n = @c2.new(:id => 1234, :xxx=>5)
2134
2120
  a = @c1.new(:id => 2345, :yyy=>8)
2135
2121
  n.remove_attribute(a).should == a
2136
- MODEL_DB.sqls.should == ['DELETE FROM attributes_nodes WHERE ((node_id = 5) AND (attribute_id = 8))']
2122
+ DB.sqls.should == ['DELETE FROM attributes_nodes WHERE ((node_id = 5) AND (attribute_id = 8))']
2137
2123
  end
2138
2124
 
2139
2125
  it "should have the remove_ method respect composite keys" do
@@ -2141,7 +2127,7 @@ describe Sequel::Model, "many_to_many" do
2141
2127
  n = @c2.load(:id => 1234, :x=>5)
2142
2128
  a = @c1.load(:id => 2345, :z=>8)
2143
2129
  a.should == n.remove_attribute(a)
2144
- MODEL_DB.sqls.should == ["DELETE FROM attributes_nodes WHERE ((l1 = 1234) AND (l2 = 5) AND (r1 = 2345) AND (r2 = 8))"]
2130
+ DB.sqls.should == ["DELETE FROM attributes_nodes WHERE ((l1 = 1234) AND (l2 = 5) AND (r1 = 2345) AND (r2 = 8))"]
2145
2131
  end
2146
2132
 
2147
2133
  it "should accept a array of composite primary key values for the remove_ method and remove an existing record" do
@@ -2150,7 +2136,7 @@ describe Sequel::Model, "many_to_many" do
2150
2136
  n = @c2.new(:id => 1234)
2151
2137
  @c1.dataset._fetch = {:id=>234, :y=>8}
2152
2138
  @c1.load(:id => 234, :y=>8).should == n.remove_attribute([234, 8])
2153
- sqls = MODEL_DB.sqls
2139
+ sqls = DB.sqls
2154
2140
  ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) WHERE ((attributes.id = 234) AND (attributes.y = 8)) LIMIT 1",
2155
2141
  "SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)) WHERE ((attributes.y = 8) AND (attributes.id = 234)) LIMIT 1"].should include(sqls.shift)
2156
2142
  sqls.should == ["DELETE FROM attributes_nodes WHERE ((node_id = 1234) AND (attribute_id = 234))"]
@@ -2214,7 +2200,7 @@ describe Sequel::Model, "many_to_many" do
2214
2200
  @c2.many_to_many :attributes, :class => @c1
2215
2201
 
2216
2202
  @c2.new(:id => 1234).attributes.should == [@c1.load({})]
2217
- MODEL_DB.sqls.should == ['SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234))']
2203
+ DB.sqls.should == ['SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234))']
2218
2204
  end
2219
2205
 
2220
2206
  it "should populate cache when accessed" do
@@ -2232,7 +2218,7 @@ describe Sequel::Model, "many_to_many" do
2232
2218
  n = @c2.new(:id => 1234)
2233
2219
  n.associations[:attributes] = 42
2234
2220
  n.attributes.should == 42
2235
- MODEL_DB.sqls.should == []
2221
+ DB.sqls.should == []
2236
2222
  end
2237
2223
 
2238
2224
  it "should not use cache if asked to reload" do
@@ -2241,7 +2227,7 @@ describe Sequel::Model, "many_to_many" do
2241
2227
  n = @c2.new(:id => 1234)
2242
2228
  n.associations[:attributes] = 42
2243
2229
  n.attributes(true).should_not == 42
2244
- MODEL_DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234))"]
2230
+ DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234))"]
2245
2231
  end
2246
2232
 
2247
2233
  it "should add item to cache if it exists when calling add_" do
@@ -2317,19 +2303,19 @@ describe Sequel::Model, "many_to_many" do
2317
2303
  it "should have an remove_all_ method that removes all associations" do
2318
2304
  @c2.many_to_many :attributes, :class => @c1
2319
2305
  @c2.new(:id => 1234).remove_all_attributes
2320
- MODEL_DB.sqls.should == ['DELETE FROM attributes_nodes WHERE (node_id = 1234)']
2306
+ DB.sqls.should == ['DELETE FROM attributes_nodes WHERE (node_id = 1234)']
2321
2307
  end
2322
2308
 
2323
2309
  it "should have the remove_all_ method respect the :left_primary_key option" do
2324
2310
  @c2.many_to_many :attributes, :class => @c1, :left_primary_key=>:xxx
2325
2311
  @c2.new(:id => 1234, :xxx=>5).remove_all_attributes
2326
- MODEL_DB.sqls.should == ['DELETE FROM attributes_nodes WHERE (node_id = 5)']
2312
+ DB.sqls.should == ['DELETE FROM attributes_nodes WHERE (node_id = 5)']
2327
2313
  end
2328
2314
 
2329
2315
  it "should have the remove_all_ method respect composite keys" do
2330
2316
  @c2.many_to_many :attributes, :class => @c1, :left_primary_key=>[:id, :x], :left_key=>[:l1, :l2]
2331
2317
  @c2.load(:id => 1234, :x=>5).remove_all_attributes
2332
- MODEL_DB.sqls.should == ['DELETE FROM attributes_nodes WHERE ((l1 = 1234) AND (l2 = 5))']
2318
+ DB.sqls.should == ['DELETE FROM attributes_nodes WHERE ((l1 = 1234) AND (l2 = 5))']
2333
2319
  end
2334
2320
 
2335
2321
  it "remove_all should set the cached instance variable to []" do
@@ -2376,7 +2362,7 @@ describe Sequel::Model, "many_to_many" do
2376
2362
  o.add_attribute(@c1.load(:id=>44))
2377
2363
  o.remove_attribute(@c1.load(:id=>45))
2378
2364
  o.remove_all_attributes
2379
- sqls = MODEL_DB.sqls
2365
+ sqls = DB.sqls
2380
2366
  sqls.shift =~ /INSERT INTO attributes_nodes \((node_id|attribute_id), (node_id|attribute_id)\) VALUES \((1234|44), (1234|44)\)/
2381
2367
  sqls.should == ["DELETE FROM attributes_nodes WHERE ((x = 123) AND (node_id = 1234) AND (attribute_id = 45))",
2382
2368
  "DELETE FROM attributes_nodes WHERE ((x = 123) AND (node_id = 1234))"]
@@ -2392,7 +2378,7 @@ describe Sequel::Model, "many_to_many" do
2392
2378
  end
2393
2379
  p.add_attribute(c)
2394
2380
  p.instance_variable_get(:@x).should == c
2395
- MODEL_DB.sqls.should == []
2381
+ DB.sqls.should == []
2396
2382
  end
2397
2383
 
2398
2384
  it "should support an :adder option for defining the _add_ method" do
@@ -2401,7 +2387,7 @@ describe Sequel::Model, "many_to_many" do
2401
2387
  c = @c1.load(:id=>123)
2402
2388
  p.add_attribute(c)
2403
2389
  p.instance_variable_get(:@x).should == c
2404
- MODEL_DB.sqls.should == []
2390
+ DB.sqls.should == []
2405
2391
  end
2406
2392
 
2407
2393
  it "should allow additional arguments given to the add_ method and pass them onwards to the _add_ method" do
@@ -2427,7 +2413,7 @@ describe Sequel::Model, "many_to_many" do
2427
2413
  end
2428
2414
  p.remove_attribute(c)
2429
2415
  p.instance_variable_get(:@x).should == c
2430
- MODEL_DB.sqls.should == []
2416
+ DB.sqls.should == []
2431
2417
  end
2432
2418
 
2433
2419
  it "should support a :remover option for defining the _remove_ method" do
@@ -2436,7 +2422,7 @@ describe Sequel::Model, "many_to_many" do
2436
2422
  c = @c1.load(:id=>123)
2437
2423
  p.remove_attribute(c)
2438
2424
  p.instance_variable_get(:@x).should == c
2439
- MODEL_DB.sqls.should == []
2425
+ DB.sqls.should == []
2440
2426
  end
2441
2427
 
2442
2428
  it "should allow additional arguments given to the remove_ method and pass them onwards to the _remove_ method" do
@@ -2471,7 +2457,7 @@ describe Sequel::Model, "many_to_many" do
2471
2457
  end
2472
2458
  p.remove_all_attributes
2473
2459
  p.instance_variable_get(:@x).should == :foo
2474
- MODEL_DB.sqls.should == []
2460
+ DB.sqls.should == []
2475
2461
  end
2476
2462
 
2477
2463
  it "should support a :clearer option for defining the _remove_all_ method" do
@@ -2479,7 +2465,7 @@ describe Sequel::Model, "many_to_many" do
2479
2465
  p = @c2.load(:id=>10)
2480
2466
  p.remove_all_attributes
2481
2467
  p.instance_variable_get(:@x).should == :foo
2482
- MODEL_DB.sqls.should == []
2468
+ DB.sqls.should == []
2483
2469
  end
2484
2470
 
2485
2471
  it "should support (before|after)_(add|remove) callbacks" do
@@ -2575,7 +2561,7 @@ describe Sequel::Model, "many_to_many" do
2575
2561
  ds.filter(:name=>'John')
2576
2562
  end
2577
2563
  @c2.load(:id=>1).remove_all_attributes
2578
- MODEL_DB.sqls.should == ["DELETE FROM attributes_nodes WHERE (node_id = 1)"]
2564
+ DB.sqls.should == ["DELETE FROM attributes_nodes WHERE (node_id = 1)"]
2579
2565
  end
2580
2566
 
2581
2567
  it "should use assocation's dataset when grabbing a record to remove from the assocation by primary key" do
@@ -2584,7 +2570,7 @@ describe Sequel::Model, "many_to_many" do
2584
2570
  end
2585
2571
  @c1.dataset._fetch = {:id=>2}
2586
2572
  @c2.load(:id=>1).remove_attribute(2)
2587
- MODEL_DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1)) WHERE ((join_table_att = 3) AND (attributes.id = 2)) LIMIT 1",
2573
+ DB.sqls.should == ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON ((attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1)) WHERE ((join_table_att = 3) AND (attributes.id = 2)) LIMIT 1",
2588
2574
  "DELETE FROM attributes_nodes WHERE ((node_id = 1) AND (attribute_id = 2))"]
2589
2575
  end
2590
2576
  end
@@ -3227,47 +3213,13 @@ describe "Sequel::Model Associations with non-column expression keys" do
3227
3213
  end
3228
3214
  end
3229
3215
 
3230
- describe "Model#pk_or_nil" do
3231
- before do
3232
- @m = Class.new(Sequel::Model)
3233
- @m.columns :id, :x, :y
3234
- end
3235
-
3236
- qspecify "should be default return the value of the :id column" do
3237
- m = @m.load(:id => 111, :x => 2, :y => 3)
3238
- m.pk_or_nil.should == 111
3239
- end
3240
-
3241
- qspecify "should be return the primary key value for custom primary key" do
3242
- @m.set_primary_key :x
3243
- m = @m.load(:id => 111, :x => 2, :y => 3)
3244
- m.pk_or_nil.should == 2
3245
- end
3246
-
3247
- qspecify "should be return the primary key value for composite primary key" do
3248
- @m.set_primary_key [:y, :x]
3249
- m = @m.load(:id => 111, :x => 2, :y => 3)
3250
- m.pk_or_nil.should == [3, 2]
3251
- end
3252
-
3253
- qspecify "should not raise if no primary key" do
3254
- @m.set_primary_key nil
3255
- m = @m.new(:id => 111, :x => 2, :y => 3)
3256
- m.pk_or_nil.should be_nil
3257
-
3258
- @m.no_primary_key
3259
- m = @m.new(:id => 111, :x => 2, :y => 3)
3260
- m.pk_or_nil.should be_nil
3261
- end
3262
- end
3263
-
3264
3216
  describe Sequel::Model, "#refresh" do
3265
3217
  before do
3266
3218
  @c = Class.new(Sequel::Model(:items)) do
3267
3219
  unrestrict_primary_key
3268
3220
  columns :id, :x
3269
3221
  end
3270
- MODEL_DB.reset
3222
+ DB.reset
3271
3223
  end
3272
3224
 
3273
3225
  specify "should remove cached associations" do
@@ -3290,7 +3242,7 @@ describe "Model#freeze" do
3290
3242
  one_to_one :b, :key=>:album_id, :class=>B
3291
3243
  end
3292
3244
  @o = Album.load(:id=>1).freeze
3293
- MODEL_DB.sqls
3245
+ DB.sqls
3294
3246
  end
3295
3247
  after do
3296
3248
  Object.send(:remove_const, :Album)
@@ -3312,3 +3264,102 @@ describe "Model#freeze" do
3312
3264
  @o.associations[:b].should be_nil
3313
3265
  end
3314
3266
  end
3267
+
3268
+ describe "association autoreloading" do
3269
+ before do
3270
+ @c = Class.new(Sequel::Model)
3271
+ @Artist = Class.new(@c).set_dataset(:artists)
3272
+ @Artist.dataset._fetch = {:id=>2, :name=>'Ar'}
3273
+ @Album = Class.new(@c).set_dataset(:albums)
3274
+ @Artist.columns :id, :name
3275
+ @Album.columns :id, :name, :artist_id
3276
+ @Album.db_schema[:artist_id][:type] = :integer
3277
+ @Album.many_to_one :artist, :class=>@Artist
3278
+ DB.reset
3279
+ end
3280
+
3281
+ specify "should reload many_to_one association when foreign key is modified" do
3282
+ album = @Album.load(:id => 1, :name=>'Al', :artist_id=>2)
3283
+ album.artist
3284
+ DB.sqls.should == ['SELECT * FROM artists WHERE id = 2']
3285
+
3286
+ album.artist_id = 1
3287
+ album.artist
3288
+ DB.sqls.should == ['SELECT * FROM artists WHERE id = 1']
3289
+ end
3290
+
3291
+ specify "should handle multiple many_to_one association with the same foreign key" do
3292
+ @Album.many_to_one :artist2, :key=>:artist_id, :class=>@Artist
3293
+ album = @Album.load(:id => 1, :name=>'Al', :artist_id=>2)
3294
+ album.artist
3295
+ album.artist2
3296
+ DB.sqls.should == ['SELECT * FROM artists WHERE id = 2'] * 2
3297
+
3298
+ album.artist
3299
+ album.artist2
3300
+ DB.sqls.should == []
3301
+
3302
+ album.artist_id = 1
3303
+ album.artist
3304
+ album.artist2
3305
+ DB.sqls.should == ['SELECT * FROM artists WHERE id = 1'] * 2
3306
+ end
3307
+
3308
+ specify "should not reload when value has not changed" do
3309
+ album = @Album.load(:id => 1, :name=>'Al', :artist_id=>2)
3310
+ album.artist
3311
+ DB.sqls.should == ['SELECT * FROM artists WHERE id = 2']
3312
+
3313
+ album.artist_id = 2
3314
+ album.artist
3315
+ DB.sqls.should == []
3316
+
3317
+ album.artist_id = "2"
3318
+ album.artist
3319
+ DB.sqls.should == []
3320
+ end
3321
+
3322
+ specify "should reload all associations which use the foreign key" do
3323
+ @Album.many_to_one :other_artist, :key => :artist_id, :foreign_key => :id, :class => @Artist
3324
+ album = @Album.load(:id => 1, :name=>'Al', :artist_id=>2)
3325
+ album.artist
3326
+ album.other_artist
3327
+ DB.reset
3328
+
3329
+ album.artist_id = 1
3330
+ album.artist
3331
+ DB.sqls.should == ['SELECT * FROM artists WHERE id = 1']
3332
+
3333
+ album.other_artist
3334
+ DB.sqls.should == ['SELECT * FROM artists WHERE id = 1']
3335
+ end
3336
+
3337
+ specify "should work with composite keys" do
3338
+ @Album.many_to_one :composite_artist, :key => [:artist_id, :name], :primary_key => [:id, :name], :class => @Artist
3339
+ album = @Album.load(:id => 1, :name=>'Al', :artist_id=>2)
3340
+ album.composite_artist
3341
+ DB.reset
3342
+
3343
+ album.artist_id = 1
3344
+ album.composite_artist
3345
+ DB.sqls.should == ["SELECT * FROM artists WHERE ((artists.id = 1) AND (artists.name = 'Al')) LIMIT 1"]
3346
+
3347
+ album.name = 'Al2'
3348
+ album.composite_artist
3349
+ DB.sqls.should == ["SELECT * FROM artists WHERE ((artists.id = 1) AND (artists.name = 'Al2')) LIMIT 1"]
3350
+ end
3351
+
3352
+ specify "should work with subclasses" do
3353
+ salbum = Class.new(@Album)
3354
+ oartist = Class.new(@c).set_dataset(:oartist)
3355
+ oartist.columns :id, :name
3356
+ salbum.many_to_one :artist2, :class=>oartist, :key=>:artist_id
3357
+ album = salbum.load(:id => 1, :name=>'Al', :artist_id=>2)
3358
+ album.artist
3359
+ DB.sqls.should == ['SELECT * FROM artists WHERE id = 2']
3360
+
3361
+ album.artist_id = 1
3362
+ album.artist
3363
+ DB.sqls.should == ['SELECT * FROM artists WHERE id = 1']
3364
+ end
3365
+ end