activerecord-jdbc-adapter 1.3.0.rc1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CONTRIBUTING.md +3 -5
- data/Gemfile +3 -5
- data/Gemfile.lock +1 -1
- data/History.md +30 -3
- data/README.md +14 -9
- data/gemfiles/rails23.gemfile +3 -0
- data/gemfiles/rails23.gemfile.lock +8 -0
- data/gemfiles/rails30.gemfile +3 -0
- data/gemfiles/rails30.gemfile.lock +11 -0
- data/gemfiles/rails31.gemfile +3 -0
- data/gemfiles/rails31.gemfile.lock +8 -0
- data/gemfiles/rails32.gemfile +3 -0
- data/gemfiles/rails32.gemfile.lock +11 -0
- data/gemfiles/rails40.gemfile +3 -0
- data/gemfiles/rails40.gemfile.lock +6 -0
- data/lib/arjdbc/db2/adapter.rb +39 -23
- data/lib/arjdbc/db2/column.rb +3 -3
- data/lib/arjdbc/derby/adapter.rb +45 -0
- data/lib/arjdbc/firebird/adapter.rb +38 -36
- data/lib/arjdbc/h2/adapter.rb +1 -1
- data/lib/arjdbc/hsqldb/adapter.rb +1 -0
- data/lib/arjdbc/hsqldb/explain_support.rb +6 -6
- data/lib/arjdbc/jdbc/adapter.rb +80 -39
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/serialized_attributes_helper.rb +3 -21
- data/lib/arjdbc/mssql/adapter.rb +41 -18
- data/lib/arjdbc/mssql/column.rb +3 -8
- data/lib/arjdbc/mssql/explain_support.rb +1 -1
- data/lib/arjdbc/mysql/adapter.rb +19 -9
- data/lib/arjdbc/mysql/column.rb +1 -1
- data/lib/arjdbc/mysql/connection_methods.rb +1 -0
- data/lib/arjdbc/mysql/explain_support.rb +2 -1
- data/lib/arjdbc/oracle/adapter.rb +42 -26
- data/lib/arjdbc/oracle/column.rb +1 -1
- data/lib/arjdbc/postgresql/adapter.rb +13 -4
- data/lib/arjdbc/sqlite3/adapter.rb +2 -0
- data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +5 -5
- data/lib/arjdbc/util/serialized_attributes.rb +87 -0
- data/lib/arjdbc/version.rb +1 -1
- data/rakelib/02-test.rake +1 -1
- data/rakelib/db.rake +1 -1
- data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +2 -2
- data/src/java/arjdbc/derby/DerbyModule.java +26 -173
- data/src/java/arjdbc/h2/H2Module.java +1 -0
- data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +1 -2
- data/src/java/arjdbc/hsqldb/HSQLDBModule.java +10 -9
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +3 -3
- data/src/java/arjdbc/jdbc/JdbcConnectionFactory.java +4 -3
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +189 -70
- data/src/java/arjdbc/jdbc/SQLBlock.java +4 -4
- data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +6 -7
- data/src/java/arjdbc/mysql/MySQLModule.java +1 -0
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +14 -9
- data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +19 -3
- data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +305 -11
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +3 -3
- metadata +6 -5
Binary file
|
@@ -1,21 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
def self.dump_column_value(record, column)
|
5
|
-
value = record[ name = column.name.to_s ]
|
6
|
-
if record.class.respond_to?(:serialized_attributes)
|
7
|
-
if coder = record.class.serialized_attributes[name]
|
8
|
-
value = coder.respond_to?(:dump) ? coder.dump(value) : value.to_yaml
|
9
|
-
end
|
10
|
-
else
|
11
|
-
if record.respond_to?(:unserializable_attribute?)
|
12
|
-
value = value.to_yaml if record.unserializable_attribute?(name, column)
|
13
|
-
else
|
14
|
-
value = value.to_yaml if value.is_a?(Hash)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
value
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
1
|
+
# @deprecated
|
2
|
+
warn "DEPRECATED: require 'arjdbc/util/serialized_attributes' instead of 'arjdbc/jdbc/serialized_attributes_helper'"
|
3
|
+
require 'arjdbc/util/serialized_attributes'
|
data/lib/arjdbc/mssql/adapter.rb
CHANGED
@@ -29,18 +29,31 @@ module ArJdbc
|
|
29
29
|
def self.initialize!
|
30
30
|
return if @@_initialized; @@_initialized = true
|
31
31
|
|
32
|
-
require 'arjdbc/
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
32
|
+
require 'arjdbc/util/serialized_attributes'
|
33
|
+
Util::SerializedAttributes.setup /image/i, 'after_save_with_mssql_lob'
|
34
|
+
end
|
35
|
+
|
36
|
+
# @private
|
37
|
+
@@update_lob_values = true
|
38
|
+
|
39
|
+
# Updating records with LOB values (binary/text columns) in a separate
|
40
|
+
# statement can be disabled using :
|
41
|
+
#
|
42
|
+
# ArJdbc::MSSQL.update_lob_values = false
|
43
|
+
#
|
44
|
+
# @note This only applies when prepared statements are not used.
|
45
|
+
def self.update_lob_values?; @@update_lob_values; end
|
46
|
+
# @see #update_lob_values?
|
47
|
+
def self.update_lob_values=(update); @@update_lob_values = update; end
|
48
|
+
|
49
|
+
# @see #quote
|
50
|
+
# @private
|
51
|
+
BLOB_VALUE_MARKER = "''"
|
52
|
+
|
53
|
+
# @see #update_lob_values?
|
54
|
+
# @see ArJdbc::Util::SerializedAttributes#update_lob_columns
|
55
|
+
def update_lob_value?(value, column = nil)
|
56
|
+
MSSQL.update_lob_values? && ! prepared_statements? # && value
|
44
57
|
end
|
45
58
|
|
46
59
|
# @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
|
@@ -131,15 +144,19 @@ module ArJdbc
|
|
131
144
|
# @override
|
132
145
|
def quote(value, column = nil)
|
133
146
|
return value.quoted_id if value.respond_to?(:quoted_id)
|
147
|
+
return value if sql_literal?(value)
|
134
148
|
|
135
149
|
case value
|
136
150
|
# SQL Server 2000 doesn't let you insert an integer into a NVARCHAR
|
137
|
-
# column, so we include Integer here.
|
138
151
|
when String, ActiveSupport::Multibyte::Chars, Integer
|
139
152
|
value = value.to_s
|
140
153
|
column_type = column && column.type
|
141
154
|
if column_type == :binary
|
142
|
-
|
155
|
+
if update_lob_value?(value, column)
|
156
|
+
BLOB_VALUE_MARKER
|
157
|
+
else
|
158
|
+
"'#{quote_string(column.class.string_to_binary(value))}'" # ' (for ruby-mode)
|
159
|
+
end
|
143
160
|
elsif column_type == :integer
|
144
161
|
value.to_i.to_s
|
145
162
|
elsif column_type == :float
|
@@ -520,22 +537,28 @@ module ArJdbc
|
|
520
537
|
def exec_query(sql, name = 'SQL', binds = [])
|
521
538
|
# NOTE: we allow to execute SQL as requested returning a results.
|
522
539
|
# e.g. this allows to use SQLServer's EXEC with a result set ...
|
523
|
-
sql
|
540
|
+
if sql.respond_to?(:to_sql)
|
541
|
+
sql = to_sql(sql, binds); to_sql = true
|
542
|
+
end
|
543
|
+
sql = repair_special_columns(sql)
|
524
544
|
if prepared_statements?
|
525
545
|
log(sql, name, binds) { @connection.execute_query(sql, binds) }
|
526
546
|
else
|
527
|
-
sql = suble_binds(sql, binds)
|
547
|
+
sql = suble_binds(sql, binds) unless to_sql # deprecated behavior
|
528
548
|
log(sql, name) { @connection.execute_query(sql) }
|
529
549
|
end
|
530
550
|
end
|
531
551
|
|
532
552
|
# @override
|
533
553
|
def exec_query_raw(sql, name = 'SQL', binds = [], &block)
|
534
|
-
sql
|
554
|
+
if sql.respond_to?(:to_sql)
|
555
|
+
sql = to_sql(sql, binds); to_sql = true
|
556
|
+
end
|
557
|
+
sql = repair_special_columns(sql)
|
535
558
|
if prepared_statements?
|
536
559
|
log(sql, name, binds) { @connection.execute_query_raw(sql, binds, &block) }
|
537
560
|
else
|
538
|
-
sql = suble_binds(sql, binds)
|
561
|
+
sql = suble_binds(sql, binds) unless to_sql # deprecated behavior
|
539
562
|
log(sql, name) { @connection.execute_query_raw(sql, &block) }
|
540
563
|
end
|
541
564
|
end
|
data/lib/arjdbc/mssql/column.rb
CHANGED
@@ -140,11 +140,7 @@ module ArJdbc
|
|
140
140
|
return value unless value.is_a?(String)
|
141
141
|
return nil if value.empty?
|
142
142
|
|
143
|
-
fast_string_to_time(value) ||
|
144
|
-
begin
|
145
|
-
DateTime.parse(value).to_time
|
146
|
-
rescue nil
|
147
|
-
end
|
143
|
+
fast_string_to_time(value) || DateTime.parse(value).to_time rescue nil
|
148
144
|
end
|
149
145
|
|
150
146
|
ISO_TIME = /\A(\d\d)\:(\d\d)\:(\d\d)(\.\d+)?\z/
|
@@ -160,12 +156,11 @@ module ArJdbc
|
|
160
156
|
super(value)
|
161
157
|
end
|
162
158
|
end
|
163
|
-
|
164
|
-
# @private
|
159
|
+
|
165
160
|
def string_to_binary(value)
|
166
161
|
# this will only allow the adapter to insert binary data with a length
|
167
162
|
# of 7K or less because of a SQL Server statement length policy ...
|
168
|
-
|
163
|
+
"0x#{value.unpack("H*")}" # "0x#{value.unpack("H*")[0]}"
|
169
164
|
end
|
170
165
|
|
171
166
|
def binary_to_string(value)
|
data/lib/arjdbc/mysql/adapter.rb
CHANGED
@@ -75,7 +75,10 @@ module ArJdbc
|
|
75
75
|
# ArJdbc::MySQL.emulate_booleans = false
|
76
76
|
#
|
77
77
|
# @see ActiveRecord::ConnectionAdapters::MysqlAdapter#emulate_booleans
|
78
|
+
def self.emulate_booleans?; @@emulate_booleans; end
|
79
|
+
# @deprecated Use {#emulate_booleans?} instead.
|
78
80
|
def self.emulate_booleans; @@emulate_booleans; end
|
81
|
+
# @see #emulate_booleans?
|
79
82
|
def self.emulate_booleans=(emulate); @@emulate_booleans = emulate; end
|
80
83
|
|
81
84
|
NATIVE_DATABASE_TYPES = {
|
@@ -141,6 +144,7 @@ module ArJdbc
|
|
141
144
|
# @override
|
142
145
|
def quote(value, column = nil)
|
143
146
|
return value.quoted_id if value.respond_to?(:quoted_id)
|
147
|
+
return value if sql_literal?(value)
|
144
148
|
return value.to_s if column && column.type == :primary_key
|
145
149
|
|
146
150
|
if value.kind_of?(String) && column && column.type == :binary && column.class.respond_to?(:string_to_binary)
|
@@ -320,15 +324,17 @@ module ArJdbc
|
|
320
324
|
indexes
|
321
325
|
end
|
322
326
|
|
327
|
+
# Returns an array of `Column` objects for the table specified.
|
323
328
|
# @override
|
324
329
|
def columns(table_name, name = nil)
|
325
|
-
sql = "SHOW
|
330
|
+
sql = "SHOW FULL COLUMNS FROM #{quote_table_name(table_name)}"
|
326
331
|
column = ::ActiveRecord::ConnectionAdapters::MysqlAdapter::Column
|
327
|
-
|
328
|
-
|
329
|
-
column.new(field[
|
332
|
+
columns = execute(sql, name || 'SCHEMA')
|
333
|
+
columns.map! do |field|
|
334
|
+
column.new(field['Field'], field['Default'], field['Type'],
|
335
|
+
field['Null'] == "YES", field['Collation'], field['Extra'])
|
330
336
|
end
|
331
|
-
|
337
|
+
columns
|
332
338
|
end
|
333
339
|
|
334
340
|
# @private
|
@@ -591,17 +597,21 @@ module ActiveRecord
|
|
591
597
|
# ```
|
592
598
|
# ActiveRecord::ConnectionAdapters::Mysql[2]Adapter.emulate_booleans = false
|
593
599
|
# ```
|
594
|
-
def self.emulate_booleans
|
600
|
+
def self.emulate_booleans?; ::ArJdbc::MySQL.emulate_booleans?; end
|
601
|
+
def self.emulate_booleans; ::ArJdbc::MySQL.emulate_booleans?; end # native adapter
|
595
602
|
def self.emulate_booleans=(emulate); ::ArJdbc::MySQL.emulate_booleans = emulate; end
|
596
603
|
|
597
604
|
class Column < JdbcColumn
|
598
605
|
include ::ArJdbc::MySQL::Column
|
599
606
|
|
600
|
-
|
607
|
+
attr_reader :collation, :strict, :extra
|
608
|
+
|
609
|
+
def initialize(name, default, sql_type = nil, null = true, collation = nil, strict = false, extra = "")
|
601
610
|
if Hash === name
|
602
|
-
super
|
611
|
+
super # first arg: config
|
603
612
|
else
|
604
|
-
|
613
|
+
@strict = strict; @collation = collation; @extra = extra
|
614
|
+
super(name, default, sql_type, null)
|
605
615
|
end
|
606
616
|
end
|
607
617
|
|
data/lib/arjdbc/mysql/column.rb
CHANGED
@@ -6,6 +6,7 @@ ArJdbc::ConnectionMethods.module_eval do
|
|
6
6
|
rescue LoadError # assuming driver.jar is on the class-path
|
7
7
|
end
|
8
8
|
|
9
|
+
config[:username] = 'root' unless config.key?(:username)
|
9
10
|
config[:port] ||= 3306
|
10
11
|
config[:url] ||= "jdbc:mysql://#{config[:host]}:#{config[:port]}/#{config[:database]}"
|
11
12
|
config[:driver] ||= defined?(::Jdbc::MySQL.driver_name) ? ::Jdbc::MySQL.driver_name : 'com.mysql.jdbc.Driver'
|
@@ -13,7 +13,8 @@ module ::ArJdbc
|
|
13
13
|
ExplainPrettyPrinter.new.pp result, elapsed
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
# @private
|
17
|
+
class ExplainPrettyPrinter
|
17
18
|
# Pretty prints the result of a EXPLAIN in a way that resembles the output of the
|
18
19
|
# MySQL shell:
|
19
20
|
#
|
@@ -15,18 +15,8 @@ module ArJdbc
|
|
15
15
|
def self.initialize!
|
16
16
|
return if @@_initialized; @@_initialized = true
|
17
17
|
|
18
|
-
require 'arjdbc/
|
19
|
-
|
20
|
-
def after_save_with_oracle_lob
|
21
|
-
self.class.columns.select { |c| c.sql_type =~ /LOB\(|LOB$/i }.each do |column|
|
22
|
-
value = ::ArJdbc::SerializedAttributesHelper.dump_column_value(self, column)
|
23
|
-
next if value.nil? || (value == '')
|
24
|
-
|
25
|
-
self.class.connection.update_lob_value(self, column, value)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
ActiveRecord::Base.after_save :after_save_with_oracle_lob
|
18
|
+
require 'arjdbc/util/serialized_attributes'
|
19
|
+
Util::SerializedAttributes.setup /LOB\(|LOB$/i, 'after_save_with_oracle_lob'
|
30
20
|
|
31
21
|
unless ActiveRecord::ConnectionAdapters::AbstractAdapter.
|
32
22
|
instance_methods(false).detect { |m| m.to_s == "prefetch_primary_key?" }
|
@@ -45,6 +35,25 @@ module ArJdbc
|
|
45
35
|
::ActiveRecord::ConnectionAdapters::OracleColumn
|
46
36
|
end
|
47
37
|
|
38
|
+
# @private
|
39
|
+
@@update_lob_values = true
|
40
|
+
|
41
|
+
# Updating records with LOB values (binary/text columns) in a separate
|
42
|
+
# statement can be disabled using :
|
43
|
+
#
|
44
|
+
# ArJdbc::Oracle.update_lob_values = false
|
45
|
+
#
|
46
|
+
# @note This only applies when prepared statements are not used.
|
47
|
+
def self.update_lob_values?; @@update_lob_values; end
|
48
|
+
# @see #update_lob_values?
|
49
|
+
def self.update_lob_values=(update); @@update_lob_values = update; end
|
50
|
+
|
51
|
+
# @see #update_lob_values?
|
52
|
+
# @see ArJdbc::Util::SerializedAttributes#update_lob_columns
|
53
|
+
def update_lob_value?(value, column = nil)
|
54
|
+
Oracle.update_lob_values? && ! prepared_statements? && ! ( value.nil? || value == '' )
|
55
|
+
end
|
56
|
+
|
48
57
|
# @private
|
49
58
|
@@emulate_booleans = true
|
50
59
|
|
@@ -53,7 +62,10 @@ module ArJdbc
|
|
53
62
|
# ArJdbc::Oracle.emulate_booleans = false
|
54
63
|
#
|
55
64
|
# @see ActiveRecord::ConnectionAdapters::OracleAdapter#emulate_booleans
|
65
|
+
def self.emulate_booleans?; @@emulate_booleans; end
|
66
|
+
# @deprecated Use {#emulate_booleans?} instead.
|
56
67
|
def self.emulate_booleans; @@emulate_booleans; end
|
68
|
+
# @see #emulate_booleans?
|
57
69
|
def self.emulate_booleans=(emulate); @@emulate_booleans = emulate; end
|
58
70
|
|
59
71
|
class TableDefinition < ::ActiveRecord::ConnectionAdapters::TableDefinition
|
@@ -161,8 +173,11 @@ module ArJdbc
|
|
161
173
|
|
162
174
|
# @override
|
163
175
|
def drop_table(name, options = {})
|
164
|
-
super(name)
|
165
|
-
|
176
|
+
outcome = super(name)
|
177
|
+
return outcome if name == 'schema_migrations'
|
178
|
+
seq_name = options.key?(:sequence_name) ? # pass nil/false - no sequence
|
179
|
+
options[:sequence_name] : default_sequence_name(name)
|
180
|
+
return outcome unless seq_name
|
166
181
|
execute "DROP SEQUENCE #{quote_table_name(seq_name)}" rescue nil
|
167
182
|
end
|
168
183
|
|
@@ -191,11 +206,6 @@ module ArJdbc
|
|
191
206
|
end
|
192
207
|
end
|
193
208
|
|
194
|
-
def sql_literal?(value)
|
195
|
-
defined?(::Arel::SqlLiteral) && ::Arel::SqlLiteral === value
|
196
|
-
end
|
197
|
-
private :sql_literal?
|
198
|
-
|
199
209
|
def indexes(table, name = nil)
|
200
210
|
@connection.indexes(table, name, @connection.connection.meta_data.user_name)
|
201
211
|
end
|
@@ -380,14 +390,19 @@ module ArJdbc
|
|
380
390
|
|
381
391
|
# @override
|
382
392
|
def quote(value, column = nil)
|
383
|
-
return value if sql_literal?(value)
|
393
|
+
return value if sql_literal?(value)
|
384
394
|
|
385
395
|
column_type = column && column.type
|
386
396
|
if column_type == :text || column_type == :binary
|
387
|
-
if
|
388
|
-
|
397
|
+
return 'NULL' if value.nil? || value == ''
|
398
|
+
if update_lob_value?(value, column)
|
399
|
+
if /(.*?)\([0-9]+\)/ =~ ( sql_type = column.sql_type )
|
400
|
+
%Q{empty_#{ $1.downcase }()}
|
401
|
+
else
|
402
|
+
%Q{empty_#{ sql_type.respond_to?(:downcase) ? sql_type.downcase : 'blob' }()}
|
403
|
+
end
|
389
404
|
else
|
390
|
-
|
405
|
+
"'#{quote_string(value.to_s)}'"
|
391
406
|
end
|
392
407
|
elsif column_type == :xml
|
393
408
|
"XMLTYPE('#{quote_string(value)}')" # XMLTYPE ?
|
@@ -462,9 +477,9 @@ module ArJdbc
|
|
462
477
|
end
|
463
478
|
|
464
479
|
def explain(arel, binds = [])
|
465
|
-
sql = "EXPLAIN PLAN FOR #{to_sql(arel)}"
|
480
|
+
sql = "EXPLAIN PLAN FOR #{to_sql(arel, binds)}"
|
466
481
|
return if sql =~ /FROM all_/
|
467
|
-
|
482
|
+
exec_update(sql, 'EXPLAIN', binds)
|
468
483
|
select_values("SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY)", 'EXPLAIN').join("\n")
|
469
484
|
end
|
470
485
|
|
@@ -611,7 +626,8 @@ module ActiveRecord::ConnectionAdapters
|
|
611
626
|
#
|
612
627
|
# ActiveRecord::ConnectionAdapters::OracleAdapter.emulate_booleans = false
|
613
628
|
#
|
614
|
-
def self.emulate_booleans
|
629
|
+
def self.emulate_booleans?; ::ArJdbc::Oracle.emulate_booleans?; end
|
630
|
+
def self.emulate_booleans; ::ArJdbc::Oracle.emulate_booleans?; end # oracle-enhanced
|
615
631
|
def self.emulate_booleans=(emulate); ::ArJdbc::Oracle.emulate_booleans = emulate; end
|
616
632
|
|
617
633
|
def initialize(*args)
|
data/lib/arjdbc/oracle/column.rb
CHANGED
@@ -55,7 +55,7 @@ module ArJdbc
|
|
55
55
|
when /char/i then :string
|
56
56
|
when /float|double/i then :float
|
57
57
|
when /int/i then :integer
|
58
|
-
when /^number\(1\)$/i then Oracle.emulate_booleans ? :boolean : :integer
|
58
|
+
when /^number\(1\)$/i then Oracle.emulate_booleans? ? :boolean : :integer
|
59
59
|
when /^num|dec|real/i then extract_scale(field_type) == 0 ? :integer : :decimal
|
60
60
|
# Oracle TIMESTAMP stores the date and time to up to 9 digits of sub-second precision
|
61
61
|
when /TIMESTAMP/i then :timestamp
|
@@ -379,7 +379,8 @@ module ArJdbc
|
|
379
379
|
def extension_enabled?(name)
|
380
380
|
if supports_extensions?
|
381
381
|
rows = select_rows("SELECT EXISTS(SELECT * FROM pg_available_extensions WHERE name = '#{name}' AND installed_version IS NOT NULL)", 'SCHEMA')
|
382
|
-
rows.first.first
|
382
|
+
available = rows.first.first # true/false or 't'/'f'
|
383
|
+
available == true || available == 't'
|
383
384
|
end
|
384
385
|
end
|
385
386
|
|
@@ -635,7 +636,11 @@ module ArJdbc
|
|
635
636
|
|
636
637
|
def last_insert_id(table, sequence_name = nil)
|
637
638
|
sequence_name = table if sequence_name.nil? # AR-4.0 1 argument
|
638
|
-
|
639
|
+
last_insert_id_result(sequence_name)
|
640
|
+
end
|
641
|
+
|
642
|
+
def last_insert_id_result(sequence_name)
|
643
|
+
select_value("SELECT currval('#{sequence_name}')", 'SQL')
|
639
644
|
end
|
640
645
|
|
641
646
|
def recreate_database(name, options = {})
|
@@ -792,6 +797,7 @@ module ArJdbc
|
|
792
797
|
# @override
|
793
798
|
def quote(value, column = nil)
|
794
799
|
return super unless column
|
800
|
+
return value if sql_literal?(value)
|
795
801
|
|
796
802
|
case value
|
797
803
|
when Float
|
@@ -1085,13 +1091,16 @@ module ArJdbc
|
|
1085
1091
|
|
1086
1092
|
binds = [[ nil, table.gsub(/(^"|"$)/,'') ]]
|
1087
1093
|
binds << [ nil, schema ] if schema
|
1088
|
-
|
1089
|
-
exec_query_raw(<<-SQL, 'SCHEMA', binds).first["table_count"] > 0
|
1094
|
+
sql = <<-SQL
|
1090
1095
|
SELECT COUNT(*) as table_count
|
1091
1096
|
FROM pg_tables
|
1092
1097
|
WHERE tablename = ?
|
1093
1098
|
AND schemaname = #{schema ? "?" : "ANY (current_schemas(false))"}
|
1094
1099
|
SQL
|
1100
|
+
|
1101
|
+
log(sql, 'SCHEMA', binds) do
|
1102
|
+
@connection.execute_query_raw(sql, binds).first["table_count"] > 0
|
1103
|
+
end
|
1095
1104
|
end
|
1096
1105
|
|
1097
1106
|
# @private
|
@@ -209,6 +209,8 @@ module ArJdbc
|
|
209
209
|
|
210
210
|
# @override
|
211
211
|
def quote(value, column = nil)
|
212
|
+
return value if sql_literal?(value)
|
213
|
+
|
212
214
|
if value.kind_of?(String)
|
213
215
|
column_type = column && column.type
|
214
216
|
if column_type == :binary && column.class.respond_to?(:string_to_binary)
|