sequel 3.21.0 → 3.29.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 +413 -3
- data/README.rdoc +20 -6
- data/Rakefile +23 -16
- data/bin/sequel +1 -5
- data/doc/association_basics.rdoc +210 -43
- data/doc/dataset_basics.rdoc +4 -4
- data/doc/mass_assignment.rdoc +54 -0
- data/doc/migration.rdoc +15 -538
- data/doc/model_hooks.rdoc +72 -27
- data/doc/opening_databases.rdoc +86 -50
- data/doc/prepared_statements.rdoc +40 -13
- data/doc/reflection.rdoc +8 -2
- data/doc/release_notes/3.22.0.txt +39 -0
- data/doc/release_notes/3.23.0.txt +172 -0
- data/doc/release_notes/3.24.0.txt +420 -0
- data/doc/release_notes/3.25.0.txt +88 -0
- data/doc/release_notes/3.26.0.txt +88 -0
- data/doc/release_notes/3.27.0.txt +82 -0
- data/doc/release_notes/3.28.0.txt +304 -0
- data/doc/release_notes/3.29.0.txt +459 -0
- data/doc/schema_modification.rdoc +547 -0
- data/doc/sharding.rdoc +7 -1
- data/doc/testing.rdoc +115 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/virtual_rows.rdoc +2 -2
- data/lib/sequel/adapters/ado/mssql.rb +18 -6
- data/lib/sequel/adapters/ado.rb +40 -18
- data/lib/sequel/adapters/amalgalite.rb +15 -7
- data/lib/sequel/adapters/db2.rb +175 -86
- data/lib/sequel/adapters/dbi.rb +15 -15
- data/lib/sequel/adapters/do/mysql.rb +0 -5
- data/lib/sequel/adapters/do/postgres.rb +0 -5
- data/lib/sequel/adapters/do/sqlite.rb +0 -5
- data/lib/sequel/adapters/do.rb +17 -36
- data/lib/sequel/adapters/firebird.rb +27 -208
- data/lib/sequel/adapters/ibmdb.rb +448 -0
- data/lib/sequel/adapters/informix.rb +6 -23
- data/lib/sequel/adapters/jdbc/as400.rb +5 -31
- data/lib/sequel/adapters/jdbc/db2.rb +44 -0
- data/lib/sequel/adapters/jdbc/derby.rb +217 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +29 -0
- data/lib/sequel/adapters/jdbc/h2.rb +26 -17
- data/lib/sequel/adapters/jdbc/hsqldb.rb +166 -0
- data/lib/sequel/adapters/jdbc/informix.rb +26 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +29 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +0 -32
- data/lib/sequel/adapters/jdbc/mysql.rb +9 -10
- data/lib/sequel/adapters/jdbc/oracle.rb +67 -25
- data/lib/sequel/adapters/jdbc/postgresql.rb +6 -11
- data/lib/sequel/adapters/jdbc/sqlite.rb +0 -5
- data/lib/sequel/adapters/jdbc/sqlserver.rb +41 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +107 -38
- data/lib/sequel/adapters/mock.rb +315 -0
- data/lib/sequel/adapters/mysql.rb +78 -182
- data/lib/sequel/adapters/mysql2.rb +24 -23
- data/lib/sequel/adapters/odbc/db2.rb +17 -0
- data/lib/sequel/adapters/odbc/mssql.rb +0 -5
- data/lib/sequel/adapters/odbc.rb +28 -9
- data/lib/sequel/adapters/openbase.rb +2 -4
- data/lib/sequel/adapters/oracle.rb +349 -51
- data/lib/sequel/adapters/postgres.rb +169 -21
- data/lib/sequel/adapters/shared/access.rb +21 -6
- data/lib/sequel/adapters/shared/db2.rb +288 -0
- data/lib/sequel/adapters/shared/firebird.rb +214 -0
- data/lib/sequel/adapters/shared/informix.rb +45 -0
- data/lib/sequel/adapters/shared/mssql.rb +108 -65
- data/lib/sequel/adapters/shared/mysql.rb +56 -13
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +149 -0
- data/lib/sequel/adapters/shared/oracle.rb +185 -34
- data/lib/sequel/adapters/shared/postgres.rb +107 -58
- data/lib/sequel/adapters/shared/progress.rb +0 -6
- data/lib/sequel/adapters/shared/sqlite.rb +168 -41
- data/lib/sequel/adapters/sqlite.rb +27 -18
- data/lib/sequel/adapters/swift/mysql.rb +9 -5
- data/lib/sequel/adapters/swift/postgres.rb +0 -5
- data/lib/sequel/adapters/swift/sqlite.rb +6 -4
- data/lib/sequel/adapters/swift.rb +5 -5
- data/lib/sequel/adapters/tinytds.rb +152 -17
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +63 -0
- data/lib/sequel/ast_transformer.rb +190 -0
- data/lib/sequel/connection_pool/threaded.rb +3 -2
- data/lib/sequel/connection_pool.rb +1 -1
- data/lib/sequel/core.rb +46 -5
- data/lib/sequel/database/connecting.rb +5 -6
- data/lib/sequel/database/dataset.rb +4 -4
- data/lib/sequel/database/dataset_defaults.rb +59 -1
- data/lib/sequel/database/logging.rb +1 -1
- data/lib/sequel/database/misc.rb +100 -19
- data/lib/sequel/database/query.rb +153 -58
- data/lib/sequel/database/schema_generator.rb +8 -5
- data/lib/sequel/database/schema_methods.rb +59 -29
- data/lib/sequel/dataset/actions.rb +194 -57
- data/lib/sequel/dataset/features.rb +81 -8
- data/lib/sequel/dataset/graph.rb +8 -7
- data/lib/sequel/dataset/misc.rb +50 -23
- data/lib/sequel/dataset/mutation.rb +5 -6
- data/lib/sequel/dataset/prepared_statements.rb +32 -15
- data/lib/sequel/dataset/query.rb +223 -42
- data/lib/sequel/dataset/sql.rb +58 -61
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/columns_introspection.rb +61 -0
- data/lib/sequel/extensions/migration.rb +6 -4
- data/lib/sequel/extensions/named_timezones.rb +5 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
- data/lib/sequel/extensions/to_dot.rb +95 -83
- data/lib/sequel/model/associations.rb +997 -331
- data/lib/sequel/model/base.rb +386 -129
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +5 -1
- data/lib/sequel/model.rb +15 -8
- data/lib/sequel/plugins/association_pks.rb +22 -4
- data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
- data/lib/sequel/plugins/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +58 -0
- data/lib/sequel/plugins/force_encoding.rb +6 -6
- data/lib/sequel/plugins/identity_map.rb +114 -7
- data/lib/sequel/plugins/many_through_many.rb +65 -7
- data/lib/sequel/plugins/prepared_statements.rb +151 -0
- data/lib/sequel/plugins/prepared_statements_associations.rb +84 -0
- data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
- data/lib/sequel/plugins/rcte_tree.rb +29 -15
- data/lib/sequel/plugins/serialization.rb +6 -1
- data/lib/sequel/plugins/serialization_modification_detection.rb +51 -0
- data/lib/sequel/plugins/sharding.rb +12 -25
- data/lib/sequel/plugins/single_table_inheritance.rb +3 -1
- data/lib/sequel/plugins/typecast_on_load.rb +9 -12
- data/lib/sequel/plugins/update_primary_key.rb +2 -2
- data/lib/sequel/plugins/xml_serializer.rb +3 -3
- data/lib/sequel/sql.rb +107 -51
- data/lib/sequel/timezones.rb +44 -35
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +146 -0
- data/spec/adapters/mssql_spec.rb +65 -29
- data/spec/adapters/mysql_spec.rb +122 -123
- data/spec/adapters/oracle_spec.rb +48 -76
- data/spec/adapters/postgres_spec.rb +213 -61
- data/spec/adapters/spec_helper.rb +6 -5
- data/spec/adapters/sqlite_spec.rb +35 -21
- data/spec/core/connection_pool_spec.rb +71 -92
- data/spec/core/core_sql_spec.rb +20 -31
- data/spec/core/database_spec.rb +729 -508
- data/spec/core/dataset_spec.rb +980 -1044
- data/spec/core/expression_filters_spec.rb +159 -42
- data/spec/core/mock_adapter_spec.rb +378 -0
- data/spec/core/object_graph_spec.rb +48 -114
- data/spec/core/schema_generator_spec.rb +3 -3
- data/spec/core/schema_spec.rb +298 -38
- data/spec/core/spec_helper.rb +6 -48
- data/spec/extensions/association_pks_spec.rb +38 -0
- data/spec/extensions/class_table_inheritance_spec.rb +1 -1
- data/spec/extensions/columns_introspection_spec.rb +91 -0
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +64 -0
- data/spec/extensions/identity_map_spec.rb +162 -0
- data/spec/extensions/instance_hooks_spec.rb +71 -0
- data/spec/extensions/many_through_many_spec.rb +195 -20
- data/spec/extensions/migration_spec.rb +17 -17
- data/spec/extensions/named_timezones_spec.rb +22 -2
- data/spec/extensions/nested_attributes_spec.rb +4 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +126 -0
- data/spec/extensions/prepared_statements_safe_spec.rb +79 -0
- data/spec/extensions/prepared_statements_spec.rb +72 -0
- data/spec/extensions/prepared_statements_with_pk_spec.rb +38 -0
- data/spec/extensions/schema_dumper_spec.rb +2 -2
- data/spec/extensions/schema_spec.rb +13 -21
- data/spec/extensions/serialization_modification_detection_spec.rb +37 -0
- data/spec/extensions/serialization_spec.rb +5 -8
- data/spec/extensions/single_table_inheritance_spec.rb +11 -0
- data/spec/extensions/spec_helper.rb +7 -1
- data/spec/extensions/thread_local_timezones_spec.rb +22 -2
- data/spec/extensions/to_dot_spec.rb +3 -5
- data/spec/extensions/typecast_on_load_spec.rb +1 -6
- data/spec/extensions/xml_serializer_spec.rb +16 -4
- data/spec/integration/associations_test.rb +522 -21
- data/spec/integration/database_test.rb +4 -2
- data/spec/integration/dataset_test.rb +375 -62
- data/spec/integration/eager_loader_test.rb +19 -21
- data/spec/integration/model_test.rb +80 -1
- data/spec/integration/plugin_test.rb +304 -116
- data/spec/integration/prepared_statement_test.rb +200 -120
- data/spec/integration/schema_test.rb +161 -30
- data/spec/integration/spec_helper.rb +39 -30
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +172 -5
- data/spec/integration/type_test.rb +17 -3
- data/spec/model/association_reflection_spec.rb +174 -7
- data/spec/model/associations_spec.rb +849 -661
- data/spec/model/base_spec.rb +255 -95
- data/spec/model/dataset_methods_spec.rb +7 -27
- data/spec/model/eager_loading_spec.rb +640 -676
- data/spec/model/hooks_spec.rb +309 -67
- data/spec/model/model_spec.rb +207 -167
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +321 -218
- data/spec/model/spec_helper.rb +13 -71
- data/spec/model/validations_spec.rb +11 -0
- metadata +95 -38
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
require 'mysql2' unless defined? Mysql2
|
|
2
|
-
|
|
3
|
-
Sequel.require %w'shared/mysql', 'adapters'
|
|
2
|
+
Sequel.require %w'shared/mysql_prepared_statements', 'adapters'
|
|
4
3
|
|
|
5
4
|
module Sequel
|
|
6
5
|
# Module for holding all Mysql2-related classes and modules for Sequel.
|
|
@@ -8,11 +7,21 @@ module Sequel
|
|
|
8
7
|
# Database class for MySQL databases used with Sequel.
|
|
9
8
|
class Database < Sequel::Database
|
|
10
9
|
include Sequel::MySQL::DatabaseMethods
|
|
10
|
+
include Sequel::MySQL::PreparedStatements::DatabaseMethods
|
|
11
11
|
|
|
12
12
|
# Mysql::Error messages that indicate the current connection should be disconnected
|
|
13
|
-
MYSQL_DATABASE_DISCONNECT_ERRORS = /\A(Commands out of sync; you can't run this command now|Can't connect to local MySQL server through socket|MySQL server has gone away)/
|
|
13
|
+
MYSQL_DATABASE_DISCONNECT_ERRORS = /\A(Commands out of sync; you can't run this command now|Can't connect to local MySQL server through socket|MySQL server has gone away|This connection is still waiting for a result, try again once you have the result)/
|
|
14
14
|
|
|
15
15
|
set_adapter_scheme :mysql2
|
|
16
|
+
|
|
17
|
+
# Whether to convert tinyint columns to bool for this database
|
|
18
|
+
attr_accessor :convert_tinyint_to_bool
|
|
19
|
+
|
|
20
|
+
# Set the convert_tinyint_to_bool setting based on the default value.
|
|
21
|
+
def initialize(opts={})
|
|
22
|
+
super
|
|
23
|
+
self.convert_tinyint_to_bool = Sequel::MySQL.convert_tinyint_to_bool
|
|
24
|
+
end
|
|
16
25
|
|
|
17
26
|
# Connect to the database. In addition to the usual database options,
|
|
18
27
|
# the following options have effect:
|
|
@@ -21,7 +30,6 @@ module Sequel
|
|
|
21
30
|
# a filter for an autoincrement column equals NULL to return the last
|
|
22
31
|
# inserted row.
|
|
23
32
|
# * :charset - Same as :encoding (:encoding takes precendence)
|
|
24
|
-
# * :compress - Set to false to not compress results from the server
|
|
25
33
|
# * :config_default_group - The default group to read from the in
|
|
26
34
|
# the MySQL config file.
|
|
27
35
|
# * :config_local_infile - If provided, sets the Mysql::OPT_LOCAL_INFILE
|
|
@@ -57,24 +65,10 @@ module Sequel
|
|
|
57
65
|
|
|
58
66
|
sqls.each{|sql| log_yield(sql){conn.query(sql)}}
|
|
59
67
|
|
|
68
|
+
add_prepared_statements_cache(conn)
|
|
60
69
|
conn
|
|
61
70
|
end
|
|
62
71
|
|
|
63
|
-
# Returns instance of Sequel::MySQL::Dataset with the given options.
|
|
64
|
-
def dataset(opts = nil)
|
|
65
|
-
Mysql2::Dataset.new(self, opts)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# Executes the given SQL using an available connection, yielding the
|
|
69
|
-
# connection if the block is given.
|
|
70
|
-
def execute(sql, opts={}, &block)
|
|
71
|
-
if opts[:sproc]
|
|
72
|
-
call_sproc(sql, opts, &block)
|
|
73
|
-
else
|
|
74
|
-
synchronize(opts[:server]){|conn| _execute(conn, sql, opts, &block)}
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
72
|
# Return the version of the MySQL server two which we are connecting.
|
|
79
73
|
def server_version(server=nil)
|
|
80
74
|
@server_version ||= (synchronize(server){|conn| conn.server_info[:id]} || super)
|
|
@@ -87,14 +81,14 @@ module Sequel
|
|
|
87
81
|
# yield the connection if a block is given.
|
|
88
82
|
def _execute(conn, sql, opts)
|
|
89
83
|
begin
|
|
90
|
-
r = log_yield(sql){conn.query(sql, :symbolize_keys => true, :database_timezone =>
|
|
84
|
+
r = log_yield(sql){conn.query(sql, :symbolize_keys => true, :database_timezone => timezone, :application_timezone => Sequel.application_timezone)}
|
|
91
85
|
if opts[:type] == :select
|
|
92
86
|
yield r if r
|
|
93
87
|
elsif block_given?
|
|
94
88
|
yield conn
|
|
95
89
|
end
|
|
96
90
|
rescue ::Mysql2::Error => e
|
|
97
|
-
raise_error(e
|
|
91
|
+
raise_error(e)
|
|
98
92
|
end
|
|
99
93
|
end
|
|
100
94
|
|
|
@@ -108,6 +102,10 @@ module Sequel
|
|
|
108
102
|
[::Mysql2::Error]
|
|
109
103
|
end
|
|
110
104
|
|
|
105
|
+
def disconnect_error?(e, opts)
|
|
106
|
+
super || (e.is_a?(::Mysql2::Error) && MYSQL_DATABASE_DISCONNECT_ERRORS.match(e.message))
|
|
107
|
+
end
|
|
108
|
+
|
|
111
109
|
# The database name when using the native adapter is always stored in
|
|
112
110
|
# the :database option.
|
|
113
111
|
def database_name
|
|
@@ -121,13 +119,16 @@ module Sequel
|
|
|
121
119
|
|
|
122
120
|
# Convert tinyint(1) type to boolean if convert_tinyint_to_bool is true
|
|
123
121
|
def schema_column_type(db_type)
|
|
124
|
-
|
|
122
|
+
convert_tinyint_to_bool && db_type == 'tinyint(1)' ? :boolean : super
|
|
125
123
|
end
|
|
126
124
|
end
|
|
127
125
|
|
|
128
126
|
# Dataset class for MySQL datasets accessed via the native driver.
|
|
129
127
|
class Dataset < Sequel::Dataset
|
|
130
128
|
include Sequel::MySQL::DatasetMethods
|
|
129
|
+
include Sequel::MySQL::PreparedStatements::DatasetMethods
|
|
130
|
+
|
|
131
|
+
Database::DatasetClass = self
|
|
131
132
|
|
|
132
133
|
# Delete rows matching this dataset
|
|
133
134
|
def delete
|
|
@@ -138,7 +139,7 @@ module Sequel
|
|
|
138
139
|
def fetch_rows(sql, &block)
|
|
139
140
|
execute(sql) do |r|
|
|
140
141
|
@columns = r.fields
|
|
141
|
-
r.each(:cast_booleans =>
|
|
142
|
+
r.each(:cast_booleans => db.convert_tinyint_to_bool, &block)
|
|
142
143
|
end
|
|
143
144
|
self
|
|
144
145
|
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Sequel.require 'adapters/shared/db2'
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
module ODBC
|
|
5
|
+
# Database and Dataset instance methods for DB2 specific
|
|
6
|
+
# support via ODBC.
|
|
7
|
+
module DB2
|
|
8
|
+
module DatabaseMethods
|
|
9
|
+
include ::Sequel::DB2::DatabaseMethods
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class Dataset < ODBC::Dataset
|
|
13
|
+
include ::Sequel::DB2::DatasetMethods
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -9,11 +9,6 @@ module Sequel
|
|
|
9
9
|
include Sequel::MSSQL::DatabaseMethods
|
|
10
10
|
LAST_INSERT_ID_SQL='SELECT SCOPE_IDENTITY()'
|
|
11
11
|
|
|
12
|
-
# Return an instance of Sequel::ODBC::MSSQL::Dataset with the given opts.
|
|
13
|
-
def dataset(opts=nil)
|
|
14
|
-
Sequel::ODBC::MSSQL::Dataset.new(self, opts)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
12
|
# Return the last inserted identity value.
|
|
18
13
|
def execute_insert(sql, opts={})
|
|
19
14
|
synchronize(opts[:server]) do |conn|
|
data/lib/sequel/adapters/odbc.rb
CHANGED
|
@@ -15,9 +15,16 @@ module Sequel
|
|
|
15
15
|
when 'mssql'
|
|
16
16
|
Sequel.ts_require 'adapters/odbc/mssql'
|
|
17
17
|
extend Sequel::ODBC::MSSQL::DatabaseMethods
|
|
18
|
+
@dataset_class = Sequel::ODBC::MSSQL::Dataset
|
|
19
|
+
set_mssql_unicode_strings
|
|
18
20
|
when 'progress'
|
|
19
21
|
Sequel.ts_require 'adapters/shared/progress'
|
|
20
22
|
extend Sequel::Progress::DatabaseMethods
|
|
23
|
+
extend_datasets(Sequel::Progress::DatasetMethods)
|
|
24
|
+
when 'db2'
|
|
25
|
+
Sequel.ts_require 'adapters/odbc/db2'
|
|
26
|
+
extend Sequel::ODBC::DB2::DatabaseMethods
|
|
27
|
+
@dataset_class = Sequel::ODBC::DB2::Dataset
|
|
21
28
|
end
|
|
22
29
|
end
|
|
23
30
|
|
|
@@ -41,17 +48,13 @@ module Sequel
|
|
|
41
48
|
conn
|
|
42
49
|
end
|
|
43
50
|
|
|
44
|
-
def dataset(opts = nil)
|
|
45
|
-
ODBC::Dataset.new(self, opts)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
51
|
def execute(sql, opts={})
|
|
49
52
|
synchronize(opts[:server]) do |conn|
|
|
50
53
|
begin
|
|
51
54
|
r = log_yield(sql){conn.run(sql)}
|
|
52
55
|
yield(r) if block_given?
|
|
53
56
|
rescue ::ODBC::Error, ArgumentError => e
|
|
54
|
-
raise_error(e
|
|
57
|
+
raise_error(e)
|
|
55
58
|
ensure
|
|
56
59
|
r.drop if r
|
|
57
60
|
end
|
|
@@ -64,7 +67,7 @@ module Sequel
|
|
|
64
67
|
begin
|
|
65
68
|
log_yield(sql){conn.do(sql)}
|
|
66
69
|
rescue ::ODBC::Error, ArgumentError => e
|
|
67
|
-
raise_error(e
|
|
70
|
+
raise_error(e)
|
|
68
71
|
end
|
|
69
72
|
end
|
|
70
73
|
end
|
|
@@ -76,9 +79,17 @@ module Sequel
|
|
|
76
79
|
:do
|
|
77
80
|
end
|
|
78
81
|
|
|
82
|
+
def database_error_classes
|
|
83
|
+
[::ODBC::Error]
|
|
84
|
+
end
|
|
85
|
+
|
|
79
86
|
def disconnect_connection(c)
|
|
80
87
|
c.disconnect
|
|
81
88
|
end
|
|
89
|
+
|
|
90
|
+
def disconnect_error?(e, opts)
|
|
91
|
+
super || (e.is_a?(::ODBC::Error) && DISCONNECT_ERRORS.match(e.message))
|
|
92
|
+
end
|
|
82
93
|
end
|
|
83
94
|
|
|
84
95
|
class Dataset < Sequel::Dataset
|
|
@@ -87,15 +98,23 @@ module Sequel
|
|
|
87
98
|
ODBC_DATE_FORMAT = "{d '%Y-%m-%d'}".freeze
|
|
88
99
|
TIMESTAMP_FORMAT="{ts '%Y-%m-%d %H:%M:%S'}".freeze
|
|
89
100
|
|
|
101
|
+
Database::DatasetClass = self
|
|
102
|
+
|
|
90
103
|
def fetch_rows(sql)
|
|
91
104
|
execute(sql) do |s|
|
|
92
105
|
i = -1
|
|
93
106
|
cols = s.columns(true).map{|c| [output_identifier(c.name), i+=1]}
|
|
94
|
-
|
|
107
|
+
columns = cols.map{|c| c.at(0)}
|
|
108
|
+
if opts[:offset] && offset_returns_row_number_column?
|
|
109
|
+
rn = row_number_column
|
|
110
|
+
columns.delete(rn)
|
|
111
|
+
end
|
|
112
|
+
@columns = columns
|
|
95
113
|
if rows = s.fetch_all
|
|
96
114
|
rows.each do |row|
|
|
97
115
|
hash = {}
|
|
98
116
|
cols.each{|n,i| hash[n] = convert_odbc_value(row[i])}
|
|
117
|
+
hash.delete(rn) if rn
|
|
99
118
|
yield hash
|
|
100
119
|
end
|
|
101
120
|
end
|
|
@@ -114,9 +133,9 @@ module Sequel
|
|
|
114
133
|
# ODBCColumn#mapSqlTypeToGenericType and Column#klass.
|
|
115
134
|
case v
|
|
116
135
|
when ::ODBC::TimeStamp
|
|
117
|
-
|
|
136
|
+
db.to_application_timestamp([v.year, v.month, v.day, v.hour, v.minute, v.second])
|
|
118
137
|
when ::ODBC::Time
|
|
119
|
-
Sequel.
|
|
138
|
+
Sequel::SQLTime.create(v.hour, v.minute, v.second)
|
|
120
139
|
when ::ODBC::Date
|
|
121
140
|
Date.new(v.year, v.month, v.day)
|
|
122
141
|
else
|
|
@@ -15,10 +15,6 @@ module Sequel
|
|
|
15
15
|
)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
def dataset(opts = nil)
|
|
19
|
-
OpenBase::Dataset.new(self, opts)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
18
|
def execute(sql, opts={})
|
|
23
19
|
synchronize(opts[:server]) do |conn|
|
|
24
20
|
r = log_yield(sql){conn.execute(sql)}
|
|
@@ -37,6 +33,8 @@ module Sequel
|
|
|
37
33
|
|
|
38
34
|
class Dataset < Sequel::Dataset
|
|
39
35
|
SELECT_CLAUSE_METHODS = clause_methods(:select, %w'distinct columns from join where group having compounds order limit')
|
|
36
|
+
|
|
37
|
+
Database::DatasetClass = self
|
|
40
38
|
|
|
41
39
|
def fetch_rows(sql)
|
|
42
40
|
execute(sql) do |result|
|