viking-sequel 3.10.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 +3134 -0
- data/COPYING +19 -0
- data/README.rdoc +723 -0
- data/Rakefile +193 -0
- data/bin/sequel +196 -0
- data/doc/advanced_associations.rdoc +644 -0
- data/doc/cheat_sheet.rdoc +218 -0
- data/doc/dataset_basics.rdoc +106 -0
- data/doc/dataset_filtering.rdoc +158 -0
- data/doc/opening_databases.rdoc +296 -0
- data/doc/prepared_statements.rdoc +104 -0
- data/doc/reflection.rdoc +84 -0
- data/doc/release_notes/1.0.txt +38 -0
- data/doc/release_notes/1.1.txt +143 -0
- data/doc/release_notes/1.3.txt +101 -0
- data/doc/release_notes/1.4.0.txt +53 -0
- data/doc/release_notes/1.5.0.txt +155 -0
- data/doc/release_notes/2.0.0.txt +298 -0
- data/doc/release_notes/2.1.0.txt +271 -0
- data/doc/release_notes/2.10.0.txt +328 -0
- data/doc/release_notes/2.11.0.txt +215 -0
- data/doc/release_notes/2.12.0.txt +534 -0
- data/doc/release_notes/2.2.0.txt +253 -0
- data/doc/release_notes/2.3.0.txt +88 -0
- data/doc/release_notes/2.4.0.txt +106 -0
- data/doc/release_notes/2.5.0.txt +137 -0
- data/doc/release_notes/2.6.0.txt +157 -0
- data/doc/release_notes/2.7.0.txt +166 -0
- data/doc/release_notes/2.8.0.txt +171 -0
- data/doc/release_notes/2.9.0.txt +97 -0
- data/doc/release_notes/3.0.0.txt +221 -0
- data/doc/release_notes/3.1.0.txt +406 -0
- data/doc/release_notes/3.10.0.txt +286 -0
- data/doc/release_notes/3.2.0.txt +268 -0
- data/doc/release_notes/3.3.0.txt +192 -0
- data/doc/release_notes/3.4.0.txt +325 -0
- data/doc/release_notes/3.5.0.txt +510 -0
- data/doc/release_notes/3.6.0.txt +366 -0
- data/doc/release_notes/3.7.0.txt +179 -0
- data/doc/release_notes/3.8.0.txt +151 -0
- data/doc/release_notes/3.9.0.txt +233 -0
- data/doc/schema.rdoc +36 -0
- data/doc/sharding.rdoc +113 -0
- data/doc/virtual_rows.rdoc +205 -0
- data/lib/sequel.rb +1 -0
- data/lib/sequel/adapters/ado.rb +90 -0
- data/lib/sequel/adapters/ado/mssql.rb +30 -0
- data/lib/sequel/adapters/amalgalite.rb +176 -0
- data/lib/sequel/adapters/db2.rb +139 -0
- data/lib/sequel/adapters/dbi.rb +113 -0
- data/lib/sequel/adapters/do.rb +188 -0
- data/lib/sequel/adapters/do/mysql.rb +49 -0
- data/lib/sequel/adapters/do/postgres.rb +91 -0
- data/lib/sequel/adapters/do/sqlite.rb +40 -0
- data/lib/sequel/adapters/firebird.rb +283 -0
- data/lib/sequel/adapters/informix.rb +77 -0
- data/lib/sequel/adapters/jdbc.rb +587 -0
- data/lib/sequel/adapters/jdbc/as400.rb +58 -0
- data/lib/sequel/adapters/jdbc/h2.rb +133 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +57 -0
- data/lib/sequel/adapters/jdbc/mysql.rb +78 -0
- data/lib/sequel/adapters/jdbc/oracle.rb +50 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +108 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +55 -0
- data/lib/sequel/adapters/mysql.rb +421 -0
- data/lib/sequel/adapters/odbc.rb +143 -0
- data/lib/sequel/adapters/odbc/mssql.rb +42 -0
- data/lib/sequel/adapters/openbase.rb +64 -0
- data/lib/sequel/adapters/oracle.rb +131 -0
- data/lib/sequel/adapters/postgres.rb +504 -0
- data/lib/sequel/adapters/shared/mssql.rb +490 -0
- data/lib/sequel/adapters/shared/mysql.rb +498 -0
- data/lib/sequel/adapters/shared/oracle.rb +195 -0
- data/lib/sequel/adapters/shared/postgres.rb +830 -0
- data/lib/sequel/adapters/shared/progress.rb +44 -0
- data/lib/sequel/adapters/shared/sqlite.rb +389 -0
- data/lib/sequel/adapters/sqlite.rb +224 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +84 -0
- data/lib/sequel/connection_pool.rb +99 -0
- data/lib/sequel/connection_pool/sharded_single.rb +84 -0
- data/lib/sequel/connection_pool/sharded_threaded.rb +211 -0
- data/lib/sequel/connection_pool/single.rb +29 -0
- data/lib/sequel/connection_pool/threaded.rb +150 -0
- data/lib/sequel/core.rb +293 -0
- data/lib/sequel/core_sql.rb +241 -0
- data/lib/sequel/database.rb +1079 -0
- data/lib/sequel/database/schema_generator.rb +327 -0
- data/lib/sequel/database/schema_methods.rb +203 -0
- data/lib/sequel/database/schema_sql.rb +320 -0
- data/lib/sequel/dataset.rb +32 -0
- data/lib/sequel/dataset/actions.rb +441 -0
- data/lib/sequel/dataset/features.rb +86 -0
- data/lib/sequel/dataset/graph.rb +254 -0
- data/lib/sequel/dataset/misc.rb +119 -0
- data/lib/sequel/dataset/mutation.rb +64 -0
- data/lib/sequel/dataset/prepared_statements.rb +227 -0
- data/lib/sequel/dataset/query.rb +709 -0
- data/lib/sequel/dataset/sql.rb +996 -0
- data/lib/sequel/exceptions.rb +51 -0
- data/lib/sequel/extensions/blank.rb +43 -0
- data/lib/sequel/extensions/inflector.rb +242 -0
- data/lib/sequel/extensions/looser_typecasting.rb +21 -0
- data/lib/sequel/extensions/migration.rb +239 -0
- data/lib/sequel/extensions/named_timezones.rb +61 -0
- data/lib/sequel/extensions/pagination.rb +100 -0
- data/lib/sequel/extensions/pretty_table.rb +82 -0
- data/lib/sequel/extensions/query.rb +52 -0
- data/lib/sequel/extensions/schema_dumper.rb +271 -0
- data/lib/sequel/extensions/sql_expr.rb +122 -0
- data/lib/sequel/extensions/string_date_time.rb +46 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +48 -0
- data/lib/sequel/metaprogramming.rb +9 -0
- data/lib/sequel/model.rb +120 -0
- data/lib/sequel/model/associations.rb +1514 -0
- data/lib/sequel/model/base.rb +1069 -0
- data/lib/sequel/model/default_inflections.rb +45 -0
- data/lib/sequel/model/errors.rb +39 -0
- data/lib/sequel/model/exceptions.rb +21 -0
- data/lib/sequel/model/inflections.rb +162 -0
- data/lib/sequel/model/plugins.rb +70 -0
- data/lib/sequel/plugins/active_model.rb +59 -0
- data/lib/sequel/plugins/association_dependencies.rb +103 -0
- data/lib/sequel/plugins/association_proxies.rb +41 -0
- data/lib/sequel/plugins/boolean_readers.rb +53 -0
- data/lib/sequel/plugins/caching.rb +141 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +214 -0
- data/lib/sequel/plugins/composition.rb +138 -0
- data/lib/sequel/plugins/force_encoding.rb +72 -0
- data/lib/sequel/plugins/hook_class_methods.rb +126 -0
- data/lib/sequel/plugins/identity_map.rb +116 -0
- data/lib/sequel/plugins/instance_filters.rb +98 -0
- data/lib/sequel/plugins/instance_hooks.rb +57 -0
- data/lib/sequel/plugins/lazy_attributes.rb +77 -0
- data/lib/sequel/plugins/many_through_many.rb +208 -0
- data/lib/sequel/plugins/nested_attributes.rb +206 -0
- data/lib/sequel/plugins/optimistic_locking.rb +81 -0
- data/lib/sequel/plugins/rcte_tree.rb +281 -0
- data/lib/sequel/plugins/schema.rb +66 -0
- data/lib/sequel/plugins/serialization.rb +166 -0
- data/lib/sequel/plugins/single_table_inheritance.rb +74 -0
- data/lib/sequel/plugins/subclasses.rb +45 -0
- data/lib/sequel/plugins/tactical_eager_loading.rb +61 -0
- data/lib/sequel/plugins/timestamps.rb +87 -0
- data/lib/sequel/plugins/touch.rb +118 -0
- data/lib/sequel/plugins/typecast_on_load.rb +72 -0
- data/lib/sequel/plugins/validation_class_methods.rb +405 -0
- data/lib/sequel/plugins/validation_helpers.rb +223 -0
- data/lib/sequel/sql.rb +1020 -0
- data/lib/sequel/timezones.rb +161 -0
- data/lib/sequel/version.rb +12 -0
- data/lib/sequel_core.rb +1 -0
- data/lib/sequel_model.rb +1 -0
- data/spec/adapters/firebird_spec.rb +407 -0
- data/spec/adapters/informix_spec.rb +97 -0
- data/spec/adapters/mssql_spec.rb +403 -0
- data/spec/adapters/mysql_spec.rb +1019 -0
- data/spec/adapters/oracle_spec.rb +286 -0
- data/spec/adapters/postgres_spec.rb +969 -0
- data/spec/adapters/spec_helper.rb +51 -0
- data/spec/adapters/sqlite_spec.rb +432 -0
- data/spec/core/connection_pool_spec.rb +808 -0
- data/spec/core/core_sql_spec.rb +417 -0
- data/spec/core/database_spec.rb +1662 -0
- data/spec/core/dataset_spec.rb +3827 -0
- data/spec/core/expression_filters_spec.rb +595 -0
- data/spec/core/object_graph_spec.rb +296 -0
- data/spec/core/schema_generator_spec.rb +159 -0
- data/spec/core/schema_spec.rb +830 -0
- data/spec/core/spec_helper.rb +56 -0
- data/spec/core/version_spec.rb +7 -0
- data/spec/extensions/active_model_spec.rb +76 -0
- data/spec/extensions/association_dependencies_spec.rb +127 -0
- data/spec/extensions/association_proxies_spec.rb +50 -0
- data/spec/extensions/blank_spec.rb +67 -0
- data/spec/extensions/boolean_readers_spec.rb +92 -0
- data/spec/extensions/caching_spec.rb +250 -0
- data/spec/extensions/class_table_inheritance_spec.rb +252 -0
- data/spec/extensions/composition_spec.rb +194 -0
- data/spec/extensions/force_encoding_spec.rb +117 -0
- data/spec/extensions/hook_class_methods_spec.rb +470 -0
- data/spec/extensions/identity_map_spec.rb +202 -0
- data/spec/extensions/inflector_spec.rb +181 -0
- data/spec/extensions/instance_filters_spec.rb +55 -0
- data/spec/extensions/instance_hooks_spec.rb +133 -0
- data/spec/extensions/lazy_attributes_spec.rb +153 -0
- data/spec/extensions/looser_typecasting_spec.rb +39 -0
- data/spec/extensions/many_through_many_spec.rb +884 -0
- data/spec/extensions/migration_spec.rb +332 -0
- data/spec/extensions/named_timezones_spec.rb +72 -0
- data/spec/extensions/nested_attributes_spec.rb +396 -0
- data/spec/extensions/optimistic_locking_spec.rb +100 -0
- 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/extensions/rcte_tree_spec.rb +205 -0
- data/spec/extensions/schema_dumper_spec.rb +357 -0
- data/spec/extensions/schema_spec.rb +127 -0
- data/spec/extensions/serialization_spec.rb +209 -0
- data/spec/extensions/single_table_inheritance_spec.rb +96 -0
- data/spec/extensions/spec_helper.rb +91 -0
- data/spec/extensions/sql_expr_spec.rb +89 -0
- data/spec/extensions/string_date_time_spec.rb +93 -0
- data/spec/extensions/subclasses_spec.rb +52 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +65 -0
- data/spec/extensions/thread_local_timezones_spec.rb +45 -0
- data/spec/extensions/timestamps_spec.rb +150 -0
- data/spec/extensions/touch_spec.rb +155 -0
- data/spec/extensions/typecast_on_load_spec.rb +69 -0
- data/spec/extensions/validation_class_methods_spec.rb +984 -0
- data/spec/extensions/validation_helpers_spec.rb +438 -0
- data/spec/integration/associations_test.rb +281 -0
- data/spec/integration/database_test.rb +26 -0
- data/spec/integration/dataset_test.rb +963 -0
- data/spec/integration/eager_loader_test.rb +734 -0
- data/spec/integration/model_test.rb +130 -0
- data/spec/integration/plugin_test.rb +814 -0
- data/spec/integration/prepared_statement_test.rb +213 -0
- data/spec/integration/schema_test.rb +361 -0
- data/spec/integration/spec_helper.rb +73 -0
- data/spec/integration/timezone_test.rb +55 -0
- data/spec/integration/transaction_test.rb +122 -0
- data/spec/integration/type_test.rb +96 -0
- data/spec/model/association_reflection_spec.rb +175 -0
- data/spec/model/associations_spec.rb +2633 -0
- data/spec/model/base_spec.rb +418 -0
- data/spec/model/dataset_methods_spec.rb +78 -0
- data/spec/model/eager_loading_spec.rb +1391 -0
- data/spec/model/hooks_spec.rb +240 -0
- data/spec/model/inflector_spec.rb +26 -0
- data/spec/model/model_spec.rb +593 -0
- data/spec/model/plugins_spec.rb +236 -0
- data/spec/model/record_spec.rb +1500 -0
- data/spec/model/spec_helper.rb +97 -0
- data/spec/model/validations_spec.rb +153 -0
- data/spec/rcov.opts +6 -0
- data/spec/spec_config.rb.example +10 -0
- metadata +346 -0
@@ -0,0 +1,58 @@
|
|
1
|
+
module Sequel
|
2
|
+
module JDBC
|
3
|
+
# Database and Dataset support for AS400 databases accessed via JDBC.
|
4
|
+
module AS400
|
5
|
+
# Instance methods for AS400 Database objects accessed via JDBC.
|
6
|
+
module DatabaseMethods
|
7
|
+
# AS400 uses the :as400 database type.
|
8
|
+
def database_type
|
9
|
+
:as400
|
10
|
+
end
|
11
|
+
|
12
|
+
# Return Sequel::JDBC::AS400::Dataset object with the given opts.
|
13
|
+
def dataset(opts=nil)
|
14
|
+
Sequel::JDBC::AS400::Dataset.new(self, opts)
|
15
|
+
end
|
16
|
+
|
17
|
+
# TODO: Fix for AS400
|
18
|
+
def last_insert_id(conn, opts={})
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Dataset class for AS400 datasets accessed via JDBC.
|
24
|
+
class Dataset < JDBC::Dataset
|
25
|
+
WILDCARD = Sequel::LiteralString.new('*').freeze
|
26
|
+
|
27
|
+
# AS400 needs to use a couple of subselects for all limits and offsets.
|
28
|
+
def select_sql
|
29
|
+
return super unless l = @opts[:limit]
|
30
|
+
o = @opts[:offset] || 0
|
31
|
+
order = @opts[:order]
|
32
|
+
dsa1 = dataset_alias(1)
|
33
|
+
dsa2 = dataset_alias(2)
|
34
|
+
rn = row_number_column
|
35
|
+
irn = Sequel::SQL::Identifier.new(rn).qualify(dsa2)
|
36
|
+
subselect_sql(unlimited.
|
37
|
+
from_self(:alias=>dsa1).
|
38
|
+
select_more(Sequel::SQL::QualifiedIdentifier.new(dsa1, WILDCARD),
|
39
|
+
Sequel::SQL::WindowFunction.new(SQL::Function.new(:ROW_NUMBER), Sequel::SQL::Window.new(:order=>order)).as(rn)).
|
40
|
+
from_self(:alias=>dsa2).
|
41
|
+
select(Sequel::SQL::QualifiedIdentifier.new(dsa2, WILDCARD)).
|
42
|
+
where((irn > o) & (irn <= l + o)))
|
43
|
+
end
|
44
|
+
|
45
|
+
def supports_window_functions?
|
46
|
+
true
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
# The alias to use for the row_number column when emulating LIMIT and OFFSET
|
52
|
+
def row_number_column
|
53
|
+
:x_sequel_row_number_x
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
module Sequel
|
2
|
+
module JDBC
|
3
|
+
# Database and Dataset support for H2 databases accessed via JDBC.
|
4
|
+
module H2
|
5
|
+
# Instance methods for H2 Database objects accessed via JDBC.
|
6
|
+
module DatabaseMethods
|
7
|
+
PRIMARY_KEY_INDEX_RE = /\Aprimary_key/i.freeze
|
8
|
+
|
9
|
+
# H2 uses the :h2 database type.
|
10
|
+
def database_type
|
11
|
+
:h2
|
12
|
+
end
|
13
|
+
|
14
|
+
# Return Sequel::JDBC::H2::Dataset object with the given opts.
|
15
|
+
def dataset(opts=nil)
|
16
|
+
Sequel::JDBC::H2::Dataset.new(self, opts)
|
17
|
+
end
|
18
|
+
|
19
|
+
# H2 uses an IDENTITY type
|
20
|
+
def serial_primary_key_options
|
21
|
+
{:primary_key => true, :type => :identity}
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# H2 needs to add a primary key column as a constraint
|
27
|
+
def alter_table_sql(table, op)
|
28
|
+
case op[:op]
|
29
|
+
when :add_column
|
30
|
+
if (pk = op.delete(:primary_key)) || (ref = op.delete(:table))
|
31
|
+
sqls = [super(table, op)]
|
32
|
+
sqls << "ALTER TABLE #{quote_schema_table(table)} ADD PRIMARY KEY (#{quote_identifier(op[:name])})" if pk
|
33
|
+
if ref
|
34
|
+
op[:table] = ref
|
35
|
+
sqls << "ALTER TABLE #{quote_schema_table(table)} ADD FOREIGN KEY (#{quote_identifier(op[:name])}) #{column_references_sql(op)}"
|
36
|
+
end
|
37
|
+
sqls
|
38
|
+
else
|
39
|
+
super(table, op)
|
40
|
+
end
|
41
|
+
when :rename_column
|
42
|
+
"ALTER TABLE #{quote_schema_table(table)} ALTER COLUMN #{quote_identifier(op[:name])} RENAME TO #{quote_identifier(op[:new_name])}"
|
43
|
+
when :set_column_null
|
44
|
+
"ALTER TABLE #{quote_schema_table(table)} ALTER COLUMN #{quote_identifier(op[:name])} SET#{' NOT' unless op[:null]} NULL"
|
45
|
+
when :set_column_type
|
46
|
+
"ALTER TABLE #{quote_schema_table(table)} ALTER COLUMN #{quote_identifier(op[:name])} #{type_literal(op)}"
|
47
|
+
else
|
48
|
+
super(table, op)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Default to a single connection for a memory database.
|
53
|
+
def connection_pool_default_options
|
54
|
+
o = super
|
55
|
+
uri == 'jdbc:h2:mem:' ? o.merge(:max_connections=>1) : o
|
56
|
+
end
|
57
|
+
|
58
|
+
# Use IDENTITY() to get the last inserted id.
|
59
|
+
def last_insert_id(conn, opts={})
|
60
|
+
stmt = conn.createStatement
|
61
|
+
begin
|
62
|
+
rs = stmt.executeQuery('SELECT IDENTITY();')
|
63
|
+
rs.next
|
64
|
+
rs.getInt(1)
|
65
|
+
ensure
|
66
|
+
stmt.close
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def primary_key_index_re
|
71
|
+
PRIMARY_KEY_INDEX_RE
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Dataset class for H2 datasets accessed via JDBC.
|
76
|
+
class Dataset < JDBC::Dataset
|
77
|
+
SELECT_CLAUSE_METHODS = clause_methods(:select, %w'distinct columns from join where group having compounds order limit')
|
78
|
+
|
79
|
+
# Work around H2's lack of a case insensitive LIKE operator
|
80
|
+
def complex_expression_sql(op, args)
|
81
|
+
case op
|
82
|
+
when :ILIKE
|
83
|
+
super(:LIKE, [SQL::PlaceholderLiteralString.new("CAST(? AS VARCHAR_IGNORECASE)", [args.at(0)]), args.at(1)])
|
84
|
+
when :"NOT ILIKE"
|
85
|
+
super(:"NOT LIKE", [SQL::PlaceholderLiteralString.new("CAST(? AS VARCHAR_IGNORECASE)", [args.at(0)]), args.at(1)])
|
86
|
+
else
|
87
|
+
super(op, args)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# H2 requires SQL standard datetimes
|
92
|
+
def requires_sql_standard_datetimes?
|
93
|
+
true
|
94
|
+
end
|
95
|
+
|
96
|
+
# H2 doesn't support IS TRUE
|
97
|
+
def supports_is_true?
|
98
|
+
false
|
99
|
+
end
|
100
|
+
|
101
|
+
# H2 doesn't support JOIN USING
|
102
|
+
def supports_join_using?
|
103
|
+
false
|
104
|
+
end
|
105
|
+
|
106
|
+
# H2 doesn't support multiple columns in IN/NOT IN
|
107
|
+
def supports_multiple_column_in?
|
108
|
+
false
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
# H2 expects hexadecimal strings for blob values
|
114
|
+
def literal_blob(v)
|
115
|
+
literal_string v.unpack("H*").first
|
116
|
+
end
|
117
|
+
|
118
|
+
def convert_type(v)
|
119
|
+
case v
|
120
|
+
when Java::OrgH2Jdbc::JdbcClob
|
121
|
+
convert_type(v.getSubString(1, v.length))
|
122
|
+
else
|
123
|
+
super(v)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def select_clause_methods
|
128
|
+
SELECT_CLAUSE_METHODS
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
Sequel.require 'adapters/shared/mssql'
|
2
|
+
|
3
|
+
module Sequel
|
4
|
+
module JDBC
|
5
|
+
class Database
|
6
|
+
# Alias the generic JDBC version so it can be called directly later
|
7
|
+
alias jdbc_schema_parse_table schema_parse_table
|
8
|
+
end
|
9
|
+
|
10
|
+
# Database and Dataset instance methods for MSSQL specific
|
11
|
+
# support via JDBC.
|
12
|
+
module MSSQL
|
13
|
+
# Database instance methods for MSSQL databases accessed via JDBC.
|
14
|
+
module DatabaseMethods
|
15
|
+
PRIMARY_KEY_INDEX_RE = /\Apk__/i.freeze
|
16
|
+
|
17
|
+
include Sequel::MSSQL::DatabaseMethods
|
18
|
+
|
19
|
+
# Return instance of Sequel::JDBC::MSSQL::Dataset with the given opts.
|
20
|
+
def dataset(opts=nil)
|
21
|
+
Sequel::JDBC::MSSQL::Dataset.new(self, opts)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# Get the last inserted id using SCOPE_IDENTITY().
|
27
|
+
def last_insert_id(conn, opts={})
|
28
|
+
stmt = conn.createStatement
|
29
|
+
begin
|
30
|
+
sql = opts[:prepared] ? 'SELECT @@IDENTITY' : 'SELECT SCOPE_IDENTITY()'
|
31
|
+
rs = log_yield(sql){stmt.executeQuery(sql)}
|
32
|
+
rs.next
|
33
|
+
rs.getInt(1)
|
34
|
+
ensure
|
35
|
+
stmt.close
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Call the generic JDBC version instead of MSSQL version,
|
40
|
+
# since the JDBC version handles primary keys.
|
41
|
+
def schema_parse_table(table, opts={})
|
42
|
+
jdbc_schema_parse_table(table, opts)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Primary key indexes appear to start with pk__ on MSSQL
|
46
|
+
def primary_key_index_re
|
47
|
+
PRIMARY_KEY_INDEX_RE
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Dataset class for MSSQL datasets accessed via JDBC.
|
52
|
+
class Dataset < JDBC::Dataset
|
53
|
+
include Sequel::MSSQL::DatasetMethods
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
Sequel.require 'adapters/shared/mysql'
|
2
|
+
|
3
|
+
module Sequel
|
4
|
+
module JDBC
|
5
|
+
# Database and Dataset instance methods for MySQL specific
|
6
|
+
# support via JDBC.
|
7
|
+
module MySQL
|
8
|
+
# Database instance methods for MySQL databases accessed via JDBC.
|
9
|
+
module DatabaseMethods
|
10
|
+
include Sequel::MySQL::DatabaseMethods
|
11
|
+
|
12
|
+
# Return instance of Sequel::JDBC::MySQL::Dataset with the given opts.
|
13
|
+
def dataset(opts=nil)
|
14
|
+
Sequel::JDBC::MySQL::Dataset.new(self, opts)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
# The database name for the given database. Need to parse it out
|
20
|
+
# of the connection string, since the JDBC does no parsing on the
|
21
|
+
# given connection string by default.
|
22
|
+
def database_name
|
23
|
+
u = URI.parse(uri.sub(/\Ajdbc:/, ''))
|
24
|
+
(m = /\/(.*)/.match(u.path)) && m[1]
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get the last inserted id using LAST_INSERT_ID().
|
28
|
+
def last_insert_id(conn, opts={})
|
29
|
+
if stmt = opts[:stmt]
|
30
|
+
rs = stmt.getGeneratedKeys
|
31
|
+
begin
|
32
|
+
if rs.next
|
33
|
+
rs.getInt(1)
|
34
|
+
else
|
35
|
+
0
|
36
|
+
end
|
37
|
+
ensure
|
38
|
+
rs.close
|
39
|
+
end
|
40
|
+
else
|
41
|
+
stmt = conn.createStatement
|
42
|
+
begin
|
43
|
+
rs = stmt.executeQuery('SELECT LAST_INSERT_ID()')
|
44
|
+
rs.next
|
45
|
+
rs.getInt(1)
|
46
|
+
ensure
|
47
|
+
stmt.close
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def requires_return_generated_keys?
|
53
|
+
true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Dataset class for MySQL datasets accessed via JDBC.
|
58
|
+
class Dataset < JDBC::Dataset
|
59
|
+
include Sequel::MySQL::DatasetMethods
|
60
|
+
|
61
|
+
# Use execute_insert to execute the insert_sql.
|
62
|
+
def insert(*values)
|
63
|
+
execute_insert(insert_sql(*values))
|
64
|
+
end
|
65
|
+
|
66
|
+
# Use execute_insert to execute the replace_sql.
|
67
|
+
def replace(*args)
|
68
|
+
execute_insert(replace_sql(*args))
|
69
|
+
end
|
70
|
+
|
71
|
+
# MySQL on JDBC does provides an accurate number of rows matched.
|
72
|
+
def provides_accurate_rows_matched?
|
73
|
+
true
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
Sequel.require 'adapters/shared/oracle'
|
2
|
+
|
3
|
+
module Sequel
|
4
|
+
module JDBC
|
5
|
+
# Database and Dataset support for Oracle databases accessed via JDBC.
|
6
|
+
module Oracle
|
7
|
+
# Instance methods for Oracle Database objects accessed via JDBC.
|
8
|
+
module DatabaseMethods
|
9
|
+
include Sequel::Oracle::DatabaseMethods
|
10
|
+
TRANSACTION_BEGIN = 'Transaction.begin'.freeze
|
11
|
+
TRANSACTION_COMMIT = 'Transaction.commit'.freeze
|
12
|
+
TRANSACTION_ROLLBACK = 'Transaction.rollback'.freeze
|
13
|
+
|
14
|
+
# Return Sequel::JDBC::Oracle::Dataset object with the given opts.
|
15
|
+
def dataset(opts=nil)
|
16
|
+
Sequel::JDBC::Oracle::Dataset.new(self, opts)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
# Use JDBC connection's setAutoCommit to false to start transactions
|
22
|
+
def begin_transaction(conn)
|
23
|
+
log_yield(TRANSACTION_BEGIN){conn.setAutoCommit(false)}
|
24
|
+
conn
|
25
|
+
end
|
26
|
+
|
27
|
+
# Use JDBC connection's commit method to commit transactions
|
28
|
+
def commit_transaction(conn)
|
29
|
+
log_yield(TRANSACTION_COMMIT){conn.commit}
|
30
|
+
end
|
31
|
+
|
32
|
+
# Use JDBC connection's setAutoCommit to true to enable non-transactional behavior
|
33
|
+
def remove_transaction(conn)
|
34
|
+
conn.setAutoCommit(true) if conn
|
35
|
+
@transactions.delete(Thread.current)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Use JDBC connection's rollback method to rollback transactions
|
39
|
+
def rollback_transaction(conn)
|
40
|
+
log_yield(TRANSACTION_ROLLBACK){conn.rollback}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Dataset class for Oracle datasets accessed via JDBC.
|
45
|
+
class Dataset < JDBC::Dataset
|
46
|
+
include Sequel::Oracle::DatasetMethods
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
Sequel.require 'adapters/shared/postgres'
|
2
|
+
|
3
|
+
module Sequel
|
4
|
+
Postgres::CONVERTED_EXCEPTIONS << NativeException
|
5
|
+
|
6
|
+
module JDBC
|
7
|
+
# Adapter, Database, and Dataset support for accessing a PostgreSQL
|
8
|
+
# database via JDBC.
|
9
|
+
module Postgres
|
10
|
+
# Methods to add to the JDBC adapter/connection to allow it to work
|
11
|
+
# with the shared PostgreSQL code.
|
12
|
+
module AdapterMethods
|
13
|
+
include Sequel::Postgres::AdapterMethods
|
14
|
+
|
15
|
+
# Give the JDBC adapter a direct execute method, which creates
|
16
|
+
# a statement with the given sql and executes it.
|
17
|
+
def execute(sql, args=nil)
|
18
|
+
method = block_given? ? :executeQuery : :execute
|
19
|
+
stmt = createStatement
|
20
|
+
begin
|
21
|
+
rows = @db.log_yield(sql){stmt.send(method, sql)}
|
22
|
+
yield(rows) if block_given?
|
23
|
+
rescue NativeException => e
|
24
|
+
raise_error(e)
|
25
|
+
ensure
|
26
|
+
stmt.close
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
# JDBC specific method of getting specific values from a result set.
|
33
|
+
def single_value(r)
|
34
|
+
unless r.nil?
|
35
|
+
r.next
|
36
|
+
r.getString(1) unless r.getRow == 0
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Methods to add to Database instances that access PostgreSQL via
|
42
|
+
# JDBC.
|
43
|
+
module DatabaseMethods
|
44
|
+
include Sequel::Postgres::DatabaseMethods
|
45
|
+
|
46
|
+
# Add the primary_keys and primary_key_sequences instance variables,
|
47
|
+
# so we can get the correct return values for inserted rows.
|
48
|
+
def self.extended(db)
|
49
|
+
db.instance_eval do
|
50
|
+
@primary_keys = {}
|
51
|
+
@primary_key_sequences = {}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Return instance of Sequel::JDBC::Postgres::Dataset with the given opts.
|
56
|
+
def dataset(opts=nil)
|
57
|
+
Sequel::JDBC::Postgres::Dataset.new(self, opts)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Run the INSERT sql on the database and return the primary key
|
61
|
+
# for the record.
|
62
|
+
def execute_insert(sql, opts={})
|
63
|
+
super(sql, {:type=>:insert}.merge(opts))
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
# Extend the adapter with the JDBC PostgreSQL AdapterMethods
|
69
|
+
def setup_connection(conn)
|
70
|
+
conn = super(conn)
|
71
|
+
conn.extend(Sequel::JDBC::Postgres::AdapterMethods)
|
72
|
+
conn.db = self
|
73
|
+
conn.apply_connection_settings
|
74
|
+
conn
|
75
|
+
end
|
76
|
+
|
77
|
+
# Call insert_result with the table and values specified in the opts.
|
78
|
+
def last_insert_id(conn, opts)
|
79
|
+
insert_result(conn, opts[:table], opts[:values])
|
80
|
+
end
|
81
|
+
|
82
|
+
# Override shared postgresql adapter method to actually log,
|
83
|
+
# since on JDBC the first argument is a statement and not a
|
84
|
+
# connection, so it wouldn't be logged otherwise.
|
85
|
+
def log_connection_execute(stmt, sql)
|
86
|
+
log_yield(sql){stmt.execute(sql)}
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Dataset subclass used for datasets that connect to PostgreSQL via JDBC.
|
91
|
+
class Dataset < JDBC::Dataset
|
92
|
+
include Sequel::Postgres::DatasetMethods
|
93
|
+
|
94
|
+
# Add the shared PostgreSQL prepared statement methods
|
95
|
+
def prepare(*args)
|
96
|
+
ps = super
|
97
|
+
ps.extend(::Sequel::Postgres::DatasetMethods::PreparedStatementMethods)
|
98
|
+
ps
|
99
|
+
end
|
100
|
+
|
101
|
+
# Literalize strings similar to the native postgres adapter
|
102
|
+
def literal_string(v)
|
103
|
+
db.synchronize{|c| "'#{c.escape_string(v)}'"}
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|