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
@@ -1,70 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "pg_auto_parameterize extension" do
4
- before do
5
- @db = Sequel.connect('mock://postgres', :quote_identifiers=>false)
6
- @db.synchronize{|c| def c.escape_bytea(v) v*2 end}
7
- @db.extend_datasets{def use_cursor(*) clone end}
8
- @db.extension :pg_auto_parameterize
9
- end
10
-
11
- it "should automatically parameterize queries strings, blobs, numerics, dates, and times" do
12
- pr = proc do |ds, sql, *args|
13
- arg = args[0]
14
- parg = args[1] || arg
15
- s = ds.filter(:a=>arg).sql
16
- s.should == sql
17
- s.args.should == (parg == :nil ? nil : [parg])
18
- end
19
- pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::int4)', 1)
20
- pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::int8)', 18446744073709551616)
21
- pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::double precision)', 1.1)
22
- pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::numeric)', BigDecimal.new('1.01'))
23
- pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1)', "a")
24
- pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::bytea)', Sequel.blob("a\0b"))
25
- pr.call(@db[:table], 'SELECT * FROM table WHERE (a = 1)', Sequel.lit('1'), :nil)
26
- pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::time)', Sequel::SQLTime.create(1, 2, 3, 500000))
27
- pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::date)', Date.today)
28
- pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::timestamp)', DateTime.new(2012, 1, 2, 3, 4, 5))
29
- pr.call(@db[:table], 'SELECT * FROM table WHERE (a = $1::timestamp)', Time.utc(2012, 1, 2, 3, 4, 5))
30
- end
31
-
32
- it "should extract parameters from query string when executing" do
33
- @db.fetch = {:a=>1}
34
- @db.numrows = 1
35
- @db.autoid = 1
36
-
37
- @db[:table].filter(:a=>1).all.should == [{:a=>1}]
38
- @db.sqls.should == ['SELECT * FROM table WHERE (a = $1::int4) -- args: [1]']
39
-
40
- @db[:table].filter(:a=>1).update(:b=>'a').should == 1
41
- @db.sqls.should == ['UPDATE table SET b = $1 WHERE (a = $2::int4) -- args: ["a", 1]']
42
-
43
- @db[:table].filter(:a=>1).delete.should == 1
44
- @db.sqls.should == ['DELETE FROM table WHERE (a = $1::int4) -- args: [1]']
45
-
46
- @db[:table].insert(:a=>1).should == 1
47
- @db.sqls.should == ['INSERT INTO table (a) VALUES ($1::int4) RETURNING id -- args: [1]']
48
- end
49
-
50
- it "should not automatically paramiterize if no_auto_parameterize is used" do
51
- @db[:table].no_auto_parameterize.filter(:a=>1).sql.should == 'SELECT * FROM table WHERE (a = 1)'
52
- end
53
-
54
- it "should not automatically parameterize prepared statements" do
55
- @db[:table].filter(:a=>1, :b=>:$b).prepare(:select).sql.should =~ /SELECT \* FROM table WHERE \(\((a = 1|b = \$b)\) AND \((a = 1|b = \$b)\)\)/
56
- end
57
-
58
- it "should show args with string when inspecting SQL " do
59
- @db[:table].filter(:a=>1).sql.inspect.should == '"SELECT * FROM table WHERE (a = $1::int4); [1]"'
60
- end
61
-
62
- it "should not auto parameterize when using cursors" do
63
- @db[:table].filter(:a=>1).use_cursor.opts[:no_auto_parameterize].should be_true
64
- end
65
-
66
- it "should have a working create_view" do
67
- @db.create_view :foo, @db[:table].filter(:a=>1)
68
- @db.sqls.should == ["CREATE VIEW foo AS SELECT * FROM table WHERE (a = 1)"]
69
- end
70
- end
@@ -1,208 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- Sequel::Postgres::StatementCache::PGError = Sequel::Error
4
-
5
- describe "pg_statement_cache and pg_auto_parameterize extensions" do
6
- before do
7
- @dbp = proc do |opts|
8
- @db = Sequel.connect 'mock://postgres', :quote_identifiers=>false, :statement_cache_opts=>{:max_size=>4}.merge(opts),
9
- :after_connect=>(proc do |c|
10
- c.extend(Module.new do
11
- def execute_query(sql, args)
12
- raise Sequel::Postgres::StatementCache::PGError if @db.exec_raise
13
- @db.execute(sql, :arguments=>args, :no_eq=>true)
14
- end
15
- def prepare(name, sql)
16
- raise Sequel::Postgres::StatementCache::PGError if sql =~ /prepare_raise/
17
- @ps ||= {}
18
- @ps[name] = sql
19
- @db._sqls << "PREPARE #{name} AS #{sql}"
20
- end
21
- def exec_prepared(name, args=nil)
22
- @db._sqls << "EXECUTE #{name} (#{@ps[name]})#{" -- args: #{args.inspect}" if args}"
23
- end
24
- end)
25
- end)
26
- @db.extension :pg_auto_parameterize, :pg_statement_cache
27
- @db.extend(Module.new do
28
- attr_accessor :exec_raise
29
- def _execute(c, sql, opts={})
30
- opts[:no_eq] ? super : c.send(:execute_query, sql, opts[:arguments])
31
- end
32
- def _sqls
33
- @sqls
34
- end
35
- def statement_cache
36
- synchronize{|c| c.statement_cache}
37
- end
38
- end)
39
- @db
40
- end
41
- @db = @dbp.call({})
42
- end
43
-
44
- it "should automatically prepare statements executed multiple times" do
45
- @db[:table].filter(:b=>2).all
46
- 3.times{|i| @db[:table].filter(:a=>i).all}
47
- @db.sqls.should == ["SELECT * FROM table WHERE (b = $1::int4) -- args: [2]",
48
- "SELECT * FROM table WHERE (a = $1::int4) -- args: [0]",
49
- "PREPARE sequel_pgap_2 AS SELECT * FROM table WHERE (a = $1::int4)",
50
- "EXECUTE sequel_pgap_2 (SELECT * FROM table WHERE (a = $1::int4)) -- args: [1]",
51
- "EXECUTE sequel_pgap_2 (SELECT * FROM table WHERE (a = $1::int4)) -- args: [2]"]
52
- end
53
-
54
- it "should work correctly for queries without parameters" do
55
- @db[:table].filter(:b).all
56
- 3.times{|i| @db[:table].filter(:a).all}
57
- @db.sqls.should == ["SELECT * FROM table WHERE b",
58
- "SELECT * FROM table WHERE a",
59
- "PREPARE sequel_pgap_2 AS SELECT * FROM table WHERE a",
60
- "EXECUTE sequel_pgap_2 (SELECT * FROM table WHERE a)",
61
- "EXECUTE sequel_pgap_2 (SELECT * FROM table WHERE a)"]
62
- end
63
-
64
- it "should correctly return the size of the cache" do
65
- sc = @db.statement_cache
66
- sc.size.should == 0
67
- @db[:table].filter(:b=>2).all
68
- sc.size.should == 1
69
- 3.times{|i| @db[:table].filter(:a=>i).all}
70
- sc.size.should == 2
71
- end
72
-
73
- it "should correctly clear the cache" do
74
- sc = @db.statement_cache
75
- sc.size.should == 0
76
- @db[:table].filter(:b=>2).all
77
- sc.size.should == 1
78
- 3.times{|i| @db[:table].filter(:a=>i).all}
79
- sc.size.should == 2
80
- sc.clear
81
- sc.size.should == 0
82
- 3.times{|i| @db[:table].filter(:a=>i).all}
83
- sc.size.should == 1
84
- end
85
-
86
- it "should correctly yield each entry in the cache" do
87
- @db[:table].filter(:b=>2).all
88
- 3.times{|i| @db[:table].filter(:a=>i).all}
89
- a = []
90
- @db.statement_cache.each{|k, v| a << [k, v]}
91
- a.sort!
92
- a[0][0].should == "SELECT * FROM table WHERE (a = $1::int4)"
93
- a[1][0].should == "SELECT * FROM table WHERE (b = $1::int4)"
94
- s1 = a[1][1]
95
- s1.cache_id.should == 1
96
- s1.num_executes.should == 1
97
- s1 = a[0][1]
98
- s1.cache_id.should == 2
99
- s1.num_executes.should == 3
100
- end
101
-
102
- it "should automatically cleanup the cache when it goes beyond its maximum size" do
103
- sc = @db.statement_cache
104
- 4.times{|i| @db[:table].filter(:"a#{i}"=>1).all}
105
- sc.size.should == 4
106
- @db[:table].filter(:b=>1).all
107
- sc.size.should == 2
108
- end
109
-
110
- it "should clear statement caches when altering tables" do
111
- @db[:table].filter(:b=>2).all
112
- sc = @db.statement_cache
113
- @db.alter_table(:foo){drop_column :bar}
114
- sc.size.should == 0
115
- end
116
-
117
- it "should clear statement caches when dropping tables" do
118
- @db[:table].filter(:b=>2).all
119
- sc = @db.statement_cache
120
- @db.drop_table(:foo)
121
- sc.size.should == 0
122
- end
123
-
124
- it "should deallocate prepared statements when clearing the cache" do
125
- 3.times{|i| @db[:table].filter(:a=>i).all}
126
- @db.sqls
127
- @db.statement_cache.clear
128
- @db.sqls.should == ["DEALLOCATE sequel_pgap_1"]
129
- end
130
-
131
- it "should deallocate prepared statements when cleaning up the cache" do
132
- @db = @dbp.call(:sorter=>proc{|t, s| -s.num_executes})
133
- 4.times{|i| @db[:table].filter(:"a#{i}"=>1).all}
134
- @db[:table].filter(:a0=>1).all
135
- @db.sqls
136
- @db[:table].filter(:b=>1).all
137
- @db.sqls.should == ["DEALLOCATE sequel_pgap_1", "SELECT * FROM table WHERE (b = $1::int4) -- args: [1]"]
138
- end
139
-
140
- it "should not deallocate nonprepared statements when clearing the cache" do
141
- 4.times{|i| @db[:table].filter(:"a#{i}"=>1).all}
142
- @db.sqls
143
- @db.statement_cache.clear
144
- @db.sqls.should == []
145
- end
146
-
147
- it "should not deallocate nonprepared statements when cleaning up the cache" do
148
- @db = @dbp.call(:sorter=>proc{|t, s| -s.num_executes})
149
- 4.times{|i| @db[:table].filter(:"a#{i}"=>1).all}
150
- @db.sqls
151
- @db[:table].filter(:b=>1).all
152
- @db.sqls.should == ["SELECT * FROM table WHERE (b = $1::int4) -- args: [1]"]
153
- end
154
-
155
- it "should have a configurable max_size and min_size" do
156
- @db = @dbp.call(:max_size=>10, :min_size=>2)
157
- 10.times{|i| @db[:table].filter(:"a#{i}"=>1).all}
158
- sc = @db.statement_cache
159
- sc.size.should == 10
160
- @db[:table].filter(:b=>1).all
161
- sc.size.should == 2
162
- end
163
-
164
- it "should have a configurable prepare_after" do
165
- @db = @dbp.call(:prepare_after=>3)
166
- 4.times{|i| @db[:table].filter(:a=>i).all}
167
- @db.sqls.should == ["SELECT * FROM table WHERE (a = $1::int4) -- args: [0]",
168
- "SELECT * FROM table WHERE (a = $1::int4) -- args: [1]",
169
- "PREPARE sequel_pgap_1 AS SELECT * FROM table WHERE (a = $1::int4)",
170
- "EXECUTE sequel_pgap_1 (SELECT * FROM table WHERE (a = $1::int4)) -- args: [2]",
171
- "EXECUTE sequel_pgap_1 (SELECT * FROM table WHERE (a = $1::int4)) -- args: [3]"]
172
- end
173
-
174
- it "should have a configurable sorter" do
175
- @db = @dbp.call(:sorter=>proc{|t, s| s.num_executes})
176
- 4.times{|i| (i+1).times{@db[:table].filter(:"a#{i}"=>1).all}}
177
- @db[:table].filter(:b=>1).all
178
- sc = @db.statement_cache
179
- a = []
180
- sc.each{|k, v| a << [k, v]}
181
- a.sort!
182
- a[0][0].should == "SELECT * FROM table WHERE (a3 = $1::int4)"
183
- a[1][0].should == "SELECT * FROM table WHERE (b = $1::int4)"
184
- s1 = a[1][1]
185
- s1.num_executes.should == 1
186
- s1 = a[0][1]
187
- s1.cache_id.should == 4
188
- s1.num_executes.should == 4
189
- end
190
-
191
- it "should ignore errors when preparing queries" do
192
- 3.times{|i| @db[:table].filter(:prepare_raise=>1).all}
193
- @db.sqls.should == ["SELECT * FROM table WHERE (prepare_raise = $1::int4) -- args: [1]",
194
- "SELECT * FROM table WHERE (prepare_raise = $1::int4) -- args: [1]",
195
- "SELECT * FROM table WHERE (prepare_raise = $1::int4) -- args: [1]"]
196
- end
197
-
198
- it "should ignore errors when deallocating queries" do
199
- 3.times{|i| @db[:table].filter(:a=>1).all}
200
- @db.exec_raise = true
201
- @db.statement_cache.clear
202
- @db.sqls.should == ["SELECT * FROM table WHERE (a = $1::int4) -- args: [1]",
203
- "PREPARE sequel_pgap_1 AS SELECT * FROM table WHERE (a = $1::int4)",
204
- "EXECUTE sequel_pgap_1 (SELECT * FROM table WHERE (a = $1::int4)) -- args: [1]",
205
- "EXECUTE sequel_pgap_1 (SELECT * FROM table WHERE (a = $1::int4)) -- args: [1]"]
206
- end
207
-
208
- end
@@ -1,8 +0,0 @@
1
- --exclude
2
- gems
3
- --exclude
4
- spec
5
- --exclude
6
- 00*
7
- --threshold
8
- 100
@@ -1,10 +0,0 @@
1
- # database objects for running adapter specs
2
- # ADO_DB = Sequel.connect(:adapter => 'ado', :driver => "{Microsoft Access Driver (*.mdb)}; DBQ=c:\\Nwind.mdb")
3
- # INFORMIX_DB = Sequel.connect('informix://localhost/mydb')
4
- # INTEGRATION_URL = 'sqlite:/'
5
- # MYSQL_USER = 'root'
6
- # MYSQL_URL = "mysql://#{MYSQL_USER}@localhost/sandbox"
7
- # MYSQL_SOCKET_FILE = '/tmp/mysql.sock'
8
- # ORACLE_DB = Sequel.connect('oracle://hr:hr@localhost/XE')
9
- # POSTGRES_URL = 'postgres://postgres:postgres@localhost:5432/reality_spec'
10
- # SQLITE_URL = 'sqlite:/'