ActiveRecord-JDBC 0.2.1 → 0.2.2
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/lib/active_record/connection_adapters/jdbc_adapter.rb +45 -9
- data/lib/active_record/connection_adapters/jdbc_adapter_spec.rb +9 -1132
- data/lib/jdbc_adapter/jdbc_db2.rb +83 -0
- data/lib/jdbc_adapter/jdbc_derby.rb +113 -0
- data/lib/jdbc_adapter/jdbc_firebird.rb +103 -0
- data/lib/jdbc_adapter/jdbc_hsqldb.rb +104 -0
- data/lib/jdbc_adapter/jdbc_mimer.rb +122 -0
- data/lib/jdbc_adapter/jdbc_mssql.rb +208 -0
- data/lib/jdbc_adapter/jdbc_mysql.rb +119 -0
- data/lib/jdbc_adapter/jdbc_oracle.rb +237 -0
- data/lib/jdbc_adapter/jdbc_postgre.rb +173 -0
- data/test/db/hsqldb.rb +14 -0
- data/test/db/logger.rb +3 -0
- data/test/db/mysql.rb +20 -0
- data/test/hsqldb_simple_test.rb +9 -0
- data/test/manualTestDatabase.rb +5 -5
- data/test/minirunit/testHsqldb.rb +8 -6
- data/test/minirunit/testMysql.rb +1 -1
- data/test/models/entry.rb +22 -0
- data/test/mysql_simple_test.rb +15 -0
- data/test/simple.rb +65 -0
- metadata +21 -2
@@ -0,0 +1,83 @@
|
|
1
|
+
module JdbcSpec
|
2
|
+
module DB2
|
3
|
+
module Column
|
4
|
+
def type_cast(value)
|
5
|
+
return nil if value.nil? || value =~ /^\s*null\s*$/i
|
6
|
+
case type
|
7
|
+
when :string then value
|
8
|
+
when :integer then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
|
9
|
+
when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
|
10
|
+
when :float then value.to_f
|
11
|
+
when :datetime then cast_to_date_or_time(value)
|
12
|
+
when :timestamp then cast_to_time(value)
|
13
|
+
when :time then cast_to_time(value)
|
14
|
+
else value
|
15
|
+
end
|
16
|
+
end
|
17
|
+
def cast_to_date_or_time(value)
|
18
|
+
return value if value.is_a? Date
|
19
|
+
return nil if value.blank?
|
20
|
+
guess_date_or_time (value.is_a? Time) ? value : cast_to_time(value)
|
21
|
+
end
|
22
|
+
|
23
|
+
def cast_to_time(value)
|
24
|
+
return value if value.is_a? Time
|
25
|
+
time_array = ParseDate.parsedate value
|
26
|
+
time_array[0] ||= 2000; time_array[1] ||= 1; time_array[2] ||= 1;
|
27
|
+
Time.send(Base.default_timezone, *time_array) rescue nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def guess_date_or_time(value)
|
31
|
+
(value.hour == 0 and value.min == 0 and value.sec == 0) ?
|
32
|
+
Date.new(value.year, value.month, value.day) : value
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def modify_types(tp)
|
37
|
+
tp[:primary_key] = 'int generated by default as identity (start with 42) primary key'
|
38
|
+
tp[:string][:limit] = 255
|
39
|
+
tp[:integer][:limit] = nil
|
40
|
+
tp[:boolean][:limit] = nil
|
41
|
+
tp
|
42
|
+
end
|
43
|
+
|
44
|
+
def add_limit_offset!(sql, options)
|
45
|
+
if limit = options[:limit]
|
46
|
+
offset = options[:offset] || 0
|
47
|
+
sql.gsub!(/SELECT/i, 'SELECT B.* FROM (SELECT A.*, row_number() over () AS internal$rownum FROM (SELECT')
|
48
|
+
sql << ") A ) B WHERE B.internal$rownum > #{offset} AND B.internal$rownum <= #{limit + offset}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def quote_column_name(column_name)
|
53
|
+
column_name
|
54
|
+
end
|
55
|
+
|
56
|
+
def quote(value, column = nil) # :nodoc:
|
57
|
+
if column && column.type == :primary_key
|
58
|
+
return value.to_s
|
59
|
+
end
|
60
|
+
case value
|
61
|
+
when String
|
62
|
+
if column && column.type == :binary
|
63
|
+
"BLOB('#{quote_string(value)}')"
|
64
|
+
else
|
65
|
+
"'#{quote_string(value)}'"
|
66
|
+
end
|
67
|
+
else super
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def quote_string(string)
|
72
|
+
string.gsub(/'/, "''") # ' (for ruby-mode)
|
73
|
+
end
|
74
|
+
|
75
|
+
def quoted_true
|
76
|
+
'1'
|
77
|
+
end
|
78
|
+
|
79
|
+
def quoted_false
|
80
|
+
'0'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module JdbcSpec
|
2
|
+
module Derby
|
3
|
+
module Column
|
4
|
+
def type_cast(value)
|
5
|
+
return nil if value.nil? || value =~ /^\s*null\s*$/i
|
6
|
+
case type
|
7
|
+
when :string then value
|
8
|
+
when :integer then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
|
9
|
+
when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
|
10
|
+
when :float then value.to_f
|
11
|
+
when :datetime then cast_to_date_or_time(value)
|
12
|
+
when :timestamp then cast_to_time(value)
|
13
|
+
when :binary then value.scan(/[0-9A-Fa-f]{2}/).collect {|v| v.to_i(16)}.pack("C*")
|
14
|
+
when :time then cast_to_time(value)
|
15
|
+
else value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
def cast_to_date_or_time(value)
|
19
|
+
return value if value.is_a? Date
|
20
|
+
return nil if value.blank?
|
21
|
+
guess_date_or_time (value.is_a? Time) ? value : cast_to_time(value)
|
22
|
+
end
|
23
|
+
|
24
|
+
def cast_to_time(value)
|
25
|
+
return value if value.is_a? Time
|
26
|
+
time_array = ParseDate.parsedate value
|
27
|
+
time_array[0] ||= 2000; time_array[1] ||= 1; time_array[2] ||= 1;
|
28
|
+
Time.send(Base.default_timezone, *time_array) rescue nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def guess_date_or_time(value)
|
32
|
+
(value.hour == 0 and value.min == 0 and value.sec == 0) ?
|
33
|
+
Date.new(value.year, value.month, value.day) : value
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def modify_types(tp)
|
38
|
+
tp[:primary_key] = "int generated by default as identity NOT NULL PRIMARY KEY"
|
39
|
+
tp[:integer][:limit] = nil
|
40
|
+
tp
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_limit_offset!(sql, options) # :nodoc:
|
44
|
+
@limit = options[:limit]
|
45
|
+
@offset = options[:offset]
|
46
|
+
end
|
47
|
+
|
48
|
+
def select_all(sql, name = nil)
|
49
|
+
@limit ||= -1
|
50
|
+
@offset ||= 0
|
51
|
+
select(sql, name)[@offset..(@offset+@limit)]
|
52
|
+
ensure
|
53
|
+
@limit = @offset = nil
|
54
|
+
end
|
55
|
+
|
56
|
+
def select_one(sql, name = nil)
|
57
|
+
@offset ||= 0
|
58
|
+
select(sql, name)[@offset]
|
59
|
+
ensure
|
60
|
+
@limit = @offset = nil
|
61
|
+
end
|
62
|
+
|
63
|
+
def execute(sql, name = nil)
|
64
|
+
log_no_bench(sql, name) do
|
65
|
+
if sql =~ /^select/i
|
66
|
+
@limit ||= -1
|
67
|
+
@offset ||= 0
|
68
|
+
@connection.execute_query(sql)[@offset..(@offset+@limit)]
|
69
|
+
else
|
70
|
+
@connection.execute_update(sql)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
ensure
|
74
|
+
@limit = @offset = nil
|
75
|
+
end
|
76
|
+
|
77
|
+
def remove_index(table_name, options) #:nodoc:
|
78
|
+
execute "DROP INDEX #{index_name(table_name, options)}"
|
79
|
+
end
|
80
|
+
|
81
|
+
def rename_table(name, new_name)
|
82
|
+
execute "RENAME TABLE #{name} TO #{new_name}"
|
83
|
+
end
|
84
|
+
|
85
|
+
def quote(value, column = nil) # :nodoc:
|
86
|
+
if column && column.type == :primary_key
|
87
|
+
return value.to_s
|
88
|
+
end
|
89
|
+
case value
|
90
|
+
when String
|
91
|
+
if column && column.type == :binary
|
92
|
+
"CAST(x'#{quote_string(value).unpack("C*").collect {|v| v.to_s(16)}.join}' AS BLOB)"
|
93
|
+
else
|
94
|
+
vi = value.to_i
|
95
|
+
if vi.to_s == value
|
96
|
+
value
|
97
|
+
else
|
98
|
+
"'#{quote_string(value)}'"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
else super
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def quoted_true
|
106
|
+
'1'
|
107
|
+
end
|
108
|
+
|
109
|
+
def quoted_false
|
110
|
+
'0'
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module JdbcSpec
|
2
|
+
module FireBird
|
3
|
+
def modify_types(tp)
|
4
|
+
tp[:primary_key] = 'INTEGER NOT NULL PRIMARY KEY'
|
5
|
+
tp[:string][:limit] = 252
|
6
|
+
tp[:integer][:limit] = nil
|
7
|
+
tp
|
8
|
+
end
|
9
|
+
|
10
|
+
def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) # :nodoc:
|
11
|
+
execute(sql, name)
|
12
|
+
id_value
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_limit_offset!(sql, options) # :nodoc:
|
16
|
+
if options[:limit]
|
17
|
+
limit_string = "FIRST #{options[:limit]}"
|
18
|
+
limit_string << " SKIP #{options[:offset]}" if options[:offset]
|
19
|
+
sql.sub!(/\A(\s*SELECT\s)/i, '\&' + limit_string + ' ')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def prefetch_primary_key?(table_name = nil)
|
24
|
+
true
|
25
|
+
end
|
26
|
+
|
27
|
+
def default_sequence_name(table_name, primary_key) # :nodoc:
|
28
|
+
"#{table_name}_seq"
|
29
|
+
end
|
30
|
+
|
31
|
+
def next_sequence_value(sequence_name)
|
32
|
+
select_one("SELECT GEN_ID(#{sequence_name}, 1 ) FROM RDB$DATABASE;")["gen_id"]
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_table(name, options = {}) #:nodoc:
|
36
|
+
super(name, options)
|
37
|
+
execute "CREATE GENERATOR #{name}_seq"
|
38
|
+
end
|
39
|
+
|
40
|
+
def rename_table(name, new_name) #:nodoc:
|
41
|
+
execute "RENAME #{name} TO #{new_name}"
|
42
|
+
execute "UPDATE RDB$GENERATORS SET RDB$GENERATOR_NAME='#{new_name}_seq' WHERE RDB$GENERATOR_NAME='#{name}_seq'" rescue nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def drop_table(name) #:nodoc:
|
46
|
+
super(name)
|
47
|
+
execute "DROP GENERATOR #{name}_seq" rescue nil
|
48
|
+
end
|
49
|
+
|
50
|
+
def change_column(table_name, column_name, type, options = {}) #:nodoc:
|
51
|
+
execute "ALTER TABLE #{table_name} ALTER #{column_name} TYPE #{type_to_sql(type, options[:limit])}"
|
52
|
+
end
|
53
|
+
|
54
|
+
def rename_column(table_name, column_name, new_column_name)
|
55
|
+
execute "ALTER TABLE #{table_name} ALTER #{column_name} TO #{new_column_name}"
|
56
|
+
end
|
57
|
+
|
58
|
+
def remove_index(table_name, options) #:nodoc:
|
59
|
+
execute "DROP INDEX #{index_name(table_name, options)}"
|
60
|
+
end
|
61
|
+
|
62
|
+
def quote(value, column = nil) # :nodoc:
|
63
|
+
if [Time, DateTime].include?(value.class)
|
64
|
+
"CAST('#{value.strftime("%Y-%m-%d %H:%M:%S")}' AS TIMESTAMP)"
|
65
|
+
else
|
66
|
+
if column && column.type == :primary_key
|
67
|
+
return value.to_s
|
68
|
+
end
|
69
|
+
super
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def quote_string(string) # :nodoc:
|
74
|
+
string.gsub(/'/, "''")
|
75
|
+
end
|
76
|
+
|
77
|
+
def quote_column_name(column_name) # :nodoc:
|
78
|
+
%Q("#{ar_to_fb_case(column_name)}")
|
79
|
+
end
|
80
|
+
|
81
|
+
def quoted_true # :nodoc:
|
82
|
+
quote(1)
|
83
|
+
end
|
84
|
+
|
85
|
+
def quoted_false # :nodoc:
|
86
|
+
quote(0)
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
# Maps uppercase Firebird column names to lowercase for ActiveRecord;
|
92
|
+
# mixed-case columns retain their original case.
|
93
|
+
def fb_to_ar_case(column_name)
|
94
|
+
column_name =~ /[[:lower:]]/ ? column_name : column_name.to_s.downcase
|
95
|
+
end
|
96
|
+
|
97
|
+
# Maps lowercase ActiveRecord column names to uppercase for Fierbird;
|
98
|
+
# mixed-case columns retain their original case.
|
99
|
+
def ar_to_fb_case(column_name)
|
100
|
+
column_name =~ /[[:upper:]]/ ? column_name : column_name.to_s.upcase
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module JdbcSpec
|
2
|
+
module HSQLDB
|
3
|
+
module Column
|
4
|
+
def type_cast(value)
|
5
|
+
return nil if value.nil? || value =~ /^\s*null\s*$/i
|
6
|
+
case type
|
7
|
+
when :string then value
|
8
|
+
when :integer then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
|
9
|
+
when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
|
10
|
+
when :float then value.to_f
|
11
|
+
when :datetime then cast_to_date_or_time(value)
|
12
|
+
when :timestamp then cast_to_time(value)
|
13
|
+
when :binary then value.scan(/[0-9A-Fa-f]{2}/).collect {|v| v.to_i(16)}.pack("C*")
|
14
|
+
when :time then cast_to_time(value)
|
15
|
+
else value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
def cast_to_date_or_time(value)
|
19
|
+
return value if value.is_a? Date
|
20
|
+
return nil if value.blank?
|
21
|
+
guess_date_or_time (value.is_a? Time) ? value : cast_to_time(value)
|
22
|
+
end
|
23
|
+
|
24
|
+
def cast_to_time(value)
|
25
|
+
return value if value.is_a? Time
|
26
|
+
time_array = ParseDate.parsedate value
|
27
|
+
time_array[0] ||= 2000; time_array[1] ||= 1; time_array[2] ||= 1;
|
28
|
+
Time.send(Base.default_timezone, *time_array) rescue nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def guess_date_or_time(value)
|
32
|
+
(value.hour == 0 and value.min == 0 and value.sec == 0) ?
|
33
|
+
Date.new(value.year, value.month, value.day) : value
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def modify_types(tp)
|
38
|
+
tp[:primary_key] = "INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) PRIMARY KEY"
|
39
|
+
tp[:integer][:limit] = nil
|
40
|
+
tp[:boolean][:limit] = nil
|
41
|
+
tp[:datetime] = { :name => "DATETIME" }
|
42
|
+
tp[:timestamp] = { :name => "DATETIME" }
|
43
|
+
tp[:time] = { :name => "DATETIME" }
|
44
|
+
tp[:date] = { :name => "DATETIME" }
|
45
|
+
tp
|
46
|
+
end
|
47
|
+
|
48
|
+
def quote(value, column = nil) # :nodoc:
|
49
|
+
case value
|
50
|
+
when String
|
51
|
+
if column && column.type == :binary
|
52
|
+
"'#{quote_string(value).unpack("C*").collect {|v| v.to_s(16)}.join}'"
|
53
|
+
else
|
54
|
+
"'#{quote_string(value)}'"
|
55
|
+
end
|
56
|
+
else super
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def quoted_true
|
61
|
+
'1'
|
62
|
+
end
|
63
|
+
|
64
|
+
def quoted_false
|
65
|
+
'0'
|
66
|
+
end
|
67
|
+
|
68
|
+
def change_column(table_name, column_name, type, options = {}) #:nodoc:
|
69
|
+
execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} #{type_to_sql(type, options[:limit])}"
|
70
|
+
end
|
71
|
+
|
72
|
+
def change_column_default(table_name, column_name, default) #:nodoc:
|
73
|
+
execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET DEFAULT #{quote(default)}"
|
74
|
+
end
|
75
|
+
|
76
|
+
def rename_column(table_name, column_name, new_column_name) #:nodoc:
|
77
|
+
execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} RENAME TO #{new_column_name}"
|
78
|
+
end
|
79
|
+
|
80
|
+
def rename_table(name, new_name)
|
81
|
+
execute "ALTER TABLE #{name} RENAME TO #{new_name}"
|
82
|
+
end
|
83
|
+
|
84
|
+
def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
|
85
|
+
execute(sql, name)
|
86
|
+
table = sql.split(" ", 4)[2]
|
87
|
+
id_value || last_insert_id(table, nil)
|
88
|
+
end
|
89
|
+
|
90
|
+
def last_insert_id(table, sequence_name)
|
91
|
+
Integer(select_value("SELECT IDENTITY() FROM #{table}"))
|
92
|
+
end
|
93
|
+
|
94
|
+
def add_limit_offset!(sql, options) #:nodoc:
|
95
|
+
offset = options[:offset] || 0
|
96
|
+
bef = sql[7..-1]
|
97
|
+
if limit = options[:limit]
|
98
|
+
sql.replace "select limit #{offset} #{limit} #{bef}"
|
99
|
+
elsif offset > 0
|
100
|
+
sql.replace "select limit #{offset} 0 #{bef}"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
module JdbcSpec
|
2
|
+
module Mimer
|
3
|
+
def modify_types(tp)
|
4
|
+
tp[:primary_key] = "INTEGER NOT NULL PRIMARY KEY"
|
5
|
+
tp[:boolean][:limit] = nil
|
6
|
+
tp[:string][:limit] = 255
|
7
|
+
tp[:binary] = {:name => "BINARY VARYING", :limit => 4096}
|
8
|
+
tp[:text] = {:name => "VARCHAR", :limit => 4096}
|
9
|
+
tp[:datetime] = { :name => "TIMESTAMP" }
|
10
|
+
tp[:timestamp] = { :name => "TIMESTAMP" }
|
11
|
+
tp[:time] = { :name => "TIMESTAMP" }
|
12
|
+
tp[:date] = { :name => "TIMESTAMP" }
|
13
|
+
tp
|
14
|
+
end
|
15
|
+
|
16
|
+
def default_sequence_name(table, column) #:nodoc:
|
17
|
+
"#{table}_seq"
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_table(name, options = {}) #:nodoc:
|
21
|
+
super(name, options)
|
22
|
+
execute "CREATE SEQUENCE #{name}_seq" unless options[:id] == false
|
23
|
+
end
|
24
|
+
|
25
|
+
def drop_table(name) #:nodoc:
|
26
|
+
super(name) rescue nil
|
27
|
+
execute "DROP SEQUENCE #{name}_seq" rescue nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def change_column(table_name, column_name, type, options = {}) #:nodoc:
|
31
|
+
execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} #{type_to_sql(type, options[:limit])}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def change_column_default(table_name, column_name, default) #:nodoc:
|
35
|
+
execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET DEFAULT #{quote(default)}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def remove_index(table_name, options = {}) #:nodoc:
|
39
|
+
execute "DROP INDEX #{index_name(table_name, options)}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
|
43
|
+
if pk.nil? # Who called us? What does the sql look like? No idea!
|
44
|
+
execute sql, name
|
45
|
+
elsif id_value # Pre-assigned id
|
46
|
+
log(sql, name) { @connection.execute_insert sql,pk }
|
47
|
+
else # Assume the sql contains a bind-variable for the id
|
48
|
+
id_value = select_one("SELECT NEXT_VALUE OF #{sequence_name} AS val FROM MIMER.ONEROW")['val']
|
49
|
+
log(sql, name) {
|
50
|
+
execute_prepared_insert(sql,id_value)
|
51
|
+
}
|
52
|
+
end
|
53
|
+
id_value
|
54
|
+
end
|
55
|
+
|
56
|
+
def execute_prepared_insert(sql, id)
|
57
|
+
@stmts ||= {}
|
58
|
+
@stmts[sql] ||= @connection.ps(sql)
|
59
|
+
stmt = @stmts[sql]
|
60
|
+
stmt.setLong(1,id)
|
61
|
+
stmt.executeUpdate
|
62
|
+
id
|
63
|
+
end
|
64
|
+
|
65
|
+
def quote(value, column = nil) #:nodoc:
|
66
|
+
if String === value && column && column.type == :binary
|
67
|
+
return "X'#{quote_string(value.unpack("C*").collect {|v| v.to_s(16)}.join)}'"
|
68
|
+
end
|
69
|
+
case value
|
70
|
+
when String : %Q{'#{quote_string(value)}'}
|
71
|
+
when NilClass : 'NULL'
|
72
|
+
when TrueClass : '1'
|
73
|
+
when FalseClass : '0'
|
74
|
+
when Numeric : value.to_s
|
75
|
+
when Date, Time : %Q{TIMESTAMP '#{value.strftime("%Y-%m-%d %H:%M:%S")}'}
|
76
|
+
else %Q{'#{quote_string(value.to_yaml)}'}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def quoted_true
|
81
|
+
'1'
|
82
|
+
end
|
83
|
+
|
84
|
+
def quoted_false
|
85
|
+
'0'
|
86
|
+
end
|
87
|
+
|
88
|
+
def add_limit_offset!(sql, options) # :nodoc:
|
89
|
+
@limit = options[:limit]
|
90
|
+
@offset = options[:offset]
|
91
|
+
end
|
92
|
+
|
93
|
+
def select_all(sql, name = nil)
|
94
|
+
@limit ||= -1
|
95
|
+
@offset ||= 0
|
96
|
+
select(sql, name)[@offset..(@offset+@limit)]
|
97
|
+
ensure
|
98
|
+
@limit = @offset = nil
|
99
|
+
end
|
100
|
+
|
101
|
+
def select_one(sql, name = nil)
|
102
|
+
@offset ||= 0
|
103
|
+
select(sql, name)[@offset]
|
104
|
+
ensure
|
105
|
+
@limit = @offset = nil
|
106
|
+
end
|
107
|
+
|
108
|
+
def execute(sql, name = nil)
|
109
|
+
log_no_bench(sql, name) do
|
110
|
+
if sql =~ /^select/i
|
111
|
+
@limit ||= -1
|
112
|
+
@offset ||= 0
|
113
|
+
@connection.execute_query(sql)[@offset..(@offset+@limit)]
|
114
|
+
else
|
115
|
+
@connection.execute_update(sql)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
ensure
|
119
|
+
@limit = @offset = nil
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|