sequel 4.12.0 → 4.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +64 -0
  3. data/Rakefile +3 -1
  4. data/bin/sequel +13 -5
  5. data/doc/release_notes/4.13.0.txt +169 -0
  6. data/doc/sql.rdoc +3 -3
  7. data/lib/sequel/adapters/do.rb +11 -23
  8. data/lib/sequel/adapters/do/mysql.rb +8 -0
  9. data/lib/sequel/adapters/do/postgres.rb +8 -0
  10. data/lib/sequel/adapters/do/{sqlite.rb → sqlite3.rb} +9 -0
  11. data/lib/sequel/adapters/jdbc.rb +16 -139
  12. data/lib/sequel/adapters/jdbc/as400.rb +9 -0
  13. data/lib/sequel/adapters/jdbc/cubrid.rb +9 -0
  14. data/lib/sequel/adapters/jdbc/db2.rb +9 -0
  15. data/lib/sequel/adapters/jdbc/derby.rb +9 -0
  16. data/lib/sequel/adapters/jdbc/{firebird.rb → firebirdsql.rb} +9 -0
  17. data/lib/sequel/adapters/jdbc/h2.rb +10 -0
  18. data/lib/sequel/adapters/jdbc/hsqldb.rb +9 -0
  19. data/lib/sequel/adapters/jdbc/{informix.rb → informix-sqli.rb} +9 -0
  20. data/lib/sequel/adapters/jdbc/{progress.rb → jdbcprogress.rb} +9 -0
  21. data/lib/sequel/adapters/jdbc/jtds.rb +10 -0
  22. data/lib/sequel/adapters/jdbc/mysql.rb +14 -0
  23. data/lib/sequel/adapters/jdbc/oracle.rb +9 -0
  24. data/lib/sequel/adapters/jdbc/postgresql.rb +9 -0
  25. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +23 -0
  26. data/lib/sequel/adapters/jdbc/sqlite.rb +10 -0
  27. data/lib/sequel/adapters/jdbc/sqlserver.rb +10 -0
  28. data/lib/sequel/adapters/odbc.rb +6 -14
  29. data/lib/sequel/adapters/odbc/db2.rb +9 -0
  30. data/lib/sequel/adapters/odbc/mssql.rb +8 -0
  31. data/lib/sequel/adapters/odbc/progress.rb +8 -0
  32. data/lib/sequel/adapters/oracle.rb +1 -1
  33. data/lib/sequel/adapters/postgres.rb +1 -1
  34. data/lib/sequel/adapters/shared/firebird.rb +8 -1
  35. data/lib/sequel/adapters/shared/mssql.rb +68 -27
  36. data/lib/sequel/adapters/shared/mysql.rb +3 -5
  37. data/lib/sequel/adapters/shared/oracle.rb +17 -3
  38. data/lib/sequel/adapters/shared/postgres.rb +9 -4
  39. data/lib/sequel/adapters/shared/sqlanywhere.rb +6 -6
  40. data/lib/sequel/database/connecting.rb +38 -17
  41. data/lib/sequel/dataset/actions.rb +6 -2
  42. data/lib/sequel/dataset/graph.rb +18 -20
  43. data/lib/sequel/dataset/misc.rb +37 -0
  44. data/lib/sequel/dataset/prepared_statements.rb +1 -2
  45. data/lib/sequel/dataset/query.rb +1 -0
  46. data/lib/sequel/dataset/sql.rb +17 -10
  47. data/lib/sequel/extensions/dataset_source_alias.rb +90 -0
  48. data/lib/sequel/extensions/pg_array.rb +14 -10
  49. data/lib/sequel/extensions/pg_enum.rb +135 -0
  50. data/lib/sequel/extensions/pg_hstore.rb +4 -6
  51. data/lib/sequel/extensions/pg_inet.rb +4 -5
  52. data/lib/sequel/extensions/pg_interval.rb +3 -3
  53. data/lib/sequel/extensions/pg_json.rb +16 -12
  54. data/lib/sequel/extensions/pg_range.rb +5 -3
  55. data/lib/sequel/extensions/pg_row.rb +2 -2
  56. data/lib/sequel/extensions/round_timestamps.rb +52 -0
  57. data/lib/sequel/model.rb +5 -2
  58. data/lib/sequel/model/associations.rb +29 -3
  59. data/lib/sequel/model/base.rb +68 -29
  60. data/lib/sequel/plugins/class_table_inheritance.rb +25 -16
  61. data/lib/sequel/plugins/column_select.rb +57 -0
  62. data/lib/sequel/plugins/composition.rb +14 -16
  63. data/lib/sequel/plugins/dirty.rb +9 -11
  64. data/lib/sequel/plugins/insert_returning_select.rb +70 -0
  65. data/lib/sequel/plugins/instance_filters.rb +7 -9
  66. data/lib/sequel/plugins/lazy_attributes.rb +16 -4
  67. data/lib/sequel/plugins/list.rb +9 -0
  68. data/lib/sequel/plugins/modification_detection.rb +90 -0
  69. data/lib/sequel/plugins/serialization.rb +13 -15
  70. data/lib/sequel/plugins/serialization_modification_detection.rb +9 -9
  71. data/lib/sequel/plugins/single_table_inheritance.rb +3 -1
  72. data/lib/sequel/plugins/timestamps.rb +6 -6
  73. data/lib/sequel/version.rb +1 -1
  74. data/spec/adapters/mysql_spec.rb +7 -0
  75. data/spec/adapters/postgres_spec.rb +41 -0
  76. data/spec/bin_spec.rb +4 -1
  77. data/spec/core/database_spec.rb +6 -0
  78. data/spec/core/dataset_spec.rb +100 -90
  79. data/spec/core/object_graph_spec.rb +5 -0
  80. data/spec/extensions/class_table_inheritance_spec.rb +18 -13
  81. data/spec/extensions/column_select_spec.rb +108 -0
  82. data/spec/extensions/composition_spec.rb +20 -0
  83. data/spec/extensions/dataset_source_alias_spec.rb +51 -0
  84. data/spec/extensions/insert_returning_select_spec.rb +46 -0
  85. data/spec/extensions/lazy_attributes_spec.rb +24 -20
  86. data/spec/extensions/list_spec.rb +5 -0
  87. data/spec/extensions/modification_detection_spec.rb +80 -0
  88. data/spec/extensions/pg_enum_spec.rb +64 -0
  89. data/spec/extensions/pg_json_spec.rb +7 -13
  90. data/spec/extensions/prepared_statements_spec.rb +6 -4
  91. data/spec/extensions/round_timestamps_spec.rb +43 -0
  92. data/spec/extensions/serialization_modification_detection_spec.rb +10 -1
  93. data/spec/extensions/serialization_spec.rb +18 -0
  94. data/spec/extensions/single_table_inheritance_spec.rb +5 -0
  95. data/spec/extensions/timestamps_spec.rb +6 -0
  96. data/spec/integration/plugin_test.rb +14 -8
  97. data/spec/integration/prepared_statement_test.rb +12 -0
  98. data/spec/model/associations_spec.rb +24 -0
  99. data/spec/model/model_spec.rb +13 -3
  100. data/spec/model/record_spec.rb +24 -1
  101. metadata +22 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b15d571f0ccc175749541cfee443b953dcd145fd
4
- data.tar.gz: 9dec9dd2f6816432f511c0153737646e44da31a1
3
+ metadata.gz: 22556ea07ee280b6aeb118f6079e84cd50079cd4
4
+ data.tar.gz: 011dbf4ff522233e9bed8a1b2bab18347237345b
5
5
  SHA512:
6
- metadata.gz: ec94d8b6fcd34fecdb4d4c3cc4f2b4fb0277c8d7289baebde098b8b84cc99ab0bfd0ab28effa316df0a0fbba1a7bf2cc3bc0fbbfc682e68f6d50326652719306
7
- data.tar.gz: 919e8651ded7808d66e95788af7993c4b13136487bed14b6e12db2150bca22ab166eef6e0eeb5350b2e2aebdb6f72c36f47ef7dfaef4e3eea2170c396f15f02c
6
+ metadata.gz: 9dc9163ebb7f4066cd44da3bdd85b1f5f26cea75b4af812f50ef2c950742b38b992b5c0fbdf61428395b3624788b31cf9f42a9da9b7bfac4ea4976cd29c73b69
7
+ data.tar.gz: 0ba493e43d63d2fe3d750a621199bb5f43b39e72858424e0089ff977045a3bc6b1c472751ad4c629bbf83680de7bad227cd29c4d7f705389ee212ee638e5c77f
data/CHANGELOG CHANGED
@@ -1,3 +1,67 @@
1
+ === 4.13.0 (2014-08-01)
2
+
3
+ * Use copy constructors instead of overriding Model#dup and #clone (ged, jeremyevans) (#852)
4
+
5
+ * Fix handling of MySQL create_table foreign_key calls using :key option (mimperatore, jeremyevans) (#850)
6
+
7
+ * Handle another disconnection error in the postgres adapter (lbosque) (#848)
8
+
9
+ * Make list plugin update remaining positions after destroying an instance (ehq, jeremyevans) (#847)
10
+
11
+ * Unalias aliased tables in Dataset#insert (jeremyevans)
12
+
13
+ * Add insert_returning_select plugin, for setting up RETURNING for inserts for models selecting explicit columns (jeremyevans)
14
+
15
+ * Make Model#save use insert_select if the dataset used for inserting already uses returning (jeremyevans)
16
+
17
+ * Add Dataset#unqualified_column_for helper method, returning unqualified version of possibly qualified column (jeremyevans)
18
+
19
+ * Calling Dataset#returning when the Database does not support or emulate RETURNING now raises an Error (jeremyevans)
20
+
21
+ * Emulate RETURNING on Microsoft SQL Server using OUTPUT, as long as only simple column references are used (jeremyevans)
22
+
23
+ * Switch class_table_inheritance plugin to use JOIN ON instead of JOIN USING (jeremyevans)
24
+
25
+ * Qualify primary keys for models with joined datasets when looking up model instances by primary key (jeremyevans)
26
+
27
+ * Fix qualification of columns when Dataset#graph automatically wraps the initially graphed dataset in a subselect (jeremyevans)
28
+
29
+ * Make Dataset#joined_dataset? a public method (jeremyevans)
30
+
31
+ * Allow external jdbc, odbc, and do subadapters to be loaded automatically (jeremyevans)
32
+
33
+ * Recognize another disconnect error in the jdbc/mysql adapter (jeremyevans)
34
+
35
+ * Set primary keys correctly for models even if datasets select specific columns (jeremyevans)
36
+
37
+ * Add dataset_source_alias extension, for automatically aliasing datasets to their first source (jeremyevans)
38
+
39
+ * Use qualified columns in the lazy_attributes plugin (jeremyevans)
40
+
41
+ * Add column_select plugin, for using explicit column selections in model datasets (jeremyevans)
42
+
43
+ * Use associated model's existing selection for join associations if it consists solely of explicitly quailfied columns (jeremyevans)
44
+
45
+ * Add round_timestamps extension for automatically rounding timestamp values to database precision before literalizing (jeremyevans)
46
+
47
+ * Make rake default task run plugin specs as well as core/model specs (jeremyevans)
48
+
49
+ * Use all_tables and all_views for Database#tables and #views on Oracle (jeremyevans)
50
+
51
+ * Use all_tab_cols instead of user_tab cols for defaults parsing in the oracle adapter (jeremyevans)
52
+
53
+ * Fix recursive mutex locking issue on JRuby when using Sequel::Model(dataset) (jeremyevans) (#841)
54
+
55
+ * Make composition and serialization plugins support validations on underlying columns (jeremyevans)
56
+
57
+ * Fix regression in timestamps and table inheritance plugin where column values would not be saved if validation is skipped (jeremyevans) (#839)
58
+
59
+ * Add pg_enum extension, for dealing with PostgreSQL enums (jeremyevans)
60
+
61
+ * Add modification_detection plugin, for automatic detection of in-place column value modifications (jeremyevans)
62
+
63
+ * Speed up using plain strings, numbers, true, false, and nil in json columns if underlying json library supports them (jeremyevans) (#834)
64
+
1
65
  === 4.12.0 (2014-07-01)
2
66
 
3
67
  * Support :readonly Database option in sqlite adapter (ippeiukai, jeremyevans) (#832)
data/Rakefile CHANGED
@@ -132,7 +132,9 @@ begin
132
132
  t
133
133
  end
134
134
 
135
- task :default => [:spec]
135
+ desc "Run the core, model, and extension/plugin specs"
136
+ task :default => [:spec, :spec_plugin]
137
+
136
138
  spec_with_cov.call("spec", Dir["spec/{core,model}/*_spec.rb"], "Run core and model specs"){|t| t.rcov_opts.concat(%w'--exclude "lib/sequel/(adapters/([a-ln-z]|m[a-np-z])|extensions/core_extensions)"')}
137
139
  spec.call("spec_bin", ["spec/bin_spec.rb"], "Run bin/sequel specs")
138
140
  spec.call("spec_core", Dir["spec/core/*_spec.rb"], "Run core specs")
data/bin/sequel CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require 'optparse'
5
- $: << File.join(File.dirname(__FILE__), '..', 'lib')
6
- require 'sequel'
7
5
 
8
6
  code = nil
9
7
  copy_databases = nil
@@ -13,6 +11,7 @@ env = nil
13
11
  migrate_dir = nil
14
12
  migrate_ver = nil
15
13
  backtrace = nil
14
+ show_version = false
16
15
  test = true
17
16
  load_dirs = []
18
17
  exclusive_options = []
@@ -43,6 +42,7 @@ options = OptionParser.new do |opts|
43
42
 
44
43
  opts.on("-C", "--copy-databases", "copy one database to another") do
45
44
  copy_databases = true
45
+ exclusive_options << :C
46
46
  end
47
47
 
48
48
  opts.on("-d", "--dump-migration", "print database migration to STDOUT") do
@@ -104,8 +104,7 @@ options = OptionParser.new do |opts|
104
104
  end
105
105
 
106
106
  opts.on_tail("-v", "--version", "Show version") do
107
- puts "sequel #{Sequel.version}"
108
- exit
107
+ show_version = true
109
108
  end
110
109
  end
111
110
  opts = options
@@ -140,6 +139,15 @@ connect_proc = lambda do |database|
140
139
  end
141
140
 
142
141
  begin
142
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
143
+ require 'sequel'
144
+ if show_version
145
+ puts "sequel #{Sequel.version}"
146
+ unless db || code
147
+ exit
148
+ end
149
+ end
150
+
143
151
  DB = connect_proc[db]
144
152
  load_dirs.each{|d| d.is_a?(Array) ? require(d.first) : Dir["#{d}/**/*.rb"].each{|f| load(f)}}
145
153
  if migrate_dir
@@ -222,7 +230,7 @@ begin
222
230
  end
223
231
  rescue => e
224
232
  raise e if backtrace
225
- error_proc["Error: #{e.class}: #{e.message}#{e.backtrace.first}"]
233
+ error_proc["Error: #{e.class}: #{e.message}\n#{e.backtrace.first}"]
226
234
  end
227
235
 
228
236
  if !ARGV.empty?
@@ -0,0 +1,169 @@
1
+ = New Features
2
+
3
+ * A modification_detection plugin has been added, for automatic
4
+ detection of in-place column value modifications. This makes
5
+ it so you don't have to call Model#modified! manually when
6
+ changing a value in place.
7
+
8
+ * A column_select plugin has been added, for automatically
9
+ selecting explicitly qualified columns in model datasets.
10
+ Example:
11
+
12
+ Sequel::Model.plugin :column_select
13
+ class Album < Sequel::Model
14
+ end
15
+ Album.dataset.sql
16
+ # SELECT albums.id, albums.name, albums.artist_id
17
+ # FROM albums
18
+
19
+ * An insert_returning_select plugin has been added, for automatically
20
+ setting up RETURNING clauses for models that select explicit
21
+ columns. This is useful when using the column_select or
22
+ lazy_attributes plugins.
23
+
24
+ * A pg_enum extension has been added, for easier dealing with
25
+ PostgreSQL enum types. The possible values for the type
26
+ are then returned in the schema hashes under the :enum_values
27
+ key. It also adds create_enum, drop_enum, and add_enum_value
28
+ Database methods for migration support.
29
+
30
+ * A round_timestamps extension has been added, for automatically
31
+ rounding timestamps to database supported precision when
32
+ literalizing.
33
+
34
+ * A dataset_source_alias extension has been added, for automatically
35
+ aliasing datasets to their first source, instead of using t1, t2.
36
+ Example:
37
+
38
+ DB.from(:a, DB[:b]).sql
39
+ # SELECT * FROM a, (SELECT * FROM b) AS t1
40
+
41
+ DB.extension(:dataset_source_alias)
42
+ DB.from(:a, DB[:b]).sql
43
+ # SELECT * FROM a, (SELECT * FROM b) AS b
44
+
45
+ * On Microsoft SQL Server, Sequel now emulates RETURNING support
46
+ using the OUTPUT clause, as long as only simple column references
47
+ are used.
48
+
49
+ = Other Improvements
50
+
51
+ * A regression has been fixed in the timestamps and table
52
+ inheritance plugins, where column values would not be
53
+ saved when skipping validations. This was first broken in
54
+ 4.11.0.
55
+
56
+ * A regression has been fixed on JRuby and Rubinius when using
57
+ Sequel::Model(dataset) if the dataset needs to literalize a
58
+ symbol (and most do). This was first broken in 4.10.0.
59
+
60
+ * Primary keys are now automatically setup for models even if
61
+ the models select specific columns.
62
+
63
+ * The lazy_attributes plugin now uses qualified columns in its
64
+ selection, instead of unqualified columns.
65
+
66
+ * When looking up model instances by primary key, Sequel now uses a
67
+ qualified primary key if the model uses a joined dataset.
68
+
69
+ * For associations that require joins, Sequel will now use the
70
+ associated model's selection directly (instead of
71
+ associated_table.*) if the associated model's selection consists
72
+ solely of qualified columns.
73
+
74
+ Among other things, this means that a many_to_many association to
75
+ a model that uses lazy attributes will not eagerly load the lazy
76
+ attributes by default.
77
+
78
+ * Model#save now uses insert_select if there is an existing
79
+ RETURNING clause used by the underlying dataset, even if the model
80
+ selects specific columns.
81
+
82
+ * In Dataset#insert, aliased tables are now automatically unaliased.
83
+ This allows you to use a dataset with an aliased table and have
84
+ full SELECT/INSERT/UPDATE/DELETE support, assuming the database
85
+ supports aliased tables in UPDATE and DELETE.
86
+
87
+ * Dataset#graph now qualifies columns correctly if the current
88
+ dataset is a joined dataset and it moves the current dataset to
89
+ a subselect.
90
+
91
+ * Dataset#joined_dataset? is now a public method, and can be used to
92
+ determine whether the dataset uses a join, either explicitly via
93
+ JOIN or implicitly via multiple FROM tables.
94
+
95
+ * The Dataset#unqualified_column_for helper method has been added,
96
+ returning the unqualified version of a possibly qualified column.
97
+
98
+ * The composition and serialization plugins now support validations
99
+ on the underlying columns. Previously, the didn't update the
100
+ underlying columns until after validations were performed. This
101
+ works better when using the auto_validations plugin.
102
+
103
+ * The class_table_inheritance plugin now uses JOIN ON instead of
104
+ JOIN USING, which makes it work on all databases that Sequel
105
+ supports. Additionally, the plugin now explicitly selects
106
+ qualified columns from all of the tables.
107
+
108
+ * The list plugin now adds an after_destroy hook that will renumber
109
+ rows after the current row, similar to how moving existing values
110
+ in the list works.
111
+
112
+ * The pg_json extension is now faster when json column value is a
113
+ plain string, number, true, false, or nil, if the underlying json
114
+ library handles such values natively.
115
+
116
+ * External jdbc, odbc, and do subadapters can now be loaded
117
+ automatically without requiring them first, assuming proper
118
+ support in the external subadapter.
119
+
120
+ * When using create_table on MySQL, correctly handle the :key
121
+ option to when calling foreign_key with a column reference.
122
+
123
+ * On Oracle, use all_tab_cols instead of user_tab_cols for getting
124
+ default values when parsing the schema. This makes it work if the
125
+ user does not own the table.
126
+
127
+ * On Oracle, use all_tables and all_views for Database#tables and
128
+ Database#views. This works better for users with limited rights.
129
+
130
+ * Additional disconnect errors are now recognized in the postgres and
131
+ jdbc/mysql adapters.
132
+
133
+ * Sequel::Model now uses copy constructors (e.g. initialize_copy)
134
+ instead of overriding #dup and #clone.
135
+
136
+ * The rake default task now runs plugin specs in addition to
137
+ core and model specs.
138
+
139
+ = bin/sequel Improvements
140
+
141
+ * Add the sequel lib directory to the front of the load path
142
+ instead of the end, fixing cases where you end up requiring an
143
+ old version of the sequel gem (e.g. by using sequel_pg).
144
+
145
+ * Add the sequel lib directory as an absolute path, fixing cases
146
+ where you later change the current directory.
147
+
148
+ * Require sequel later in the code, so that bin/sequel -h doesn't
149
+ need to require sequel, and full backtrace is not printed if
150
+ requiring sequel raises an error (unless -t is used).
151
+
152
+ * If an exception is raised, put a newline between the exception
153
+ message and backtrace.
154
+
155
+ * Don't allow usage of -C with any of -cdDmS.
156
+
157
+ * If sequel -v is given along with a database or code string to
158
+ execute, print the Sequel version but also continue, similar
159
+ to how ruby -v works.
160
+
161
+ = Backwards Compatibility
162
+
163
+ * The switch from JOIN ON to JOIN USING in the
164
+ class_table_inheritance can break certain usage, such as querying
165
+ using unqualified primary key. Users should switch to using a
166
+ qualified primary key instead.
167
+
168
+ * Calling Dataset#returning when the underlying database does not
169
+ support it now raises an Error.
data/doc/sql.rdoc CHANGED
@@ -287,9 +287,9 @@ Sequel also supports the SQL EXISTS operator using <tt>Dataset#exists</tt>:
287
287
 
288
288
  Hashes in Sequel use IS if the value is true, false, or nil:
289
289
 
290
- {:column=>nil) # ("column" IS NULL)
291
- {:column=>true) # ("column" IS TRUE)
292
- {:column=>false) # ("column" IS FALSE)
290
+ {:column=>nil} # ("column" IS NULL)
291
+ {:column=>true} # ("column" IS TRUE)
292
+ {:column=>false} # ("column" IS FALSE)
293
293
 
294
294
  Negation works the same way as it does for equality and inclusion:
295
295
 
@@ -11,29 +11,17 @@ module Sequel
11
11
  # * Sequel.connect('do:postgres://user:password@host/database')
12
12
  # * Sequel.connect('do:mysql://user:password@host/database')
13
13
  module DataObjects
14
- # Contains procs keyed on sub adapter type that extend the
14
+ # Contains procs keyed on subadapter type that extend the
15
15
  # given database object so it supports the correct database type.
16
- DATABASE_SETUP = {:postgres=>proc do |db|
17
- require 'do_postgres'
18
- Sequel.require 'adapters/do/postgres'
19
- db.extend(Sequel::DataObjects::Postgres::DatabaseMethods)
20
- db.extend_datasets Sequel::Postgres::DatasetMethods
21
- end,
22
- :mysql=>proc do |db|
23
- require 'do_mysql'
24
- Sequel.require 'adapters/do/mysql'
25
- db.extend(Sequel::DataObjects::MySQL::DatabaseMethods)
26
- db.dataset_class = Sequel::DataObjects::MySQL::Dataset
27
- end,
28
- :sqlite3=>proc do |db|
29
- require 'do_sqlite3'
30
- Sequel.require 'adapters/do/sqlite'
31
- db.extend(Sequel::DataObjects::SQLite::DatabaseMethods)
32
- db.extend_datasets Sequel::SQLite::DatasetMethods
33
- db.set_integer_booleans
34
- end
35
- }
16
+ DATABASE_SETUP = {}
36
17
 
18
+ # Wrapper for require that raises AdapterNotFound if driver could not be loaded
19
+ def self.load_driver(path)
20
+ require path
21
+ rescue LoadError => e
22
+ raise AdapterNotFound, e.message
23
+ end
24
+
37
25
  # DataObjects uses it's own internal connection pooling in addition to the
38
26
  # pooling that Sequel uses. You should make sure that you don't set
39
27
  # the connection pool size to more than 8 for a
@@ -108,12 +96,12 @@ module Sequel
108
96
  private
109
97
 
110
98
  # Call the DATABASE_SETUP proc directly after initialization,
111
- # so the object always uses sub adapter specific code. Also,
99
+ # so the object always uses subadapter specific code. Also,
112
100
  # raise an error immediately if the connection doesn't have a
113
101
  # uri, since DataObjects requires one.
114
102
  def adapter_initialize
115
103
  raise(Error, "No connection string specified") unless uri
116
- if prok = DATABASE_SETUP[subadapter.to_sym]
104
+ if prok = Sequel::Database.load_adapter(subadapter.to_sym, :map=>DATABASE_SETUP, :subdir=>'do')
117
105
  prok.call(self)
118
106
  end
119
107
  end
@@ -1,7 +1,15 @@
1
+ Sequel::DataObjects.load_driver 'do_mysql'
1
2
  Sequel.require 'adapters/shared/mysql'
2
3
 
3
4
  module Sequel
4
5
  module DataObjects
6
+ Sequel.synchronize do
7
+ DATABASE_SETUP[:mysql] = proc do |db|
8
+ db.extend(Sequel::DataObjects::MySQL::DatabaseMethods)
9
+ db.dataset_class = Sequel::DataObjects::MySQL::Dataset
10
+ end
11
+ end
12
+
5
13
  # Database and Dataset instance methods for MySQL specific
6
14
  # support via DataObjects.
7
15
  module MySQL
@@ -1,9 +1,17 @@
1
+ Sequel::DataObjects.load_driver 'do_postgres'
1
2
  Sequel.require 'adapters/shared/postgres'
2
3
 
3
4
  module Sequel
4
5
  Postgres::CONVERTED_EXCEPTIONS << ::DataObjects::Error
5
6
 
6
7
  module DataObjects
8
+ Sequel.synchronize do
9
+ DATABASE_SETUP[:postgres] = proc do |db|
10
+ db.extend(Sequel::DataObjects::Postgres::DatabaseMethods)
11
+ db.extend_datasets Sequel::Postgres::DatasetMethods
12
+ end
13
+ end
14
+
7
15
  # Adapter, Database, and Dataset support for accessing a PostgreSQL
8
16
  # database via DataObjects.
9
17
  module Postgres
@@ -1,7 +1,16 @@
1
+ Sequel::DataObjects.load_driver 'do_sqlite3'
1
2
  Sequel.require 'adapters/shared/sqlite'
2
3
 
3
4
  module Sequel
4
5
  module DataObjects
6
+ Sequel.synchronize do
7
+ DATABASE_SETUP[:sqlite3] = proc do |db|
8
+ db.extend(Sequel::DataObjects::SQLite::DatabaseMethods)
9
+ db.extend_datasets Sequel::SQLite::DatasetMethods
10
+ db.set_integer_booleans
11
+ end
12
+ end
13
+
5
14
  # Database and Dataset support for SQLite databases accessed via DataObjects.
6
15
  module SQLite
7
16
  # Instance methods for SQLite Database objects accessed via DataObjects.
@@ -27,146 +27,11 @@ module Sequel
27
27
  # to :integer.
28
28
  DECIMAL_TYPE_RE = /number|numeric|decimal/io
29
29
 
30
- # Contains procs keyed on sub adapter type that extend the
30
+ # Contains procs keyed on subadapter type that extend the
31
31
  # given database object so it supports the correct database type.
32
- DATABASE_SETUP = {:postgresql=>proc do |db|
33
- JDBC.load_gem(:Postgres)
34
- org.postgresql.Driver
35
- Sequel.require 'adapters/jdbc/postgresql'
36
- db.extend(Sequel::JDBC::Postgres::DatabaseMethods)
37
- db.dataset_class = Sequel::JDBC::Postgres::Dataset
38
- org.postgresql.Driver
39
- end,
40
- :mysql=>proc do |db|
41
- JDBC.load_gem(:MySQL)
42
- com.mysql.jdbc.Driver
43
- Sequel.require 'adapters/jdbc/mysql'
44
- db.extend(Sequel::JDBC::MySQL::DatabaseMethods)
45
- db.extend_datasets Sequel::MySQL::DatasetMethods
46
- com.mysql.jdbc.Driver
47
- end,
48
- :sqlite=>proc do |db|
49
- JDBC.load_gem(:SQLite3)
50
- org.sqlite.JDBC
51
- Sequel.require 'adapters/jdbc/sqlite'
52
- db.extend(Sequel::JDBC::SQLite::DatabaseMethods)
53
- db.extend_datasets Sequel::SQLite::DatasetMethods
54
- db.set_integer_booleans
55
- org.sqlite.JDBC
56
- end,
57
- :oracle=>proc do |db|
58
- Java::oracle.jdbc.driver.OracleDriver
59
- Sequel.require 'adapters/jdbc/oracle'
60
- db.extend(Sequel::JDBC::Oracle::DatabaseMethods)
61
- db.dataset_class = Sequel::JDBC::Oracle::Dataset
62
- Java::oracle.jdbc.driver.OracleDriver
63
- end,
64
- :sqlserver=>proc do |db|
65
- com.microsoft.sqlserver.jdbc.SQLServerDriver
66
- Sequel.require 'adapters/jdbc/sqlserver'
67
- db.extend(Sequel::JDBC::SQLServer::DatabaseMethods)
68
- db.extend_datasets Sequel::MSSQL::DatasetMethods
69
- db.send(:set_mssql_unicode_strings)
70
- com.microsoft.sqlserver.jdbc.SQLServerDriver
71
- end,
72
- :jtds=>proc do |db|
73
- JDBC.load_gem(:JTDS)
74
- Java::net.sourceforge.jtds.jdbc.Driver
75
- Sequel.require 'adapters/jdbc/jtds'
76
- db.extend(Sequel::JDBC::JTDS::DatabaseMethods)
77
- db.dataset_class = Sequel::JDBC::JTDS::Dataset
78
- db.send(:set_mssql_unicode_strings)
79
- Java::net.sourceforge.jtds.jdbc.Driver
80
- end,
81
- :h2=>proc do |db|
82
- JDBC.load_gem(:H2)
83
- org.h2.Driver
84
- Sequel.require 'adapters/jdbc/h2'
85
- db.extend(Sequel::JDBC::H2::DatabaseMethods)
86
- db.dataset_class = Sequel::JDBC::H2::Dataset
87
- org.h2.Driver
88
- end,
89
- :hsqldb=>proc do |db|
90
- JDBC.load_gem(:HSQLDB)
91
- org.hsqldb.jdbcDriver
92
- Sequel.require 'adapters/jdbc/hsqldb'
93
- db.extend(Sequel::JDBC::HSQLDB::DatabaseMethods)
94
- db.dataset_class = Sequel::JDBC::HSQLDB::Dataset
95
- org.hsqldb.jdbcDriver
96
- end,
97
- :derby=>proc do |db|
98
- JDBC.load_gem(:Derby)
99
- org.apache.derby.jdbc.EmbeddedDriver
100
- Sequel.require 'adapters/jdbc/derby'
101
- db.extend(Sequel::JDBC::Derby::DatabaseMethods)
102
- db.dataset_class = Sequel::JDBC::Derby::Dataset
103
- org.apache.derby.jdbc.EmbeddedDriver
104
- end,
105
- :as400=>proc do |db|
106
- com.ibm.as400.access.AS400JDBCDriver
107
- Sequel.require 'adapters/jdbc/as400'
108
- db.extend(Sequel::JDBC::AS400::DatabaseMethods)
109
- db.dataset_class = Sequel::JDBC::AS400::Dataset
110
- com.ibm.as400.access.AS400JDBCDriver
111
- end,
112
- :"informix-sqli"=>proc do |db|
113
- com.informix.jdbc.IfxDriver
114
- Sequel.require 'adapters/jdbc/informix'
115
- db.extend(Sequel::JDBC::Informix::DatabaseMethods)
116
- db.extend_datasets Sequel::Informix::DatasetMethods
117
- com.informix.jdbc.IfxDriver
118
- end,
119
- :db2=>proc do |db|
120
- com.ibm.db2.jcc.DB2Driver
121
- Sequel.require 'adapters/jdbc/db2'
122
- db.extend(Sequel::JDBC::DB2::DatabaseMethods)
123
- db.dataset_class = Sequel::JDBC::DB2::Dataset
124
- com.ibm.db2.jcc.DB2Driver
125
- end,
126
- :firebirdsql=>proc do |db|
127
- org.firebirdsql.jdbc.FBDriver
128
- Sequel.require 'adapters/jdbc/firebird'
129
- db.extend(Sequel::JDBC::Firebird::DatabaseMethods)
130
- db.extend_datasets Sequel::Firebird::DatasetMethods
131
- org.firebirdsql.jdbc.FBDriver
132
- end,
133
- :jdbcprogress=>proc do |db|
134
- com.progress.sql.jdbc.JdbcProgressDriver
135
- Sequel.require 'adapters/jdbc/progress'
136
- db.extend(Sequel::JDBC::Progress::DatabaseMethods)
137
- db.extend_datasets Sequel::Progress::DatasetMethods
138
- com.progress.sql.jdbc.JdbcProgressDriver
139
- end,
140
- :cubrid=>proc do |db|
141
- Java::cubrid.jdbc.driver.CUBRIDDriver
142
- Sequel.require 'adapters/jdbc/cubrid'
143
- db.extend(Sequel::JDBC::Cubrid::DatabaseMethods)
144
- db.extend_datasets Sequel::Cubrid::DatasetMethods
145
- Java::cubrid.jdbc.driver.CUBRIDDriver
146
- end,
147
- :sqlanywhere=>proc do |db|
148
- drv = [
149
- lambda{Java::sybase.jdbc4.sqlanywhere.IDriver},
150
- lambda{Java::ianywhere.ml.jdbcodbc.jdbc4.IDriver},
151
- lambda{Java::sybase.jdbc.sqlanywhere.IDriver},
152
- lambda{Java::ianywhere.ml.jdbcodbc.jdbc.IDriver},
153
- lambda{Java::com.sybase.jdbc4.jdbc.Sybdriver},
154
- lambda{Java::com.sybase.jdbc3.jdbc.Sybdriver}
155
- ].each do |class_proc|
156
- begin
157
- break class_proc.call
158
- rescue NameError
159
- end
160
- end
161
- Sequel.require 'adapters/jdbc/sqlanywhere'
162
- db.extend(Sequel::JDBC::SqlAnywhere::DatabaseMethods)
163
- db.dataset_class = Sequel::JDBC::SqlAnywhere::Dataset
164
- drv
165
- end
166
- }
32
+ DATABASE_SETUP = {}
167
33
 
168
- # Allowing loading the necessary JDBC support via a gem, which
169
- # works for PostgreSQL, MySQL, and SQLite.
34
+ # Allow loading the necessary JDBC support via a gem.
170
35
  def self.load_gem(name)
171
36
  begin
172
37
  require "jdbc/#{name.to_s.downcase}"
@@ -180,6 +45,18 @@ module Sequel
180
45
  end
181
46
  end
182
47
 
48
+ # Attempt to load the JDBC driver class, which should be specified as a string
49
+ # containing the driver class name (which JRuby should autoload).
50
+ # Note that the string is evaled, so this method is not safe to call with
51
+ # untrusted input.
52
+ # Raise a Sequel::AdapterNotFound if evaluating the class name raises a NameError.
53
+ def self.load_driver(drv, gem=nil)
54
+ load_gem(gem) if gem
55
+ eval drv
56
+ rescue NameError
57
+ raise Sequel::AdapterNotFound, "#{drv} not loaded#{", try installing jdbc-#{gem.to_s.downcase} gem" if gem}"
58
+ end
59
+
183
60
  class TypeConvertor
184
61
  %w'Boolean Float Double Int Long Short'.each do |meth|
185
62
  class_eval("def #{meth}(r, i) v = r.get#{meth}(i); v unless r.wasNull end", __FILE__, __LINE__)
@@ -473,7 +350,7 @@ module Sequel
473
350
 
474
351
  resolved_uri = jndi? ? get_uri_from_jndi : uri
475
352
 
476
- @driver = if (match = /\Ajdbc:([^:]+)/.match(resolved_uri)) && (prok = DATABASE_SETUP[match[1].to_sym])
353
+ @driver = if (match = /\Ajdbc:([^:]+)/.match(resolved_uri)) && (prok = Sequel::Database.load_adapter(match[1].to_sym, :map=>DATABASE_SETUP, :subdir=>'jdbc'))
477
354
  prok.call(self)
478
355
  else
479
356
  @opts[:driver]