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
@@ -115,7 +115,7 @@ describe Sequel::Model, ".plugin" do
115
115
  m.args.should == [[b, 123, {1=>2}], [b2, 234, {2=>3}]]
116
116
  end
117
117
 
118
- it "should call things in the following order: apply, InstanceMethods, ClassMethods, DatasetMethods, configure" do
118
+ it "should call things in the following order: apply, ClassMethods, InstanceMethods, DatasetMethods, configure" do
119
119
  m = Module.new do
120
120
  @args = []
121
121
  def self.args; @args; end
@@ -144,9 +144,9 @@ describe Sequel::Model, ".plugin" do
144
144
 
145
145
  b = lambda{44}
146
146
  @c.plugin(m, 123, 1=>2, &b)
147
- m.args.should == [:apply, :im, :cm, :dm, :configure]
147
+ m.args.should == [:apply, :cm, :im, :dm, :configure]
148
148
  @c.plugin(m, 234, 2=>3, &b)
149
- m.args.should == [:apply, :im, :cm, :dm, :configure, :configure]
149
+ m.args.should == [:apply, :cm, :im, :dm, :configure, :configure]
150
150
  end
151
151
 
152
152
  it "should include an InstanceMethods module in the class if the plugin includes it" do
@@ -173,30 +173,16 @@ describe Sequel::Model, ".plugin" do
173
173
  it "should save the DatasetMethods module and apply it later if the class doesn't have a dataset" do
174
174
  c = Class.new(Sequel::Model)
175
175
  c.plugin @t
176
- c.dataset = MODEL_DB[:i]
176
+ c.dataset = DB[:i]
177
177
  c.dataset.ghi.should == 345
178
178
  end
179
179
 
180
180
  it "should save the DatasetMethods module and apply it later if the class has a dataset" do
181
181
  @c.plugin @t
182
- @c.dataset = MODEL_DB[:i]
182
+ @c.dataset = DB[:i]
183
183
  @c.dataset.ghi.should == 345
184
184
  end
185
185
 
186
- qspecify "should define class methods for all public instance methods in DatasetMethod" do
187
- m = Module.new do
188
- self::DatasetMethods = Module.new do
189
- def a; 1; end
190
- def b; 2; end
191
- end
192
- end
193
- @c.plugin m
194
- @c.dataset.a.should == 1
195
- @c.dataset.b.should == 2
196
- @c.a.should == 1
197
- @c.b.should == 2
198
- end
199
-
200
186
  it "should not define class methods for private instance methods in DatasetMethod" do
201
187
  m = Module.new do
202
188
  self::DatasetMethods = Module.new do
@@ -43,13 +43,13 @@ describe "Model#save" do
43
43
  columns :id, :x, :y
44
44
  end
45
45
  @c.instance_dataset.autoid = @c.dataset.autoid = 13
46
- MODEL_DB.reset
46
+ DB.reset
47
47
  end
48
48
 
49
49
  it "should insert a record for a new model instance" do
50
50
  o = @c.new(:x => 1)
51
51
  o.save
52
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 13) LIMIT 1"]
52
+ DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 13) LIMIT 1"]
53
53
  end
54
54
 
55
55
  it "should use dataset's insert_select method if present" do
@@ -63,7 +63,7 @@ describe "Model#save" do
63
63
  o.save
64
64
 
65
65
  o.values.should == {:y=>2}
66
- MODEL_DB.sqls.should == ["INSERT INTO items (y) VALUES (2) RETURNING *"]
66
+ DB.sqls.should == ["INSERT INTO items (y) VALUES (2) RETURNING *"]
67
67
  end
68
68
 
69
69
  it "should not use dataset's insert_select method if specific columns are selected" do
@@ -75,21 +75,21 @@ describe "Model#save" do
75
75
  it "should use value returned by insert as the primary key and refresh the object" do
76
76
  o = @c.new(:x => 11)
77
77
  o.save
78
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (11)",
78
+ DB.sqls.should == ["INSERT INTO items (x) VALUES (11)",
79
79
  "SELECT * FROM items WHERE (id = 13) LIMIT 1"]
80
80
  end
81
81
 
82
82
  it "should allow you to skip refreshing by overridding _save_refresh" do
83
83
  @c.send(:define_method, :_save_refresh){}
84
84
  @c.create(:x => 11)
85
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (11)"]
85
+ DB.sqls.should == ["INSERT INTO items (x) VALUES (11)"]
86
86
  end
87
87
 
88
88
  it "should work correctly for inserting a record without a primary key" do
89
89
  @c.no_primary_key
90
90
  o = @c.new(:x => 11)
91
91
  o.save
92
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (11)"]
92
+ DB.sqls.should == ["INSERT INTO items (x) VALUES (11)"]
93
93
  end
94
94
 
95
95
  it "should set the autoincrementing_primary_key value to the value returned by insert" do
@@ -98,7 +98,7 @@ describe "Model#save" do
98
98
  o = @c.new(:x => 11)
99
99
  def o.autoincrementing_primary_key() :y end
100
100
  o.save
101
- sqls = MODEL_DB.sqls
101
+ sqls = DB.sqls
102
102
  sqls.length.should == 2
103
103
  sqls.first.should == "INSERT INTO items (x) VALUES (11)"
104
104
  sqls.last.should =~ %r{SELECT \* FROM items WHERE \(\([xy] = 1[13]\) AND \([xy] = 1[13]\)\) LIMIT 1}
@@ -107,7 +107,7 @@ describe "Model#save" do
107
107
  it "should update a record for an existing model instance" do
108
108
  o = @c.load(:id => 3, :x => 1)
109
109
  o.save
110
- MODEL_DB.sqls.should == ["UPDATE items SET x = 1 WHERE (id = 3)"]
110
+ DB.sqls.should == ["UPDATE items SET x = 1 WHERE (id = 3)"]
111
111
  end
112
112
 
113
113
  it "should raise a NoExistingObject exception if the dataset update call doesn't return 1, unless require_modification is false" do
@@ -127,16 +127,10 @@ describe "Model#save" do
127
127
  proc{o.save}.should_not raise_error
128
128
  end
129
129
 
130
- qspecify "should update only the given columns if given" do
131
- o = @c.load(:id => 3, :x => 1, :y => nil)
132
- o.save(:y)
133
- MODEL_DB.sqls.first.should == "UPDATE items SET y = NULL WHERE (id = 3)"
134
- end
135
-
136
130
  it "should respect the :columns option to specify the columns to save" do
137
131
  o = @c.load(:id => 3, :x => 1, :y => nil)
138
132
  o.save(:columns=>:y)
139
- MODEL_DB.sqls.first.should == "UPDATE items SET y = NULL WHERE (id = 3)"
133
+ DB.sqls.first.should == "UPDATE items SET y = NULL WHERE (id = 3)"
140
134
  end
141
135
 
142
136
  it "should mark saved columns as not changed" do
@@ -197,19 +191,19 @@ describe "Model#save" do
197
191
  it "should use Model's use_transactions setting by default" do
198
192
  @c.use_transactions = true
199
193
  @c.load(:id => 3, :x => 1, :y => nil).save(:columns=>:y)
200
- MODEL_DB.sqls.should == ["BEGIN", "UPDATE items SET y = NULL WHERE (id = 3)", "COMMIT"]
194
+ DB.sqls.should == ["BEGIN", "UPDATE items SET y = NULL WHERE (id = 3)", "COMMIT"]
201
195
  @c.use_transactions = false
202
196
  @c.load(:id => 3, :x => 1, :y => nil).save(:columns=>:y)
203
- MODEL_DB.sqls.should == ["UPDATE items SET y = NULL WHERE (id = 3)"]
197
+ DB.sqls.should == ["UPDATE items SET y = NULL WHERE (id = 3)"]
204
198
  end
205
199
 
206
200
  it "should inherit Model's use_transactions setting" do
207
201
  @c.use_transactions = true
208
202
  Class.new(@c).load(:id => 3, :x => 1, :y => nil).save(:columns=>:y)
209
- MODEL_DB.sqls.should == ["BEGIN", "UPDATE items SET y = NULL WHERE (id = 3)", "COMMIT"]
203
+ DB.sqls.should == ["BEGIN", "UPDATE items SET y = NULL WHERE (id = 3)", "COMMIT"]
210
204
  @c.use_transactions = false
211
205
  Class.new(@c).load(:id => 3, :x => 1, :y => nil).save(:columns=>:y)
212
- MODEL_DB.sqls.should == ["UPDATE items SET y = NULL WHERE (id = 3)"]
206
+ DB.sqls.should == ["UPDATE items SET y = NULL WHERE (id = 3)"]
213
207
  end
214
208
 
215
209
  it "should use object's use_transactions setting" do
@@ -217,23 +211,23 @@ describe "Model#save" do
217
211
  o.use_transactions = false
218
212
  @c.use_transactions = true
219
213
  o.save(:columns=>:y)
220
- MODEL_DB.sqls.should == ["UPDATE items SET y = NULL WHERE (id = 3)"]
214
+ DB.sqls.should == ["UPDATE items SET y = NULL WHERE (id = 3)"]
221
215
  o = @c.load(:id => 3, :x => 1, :y => nil)
222
216
  o.use_transactions = true
223
217
  @c.use_transactions = false
224
218
  o.save(:columns=>:y)
225
- MODEL_DB.sqls.should == ["BEGIN", "UPDATE items SET y = NULL WHERE (id = 3)", "COMMIT"]
219
+ DB.sqls.should == ["BEGIN", "UPDATE items SET y = NULL WHERE (id = 3)", "COMMIT"]
226
220
  end
227
221
 
228
222
  it "should use :transaction option if given" do
229
223
  o = @c.load(:id => 3, :x => 1, :y => nil)
230
224
  o.use_transactions = true
231
225
  o.save(:columns=>:y, :transaction=>false)
232
- MODEL_DB.sqls.should == ["UPDATE items SET y = NULL WHERE (id = 3)"]
226
+ DB.sqls.should == ["UPDATE items SET y = NULL WHERE (id = 3)"]
233
227
  o = @c.load(:id => 3, :x => 1, :y => nil)
234
228
  o.use_transactions = false
235
229
  o.save(:columns=>:y, :transaction=>true)
236
- MODEL_DB.sqls.should == ["BEGIN", "UPDATE items SET y = NULL WHERE (id = 3)", "COMMIT"]
230
+ DB.sqls.should == ["BEGIN", "UPDATE items SET y = NULL WHERE (id = 3)", "COMMIT"]
237
231
  end
238
232
 
239
233
  it "should rollback if before_save returns false and raise_on_save_failure = true" do
@@ -244,7 +238,7 @@ describe "Model#save" do
244
238
  false
245
239
  end
246
240
  proc { o.save(:columns=>:y) }.should raise_error(Sequel::BeforeHookFailed)
247
- MODEL_DB.sqls.should == ["BEGIN", "ROLLBACK"]
241
+ DB.sqls.should == ["BEGIN", "ROLLBACK"]
248
242
  end
249
243
 
250
244
  it "should rollback if before_save returns false and :raise_on_failure option is true" do
@@ -255,7 +249,7 @@ describe "Model#save" do
255
249
  false
256
250
  end
257
251
  proc { o.save(:columns=>:y, :raise_on_failure => true) }.should raise_error(Sequel::BeforeHookFailed)
258
- MODEL_DB.sqls.should == ["BEGIN", "ROLLBACK"]
252
+ DB.sqls.should == ["BEGIN", "ROLLBACK"]
259
253
  end
260
254
 
261
255
  it "should not rollback outer transactions if before_save returns false and raise_on_save_failure = false" do
@@ -265,11 +259,11 @@ describe "Model#save" do
265
259
  def o.before_save
266
260
  false
267
261
  end
268
- MODEL_DB.transaction do
262
+ DB.transaction do
269
263
  o.save(:columns=>:y).should == nil
270
- MODEL_DB.run "BLAH"
264
+ DB.run "BLAH"
271
265
  end
272
- MODEL_DB.sqls.should == ["BEGIN", "BLAH", "COMMIT"]
266
+ DB.sqls.should == ["BEGIN", "BLAH", "COMMIT"]
273
267
  end
274
268
 
275
269
  it "should rollback if before_save returns false and raise_on_save_failure = false" do
@@ -280,7 +274,7 @@ describe "Model#save" do
280
274
  false
281
275
  end
282
276
  o.save(:columns=>:y).should == nil
283
- MODEL_DB.sqls.should == ["BEGIN", "ROLLBACK"]
277
+ DB.sqls.should == ["BEGIN", "ROLLBACK"]
284
278
  end
285
279
 
286
280
  it "should not rollback if before_save throws Rollback and use_transactions = false" do
@@ -290,7 +284,7 @@ describe "Model#save" do
290
284
  raise Sequel::Rollback
291
285
  end
292
286
  proc { o.save(:columns=>:y) }.should raise_error(Sequel::Rollback)
293
- MODEL_DB.sqls.should == []
287
+ DB.sqls.should == []
294
288
  end
295
289
 
296
290
  it "should support a :server option to set the server/shard to use" do
@@ -363,7 +357,7 @@ describe "Model#freeze" do
363
357
  end
364
358
  end
365
359
  @o = Album.load(:id=>1).freeze
366
- MODEL_DB.sqls
360
+ DB.sqls
367
361
  end
368
362
  after do
369
363
  Object.send(:remove_const, :Album)
@@ -452,7 +446,7 @@ describe "Model#modified?" do
452
446
  columns :id, :x
453
447
  @db_schema = {:x => {:type => :integer}}
454
448
  end
455
- MODEL_DB.reset
449
+ DB.reset
456
450
  end
457
451
 
458
452
  it "should be true if the object is new" do
@@ -510,7 +504,7 @@ describe "Model#modified!" do
510
504
  @c.class_eval do
511
505
  columns :id, :x
512
506
  end
513
- MODEL_DB.reset
507
+ DB.reset
514
508
  end
515
509
 
516
510
  it "should mark the object as modified so that save_changes still runs the callbacks" do
@@ -542,35 +536,35 @@ describe "Model#save_changes" do
542
536
  unrestrict_primary_key
543
537
  columns :id, :x, :y
544
538
  end
545
- MODEL_DB.reset
539
+ DB.reset
546
540
  end
547
541
 
548
542
  it "should always save if the object is new" do
549
543
  o = @c.new(:x => 1)
550
544
  o.save_changes
551
- MODEL_DB.sqls.first.should == "INSERT INTO items (x) VALUES (1)"
545
+ DB.sqls.first.should == "INSERT INTO items (x) VALUES (1)"
552
546
  end
553
547
 
554
548
  it "should take options passed to save" do
555
549
  o = @c.new(:x => 1)
556
550
  def o.before_validation; false; end
557
551
  proc{o.save_changes}.should raise_error(Sequel::Error)
558
- MODEL_DB.sqls.should == []
552
+ DB.sqls.should == []
559
553
  o.save_changes(:validate=>false)
560
- MODEL_DB.sqls.first.should == "INSERT INTO items (x) VALUES (1)"
554
+ DB.sqls.first.should == "INSERT INTO items (x) VALUES (1)"
561
555
  end
562
556
 
563
557
  it "should do nothing if no changed columns" do
564
558
  o = @c.load(:id => 3, :x => 1, :y => nil)
565
559
  o.save_changes
566
- MODEL_DB.sqls.should == []
560
+ DB.sqls.should == []
567
561
  end
568
562
 
569
563
  it "should do nothing if modified? is false" do
570
564
  o = @c.load(:id => 3, :x => 1, :y => nil)
571
565
  def o.modified?; false; end
572
566
  o.save_changes
573
- MODEL_DB.sqls.should == []
567
+ DB.sqls.should == []
574
568
  end
575
569
 
576
570
  it "should update only changed columns" do
@@ -578,17 +572,17 @@ describe "Model#save_changes" do
578
572
  o.x = 2
579
573
 
580
574
  o.save_changes
581
- MODEL_DB.sqls.should == ["UPDATE items SET x = 2 WHERE (id = 3)"]
575
+ DB.sqls.should == ["UPDATE items SET x = 2 WHERE (id = 3)"]
582
576
  o.save_changes
583
577
  o.save_changes
584
- MODEL_DB.sqls.should == []
578
+ DB.sqls.should == []
585
579
 
586
580
  o.y = 4
587
581
  o.save_changes
588
- MODEL_DB.sqls.should == ["UPDATE items SET y = 4 WHERE (id = 3)"]
582
+ DB.sqls.should == ["UPDATE items SET y = 4 WHERE (id = 3)"]
589
583
  o.save_changes
590
584
  o.save_changes
591
- MODEL_DB.sqls.should == []
585
+ DB.sqls.should == []
592
586
  end
593
587
 
594
588
  it "should not consider columns changed if the values did not change" do
@@ -596,17 +590,17 @@ describe "Model#save_changes" do
596
590
  o.x = 1
597
591
 
598
592
  o.save_changes
599
- MODEL_DB.sqls.should == []
593
+ DB.sqls.should == []
600
594
  o.x = 3
601
595
  o.save_changes
602
- MODEL_DB.sqls.should == ["UPDATE items SET x = 3 WHERE (id = 3)"]
596
+ DB.sqls.should == ["UPDATE items SET x = 3 WHERE (id = 3)"]
603
597
 
604
598
  o[:y] = nil
605
599
  o.save_changes
606
- MODEL_DB.sqls.should == []
600
+ DB.sqls.should == []
607
601
  o[:y] = 4
608
602
  o.save_changes
609
- MODEL_DB.sqls.should == ["UPDATE items SET y = 4 WHERE (id = 3)"]
603
+ DB.sqls.should == ["UPDATE items SET y = 4 WHERE (id = 3)"]
610
604
  end
611
605
 
612
606
  it "should clear changed_columns" do
@@ -621,30 +615,30 @@ describe "Model#save_changes" do
621
615
  o = @c.load(:id => 3, :x => 1, :y => nil)
622
616
  @c.send(:define_method, :before_update){self.x += 1}
623
617
  o.save_changes
624
- MODEL_DB.sqls.should == []
618
+ DB.sqls.should == []
625
619
  o.x = 2
626
620
  o.save_changes
627
- MODEL_DB.sqls.should == ["UPDATE items SET x = 3 WHERE (id = 3)"]
621
+ DB.sqls.should == ["UPDATE items SET x = 3 WHERE (id = 3)"]
628
622
  o.save_changes
629
- MODEL_DB.sqls.should == []
623
+ DB.sqls.should == []
630
624
  o.x = 4
631
625
  o.save_changes
632
- MODEL_DB.sqls.should == ["UPDATE items SET x = 5 WHERE (id = 3)"]
626
+ DB.sqls.should == ["UPDATE items SET x = 5 WHERE (id = 3)"]
633
627
  end
634
628
 
635
629
  it "should update columns changed in a before_save hook" do
636
630
  o = @c.load(:id => 3, :x => 1, :y => nil)
637
631
  @c.send(:define_method, :before_update){self.x += 1}
638
632
  o.save_changes
639
- MODEL_DB.sqls.should == []
633
+ DB.sqls.should == []
640
634
  o.x = 2
641
635
  o.save_changes
642
- MODEL_DB.sqls.should == ["UPDATE items SET x = 3 WHERE (id = 3)"]
636
+ DB.sqls.should == ["UPDATE items SET x = 3 WHERE (id = 3)"]
643
637
  o.save_changes
644
- MODEL_DB.sqls.should == []
638
+ DB.sqls.should == []
645
639
  o.x = 4
646
640
  o.save_changes
647
- MODEL_DB.sqls.should == ["UPDATE items SET x = 5 WHERE (id = 3)"]
641
+ DB.sqls.should == ["UPDATE items SET x = 5 WHERE (id = 3)"]
648
642
  end
649
643
  end
650
644
 
@@ -654,7 +648,7 @@ describe "Model#new?" do
654
648
  unrestrict_primary_key
655
649
  columns :x
656
650
  end
657
- MODEL_DB.reset
651
+ DB.reset
658
652
  end
659
653
 
660
654
  it "should be true for a new instance" do
@@ -680,11 +674,6 @@ describe Sequel::Model, "with a primary key" do
680
674
  model_a.primary_key.should == :a
681
675
  end
682
676
 
683
- qspecify "should support multi argument composite keys" do
684
- model_a = Class.new(Sequel::Model){ set_primary_key :a, :b }
685
- model_a.primary_key.should == [:a, :b]
686
- end
687
-
688
677
  it "should accept single argument composite keys" do
689
678
  model_a = Class.new(Sequel::Model){ set_primary_key [:a, :b] }
690
679
  model_a.primary_key.should == [:a, :b]
@@ -804,52 +793,52 @@ describe Sequel::Model, "#set" do
804
793
  @c.strict_param_setting = false
805
794
  @o1 = @c.new
806
795
  @o2 = @c.load(:id => 5)
807
- MODEL_DB.reset
796
+ DB.reset
808
797
  end
809
798
 
810
799
  it "should filter the given params using the model columns" do
811
800
  @o1.set(:x => 1, :z => 2)
812
801
  @o1.values.should == {:x => 1}
813
- MODEL_DB.sqls.should == []
802
+ DB.sqls.should == []
814
803
 
815
804
  @o2.set(:y => 1, :abc => 2)
816
805
  @o2.values.should == {:y => 1, :id=> 5}
817
- MODEL_DB.sqls.should == []
806
+ DB.sqls.should == []
818
807
  end
819
808
 
820
809
  it "should work with both strings and symbols" do
821
810
  @o1.set('x'=> 1, 'z'=> 2)
822
811
  @o1.values.should == {:x => 1}
823
- MODEL_DB.sqls.should == []
812
+ DB.sqls.should == []
824
813
 
825
814
  @o2.set('y'=> 1, 'abc'=> 2)
826
815
  @o2.values.should == {:y => 1, :id=> 5}
827
- MODEL_DB.sqls.should == []
816
+ DB.sqls.should == []
828
817
  end
829
818
 
830
819
  it "should support virtual attributes" do
831
820
  @c.send(:define_method, :blah=){|v| self.x = v}
832
821
  @o1.set(:blah => 333)
833
822
  @o1.values.should == {:x => 333}
834
- MODEL_DB.sqls.should == []
823
+ DB.sqls.should == []
835
824
  @o1.set('blah'=> 334)
836
825
  @o1.values.should == {:x => 334}
837
- MODEL_DB.sqls.should == []
826
+ DB.sqls.should == []
838
827
  end
839
828
 
840
829
  it "should not modify the primary key" do
841
830
  @o1.set(:x => 1, :id => 2)
842
831
  @o1.values.should == {:x => 1}
843
- MODEL_DB.sqls.should == []
832
+ DB.sqls.should == []
844
833
  @o2.set('y'=> 1, 'id'=> 2)
845
834
  @o2.values.should == {:y => 1, :id=> 5}
846
- MODEL_DB.sqls.should == []
835
+ DB.sqls.should == []
847
836
  end
848
837
 
849
838
  it "should return self" do
850
839
  returned_value = @o1.set(:x => 1, :z => 2)
851
840
  returned_value.should == @o1
852
- MODEL_DB.sqls.should == []
841
+ DB.sqls.should == []
853
842
  end
854
843
 
855
844
  it "should raise error if strict_param_setting is true and method does not exist" do
@@ -935,31 +924,31 @@ describe Sequel::Model, "#update" do
935
924
  @c.strict_param_setting = false
936
925
  @o1 = @c.new
937
926
  @o2 = @c.load(:id => 5)
938
- MODEL_DB.reset
927
+ DB.reset
939
928
  end
940
929
 
941
930
  it "should filter the given params using the model columns" do
942
931
  @o1.update(:x => 1, :z => 2)
943
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
932
+ DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
944
933
 
945
- MODEL_DB.reset
934
+ DB.reset
946
935
  @o2.update(:y => 1, :abc => 2)
947
- MODEL_DB.sqls.should == ["UPDATE items SET y = 1 WHERE (id = 5)"]
936
+ DB.sqls.should == ["UPDATE items SET y = 1 WHERE (id = 5)"]
948
937
  end
949
938
 
950
939
  it "should support virtual attributes" do
951
940
  @c.send(:define_method, :blah=){|v| self.x = v}
952
941
  @o1.update(:blah => 333)
953
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (333)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
942
+ DB.sqls.should == ["INSERT INTO items (x) VALUES (333)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
954
943
  end
955
944
 
956
945
  it "should not modify the primary key" do
957
946
  @o1.update(:x => 1, :id => 2)
958
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
959
- MODEL_DB.reset
947
+ DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
948
+ DB.reset
960
949
  @o2.update('y'=> 1, 'id'=> 2)
961
950
  @o2.values.should == {:y => 1, :id=> 5}
962
- MODEL_DB.sqls.should == ["UPDATE items SET y = 1 WHERE (id = 5)"]
951
+ DB.sqls.should == ["UPDATE items SET y = 1 WHERE (id = 5)"]
963
952
  end
964
953
  end
965
954
 
@@ -970,7 +959,7 @@ describe Sequel::Model, "#set_fields" do
970
959
  columns :x, :y, :z, :id
971
960
  end
972
961
  @o1 = @c.new
973
- MODEL_DB.reset
962
+ DB.reset
974
963
  end
975
964
 
976
965
  it "should set only the given fields" do
@@ -978,7 +967,7 @@ describe Sequel::Model, "#set_fields" do
978
967
  @o1.values.should == {:x => 1, :y => 2}
979
968
  @o1.set_fields({:x => 9, :y => 8, :z=>6, :id=>7}, [:x, :y, :id])
980
969
  @o1.values.should == {:x => 9, :y => 8, :id=>7}
981
- MODEL_DB.sqls.should == []
970
+ DB.sqls.should == []
982
971
  end
983
972
 
984
973
  it "should lookup into the hash without checking if the entry exists" do
@@ -1014,7 +1003,7 @@ describe Sequel::Model, "#set_fields" do
1014
1003
  @o1.values.should == {:x => 1, :y => 2}
1015
1004
  @o1.set_fields({:x => 9, :y => 8, :z=>6, :id=>7}, [:x, :y, :id], :missing=>:foo)
1016
1005
  @o1.values.should == {:x => 9, :y => 8, :id=>7}
1017
- MODEL_DB.sqls.should == []
1006
+ DB.sqls.should == []
1018
1007
  end
1019
1008
 
1020
1009
  it "should respect model's default_set_fields_options" do
@@ -1031,7 +1020,7 @@ describe Sequel::Model, "#set_fields" do
1031
1020
  @o1.values.should == {:x => 5}
1032
1021
  @o1.set_fields({:x => 5}, [:x, :y], :missing=>nil)
1033
1022
  @o1.values.should == {:x => 5, :y=>nil}
1034
- MODEL_DB.sqls.should == []
1023
+ DB.sqls.should == []
1035
1024
  end
1036
1025
 
1037
1026
  it "should respect model's default_set_fields_options in a subclass" do
@@ -1050,25 +1039,25 @@ describe Sequel::Model, "#update_fields" do
1050
1039
  end
1051
1040
  @c.strict_param_setting = true
1052
1041
  @o1 = @c.load(:id=>1)
1053
- MODEL_DB.reset
1042
+ DB.reset
1054
1043
  end
1055
1044
 
1056
1045
  it "should set only the given fields, and then save the changes to the record" do
1057
1046
  @o1.update_fields({:x => 1, :y => 2, :z=>3, :id=>4}, [:x, :y])
1058
1047
  @o1.values.should == {:x => 1, :y => 2, :id=>1}
1059
- sqls = MODEL_DB.sqls
1048
+ sqls = DB.sqls
1060
1049
  sqls.pop.should =~ /UPDATE items SET [xy] = [12], [xy] = [12] WHERE \(id = 1\)/
1061
1050
  sqls.should == []
1062
1051
 
1063
1052
  @o1.update_fields({:x => 1, :y => 5, :z=>6, :id=>7}, [:x, :y])
1064
1053
  @o1.values.should == {:x => 1, :y => 5, :id=>1}
1065
- MODEL_DB.sqls.should == ["UPDATE items SET y = 5 WHERE (id = 1)"]
1054
+ DB.sqls.should == ["UPDATE items SET y = 5 WHERE (id = 1)"]
1066
1055
  end
1067
1056
 
1068
1057
  it "should support :missing=>:skip option" do
1069
1058
  @o1.update_fields({:x => 1, :z=>3, :id=>4}, [:x, :y], :missing=>:skip)
1070
1059
  @o1.values.should == {:x => 1, :id=>1}
1071
- MODEL_DB.sqls.should == ["UPDATE items SET x = 1 WHERE (id = 1)"]
1060
+ DB.sqls.should == ["UPDATE items SET x = 1 WHERE (id = 1)"]
1072
1061
  end
1073
1062
 
1074
1063
  it "should support :missing=>:raise option" do
@@ -1079,15 +1068,15 @@ describe Sequel::Model, "#update_fields" do
1079
1068
  @c.default_set_fields_options = {:missing=>:skip}
1080
1069
  @o1.update_fields({:x => 3}, [:x, :y])
1081
1070
  @o1.values.should == {:x => 3, :id=>1}
1082
- MODEL_DB.sqls.should == ["UPDATE items SET x = 3 WHERE (id = 1)"]
1071
+ DB.sqls.should == ["UPDATE items SET x = 3 WHERE (id = 1)"]
1083
1072
 
1084
1073
  @c.default_set_fields_options = {:missing=>:raise}
1085
1074
  proc{@o1.update_fields({:x => 3}, [:x, :y])}.should raise_error(Sequel::Error)
1086
- MODEL_DB.sqls.should == []
1075
+ DB.sqls.should == []
1087
1076
  end
1088
1077
  end
1089
1078
 
1090
- describe Sequel::Model, "#(set|update)_(all|except|only)" do
1079
+ describe Sequel::Model, "#(set|update)_(all|only)" do
1091
1080
  before do
1092
1081
  @c = Class.new(Sequel::Model(:items)) do
1093
1082
  set_primary_key :id
@@ -1096,13 +1085,13 @@ describe Sequel::Model, "#(set|update)_(all|except|only)" do
1096
1085
  end
1097
1086
  @c.strict_param_setting = false
1098
1087
  @o1 = @c.new
1099
- MODEL_DB.reset
1088
+ DB.reset
1100
1089
  end
1101
1090
 
1102
1091
  it "should raise errors if not all hash fields can be set and strict_param_setting is true" do
1103
1092
  @c.strict_param_setting = true
1104
1093
 
1105
- proc{@c.new.set_all(:x => 1, :y => 2, :z=>3, :id=>4)}.should raise_error(Sequel::Error)
1094
+ proc{@c.new.set_all(:x => 1, :y => 2, :z=>3, :use_after_commit_rollback => false)}.should raise_error(Sequel::Error)
1106
1095
  (o = @c.new).set_all(:x => 1, :y => 2, :z=>3)
1107
1096
  o.values.should == {:x => 1, :y => 2, :z=>3}
1108
1097
 
@@ -1112,17 +1101,15 @@ describe Sequel::Model, "#(set|update)_(all|except|only)" do
1112
1101
  o.values.should == {:x => 1, :y => 2}
1113
1102
  end
1114
1103
 
1115
- qspecify "should raise errors for set_except if not all hash fields can be set and strict_param_setting is true" do
1116
- @c.strict_param_setting = true
1117
- proc{@c.new.set_except({:x => 1, :y => 2, :z=>3, :id=>4}, :x, :y)}.should raise_error(Sequel::Error)
1118
- proc{@c.new.set_except({:x => 1, :y => 2, :z=>3}, :x, :y)}.should raise_error(Sequel::Error)
1119
- (o = @c.new).set_except({:z => 3}, :x, :y)
1120
- o.values.should == {:z=>3}
1104
+ it "#set_all should set all attributes including the primary key" do
1105
+ @o1.set_all(:x => 1, :y => 2, :z=>3, :id=>4)
1106
+ @o1.values.should == {:id =>4, :x => 1, :y => 2, :z=>3}
1121
1107
  end
1122
1108
 
1123
- it "#set_all should set all attributes except the primary key" do
1124
- @o1.set_all(:x => 1, :y => 2, :z=>3, :id=>4)
1125
- @o1.values.should == {:x => 1, :y => 2, :z=>3}
1109
+ it "#set_all should set not set restricted fields" do
1110
+ @o1.set_all(:x => 1, :use_after_commit_rollback => false)
1111
+ @o1.use_after_commit_rollback.should be_true
1112
+ @o1.values.should == {:x => 1}
1126
1113
  end
1127
1114
 
1128
1115
  it "#set_only should only set given attributes" do
@@ -1134,43 +1121,29 @@ describe Sequel::Model, "#(set|update)_(all|except|only)" do
1134
1121
  @o1.values.should == {:x => 9, :y => 8, :id=>7}
1135
1122
  end
1136
1123
 
1137
- qspecify "#set_except should not set given attributes or the primary key" do
1138
- @o1.set_except({:x => 1, :y => 2, :z=>3, :id=>4}, [:y, :z])
1139
- @o1.values.should == {:x => 1}
1140
- @o1.set_except({:x => 4, :y => 2, :z=>3, :id=>4}, :y, :z)
1141
- @o1.values.should == {:x => 4}
1142
- end
1143
-
1144
1124
  it "#update_all should update all attributes" do
1145
- @c.new.update_all(:x => 1, :id=>4)
1146
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1147
- @c.new.update_all(:y => 1, :id=>4)
1148
- MODEL_DB.sqls.should == ["INSERT INTO items (y) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1149
- @c.new.update_all(:z => 1, :id=>4)
1150
- MODEL_DB.sqls.should == ["INSERT INTO items (z) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1125
+ @c.new.update_all(:x => 1)
1126
+ DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1127
+ @c.new.update_all(:y => 1)
1128
+ DB.sqls.should == ["INSERT INTO items (y) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1129
+ @c.new.update_all(:z => 1)
1130
+ DB.sqls.should == ["INSERT INTO items (z) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1151
1131
  end
1152
1132
 
1153
1133
  it "#update_only should only update given attributes" do
1154
1134
  @o1.update_only({:x => 1, :y => 2, :z=>3, :id=>4}, [:x])
1155
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1135
+ DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1156
1136
  @c.new.update_only({:x => 1, :y => 2, :z=>3, :id=>4}, :x)
1157
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1158
- end
1159
-
1160
- qspecify "#update_except should not update given attributes" do
1161
- @o1.update_except({:x => 1, :y => 2, :z=>3, :id=>4}, [:y, :z])
1162
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1163
- @c.new.update_except({:x => 1, :y => 2, :z=>3, :id=>4}, :y, :z)
1164
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1137
+ DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1165
1138
  end
1166
1139
  end
1167
1140
 
1168
1141
  describe Sequel::Model, "#destroy with filtered dataset" do
1169
1142
  before do
1170
- @model = Class.new(Sequel::Model(MODEL_DB[:items].where(:a=>1)))
1143
+ @model = Class.new(Sequel::Model(DB[:items].where(:a=>1)))
1171
1144
  @model.columns :id, :a
1172
1145
  @instance = @model.load(:id => 1234)
1173
- MODEL_DB.reset
1146
+ DB.reset
1174
1147
  end
1175
1148
 
1176
1149
  it "should raise a NoExistingObject exception if the dataset delete call doesn't return 1" do
@@ -1190,7 +1163,7 @@ describe Sequel::Model, "#destroy with filtered dataset" do
1190
1163
 
1191
1164
  it "should include WHERE clause when deleting" do
1192
1165
  @instance.destroy
1193
- MODEL_DB.sqls.should == ["DELETE FROM items WHERE ((a = 1) AND (id = 1234))"]
1166
+ DB.sqls.should == ["DELETE FROM items WHERE ((a = 1) AND (id = 1234))"]
1194
1167
  end
1195
1168
  end
1196
1169
 
@@ -1199,7 +1172,7 @@ describe Sequel::Model, "#destroy" do
1199
1172
  @model = Class.new(Sequel::Model(:items))
1200
1173
  @model.columns :id
1201
1174
  @instance = @model.load(:id => 1234)
1202
- MODEL_DB.reset
1175
+ DB.reset
1203
1176
  end
1204
1177
 
1205
1178
  it "should return self" do
@@ -1225,32 +1198,32 @@ describe Sequel::Model, "#destroy" do
1225
1198
  it "should run within a transaction if use_transactions is true" do
1226
1199
  @instance.use_transactions = true
1227
1200
  @instance.destroy
1228
- MODEL_DB.sqls.should == ["BEGIN", "DELETE FROM items WHERE id = 1234", "COMMIT"]
1201
+ DB.sqls.should == ["BEGIN", "DELETE FROM items WHERE id = 1234", "COMMIT"]
1229
1202
  end
1230
1203
 
1231
1204
  it "should not run within a transaction if use_transactions is false" do
1232
1205
  @instance.use_transactions = false
1233
1206
  @instance.destroy
1234
- MODEL_DB.sqls.should == ["DELETE FROM items WHERE id = 1234"]
1207
+ DB.sqls.should == ["DELETE FROM items WHERE id = 1234"]
1235
1208
  end
1236
1209
 
1237
1210
  it "should run within a transaction if :transaction option is true" do
1238
1211
  @instance.use_transactions = false
1239
1212
  @instance.destroy(:transaction => true)
1240
- MODEL_DB.sqls.should == ["BEGIN", "DELETE FROM items WHERE id = 1234", "COMMIT"]
1213
+ DB.sqls.should == ["BEGIN", "DELETE FROM items WHERE id = 1234", "COMMIT"]
1241
1214
  end
1242
1215
 
1243
1216
  it "should not run within a transaction if :transaction option is false" do
1244
1217
  @instance.use_transactions = true
1245
1218
  @instance.destroy(:transaction => false)
1246
- MODEL_DB.sqls.should == ["DELETE FROM items WHERE id = 1234"]
1219
+ DB.sqls.should == ["DELETE FROM items WHERE id = 1234"]
1247
1220
  end
1248
1221
 
1249
1222
  it "should run before_destroy and after_destroy hooks" do
1250
- @model.send(:define_method, :before_destroy){MODEL_DB.execute('before blah')}
1251
- @model.send(:define_method, :after_destroy){MODEL_DB.execute('after blah')}
1223
+ @model.send(:define_method, :before_destroy){DB.execute('before blah')}
1224
+ @model.send(:define_method, :after_destroy){DB.execute('after blah')}
1252
1225
  @instance.destroy
1253
- MODEL_DB.sqls.should == ["before blah", "DELETE FROM items WHERE id = 1234", "after blah"]
1226
+ DB.sqls.should == ["before blah", "DELETE FROM items WHERE id = 1234", "after blah"]
1254
1227
  end
1255
1228
  end
1256
1229
 
@@ -1258,22 +1231,22 @@ describe Sequel::Model, "#exists?" do
1258
1231
  before do
1259
1232
  @model = Class.new(Sequel::Model(:items))
1260
1233
  @model.instance_dataset._fetch = @model.dataset._fetch = proc{|sql| {:x=>1} if sql =~ /id = 1/}
1261
- MODEL_DB.reset
1234
+ DB.reset
1262
1235
  end
1263
1236
 
1264
1237
  it "should do a query to check if the record exists" do
1265
1238
  @model.load(:id=>1).exists?.should be_true
1266
- MODEL_DB.sqls.should == ['SELECT 1 AS one FROM items WHERE (id = 1) LIMIT 1']
1239
+ DB.sqls.should == ['SELECT 1 AS one FROM items WHERE (id = 1) LIMIT 1']
1267
1240
  end
1268
1241
 
1269
1242
  it "should return false when #this.count == 0" do
1270
1243
  @model.load(:id=>2).exists?.should be_false
1271
- MODEL_DB.sqls.should == ['SELECT 1 AS one FROM items WHERE (id = 2) LIMIT 1']
1244
+ DB.sqls.should == ['SELECT 1 AS one FROM items WHERE (id = 2) LIMIT 1']
1272
1245
  end
1273
1246
 
1274
1247
  it "should return false without issuing a query if the model object is new" do
1275
1248
  @model.new.exists?.should be_false
1276
- MODEL_DB.sqls.should == []
1249
+ DB.sqls.should == []
1277
1250
  end
1278
1251
  end
1279
1252
 
@@ -1516,7 +1489,7 @@ end
1516
1489
 
1517
1490
  describe Sequel::Model, ".create" do
1518
1491
  before do
1519
- MODEL_DB.reset
1492
+ DB.reset
1520
1493
  @c = Class.new(Sequel::Model(:items)) do
1521
1494
  unrestrict_primary_key
1522
1495
  columns :x
@@ -1526,13 +1499,13 @@ describe Sequel::Model, ".create" do
1526
1499
  it "should be able to create rows in the associated table" do
1527
1500
  o = @c.create(:x => 1)
1528
1501
  o.class.should == @c
1529
- MODEL_DB.sqls.should == ['INSERT INTO items (x) VALUES (1)', "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1502
+ DB.sqls.should == ['INSERT INTO items (x) VALUES (1)', "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1530
1503
  end
1531
1504
 
1532
1505
  it "should be able to create rows without any values specified" do
1533
1506
  o = @c.create
1534
1507
  o.class.should == @c
1535
- MODEL_DB.sqls.should == ["INSERT INTO items DEFAULT VALUES", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1508
+ DB.sqls.should == ["INSERT INTO items DEFAULT VALUES", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1536
1509
  end
1537
1510
 
1538
1511
  it "should accept a block and call it" do
@@ -1542,14 +1515,14 @@ describe Sequel::Model, ".create" do
1542
1515
  o1.should === o
1543
1516
  o3.should === o
1544
1517
  o2.should == :blah
1545
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (333)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1518
+ DB.sqls.should == ["INSERT INTO items (x) VALUES (333)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
1546
1519
  end
1547
1520
 
1548
1521
  it "should create a row for a model with custom primary key" do
1549
1522
  @c.set_primary_key :x
1550
1523
  o = @c.create(:x => 30)
1551
1524
  o.class.should == @c
1552
- MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (30)", "SELECT * FROM items WHERE (x = 30) LIMIT 1"]
1525
+ DB.sqls.should == ["INSERT INTO items (x) VALUES (30)", "SELECT * FROM items WHERE (x = 30) LIMIT 1"]
1553
1526
  end
1554
1527
  end
1555
1528
 
@@ -1559,7 +1532,7 @@ describe Sequel::Model, "#refresh" do
1559
1532
  unrestrict_primary_key
1560
1533
  columns :id, :x
1561
1534
  end
1562
- MODEL_DB.reset
1535
+ DB.reset
1563
1536
  end
1564
1537
 
1565
1538
  specify "should reload the instance values from the database" do
@@ -1568,14 +1541,14 @@ describe Sequel::Model, "#refresh" do
1568
1541
  @c.instance_dataset._fetch = @c.dataset._fetch = {:x => 'kaboom', :id => 555}
1569
1542
  @m.refresh
1570
1543
  @m[:x].should == 'kaboom'
1571
- MODEL_DB.sqls.should == ["SELECT * FROM items WHERE (id = 555) LIMIT 1"]
1544
+ DB.sqls.should == ["SELECT * FROM items WHERE (id = 555) LIMIT 1"]
1572
1545
  end
1573
1546
 
1574
1547
  specify "should raise if the instance is not found" do
1575
1548
  @m = @c.new(:id => 555)
1576
1549
  @c.instance_dataset._fetch =@c.dataset._fetch = []
1577
1550
  proc {@m.refresh}.should raise_error(Sequel::Error)
1578
- MODEL_DB.sqls.should == ["SELECT * FROM items WHERE (id = 555) LIMIT 1"]
1551
+ DB.sqls.should == ["SELECT * FROM items WHERE (id = 555) LIMIT 1"]
1579
1552
  end
1580
1553
 
1581
1554
  specify "should be aliased by #reload" do
@@ -1583,7 +1556,7 @@ describe Sequel::Model, "#refresh" do
1583
1556
  @c.instance_dataset._fetch =@c.dataset._fetch = {:x => 'kaboom', :id => 555}
1584
1557
  @m.reload
1585
1558
  @m[:x].should == 'kaboom'
1586
- MODEL_DB.sqls.should == ["SELECT * FROM items WHERE (id = 555) LIMIT 1"]
1559
+ DB.sqls.should == ["SELECT * FROM items WHERE (id = 555) LIMIT 1"]
1587
1560
  end
1588
1561
  end
1589
1562
 
@@ -1593,7 +1566,8 @@ describe Sequel::Model, "typecasting" do
1593
1566
  columns :x
1594
1567
  end
1595
1568
  @c.db_schema = {:x=>{:type=>:integer}}
1596
- MODEL_DB.reset
1569
+ @c.raise_on_typecast_failure = true
1570
+ DB.reset
1597
1571
  end
1598
1572
 
1599
1573
  after do
@@ -1952,7 +1926,7 @@ describe "Model#lock!" do
1952
1926
  columns :id
1953
1927
  end
1954
1928
  @c.dataset._fetch = {:id=>1}
1955
- MODEL_DB.reset
1929
+ DB.reset
1956
1930
  end
1957
1931
 
1958
1932
  it "should do nothing if the record is a new record" do
@@ -1960,7 +1934,7 @@ describe "Model#lock!" do
1960
1934
  def o._refresh(x) raise Sequel::Error; super(x) end
1961
1935
  x = o.lock!
1962
1936
  x.should == o
1963
- MODEL_DB.sqls.should == []
1937
+ DB.sqls.should == []
1964
1938
  end
1965
1939
 
1966
1940
  it "should refresh the record using for_update if it is not a new record" do
@@ -1969,7 +1943,7 @@ describe "Model#lock!" do
1969
1943
  x = o.lock!
1970
1944
  x.should == o
1971
1945
  o.instance_variable_get(:@a).should == 1
1972
- MODEL_DB.sqls.should == ["SELECT * FROM items WHERE (id = 1) LIMIT 1 FOR UPDATE"]
1946
+ DB.sqls.should == ["SELECT * FROM items WHERE (id = 1) LIMIT 1 FOR UPDATE"]
1973
1947
  end
1974
1948
  end
1975
1949