activerecord-jdbc-adapter 1.3.0.rc1 → 1.3.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/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)
|