]> source.dussan.org Git - sonarqube.git/blob
69ae7b08c0463dd528ba2713446e0c78548cdb78
[sonarqube.git] /
1 module ::JdbcSpec
2   module FireBird
3     def self.adapter_selector
4       [/firebird/i, lambda{|cfg,adapt| adapt.extend(::JdbcSpec::FireBird)}]
5     end
6
7     def modify_types(tp)
8       tp[:primary_key] = 'INTEGER NOT NULL PRIMARY KEY'
9       tp[:string][:limit] = 252
10       tp[:integer][:limit] = nil
11       tp
12     end
13     
14     def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) # :nodoc:
15       execute(sql, name)
16       id_value
17     end
18
19     def add_limit_offset!(sql, options) # :nodoc:
20       if options[:limit]
21         limit_string = "FIRST #{options[:limit]}"
22         limit_string << " SKIP #{options[:offset]}" if options[:offset]
23         sql.sub!(/\A(\s*SELECT\s)/i, '\&' + limit_string + ' ')
24       end
25     end
26
27     def prefetch_primary_key?(table_name = nil)
28       true
29     end
30
31     def default_sequence_name(table_name, primary_key) # :nodoc:
32       "#{table_name}_seq"
33     end
34     
35     def next_sequence_value(sequence_name)
36       select_one("SELECT GEN_ID(#{sequence_name}, 1 ) FROM RDB$DATABASE;")["gen_id"]
37     end
38     
39     def create_table(name, options = {}) #:nodoc:
40       super(name, options)
41       execute "CREATE GENERATOR #{name}_seq"
42     end
43
44     def rename_table(name, new_name) #:nodoc:
45       execute "RENAME #{name} TO #{new_name}"
46       execute "UPDATE RDB$GENERATORS SET RDB$GENERATOR_NAME='#{new_name}_seq' WHERE RDB$GENERATOR_NAME='#{name}_seq'" rescue nil
47     end  
48
49     def drop_table(name, options = {}) #:nodoc:
50       super(name)
51       execute "DROP GENERATOR #{name}_seq" rescue nil
52     end
53
54     def change_column(table_name, column_name, type, options = {}) #:nodoc:
55       execute "ALTER TABLE #{table_name} ALTER  #{column_name} TYPE #{type_to_sql(type, options[:limit])}"
56     end
57
58     def rename_column(table_name, column_name, new_column_name)
59       execute "ALTER TABLE #{table_name} ALTER  #{column_name} TO #{new_column_name}"
60     end
61
62     def remove_index(table_name, options) #:nodoc:
63       execute "DROP INDEX #{index_name(table_name, options)}"
64     end
65     
66     def quote(value, column = nil) # :nodoc:
67       return value.quoted_id if value.respond_to?(:quoted_id)
68       
69       if [Time, DateTime].include?(value.class)
70         "CAST('#{value.strftime("%Y-%m-%d %H:%M:%S")}' AS TIMESTAMP)"
71       else
72         if column && column.type == :primary_key
73           return value.to_s
74         end
75         super
76       end
77     end
78
79     def quote_string(string) # :nodoc:
80       string.gsub(/'/, "''")
81     end
82     
83     def quote_column_name(column_name) # :nodoc:
84       %Q("#{ar_to_fb_case(column_name)}")
85     end
86     
87     def quoted_true # :nodoc:
88       quote(1)
89     end
90     
91     def quoted_false # :nodoc:
92       quote(0)
93     end
94
95     private
96     
97     # Maps uppercase Firebird column names to lowercase for ActiveRecord;
98     # mixed-case columns retain their original case.
99     def fb_to_ar_case(column_name)
100       column_name =~ /[[:lower:]]/ ? column_name : column_name.to_s.downcase
101     end
102     
103     # Maps lowercase ActiveRecord column names to uppercase for Fierbird;
104     # mixed-case columns retain their original case.
105     def ar_to_fb_case(column_name)
106       column_name =~ /[[:upper:]]/ ? column_name : column_name.to_s.upcase
107     end
108   end
109 end