sequel 2.11.0 → 2.12.0
Sign up to get free protection for your applications and to get access to all the features.
- 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],
|