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.
@@ -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