kb-activerecord-jdbc-adapter 0.9.7.1-java → 1.0.0.beta1-java
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/History.txt +11 -0
- data/Manifest.txt +71 -38
- data/lib/active_record/connection_adapters/cachedb_adapter.rb +1 -1
- data/lib/active_record/connection_adapters/derby_adapter.rb +1 -13
- data/lib/active_record/connection_adapters/h2_adapter.rb +1 -13
- data/lib/active_record/connection_adapters/hsqldb_adapter.rb +1 -13
- data/lib/active_record/connection_adapters/informix_adapter.rb +1 -1
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +1 -661
- data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -1
- data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -13
- data/lib/active_record/connection_adapters/mysql_adapter.rb +1 -13
- data/lib/active_record/connection_adapters/oracle_adapter.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +1 -13
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -13
- data/lib/activerecord-jdbc-adapter.rb +2 -2
- data/lib/arjdbc/cachedb/adapter.rb +20 -0
- data/lib/arjdbc/cachedb/connection_methods.rb +10 -0
- data/lib/arjdbc/cachedb.rb +3 -0
- data/lib/{jdbc_adapter/jdbc_db2.rb → arjdbc/db2/adapter.rb} +2 -17
- data/lib/arjdbc/db2.rb +2 -0
- data/lib/{jdbc_adapter/jdbc_derby.rb → arjdbc/derby/adapter.rb} +8 -26
- data/lib/arjdbc/derby/connection_methods.rb +18 -0
- data/lib/arjdbc/derby.rb +7 -0
- data/lib/arjdbc/discover.rb +99 -0
- data/lib/{jdbc_adapter/jdbc_firebird.rb → arjdbc/firebird/adapter.rb} +12 -16
- data/lib/arjdbc/firebird.rb +2 -0
- data/lib/arjdbc/h2/adapter.rb +15 -0
- data/lib/arjdbc/h2/connection_methods.rb +12 -0
- data/lib/arjdbc/h2.rb +4 -0
- data/lib/{jdbc_adapter/jdbc_hsqldb.rb → arjdbc/hsqldb/adapter.rb} +6 -58
- data/lib/arjdbc/hsqldb/connection_methods.rb +14 -0
- data/lib/arjdbc/hsqldb.rb +4 -0
- data/lib/{jdbc_adapter/jdbc_informix.rb → arjdbc/informix/adapter.rb} +6 -19
- data/lib/arjdbc/informix/connection_methods.rb +10 -0
- data/lib/arjdbc/informix.rb +3 -0
- data/lib/arjdbc/jdbc/adapter.rb +235 -0
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/callbacks.rb +44 -0
- data/lib/arjdbc/jdbc/column.rb +38 -0
- data/lib/arjdbc/jdbc/compatibility.rb +51 -0
- data/lib/arjdbc/jdbc/connection.rb +97 -0
- data/lib/arjdbc/jdbc/connection_methods.rb +16 -0
- data/lib/arjdbc/jdbc/core_ext.rb +24 -0
- data/lib/arjdbc/jdbc/discover.rb +18 -0
- data/lib/arjdbc/jdbc/driver.rb +44 -0
- data/lib/arjdbc/jdbc/extension.rb +47 -0
- data/lib/arjdbc/jdbc/java.rb +14 -0
- data/lib/{jdbc_adapter → arjdbc/jdbc}/missing_functionality_helper.rb +5 -5
- data/lib/arjdbc/jdbc/quoted_primary_key.rb +28 -0
- data/lib/{jdbc_adapter → arjdbc/jdbc}/railtie.rb +1 -1
- data/lib/arjdbc/jdbc/require_driver.rb +16 -0
- data/lib/arjdbc/jdbc/type_converter.rb +119 -0
- data/lib/arjdbc/jdbc.rb +2 -0
- data/lib/{jdbc_adapter/jdbc_mimer.rb → arjdbc/mimer/adapter.rb} +16 -19
- data/lib/arjdbc/mimer.rb +2 -0
- data/lib/{jdbc_adapter/jdbc_mssql.rb → arjdbc/mssql/adapter.rb} +19 -31
- data/lib/arjdbc/mssql/connection_methods.rb +13 -0
- data/lib/arjdbc/mssql.rb +4 -0
- data/lib/arjdbc/mysql/adapter.rb +388 -0
- data/lib/arjdbc/mysql/connection_methods.rb +26 -0
- data/lib/arjdbc/mysql.rb +4 -0
- data/lib/{jdbc_adapter/jdbc_oracle.rb → arjdbc/oracle/adapter.rb} +9 -17
- data/lib/arjdbc/oracle/connection_methods.rb +11 -0
- data/lib/arjdbc/oracle.rb +3 -0
- data/lib/{jdbc_adapter/jdbc_postgre.rb → arjdbc/postgresql/adapter.rb} +7 -36
- data/lib/arjdbc/postgresql/connection_methods.rb +21 -0
- data/lib/arjdbc/postgresql.rb +4 -0
- data/lib/{jdbc_adapter/jdbc_sqlite3.rb → arjdbc/sqlite3/adapter.rb} +106 -104
- data/lib/arjdbc/sqlite3/connection_methods.rb +33 -0
- data/lib/arjdbc/sqlite3.rb +4 -0
- data/lib/arjdbc/sybase/adapter.rb +46 -0
- data/lib/arjdbc/sybase.rb +2 -0
- data/lib/arjdbc/version.rb +8 -0
- data/lib/arjdbc.rb +29 -0
- data/lib/jdbc_adapter/version.rb +3 -5
- data/lib/jdbc_adapter.rb +2 -27
- data/rails_generators/templates/config/initializers/jdbc.rb +1 -1
- data/rakelib/compile.rake +3 -2
- data/rakelib/package.rake +3 -3
- data/src/java/{jdbc_adapter/JdbcDerbySpec.java → arjdbc/derby/DerbyModule.java} +32 -32
- data/src/java/{jdbc_adapter/JdbcAdapterInternalService.java → arjdbc/jdbc/AdapterJavaService.java} +13 -7
- data/src/java/{jdbc_adapter → arjdbc/jdbc}/JdbcConnectionFactory.java +6 -6
- data/src/java/{jdbc_adapter → arjdbc/jdbc}/RubyJdbcConnection.java +91 -16
- data/src/java/arjdbc/jdbc/SQLBlock.java +48 -0
- data/src/java/{jdbc_adapter → arjdbc/mssql}/MssqlRubyJdbcConnection.java +5 -2
- data/src/java/{jdbc_adapter/JdbcMySQLSpec.java → arjdbc/mysql/MySQLModule.java} +12 -12
- data/src/java/{jdbc_adapter/PostgresRubyJdbcConnection.java → arjdbc/postgresql/PostgresqlRubyJdbcConnection.java} +11 -9
- data/src/java/arjdbc/sqlite3/Sqlite3RubyJdbcConnection.java +64 -0
- data/test/abstract_db_create.rb +4 -1
- data/test/activerecord/connection_adapters/type_conversion_test.rb +1 -1
- data/test/db/cachedb.rb +0 -0
- data/test/db/derby.rb +12 -14
- data/test/db/hsqldb.rb +3 -2
- data/test/db/jndi_config.rb +4 -4
- data/test/db/sqlite3.rb +2 -6
- data/test/db2_simple_test.rb +23 -0
- data/test/derby_migration_test.rb +50 -3
- data/test/jdbc_common.rb +1 -1
- data/test/jndi_callbacks_test.rb +1 -0
- data/test/postgres_nonseq_pkey_test.rb +0 -2
- data/test/postgres_schema_search_path_test.rb +0 -2
- data/test/simple.rb +3 -3
- data/test/sybase_jtds_simple_test.rb +22 -0
- metadata +81 -46
- data/lib/active_record/connection_adapters/jdbc_adapter_spec.rb +0 -26
- data/lib/jdbc_adapter/jdbc_adapter_internal.jar +0 -0
- data/lib/jdbc_adapter/jdbc_cachedb.rb +0 -33
- data/lib/jdbc_adapter/jdbc_mysql.rb +0 -260
- data/lib/jdbc_adapter/jdbc_sybase.rb +0 -50
- data/src/java/jdbc_adapter/SQLBlock.java +0 -27
- data/src/java/jdbc_adapter/Sqlite3RubyJdbcConnection.java +0 -41
- data/test/jdbc_adapter/jdbc_db2_test.rb +0 -26
- data/test/jdbc_adapter/jdbc_sybase_test.rb +0 -33
- data/test/minirunit/testConnect.rb +0 -14
- data/test/minirunit/testH2.rb +0 -73
- data/test/minirunit/testHsqldb.rb +0 -73
- data/test/minirunit/testLoadActiveRecord.rb +0 -3
- data/test/minirunit/testMysql.rb +0 -83
- data/test/minirunit/testRawSelect.rb +0 -24
- data/test/minirunit.rb +0 -109
- /data/lib/{jdbc_adapter → arjdbc/jdbc}/jdbc.rake +0 -0
- /data/lib/{jdbc_adapter → arjdbc/jdbc}/rake_tasks.rb +0 -0
- /data/lib/{jdbc_adapter → arjdbc/mssql}/tsql_helper.rb +0 -0
@@ -0,0 +1,388 @@
|
|
1
|
+
require 'active_record/connection_adapters/abstract/schema_definitions'
|
2
|
+
|
3
|
+
module ::ArJdbc
|
4
|
+
module MySQL
|
5
|
+
def self.column_selector
|
6
|
+
[/mysql/i, lambda {|cfg,col| col.extend(::ArJdbc::MySQL::Column)}]
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.extended(adapter)
|
10
|
+
adapter.configure_connection
|
11
|
+
end
|
12
|
+
|
13
|
+
def configure_connection
|
14
|
+
execute("SET SQL_AUTO_IS_NULL=0")
|
15
|
+
end
|
16
|
+
|
17
|
+
module Column
|
18
|
+
def extract_default(default)
|
19
|
+
if sql_type =~ /blob/i || type == :text
|
20
|
+
if default.blank?
|
21
|
+
return null ? nil : ''
|
22
|
+
else
|
23
|
+
raise ArgumentError, "#{type} columns cannot have a default value: #{default.inspect}"
|
24
|
+
end
|
25
|
+
elsif missing_default_forged_as_empty_string?(default)
|
26
|
+
nil
|
27
|
+
else
|
28
|
+
super
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def has_default?
|
33
|
+
return false if sql_type =~ /blob/i || type == :text #mysql forbids defaults on blob and text columns
|
34
|
+
super
|
35
|
+
end
|
36
|
+
|
37
|
+
def simplified_type(field_type)
|
38
|
+
return :boolean if field_type =~ /tinyint\(1\)|bit/i
|
39
|
+
return :string if field_type =~ /enum/i
|
40
|
+
super
|
41
|
+
end
|
42
|
+
|
43
|
+
def extract_limit(sql_type)
|
44
|
+
case sql_type
|
45
|
+
when /blob|text/i
|
46
|
+
case sql_type
|
47
|
+
when /tiny/i
|
48
|
+
255
|
49
|
+
when /medium/i
|
50
|
+
16777215
|
51
|
+
when /long/i
|
52
|
+
2147483647 # mysql only allows 2^31-1, not 2^32-1, somewhat inconsistently with the tiny/medium/normal cases
|
53
|
+
else
|
54
|
+
nil # we could return 65535 here, but we leave it undecorated by default
|
55
|
+
end
|
56
|
+
when /^bigint/i; 8
|
57
|
+
when /^int/i; 4
|
58
|
+
when /^mediumint/i; 3
|
59
|
+
when /^smallint/i; 2
|
60
|
+
when /^tinyint/i; 1
|
61
|
+
else
|
62
|
+
super
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# MySQL misreports NOT NULL column default when none is given.
|
67
|
+
# We can't detect this for columns which may have a legitimate ''
|
68
|
+
# default (string) but we can for others (integer, datetime, boolean,
|
69
|
+
# and the rest).
|
70
|
+
#
|
71
|
+
# Test whether the column has default '', is not null, and is not
|
72
|
+
# a type allowing default ''.
|
73
|
+
def missing_default_forged_as_empty_string?(default)
|
74
|
+
type != :string && !null && default == ''
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def modify_types(tp)
|
79
|
+
tp[:primary_key] = "int(11) DEFAULT NULL auto_increment PRIMARY KEY"
|
80
|
+
tp[:integer] = { :name => 'int', :limit => 4 }
|
81
|
+
tp[:decimal] = { :name => "decimal" }
|
82
|
+
tp[:timestamp] = { :name => "datetime" }
|
83
|
+
tp[:datetime][:limit] = nil
|
84
|
+
tp
|
85
|
+
end
|
86
|
+
|
87
|
+
def adapter_name #:nodoc:
|
88
|
+
'MySQL'
|
89
|
+
end
|
90
|
+
|
91
|
+
def case_sensitive_equality_operator
|
92
|
+
"= BINARY"
|
93
|
+
end
|
94
|
+
|
95
|
+
# QUOTING ==================================================
|
96
|
+
|
97
|
+
def quote(value, column = nil)
|
98
|
+
return value.quoted_id if value.respond_to?(:quoted_id)
|
99
|
+
|
100
|
+
if column && column.type == :primary_key
|
101
|
+
value.to_s
|
102
|
+
elsif column && String === value && column.type == :binary && column.class.respond_to?(:string_to_binary)
|
103
|
+
s = column.class.string_to_binary(value).unpack("H*")[0]
|
104
|
+
"x'#{s}'"
|
105
|
+
elsif BigDecimal === value
|
106
|
+
"'#{value.to_s("F")}'"
|
107
|
+
else
|
108
|
+
super
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def quoted_true
|
113
|
+
"1"
|
114
|
+
end
|
115
|
+
|
116
|
+
def quoted_false
|
117
|
+
"0"
|
118
|
+
end
|
119
|
+
|
120
|
+
def begin_db_transaction #:nodoc:
|
121
|
+
@connection.begin
|
122
|
+
rescue Exception
|
123
|
+
# Transactions aren't supported
|
124
|
+
end
|
125
|
+
|
126
|
+
def commit_db_transaction #:nodoc:
|
127
|
+
@connection.commit
|
128
|
+
rescue Exception
|
129
|
+
# Transactions aren't supported
|
130
|
+
end
|
131
|
+
|
132
|
+
def rollback_db_transaction #:nodoc:
|
133
|
+
@connection.rollback
|
134
|
+
rescue Exception
|
135
|
+
# Transactions aren't supported
|
136
|
+
end
|
137
|
+
|
138
|
+
def supports_savepoints? #:nodoc:
|
139
|
+
true
|
140
|
+
end
|
141
|
+
|
142
|
+
def create_savepoint
|
143
|
+
execute("SAVEPOINT #{current_savepoint_name}")
|
144
|
+
end
|
145
|
+
|
146
|
+
def rollback_to_savepoint
|
147
|
+
execute("ROLLBACK TO SAVEPOINT #{current_savepoint_name}")
|
148
|
+
end
|
149
|
+
|
150
|
+
def release_savepoint
|
151
|
+
execute("RELEASE SAVEPOINT #{current_savepoint_name}")
|
152
|
+
end
|
153
|
+
|
154
|
+
def disable_referential_integrity(&block) #:nodoc:
|
155
|
+
old = select_value("SELECT @@FOREIGN_KEY_CHECKS")
|
156
|
+
begin
|
157
|
+
update("SET FOREIGN_KEY_CHECKS = 0")
|
158
|
+
yield
|
159
|
+
ensure
|
160
|
+
update("SET FOREIGN_KEY_CHECKS = #{old}")
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# SCHEMA STATEMENTS ========================================
|
165
|
+
|
166
|
+
def structure_dump #:nodoc:
|
167
|
+
if supports_views?
|
168
|
+
sql = "SHOW FULL TABLES WHERE Table_type = 'BASE TABLE'"
|
169
|
+
else
|
170
|
+
sql = "SHOW TABLES"
|
171
|
+
end
|
172
|
+
|
173
|
+
select_all(sql).inject("") do |structure, table|
|
174
|
+
table.delete('Table_type')
|
175
|
+
|
176
|
+
hash = show_create_table(table.to_a.first.last)
|
177
|
+
|
178
|
+
if(table = hash["Create Table"])
|
179
|
+
structure += table + ";\n\n"
|
180
|
+
elsif(view = hash["Create View"])
|
181
|
+
structure += view + ";\n\n"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def recreate_database(name, options = {}) #:nodoc:
|
187
|
+
drop_database(name)
|
188
|
+
create_database(name, options)
|
189
|
+
end
|
190
|
+
|
191
|
+
def character_set(options) #:nodoc:
|
192
|
+
str = "CHARACTER SET `#{options[:charset] || 'utf8'}`"
|
193
|
+
str += " COLLATE `#{options[:collation]}`" if options[:collation]
|
194
|
+
str
|
195
|
+
end
|
196
|
+
private :character_set
|
197
|
+
|
198
|
+
def create_database(name, options = {}) #:nodoc:
|
199
|
+
execute "CREATE DATABASE `#{name}` DEFAULT #{character_set(options)}"
|
200
|
+
end
|
201
|
+
|
202
|
+
def drop_database(name) #:nodoc:
|
203
|
+
execute "DROP DATABASE IF EXISTS `#{name}`"
|
204
|
+
end
|
205
|
+
|
206
|
+
def current_database
|
207
|
+
select_one("SELECT DATABASE() as db")["db"]
|
208
|
+
end
|
209
|
+
|
210
|
+
def create_table(name, options = {}) #:nodoc:
|
211
|
+
super(name, {:options => "ENGINE=InnoDB #{character_set(options)}"}.merge(options))
|
212
|
+
end
|
213
|
+
|
214
|
+
def rename_table(name, new_name)
|
215
|
+
execute "RENAME TABLE #{quote_table_name(name)} TO #{quote_table_name(new_name)}"
|
216
|
+
end
|
217
|
+
|
218
|
+
def add_column(table_name, column_name, type, options = {})
|
219
|
+
add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
|
220
|
+
add_column_options!(add_column_sql, options)
|
221
|
+
add_column_position!(add_column_sql, options)
|
222
|
+
execute(add_column_sql)
|
223
|
+
end
|
224
|
+
|
225
|
+
def change_column_default(table_name, column_name, default) #:nodoc:
|
226
|
+
column = column_for(table_name, column_name)
|
227
|
+
change_column table_name, column_name, column.sql_type, :default => default
|
228
|
+
end
|
229
|
+
|
230
|
+
def change_column_null(table_name, column_name, null, default = nil)
|
231
|
+
column = column_for(table_name, column_name)
|
232
|
+
|
233
|
+
unless null || default.nil?
|
234
|
+
execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
|
235
|
+
end
|
236
|
+
|
237
|
+
change_column table_name, column_name, column.sql_type, :null => null
|
238
|
+
end
|
239
|
+
|
240
|
+
def change_column(table_name, column_name, type, options = {}) #:nodoc:
|
241
|
+
column = column_for(table_name, column_name)
|
242
|
+
|
243
|
+
unless options_include_default?(options)
|
244
|
+
options[:default] = column.default
|
245
|
+
end
|
246
|
+
|
247
|
+
unless options.has_key?(:null)
|
248
|
+
options[:null] = column.null
|
249
|
+
end
|
250
|
+
|
251
|
+
change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
|
252
|
+
add_column_options!(change_column_sql, options)
|
253
|
+
add_column_position!(change_column_sql, options)
|
254
|
+
execute(change_column_sql)
|
255
|
+
end
|
256
|
+
|
257
|
+
def rename_column(table_name, column_name, new_column_name) #:nodoc:
|
258
|
+
options = {}
|
259
|
+
if column = columns(table_name).find { |c| c.name == column_name.to_s }
|
260
|
+
options[:default] = column.default
|
261
|
+
options[:null] = column.null
|
262
|
+
else
|
263
|
+
raise ActiveRecord::ActiveRecordError, "No such column: #{table_name}.#{column_name}"
|
264
|
+
end
|
265
|
+
current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'")["Type"]
|
266
|
+
rename_column_sql = "ALTER TABLE #{quote_table_name(table_name)} CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}"
|
267
|
+
add_column_options!(rename_column_sql, options)
|
268
|
+
execute(rename_column_sql)
|
269
|
+
end
|
270
|
+
|
271
|
+
def add_limit_offset!(sql, options) #:nodoc:
|
272
|
+
limit, offset = options[:limit], options[:offset]
|
273
|
+
if limit && offset
|
274
|
+
sql << " LIMIT #{offset.to_i}, #{sanitize_limit(limit)}"
|
275
|
+
elsif limit
|
276
|
+
sql << " LIMIT #{sanitize_limit(limit)}"
|
277
|
+
elsif offset
|
278
|
+
sql << " OFFSET #{offset.to_i}"
|
279
|
+
end
|
280
|
+
sql
|
281
|
+
end
|
282
|
+
|
283
|
+
def show_variable(var)
|
284
|
+
res = execute("show variables like '#{var}'")
|
285
|
+
row = res.detect {|row| row["Variable_name"] == var }
|
286
|
+
row && row["Value"]
|
287
|
+
end
|
288
|
+
|
289
|
+
def charset
|
290
|
+
show_variable("character_set_database")
|
291
|
+
end
|
292
|
+
|
293
|
+
def collation
|
294
|
+
show_variable("collation_database")
|
295
|
+
end
|
296
|
+
|
297
|
+
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
|
298
|
+
return super unless type.to_s == 'integer'
|
299
|
+
|
300
|
+
case limit
|
301
|
+
when 1; 'tinyint'
|
302
|
+
when 2; 'smallint'
|
303
|
+
when 3; 'mediumint'
|
304
|
+
when nil, 4, 11; 'int(11)' # compatibility with MySQL default
|
305
|
+
when 5..8; 'bigint'
|
306
|
+
else raise(ActiveRecordError, "No integer type has byte size #{limit}")
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
def add_column_position!(sql, options)
|
311
|
+
if options[:first]
|
312
|
+
sql << " FIRST"
|
313
|
+
elsif options[:after]
|
314
|
+
sql << " AFTER #{quote_column_name(options[:after])}"
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
protected
|
319
|
+
def translate_exception(exception, message)
|
320
|
+
return super unless exception.respond_to?(:errno)
|
321
|
+
|
322
|
+
case exception.errno
|
323
|
+
when 1062
|
324
|
+
::ActiveRecord::RecordNotUnique.new(message, exception)
|
325
|
+
when 1452
|
326
|
+
::ActiveRecord::InvalidForeignKey.new(message, exception)
|
327
|
+
else
|
328
|
+
super
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
private
|
333
|
+
def column_for(table_name, column_name)
|
334
|
+
unless column = columns(table_name).find { |c| c.name == column_name.to_s }
|
335
|
+
raise "No such column: #{table_name}.#{column_name}"
|
336
|
+
end
|
337
|
+
column
|
338
|
+
end
|
339
|
+
|
340
|
+
def show_create_table(table)
|
341
|
+
select_one("SHOW CREATE TABLE #{quote_table_name(table)}")
|
342
|
+
end
|
343
|
+
|
344
|
+
def supports_views?
|
345
|
+
false
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
module ActiveRecord::ConnectionAdapters
|
351
|
+
class MysqlColumn < JdbcColumn
|
352
|
+
include ArJdbc::MySQL::Column
|
353
|
+
|
354
|
+
def initialize(name, *args)
|
355
|
+
if Hash === name
|
356
|
+
super
|
357
|
+
else
|
358
|
+
super(nil, name, *args)
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
def call_discovered_column_callbacks(*)
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
class MysqlAdapter < JdbcAdapter
|
367
|
+
include ArJdbc::MySQL
|
368
|
+
|
369
|
+
def initialize(*args)
|
370
|
+
super
|
371
|
+
configure_connection
|
372
|
+
end
|
373
|
+
|
374
|
+
def adapter_spec(config)
|
375
|
+
# return nil to avoid extending ArJdbc::MySQL, which we've already done
|
376
|
+
end
|
377
|
+
|
378
|
+
def jdbc_column_class
|
379
|
+
ActiveRecord::ConnectionAdapters::MysqlColumn
|
380
|
+
end
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
module Mysql # :nodoc:
|
385
|
+
def self.client_version
|
386
|
+
50400 # faked out for AR tests
|
387
|
+
end
|
388
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Don't need to load native mysql adapter
|
2
|
+
$LOADED_FEATURES << "active_record/connection_adapters/mysql_adapter.rb"
|
3
|
+
|
4
|
+
class ActiveRecord::Base
|
5
|
+
class << self
|
6
|
+
def mysql_connection(config)
|
7
|
+
require "arjdbc/mysql"
|
8
|
+
config[:port] ||= 3306
|
9
|
+
url_options = "zeroDateTimeBehavior=convertToNull&jdbcCompliantTruncation=false&useUnicode=true&characterEncoding="
|
10
|
+
url_options << (config[:encoding] || 'utf8')
|
11
|
+
if config[:url]
|
12
|
+
config[:url] = config[:url]['?'] ? "#{config[:url]}&#{url_options}" : "#{config[:url]}?#{url_options}"
|
13
|
+
else
|
14
|
+
config[:url] = "jdbc:mysql://#{config[:host]}:#{config[:port]}/#{config[:database]}?#{url_options}"
|
15
|
+
end
|
16
|
+
config[:driver] ||= "com.mysql.jdbc.Driver"
|
17
|
+
config[:adapter_class] = ActiveRecord::ConnectionAdapters::MysqlAdapter
|
18
|
+
connection = jdbc_connection(config)
|
19
|
+
::ArJdbc::MySQL.kill_cancel_timer(connection.raw_connection)
|
20
|
+
connection
|
21
|
+
end
|
22
|
+
alias_method :jdbcmysql_connection, :mysql_connection
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
data/lib/arjdbc/mysql.rb
ADDED
@@ -1,13 +1,8 @@
|
|
1
|
-
module ::
|
2
|
-
|
3
|
-
|
4
|
-
config[:port] ||= 1521
|
5
|
-
config[:url] ||= "jdbc:oracle:thin:@#{config[:host]}:#{config[:port]}:#{config[:database]}"
|
6
|
-
config[:driver] ||= "oracle.jdbc.driver.OracleDriver"
|
7
|
-
jdbc_connection(config)
|
8
|
-
end
|
9
|
-
end
|
1
|
+
module ActiveRecord::ConnectionAdapters
|
2
|
+
OracleAdapter = Class.new(AbstractAdapter) unless const_defined?(:OracleAdapter)
|
3
|
+
end
|
10
4
|
|
5
|
+
module ::ArJdbc
|
11
6
|
module Oracle
|
12
7
|
def self.extended(mod)
|
13
8
|
unless @lob_callback_added
|
@@ -26,19 +21,16 @@ module ::JdbcSpec
|
|
26
21
|
ActiveRecord::Base.after_save :after_save_with_oracle_lob
|
27
22
|
@lob_callback_added = true
|
28
23
|
end
|
29
|
-
|
24
|
+
require 'arjdbc/jdbc/quoted_primary_key'
|
25
|
+
ActiveRecord::Base.extend ArJdbc::QuotedPrimaryKeyExtension
|
30
26
|
mod.class.class_eval do
|
31
27
|
alias_chained_method :insert, :query_dirty, :insert
|
32
28
|
alias_chained_method :columns, :query_cache, :columns
|
33
29
|
end
|
34
30
|
end
|
35
31
|
|
36
|
-
def self.adapter_matcher(name, *)
|
37
|
-
name =~ /oracle/i ? self : false
|
38
|
-
end
|
39
|
-
|
40
32
|
def self.column_selector
|
41
|
-
[/oracle/i, lambda {|cfg,col| col.extend(::
|
33
|
+
[/oracle/i, lambda {|cfg,col| col.extend(::ArJdbc::Oracle::Column)}]
|
42
34
|
end
|
43
35
|
|
44
36
|
module Column
|
@@ -52,7 +44,7 @@ module ::JdbcSpec
|
|
52
44
|
def type_cast(value)
|
53
45
|
return nil if value.nil?
|
54
46
|
case type
|
55
|
-
when :datetime then
|
47
|
+
when :datetime then ArJdbc::Oracle::Column.string_to_time(value, self.class)
|
56
48
|
else
|
57
49
|
super
|
58
50
|
end
|
@@ -60,7 +52,7 @@ module ::JdbcSpec
|
|
60
52
|
|
61
53
|
def type_cast_code(var_name)
|
62
54
|
case type
|
63
|
-
when :datetime then "
|
55
|
+
when :datetime then "ArJdbc::Oracle::Column.string_to_time(#{var_name}, self.class)"
|
64
56
|
else
|
65
57
|
super
|
66
58
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class ActiveRecord::Base
|
2
|
+
class << self
|
3
|
+
def oracle_connection(config)
|
4
|
+
config[:port] ||= 1521
|
5
|
+
config[:url] ||= "jdbc:oracle:thin:@#{config[:host]}:#{config[:port]}:#{config[:database]}"
|
6
|
+
config[:driver] ||= "oracle.jdbc.driver.OracleDriver"
|
7
|
+
jdbc_connection(config)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
@@ -1,24 +1,8 @@
|
|
1
|
+
module ActiveRecord::ConnectionAdapters
|
2
|
+
PostgreSQLAdapter = Class.new(AbstractAdapter) unless const_defined?(:PostgreSQLAdapter)
|
3
|
+
end
|
1
4
|
|
2
|
-
module ::
|
3
|
-
# Don't need to load native postgres adapter
|
4
|
-
$LOADED_FEATURES << "active_record/connection_adapters/postgresql_adapter.rb"
|
5
|
-
|
6
|
-
module ActiveRecordExtensions
|
7
|
-
add_method_to_remove_from_ar_base(:postgresql_connection)
|
8
|
-
|
9
|
-
def postgresql_connection(config)
|
10
|
-
require File.dirname(__FILE__) + "/../active_record/connection_adapters/postgresql_adapter"
|
11
|
-
config[:host] ||= "localhost"
|
12
|
-
config[:port] ||= 5432
|
13
|
-
config[:url] ||= "jdbc:postgresql://#{config[:host]}:#{config[:port]}/#{config[:database]}"
|
14
|
-
config[:url] << config[:pg_params] if config[:pg_params]
|
15
|
-
config[:driver] ||= "org.postgresql.Driver"
|
16
|
-
conn = jdbc_connection(config)
|
17
|
-
conn.execute("SET SEARCH_PATH TO #{config[:schema_search_path]}") if config[:schema_search_path]
|
18
|
-
conn
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
5
|
+
module ::ArJdbc
|
22
6
|
module PostgreSQL
|
23
7
|
def self.extended(mod)
|
24
8
|
mod.class.class_eval do
|
@@ -26,12 +10,8 @@ module ::JdbcSpec
|
|
26
10
|
end
|
27
11
|
end
|
28
12
|
|
29
|
-
def self.adapter_matcher(name, *)
|
30
|
-
name =~ /postgre/i ? self : false
|
31
|
-
end
|
32
|
-
|
33
13
|
def self.column_selector
|
34
|
-
[/postgre/i, lambda {|cfg,col| col.extend(::
|
14
|
+
[/postgre/i, lambda {|cfg,col| col.extend(::ArJdbc::PostgreSQL::Column)}]
|
35
15
|
end
|
36
16
|
|
37
17
|
def self.jdbc_connection_class
|
@@ -188,9 +168,9 @@ module ::JdbcSpec
|
|
188
168
|
end
|
189
169
|
|
190
170
|
def quote_regclass(table_name)
|
191
|
-
table_name.to_s.split('.').map do |part|
|
171
|
+
table_name.to_s.split('.').map do |part|
|
192
172
|
part =~ /".*"/i ? part : quote_table_name(part)
|
193
|
-
end.join('.')
|
173
|
+
end.join('.')
|
194
174
|
end
|
195
175
|
|
196
176
|
# Find a table's primary key and sequence.
|
@@ -381,15 +361,6 @@ module ::JdbcSpec
|
|
381
361
|
end
|
382
362
|
end
|
383
363
|
|
384
|
-
def _execute(sql, name = nil)
|
385
|
-
case sql.strip
|
386
|
-
when /\A\(?\s*(select|show)/i then
|
387
|
-
@connection.execute_query(sql)
|
388
|
-
else
|
389
|
-
@connection.execute_update(sql)
|
390
|
-
end
|
391
|
-
end
|
392
|
-
|
393
364
|
# SELECT DISTINCT clause for a given set of columns and a given ORDER BY clause.
|
394
365
|
#
|
395
366
|
# PostgreSQL requires the ORDER BY columns in the select list for distinct queries, and
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Don't need to load native postgres adapter
|
2
|
+
$LOADED_FEATURES << "active_record/connection_adapters/postgresql_adapter.rb"
|
3
|
+
|
4
|
+
class ActiveRecord::Base
|
5
|
+
class << self
|
6
|
+
def postgresql_connection(config)
|
7
|
+
require "arjdbc/postgresql"
|
8
|
+
config[:host] ||= "localhost"
|
9
|
+
config[:port] ||= 5432
|
10
|
+
config[:url] ||= "jdbc:postgresql://#{config[:host]}:#{config[:port]}/#{config[:database]}"
|
11
|
+
config[:url] << config[:pg_params] if config[:pg_params]
|
12
|
+
config[:driver] ||= "org.postgresql.Driver"
|
13
|
+
conn = jdbc_connection(config)
|
14
|
+
conn.execute("SET SEARCH_PATH TO #{config[:schema_search_path]}") if config[:schema_search_path]
|
15
|
+
conn
|
16
|
+
end
|
17
|
+
alias_method :jdbcpostgresql_connection, :postgresql_connection
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|