sequel 2.11.0 → 2.12.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.
- data/CHANGELOG +168 -0
- data/README.rdoc +77 -95
- data/Rakefile +100 -80
- data/bin/sequel +2 -1
- data/doc/advanced_associations.rdoc +23 -32
- data/doc/cheat_sheet.rdoc +23 -40
- data/doc/dataset_filtering.rdoc +6 -6
- data/doc/prepared_statements.rdoc +22 -22
- data/doc/release_notes/2.12.0.txt +534 -0
- data/doc/schema.rdoc +3 -1
- data/doc/sharding.rdoc +8 -8
- data/doc/virtual_rows.rdoc +65 -0
- data/lib/sequel.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/ado.rb +3 -3
- data/lib/{sequel_core → sequel}/adapters/db2.rb +0 -0
- data/lib/{sequel_core → sequel}/adapters/dbi.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/do.rb +9 -5
- data/lib/{sequel_core → sequel}/adapters/do/mysql.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/do/postgres.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/do/sqlite.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/firebird.rb +84 -80
- data/lib/{sequel_core → sequel}/adapters/informix.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/jdbc.rb +21 -14
- data/lib/{sequel_core → sequel}/adapters/jdbc/h2.rb +14 -13
- data/lib/{sequel_core → sequel}/adapters/jdbc/mysql.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/jdbc/oracle.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/jdbc/postgresql.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/jdbc/sqlite.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/mysql.rb +60 -39
- data/lib/{sequel_core → sequel}/adapters/odbc.rb +8 -4
- data/lib/{sequel_core → sequel}/adapters/openbase.rb +0 -0
- data/lib/{sequel_core → sequel}/adapters/oracle.rb +38 -7
- data/lib/{sequel_core → sequel}/adapters/postgres.rb +24 -24
- data/lib/{sequel_core → sequel}/adapters/shared/mssql.rb +5 -5
- data/lib/{sequel_core → sequel}/adapters/shared/mysql.rb +126 -71
- data/lib/{sequel_core → sequel}/adapters/shared/oracle.rb +7 -10
- data/lib/{sequel_core → sequel}/adapters/shared/postgres.rb +159 -125
- data/lib/{sequel_core → sequel}/adapters/shared/progress.rb +1 -2
- data/lib/{sequel_core → sequel}/adapters/shared/sqlite.rb +72 -67
- data/lib/{sequel_core → sequel}/adapters/sqlite.rb +11 -7
- data/lib/{sequel_core → sequel}/adapters/utils/date_format.rb +0 -0
- data/lib/{sequel_core → sequel}/adapters/utils/stored_procedures.rb +0 -0
- data/lib/{sequel_core → sequel}/adapters/utils/unsupported.rb +19 -0
- data/lib/{sequel_core → sequel}/connection_pool.rb +7 -5
- data/lib/sequel/core.rb +221 -0
- data/lib/{sequel_core → sequel}/core_sql.rb +91 -49
- data/lib/{sequel_core → sequel}/database.rb +264 -149
- data/lib/{sequel_core/schema/generator.rb → sequel/database/schema_generator.rb} +6 -2
- data/lib/{sequel_core/database/schema.rb → sequel/database/schema_methods.rb} +12 -12
- data/lib/sequel/database/schema_sql.rb +224 -0
- data/lib/{sequel_core → sequel}/dataset.rb +78 -236
- data/lib/{sequel_core → sequel}/dataset/convenience.rb +99 -61
- data/lib/{sequel_core/object_graph.rb → sequel/dataset/graph.rb} +16 -14
- data/lib/{sequel_core → sequel}/dataset/prepared_statements.rb +1 -1
- data/lib/{sequel_core → sequel}/dataset/sql.rb +150 -99
- data/lib/sequel/deprecated.rb +593 -0
- data/lib/sequel/deprecated_migration.rb +91 -0
- data/lib/sequel/exceptions.rb +48 -0
- data/lib/sequel/extensions/blank.rb +42 -0
- data/lib/{sequel_model → sequel/extensions}/inflector.rb +8 -1
- data/lib/{sequel_core → sequel/extensions}/migration.rb +1 -1
- data/lib/{sequel_core/dataset → sequel/extensions}/pagination.rb +0 -0
- data/lib/{sequel_core → sequel/extensions}/pretty_table.rb +7 -0
- data/lib/{sequel_core/dataset → sequel/extensions}/query.rb +7 -0
- data/lib/sequel/extensions/string_date_time.rb +47 -0
- data/lib/sequel/metaprogramming.rb +43 -0
- data/lib/sequel/model.rb +110 -0
- data/lib/sequel/model/associations.rb +1300 -0
- data/lib/sequel/model/base.rb +937 -0
- data/lib/sequel/model/deprecated.rb +204 -0
- data/lib/sequel/model/deprecated_hooks.rb +103 -0
- data/lib/sequel/model/deprecated_inflector.rb +335 -0
- data/lib/sequel/model/deprecated_validations.rb +388 -0
- data/lib/sequel/model/errors.rb +39 -0
- data/lib/{sequel_model → sequel/model}/exceptions.rb +4 -4
- data/lib/sequel/model/inflections.rb +208 -0
- data/lib/sequel/model/plugins.rb +76 -0
- data/lib/sequel/plugins/caching.rb +122 -0
- data/lib/sequel/plugins/hook_class_methods.rb +122 -0
- data/lib/sequel/plugins/schema.rb +53 -0
- data/lib/sequel/plugins/serialization.rb +117 -0
- data/lib/sequel/plugins/single_table_inheritance.rb +63 -0
- data/lib/sequel/plugins/validation_class_methods.rb +384 -0
- data/lib/sequel/plugins/validation_helpers.rb +150 -0
- data/lib/{sequel_core → sequel}/sql.rb +125 -190
- data/lib/{sequel_core → sequel}/version.rb +2 -1
- data/lib/sequel_core.rb +1 -172
- data/lib/sequel_model.rb +1 -91
- data/spec/adapters/firebird_spec.rb +5 -5
- data/spec/adapters/informix_spec.rb +1 -1
- data/spec/adapters/mysql_spec.rb +128 -42
- data/spec/adapters/oracle_spec.rb +47 -19
- data/spec/adapters/postgres_spec.rb +64 -52
- data/spec/adapters/spec_helper.rb +1 -1
- data/spec/adapters/sqlite_spec.rb +12 -17
- data/spec/{sequel_core → core}/connection_pool_spec.rb +10 -10
- data/spec/{sequel_core → core}/core_ext_spec.rb +19 -19
- data/spec/{sequel_core → core}/core_sql_spec.rb +68 -71
- data/spec/{sequel_core → core}/database_spec.rb +135 -99
- data/spec/{sequel_core → core}/dataset_spec.rb +398 -242
- data/spec/{sequel_core → core}/expression_filters_spec.rb +13 -13
- data/spec/core/migration_spec.rb +263 -0
- data/spec/{sequel_core → core}/object_graph_spec.rb +10 -10
- data/spec/{sequel_core → core}/pretty_table_spec.rb +2 -2
- data/spec/{sequel_core → core}/schema_generator_spec.rb +0 -0
- data/spec/{sequel_core → core}/schema_spec.rb +8 -10
- data/spec/{sequel_core → core}/spec_helper.rb +29 -2
- data/spec/{sequel_core → core}/version_spec.rb +0 -0
- data/spec/extensions/blank_spec.rb +67 -0
- data/spec/extensions/caching_spec.rb +201 -0
- data/spec/{sequel_model/hooks_spec.rb → extensions/hook_class_methods_spec.rb} +8 -23
- data/spec/{sequel_model → extensions}/inflector_spec.rb +3 -0
- data/spec/{sequel_core → extensions}/migration_spec.rb +4 -4
- data/spec/extensions/pagination_spec.rb +99 -0
- data/spec/extensions/pretty_table_spec.rb +91 -0
- data/spec/extensions/query_spec.rb +85 -0
- data/spec/{sequel_model → extensions}/schema_spec.rb +22 -1
- data/spec/extensions/serialization_spec.rb +109 -0
- data/spec/extensions/single_table_inheritance_spec.rb +53 -0
- data/spec/{sequel_model → extensions}/spec_helper.rb +13 -4
- data/spec/extensions/string_date_time_spec.rb +93 -0
- data/spec/{sequel_model/validations_spec.rb → extensions/validation_class_methods_spec.rb} +15 -103
- data/spec/extensions/validation_helpers_spec.rb +291 -0
- data/spec/integration/dataset_test.rb +31 -0
- data/spec/integration/eager_loader_test.rb +17 -30
- data/spec/integration/schema_test.rb +8 -5
- data/spec/integration/spec_helper.rb +17 -0
- data/spec/integration/transaction_test.rb +68 -0
- data/spec/{sequel_model → model}/association_reflection_spec.rb +0 -0
- data/spec/{sequel_model → model}/associations_spec.rb +23 -10
- data/spec/{sequel_model → model}/base_spec.rb +29 -20
- data/spec/{sequel_model → model}/caching_spec.rb +16 -14
- data/spec/{sequel_model → model}/dataset_methods_spec.rb +0 -0
- data/spec/{sequel_model → model}/eager_loading_spec.rb +8 -8
- data/spec/model/hooks_spec.rb +472 -0
- data/spec/model/inflector_spec.rb +126 -0
- data/spec/{sequel_model → model}/model_spec.rb +25 -20
- data/spec/model/plugins_spec.rb +142 -0
- data/spec/{sequel_model → model}/record_spec.rb +121 -62
- data/spec/model/schema_spec.rb +92 -0
- data/spec/model/spec_helper.rb +124 -0
- data/spec/model/validations_spec.rb +1080 -0
- metadata +136 -107
- data/lib/sequel_core/core_ext.rb +0 -217
- data/lib/sequel_core/dataset/callback.rb +0 -13
- data/lib/sequel_core/dataset/schema.rb +0 -15
- data/lib/sequel_core/deprecated.rb +0 -26
- data/lib/sequel_core/exceptions.rb +0 -44
- data/lib/sequel_core/schema.rb +0 -2
- data/lib/sequel_core/schema/sql.rb +0 -325
- data/lib/sequel_model/association_reflection.rb +0 -267
- data/lib/sequel_model/associations.rb +0 -499
- data/lib/sequel_model/base.rb +0 -539
- data/lib/sequel_model/caching.rb +0 -82
- data/lib/sequel_model/dataset_methods.rb +0 -26
- data/lib/sequel_model/eager_loading.rb +0 -370
- data/lib/sequel_model/hooks.rb +0 -101
- data/lib/sequel_model/plugins.rb +0 -62
- data/lib/sequel_model/record.rb +0 -568
- data/lib/sequel_model/schema.rb +0 -49
- data/lib/sequel_model/validations.rb +0 -429
- data/spec/sequel_model/plugins_spec.rb +0 -80
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require 'java'
|
|
2
|
-
require '
|
|
2
|
+
Sequel.require 'adapters/utils/stored_procedures'
|
|
3
3
|
|
|
4
4
|
module Sequel
|
|
5
5
|
# Houses Sequel's JDBC support when running on JRuby.
|
|
@@ -35,35 +35,35 @@ module Sequel
|
|
|
35
35
|
# Contains procs keyed on sub adapter type that extend the
|
|
36
36
|
# given database object so it supports the correct database type.
|
|
37
37
|
DATABASE_SETUP = {:postgresql=>proc do |db|
|
|
38
|
-
require '
|
|
38
|
+
Sequel.require 'adapters/jdbc/postgresql'
|
|
39
39
|
db.extend(Sequel::JDBC::Postgres::DatabaseMethods)
|
|
40
40
|
JDBC.load_gem('postgres')
|
|
41
41
|
org.postgresql.Driver
|
|
42
42
|
end,
|
|
43
43
|
:mysql=>proc do |db|
|
|
44
|
-
require '
|
|
44
|
+
Sequel.require 'adapters/jdbc/mysql'
|
|
45
45
|
db.extend(Sequel::JDBC::MySQL::DatabaseMethods)
|
|
46
46
|
JDBC.load_gem('mysql')
|
|
47
47
|
com.mysql.jdbc.Driver
|
|
48
48
|
end,
|
|
49
49
|
:sqlite=>proc do |db|
|
|
50
|
-
require '
|
|
50
|
+
Sequel.require 'adapters/jdbc/sqlite'
|
|
51
51
|
db.extend(Sequel::JDBC::SQLite::DatabaseMethods)
|
|
52
52
|
JDBC.load_gem('sqlite3')
|
|
53
53
|
org.sqlite.JDBC
|
|
54
54
|
end,
|
|
55
55
|
:oracle=>proc do |db|
|
|
56
|
-
require '
|
|
56
|
+
Sequel.require 'adapters/jdbc/oracle'
|
|
57
57
|
db.extend(Sequel::JDBC::Oracle::DatabaseMethods)
|
|
58
58
|
Java::oracle.jdbc.driver.OracleDriver
|
|
59
59
|
end,
|
|
60
60
|
:sqlserver=>proc do |db|
|
|
61
|
-
require '
|
|
61
|
+
Sequel.require 'adapters/shared/mssql'
|
|
62
62
|
db.extend(Sequel::MSSQL::DatabaseMethods)
|
|
63
63
|
com.microsoft.sqlserver.jdbc.SQLServerDriver
|
|
64
64
|
end,
|
|
65
65
|
:h2=>proc do |db|
|
|
66
|
-
require '
|
|
66
|
+
Sequel.require 'adapters/jdbc/h2'
|
|
67
67
|
db.extend(Sequel::JDBC::H2::DatabaseMethods)
|
|
68
68
|
JDBC.load_gem('h2')
|
|
69
69
|
org.h2.Driver
|
|
@@ -146,7 +146,7 @@ module Sequel
|
|
|
146
146
|
# statement or something else that returns rows.
|
|
147
147
|
def execute(sql, opts={}, &block)
|
|
148
148
|
return call_sproc(sql, opts, &block) if opts[:sproc]
|
|
149
|
-
return execute_prepared_statement(sql, opts, &block) if sql.
|
|
149
|
+
return execute_prepared_statement(sql, opts, &block) if [Symbol, Dataset].any?{|c| sql.is_a?(c)}
|
|
150
150
|
log_info(sql)
|
|
151
151
|
synchronize(opts[:server]) do |conn|
|
|
152
152
|
stmt = conn.createStatement
|
|
@@ -196,8 +196,12 @@ module Sequel
|
|
|
196
196
|
# Default transaction method that should work on most JDBC
|
|
197
197
|
# databases. Does not use the JDBC transaction methods, uses
|
|
198
198
|
# SQL BEGIN/ROLLBACK/COMMIT statements instead.
|
|
199
|
-
def transaction(
|
|
200
|
-
|
|
199
|
+
def transaction(opts={})
|
|
200
|
+
unless opts.is_a?(Hash)
|
|
201
|
+
Deprecation.deprecate('Passing an argument other than a Hash to Database#transaction', "Use DB.transaction(:server=>#{opts.inspect})")
|
|
202
|
+
opts = {:server=>opts}
|
|
203
|
+
end
|
|
204
|
+
synchronize(opts[:server]) do |conn|
|
|
201
205
|
return yield(conn) if @transactions.include?(Thread.current)
|
|
202
206
|
stmt = conn.createStatement
|
|
203
207
|
begin
|
|
@@ -334,7 +338,9 @@ module Sequel
|
|
|
334
338
|
# and set it to an empty hash. This is used to store
|
|
335
339
|
# adapter specific prepared statements.
|
|
336
340
|
def setup_connection(conn)
|
|
337
|
-
conn
|
|
341
|
+
class << conn
|
|
342
|
+
attr_accessor :prepared_statements
|
|
343
|
+
end
|
|
338
344
|
conn.prepared_statements = {}
|
|
339
345
|
conn
|
|
340
346
|
end
|
|
@@ -432,9 +438,9 @@ module Sequel
|
|
|
432
438
|
def convert_type(v)
|
|
433
439
|
case v
|
|
434
440
|
when Java::JavaSQL::Timestamp, Java::JavaSQL::Time
|
|
435
|
-
v.to_string
|
|
441
|
+
Sequel.string_to_datetime(v.to_string)
|
|
436
442
|
when Java::JavaSQL::Date
|
|
437
|
-
v.to_string
|
|
443
|
+
Sequel.string_to_date(v.to_string)
|
|
438
444
|
when Java::JavaIo::BufferedReader
|
|
439
445
|
lines = []
|
|
440
446
|
while(line = v.read_line) do lines << line end
|
|
@@ -458,7 +464,7 @@ module Sequel
|
|
|
458
464
|
meta = result.getMetaData
|
|
459
465
|
column_count = meta.getColumnCount
|
|
460
466
|
@columns = []
|
|
461
|
-
column_count.times{|i| @columns << output_identifier(meta.
|
|
467
|
+
column_count.times{|i| @columns << output_identifier(meta.getColumnLabel(i+1))}
|
|
462
468
|
|
|
463
469
|
# get rows
|
|
464
470
|
while result.next
|
|
@@ -474,6 +480,7 @@ end
|
|
|
474
480
|
class Java::JavaSQL::Timestamp
|
|
475
481
|
# Add a usec method in order to emulate Time values.
|
|
476
482
|
def usec
|
|
483
|
+
Deprecation.deprecate('Java::JavaSQL::Timestamp#usec', 'Use timestamp.getNanos/1000')
|
|
477
484
|
getNanos/1000
|
|
478
485
|
end
|
|
479
486
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require '
|
|
1
|
+
Sequel.require %w'date_format unsupported', 'adapters/utils'
|
|
2
2
|
|
|
3
3
|
module Sequel
|
|
4
4
|
module JDBC
|
|
@@ -6,6 +6,18 @@ module Sequel
|
|
|
6
6
|
module H2
|
|
7
7
|
# Instance methods for H2 Database objects accessed via JDBC.
|
|
8
8
|
module DatabaseMethods
|
|
9
|
+
# Return Sequel::JDBC::H2::Dataset object with the given opts.
|
|
10
|
+
def dataset(opts=nil)
|
|
11
|
+
Sequel::JDBC::H2::Dataset.new(self, opts)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# H2 uses an IDENTITY type
|
|
15
|
+
def serial_primary_key_options
|
|
16
|
+
{:primary_key => true, :type => :identity}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
9
21
|
# H2 needs to add a primary key column as a constraint
|
|
10
22
|
def alter_table_sql(table, op)
|
|
11
23
|
case op[:op]
|
|
@@ -21,18 +33,6 @@ module Sequel
|
|
|
21
33
|
end
|
|
22
34
|
end
|
|
23
35
|
|
|
24
|
-
# Return Sequel::JDBC::H2::Dataset object with the given opts.
|
|
25
|
-
def dataset(opts=nil)
|
|
26
|
-
Sequel::JDBC::H2::Dataset.new(self, opts)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# H2 uses an IDENTITY type
|
|
30
|
-
def serial_primary_key_options
|
|
31
|
-
{:primary_key => true, :type => :identity}
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
private
|
|
35
|
-
|
|
36
36
|
# Use IDENTITY() to get the last inserted id.
|
|
37
37
|
def last_insert_id(conn, opts={})
|
|
38
38
|
stmt = conn.createStatement
|
|
@@ -55,6 +55,7 @@ module Sequel
|
|
|
55
55
|
# Dataset class for H2 datasets accessed via JDBC.
|
|
56
56
|
class Dataset < JDBC::Dataset
|
|
57
57
|
include Dataset::SQLStandardDateFormat
|
|
58
|
+
include Dataset::UnsupportedIsTrue
|
|
58
59
|
end
|
|
59
60
|
end
|
|
60
61
|
end
|
|
@@ -1,40 +1,55 @@
|
|
|
1
1
|
require 'mysql'
|
|
2
|
-
require '
|
|
3
|
-
require 'sequel_core/adapters/utils/stored_procedures'
|
|
2
|
+
Sequel.require %w'shared/mysql utils/stored_procedures', 'adapters'
|
|
4
3
|
|
|
5
4
|
module Sequel
|
|
6
5
|
# Module for holding all MySQL-related classes and modules for Sequel.
|
|
6
|
+
#
|
|
7
|
+
# A class level convert_invalid_date_time accessor exists if
|
|
8
|
+
# the native adapter is used. If set to nil or :nil, the adapter treats dates
|
|
9
|
+
# like 0000-00-00 and times like 838:00:00 as nil values. If set to :string,
|
|
10
|
+
# it returns the strings as is. If is false by default, which means that
|
|
11
|
+
# invalid dates and times will raise errors.
|
|
7
12
|
module MySQL
|
|
8
|
-
# Mapping of type numbers to conversion
|
|
9
|
-
MYSQL_TYPES = {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
5
|
|
16
|
-
|
|
17
|
-
7
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
10 => :to_date, # MYSQL_TYPE_DATE
|
|
21
|
-
11 => :to_time, # MYSQL_TYPE_TIME
|
|
22
|
-
12 => :to_sequel_time, # MYSQL_TYPE_DATETIME
|
|
23
|
-
13 => :to_i, # MYSQL_TYPE_YEAR
|
|
24
|
-
14 => :to_date, # MYSQL_TYPE_NEWDATE
|
|
25
|
-
# 15 => :to_s # MYSQL_TYPE_VARCHAR
|
|
26
|
-
# 16 => :to_s, # MYSQL_TYPE_BIT
|
|
27
|
-
246 => :to_d, # MYSQL_TYPE_NEWDECIMAL
|
|
28
|
-
247 => :to_i, # MYSQL_TYPE_ENUM
|
|
29
|
-
248 => :to_i, # MYSQL_TYPE_SET
|
|
30
|
-
249 => :to_sequel_blob, # MYSQL_TYPE_TINY_BLOB
|
|
31
|
-
250 => :to_sequel_blob, # MYSQL_TYPE_MEDIUM_BLOB
|
|
32
|
-
251 => :to_sequel_blob, # MYSQL_TYPE_LONG_BLOB
|
|
33
|
-
252 => :to_sequel_blob, # MYSQL_TYPE_BLOB
|
|
34
|
-
# 253 => :to_s, # MYSQL_TYPE_VAR_STRING
|
|
35
|
-
# 254 => :to_s, # MYSQL_TYPE_STRING
|
|
36
|
-
# 255 => :to_s # MYSQL_TYPE_GEOMETRY
|
|
13
|
+
# Mapping of type numbers to conversion procs
|
|
14
|
+
MYSQL_TYPES = {}
|
|
15
|
+
|
|
16
|
+
# Use only a single proc for each type to save on memory
|
|
17
|
+
MYSQL_TYPE_PROCS = {
|
|
18
|
+
[0, 246] => lambda{|v| BigDecimal.new(v)}, # decimal
|
|
19
|
+
[1, 2, 3, 8, 9, 13, 247, 248] => lambda{|v| v.to_i}, # integer
|
|
20
|
+
[4, 5] => lambda{|v| v.to_f}, # float
|
|
21
|
+
[10, 14] => lambda{|v| convert_date_time(:string_to_date, v)}, # date
|
|
22
|
+
[7, 12] => lambda{|v| convert_date_time(:string_to_datetime, v)}, # datetime
|
|
23
|
+
[11] => lambda{|v| convert_date_time(:string_to_time, v)}, # time
|
|
24
|
+
[249, 250, 251, 252] => lambda{|v| Sequel::SQL::Blob.new(v)} # blob
|
|
37
25
|
}
|
|
26
|
+
MYSQL_TYPE_PROCS.each do |k,v|
|
|
27
|
+
k.each{|n| MYSQL_TYPES[n] = v}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
@convert_invalid_date_time = false
|
|
31
|
+
|
|
32
|
+
class << self
|
|
33
|
+
attr_accessor :convert_invalid_date_time
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# If convert_invalid_date_time is nil, :nil, or :string and
|
|
37
|
+
# the conversion raises an InvalidValue exception, return v
|
|
38
|
+
# if :string and nil otherwise.
|
|
39
|
+
def self.convert_date_time(meth, v)
|
|
40
|
+
begin
|
|
41
|
+
Sequel.send(meth, v)
|
|
42
|
+
rescue InvalidValue
|
|
43
|
+
case @convert_invalid_date_time
|
|
44
|
+
when nil, :nil
|
|
45
|
+
nil
|
|
46
|
+
when :string
|
|
47
|
+
v
|
|
48
|
+
else
|
|
49
|
+
raise
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
38
53
|
|
|
39
54
|
# Database class for MySQL databases used with Sequel.
|
|
40
55
|
class Database < Sequel::Database
|
|
@@ -88,7 +103,9 @@ module Sequel
|
|
|
88
103
|
conn.query("set SQL_AUTO_IS_NULL=0") unless opts[:auto_is_null]
|
|
89
104
|
|
|
90
105
|
conn.query_with_result = false
|
|
91
|
-
conn
|
|
106
|
+
class << conn
|
|
107
|
+
attr_accessor :prepared_statements
|
|
108
|
+
end
|
|
92
109
|
conn.prepared_statements = {}
|
|
93
110
|
conn.reconnect = true
|
|
94
111
|
conn
|
|
@@ -117,8 +134,12 @@ module Sequel
|
|
|
117
134
|
end
|
|
118
135
|
|
|
119
136
|
# Support single level transactions on MySQL.
|
|
120
|
-
def transaction(
|
|
121
|
-
|
|
137
|
+
def transaction(opts={})
|
|
138
|
+
unless opts.is_a?(Hash)
|
|
139
|
+
Deprecation.deprecate('Passing an argument other than a Hash to Database#transaction', "Use DB.transaction(:server=>#{opts.inspect})")
|
|
140
|
+
opts = {:server=>opts}
|
|
141
|
+
end
|
|
142
|
+
synchronize(opts[:server]) do |conn|
|
|
122
143
|
return yield(conn) if @transactions.include?(Thread.current)
|
|
123
144
|
log_info(begin_transaction_sql)
|
|
124
145
|
conn.query(begin_transaction_sql)
|
|
@@ -276,8 +297,8 @@ module Sequel
|
|
|
276
297
|
end
|
|
277
298
|
|
|
278
299
|
# Delete rows matching this dataset
|
|
279
|
-
def delete(opts = nil)
|
|
280
|
-
execute_dui(delete_sql(opts)){|c| c.affected_rows}
|
|
300
|
+
def delete(opts = (defarg=true;nil))
|
|
301
|
+
execute_dui(defarg ? delete_sql : delete_sql(opts)){|c| c.affected_rows}
|
|
281
302
|
end
|
|
282
303
|
|
|
283
304
|
# Yield all rows matching this dataset
|
|
@@ -317,8 +338,8 @@ module Sequel
|
|
|
317
338
|
end
|
|
318
339
|
|
|
319
340
|
# Update the matching rows.
|
|
320
|
-
def update(
|
|
321
|
-
execute_dui(update_sql(
|
|
341
|
+
def update(values={}, opts=(defarg=true;nil))
|
|
342
|
+
execute_dui(defarg ? update_sql(values) : update_sql(values, opts)){|c| c.affected_rows}
|
|
322
343
|
end
|
|
323
344
|
|
|
324
345
|
private
|
|
@@ -331,7 +352,7 @@ module Sequel
|
|
|
331
352
|
# a method to an ancestor of Fixnum
|
|
332
353
|
v.to_i == 0 ? false : true
|
|
333
354
|
else
|
|
334
|
-
(
|
|
355
|
+
(b = MYSQL_TYPES[type]) ? b.call(v) : v
|
|
335
356
|
end
|
|
336
357
|
else
|
|
337
358
|
nil
|
|
@@ -12,10 +12,10 @@ module Sequel
|
|
|
12
12
|
super(opts)
|
|
13
13
|
case opts[:db_type]
|
|
14
14
|
when 'mssql'
|
|
15
|
-
require '
|
|
15
|
+
Sequel.require 'adapters/shared/mssql'
|
|
16
16
|
extend Sequel::MSSQL::DatabaseMethods
|
|
17
17
|
when 'progress'
|
|
18
|
-
require '
|
|
18
|
+
Sequel.require 'adapters/shared/progress'
|
|
19
19
|
extend Sequel::Progress::DatabaseMethods
|
|
20
20
|
end
|
|
21
21
|
end
|
|
@@ -64,8 +64,12 @@ module Sequel
|
|
|
64
64
|
alias_method :do, :execute_dui
|
|
65
65
|
|
|
66
66
|
# Support single level transactions on ODBC
|
|
67
|
-
def transaction(
|
|
68
|
-
|
|
67
|
+
def transaction(opts={})
|
|
68
|
+
unless opts.is_a?(Hash)
|
|
69
|
+
Deprecation.deprecate('Passing an argument other than a Hash to Database#transaction', "Use DB.transaction(:server=>#{opts.inspect})")
|
|
70
|
+
opts = {:server=>opts}
|
|
71
|
+
end
|
|
72
|
+
synchronize(opts[:server]) do |conn|
|
|
69
73
|
return yield(conn) if @transactions.include?(Thread.current)
|
|
70
74
|
log_info(begin_transaction_sql)
|
|
71
75
|
conn.do(begin_transaction_sql)
|
|
File without changes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require 'oci8'
|
|
2
|
-
require '
|
|
2
|
+
Sequel.require 'adapters/shared/oracle'
|
|
3
3
|
|
|
4
4
|
module Sequel
|
|
5
5
|
module Oracle
|
|
@@ -30,7 +30,35 @@ module Sequel
|
|
|
30
30
|
def dataset(opts = nil)
|
|
31
31
|
Oracle::Dataset.new(self, opts)
|
|
32
32
|
end
|
|
33
|
-
|
|
33
|
+
|
|
34
|
+
def schema_parse_table(table, opts={})
|
|
35
|
+
ds = dataset
|
|
36
|
+
ds.identifier_output_method = :downcase
|
|
37
|
+
schema, table = schema_and_table(table)
|
|
38
|
+
table_schema = []
|
|
39
|
+
metadata = transaction(opts){|conn| conn.describe_table(table.to_s)}
|
|
40
|
+
metadata.columns.each do |column|
|
|
41
|
+
table_schema << [
|
|
42
|
+
column.name.downcase.to_sym,
|
|
43
|
+
{
|
|
44
|
+
:type => column.data_type,
|
|
45
|
+
:db_type => column.type_string.split(' ')[0],
|
|
46
|
+
:type_string => column.type_string,
|
|
47
|
+
:charset_form => column.charset_form,
|
|
48
|
+
:char_used => column.char_used?,
|
|
49
|
+
:char_size => column.char_size,
|
|
50
|
+
:data_size => column.data_size,
|
|
51
|
+
:precision => column.precision,
|
|
52
|
+
:scale => column.scale,
|
|
53
|
+
:fsprecision => column.fsprecision,
|
|
54
|
+
:lfprecision => column.lfprecision,
|
|
55
|
+
:allow_null => column.nullable?
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
end
|
|
59
|
+
table_schema
|
|
60
|
+
end
|
|
61
|
+
|
|
34
62
|
def execute(sql, opts={})
|
|
35
63
|
log_info(sql)
|
|
36
64
|
synchronize(opts[:server]) do |conn|
|
|
@@ -47,19 +75,22 @@ module Sequel
|
|
|
47
75
|
end
|
|
48
76
|
end
|
|
49
77
|
end
|
|
50
|
-
|
|
78
|
+
alias do execute
|
|
51
79
|
|
|
52
|
-
def transaction(
|
|
53
|
-
|
|
80
|
+
def transaction(opts={})
|
|
81
|
+
unless opts.is_a?(Hash)
|
|
82
|
+
Deprecation.deprecate('Passing an argument other than a Hash to Database#transaction', "Use DB.transaction(:server=>#{opts.inspect})")
|
|
83
|
+
opts = {:server=>opts}
|
|
84
|
+
end
|
|
85
|
+
synchronize(opts[:server]) do |conn|
|
|
54
86
|
return yield(conn) if @transactions.include?(Thread.current)
|
|
55
|
-
|
|
56
87
|
conn.autocommit = false
|
|
57
88
|
begin
|
|
58
89
|
@transactions << Thread.current
|
|
59
90
|
yield(conn)
|
|
60
91
|
rescue => e
|
|
61
92
|
conn.rollback
|
|
62
|
-
raise e unless
|
|
93
|
+
raise e unless Rollback === e
|
|
63
94
|
ensure
|
|
64
95
|
conn.commit unless e
|
|
65
96
|
conn.autocommit = true
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require '
|
|
1
|
+
Sequel.require 'adapters/shared/postgres'
|
|
2
2
|
|
|
3
3
|
begin
|
|
4
4
|
require 'pg'
|
|
@@ -41,7 +41,7 @@ rescue LoadError => e
|
|
|
41
41
|
def escape_bytea(obj)
|
|
42
42
|
self.class.encode_bytea(obj)
|
|
43
43
|
end
|
|
44
|
-
|
|
44
|
+
instance_eval{alias unescape_bytea decode_bytea}
|
|
45
45
|
rescue
|
|
46
46
|
# If no valid bytea escaping method can be found, create one that
|
|
47
47
|
# raises an error
|
|
@@ -83,31 +83,31 @@ module Sequel
|
|
|
83
83
|
CONVERTED_EXCEPTIONS << PGError
|
|
84
84
|
|
|
85
85
|
# Hash with integer keys and proc values for converting PostgreSQL types.
|
|
86
|
-
PG_TYPES = {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
23 => lambda{
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
1083 => lambda{ |s| s.to_time }, # time without time zone
|
|
99
|
-
1114 => lambda{ |s| s.to_sequel_time }, # timestamp without time zone
|
|
100
|
-
1184 => lambda{ |s| s.to_sequel_time }, # timestamp with time zone
|
|
101
|
-
1266 => lambda{ |s| s.to_time }, # time with time zone
|
|
102
|
-
1700 => lambda{ |s| s.to_d }, # numeric
|
|
86
|
+
PG_TYPES = {}
|
|
87
|
+
|
|
88
|
+
# Use a single proc for each type to conserve memory
|
|
89
|
+
PG_TYPE_PROCS = {
|
|
90
|
+
[16] => lambda{|s| s == 't'}, # boolean
|
|
91
|
+
[17] => lambda{|s| ::Sequel::SQL::Blob.new(Adapter.unescape_bytea(s))}, # bytea
|
|
92
|
+
[20, 21, 22, 23, 26] => lambda{|s| s.to_i}, # integer
|
|
93
|
+
[700, 701] => lambda{|s| s.to_f}, # float
|
|
94
|
+
[790, 1700] => lambda{|s| BigDecimal.new(s)}, # numeric
|
|
95
|
+
[1082] => lambda{|s| @use_iso_date_format ? Date.new(*s.split("-").map{|x| x.to_i}) : Sequel.string_to_date(s)}, # date
|
|
96
|
+
[1083, 1266] => lambda{|s| Sequel.string_to_time(s)}, # time
|
|
97
|
+
[1114, 1184] => lambda{|s| Sequel.string_to_datetime(s)}, # timestamp
|
|
103
98
|
}
|
|
99
|
+
PG_TYPE_PROCS.each do |k,v|
|
|
100
|
+
k.each{|n| PG_TYPES[n] = v}
|
|
101
|
+
end
|
|
104
102
|
|
|
105
103
|
@use_iso_date_format = true
|
|
106
104
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
105
|
+
class << self
|
|
106
|
+
# As an optimization, Sequel sets the date style to ISO, so that PostgreSQL provides
|
|
107
|
+
# the date in a known format that Sequel can parse faster. This can be turned off
|
|
108
|
+
# if you require a date style other than ISO.
|
|
109
|
+
attr_accessor :use_iso_date_format
|
|
110
|
+
end
|
|
111
111
|
|
|
112
112
|
# PGconn subclass for connection specific methods used with the
|
|
113
113
|
# pg, postgres, or postgres-pr driver.
|
|
@@ -195,7 +195,7 @@ module Sequel
|
|
|
195
195
|
def connect(server)
|
|
196
196
|
opts = server_opts(server)
|
|
197
197
|
conn = Adapter.connect(
|
|
198
|
-
(opts[:host] unless opts[:host]
|
|
198
|
+
(opts[:host] unless blank_object?(opts[:host])),
|
|
199
199
|
opts[:port] || 5432,
|
|
200
200
|
nil, '',
|
|
201
201
|
opts[:database],
|