sequel 3.48.0 → 4.0.0

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