clear_primary_key(*tables)
click to toggle source
7: def clear_primary_key(*tables)
8: tables.each{|t| @primary_keys.delete(dataset.send(:input_identifier, t))}
9: end
create_trigger(*args)
click to toggle source
11: def create_trigger(*args)
12: self << create_trigger_sql(*args)
13: end
database_type()
click to toggle source
15: def database_type
16: :firebird
17: end
drop_sequence(name)
click to toggle source
19: def drop_sequence(name)
20: self << drop_sequence_sql(name)
21: end
primary_key(table)
click to toggle source
Return primary key for the given table.
24: def primary_key(table)
25: t = dataset.send(:input_identifier, table)
26: @primary_keys.fetch(t) do
27: pk = fetch("SELECT RDB$FIELD_NAME FROM RDB$INDEX_SEGMENTS NATURAL JOIN RDB$RELATION_CONSTRAINTS WHERE RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' AND RDB$RELATION_NAME = ?", t).single_value
28: @primary_keys[t] = dataset.send(:output_identifier, pk.rstrip) if pk
29: end
30: end
restart_sequence(*args)
click to toggle source
32: def restart_sequence(*args)
33: self << restart_sequence_sql(*args)
34: end
sequences(opts={})
click to toggle source
36: def sequences(opts={})
37: ds = self[:"rdb$generators"].server(opts[:server]).filter(:"rdb$system_flag" => 0).select(:"rdb$generator_name")
38: block_given? ? yield(ds) : ds.map{|r| ds.send(:output_identifier, r[:"rdb$generator_name"])}
39: end
tables(opts={})
click to toggle source
41: def tables(opts={})
42: tables_or_views(0, opts)
43: end
views(opts={})
click to toggle source
45: def views(opts={})
46: tables_or_views(1, opts)
47: end
alter_table_sql(table, op)
click to toggle source
Use Firebird specific syntax for add column
52: def alter_table_sql(table, op)
53: case op[:op]
54: when :add_column
55: "ALTER TABLE #{quote_schema_table(table)} ADD #{column_definition_sql(op)}"
56: when :drop_column
57: "ALTER TABLE #{quote_schema_table(table)} DROP #{column_definition_sql(op)}"
58: when :rename_column
59: "ALTER TABLE #{quote_schema_table(table)} ALTER #{quote_identifier(op[:name])} TO #{quote_identifier(op[:new_name])}"
60: when :set_column_type
61: "ALTER TABLE #{quote_schema_table(table)} ALTER #{quote_identifier(op[:name])} TYPE #{type_literal(op)}"
62: else
63: super(table, op)
64: end
65: end
auto_increment_sql()
click to toggle source
67: def auto_increment_sql()
68: AUTO_INCREMENT
69: end
create_sequence_sql(name, opts={})
click to toggle source
71: def create_sequence_sql(name, opts={})
72: "CREATE SEQUENCE #{quote_identifier(name)}"
73: end
create_table_from_generator(name, generator, options)
click to toggle source
Firebird gets an override because of the
mess of creating a sequence and trigger for auto-incrementing primary keys.
77: def create_table_from_generator(name, generator, options)
78: drop_statement, create_statements = create_table_sql_list(name, generator, options)
79: (execute_ddl(drop_statement) rescue nil) if drop_statement
80: create_statements.each{|sql| execute_ddl(sql)}
81: end
create_table_sql_list(name, generator, options={})
click to toggle source
83: def create_table_sql_list(name, generator, options={})
84: statements = [create_table_sql(name, generator, options)]
85: drop_seq_statement = nil
86: generator.columns.each do |c|
87: if c[:auto_increment]
88: c[:sequence_name] ||= "seq_#{name}_#{c[:name]}"
89: unless c[:create_sequence] == false
90: drop_seq_statement = drop_sequence_sql(c[:sequence_name])
91: statements << create_sequence_sql(c[:sequence_name])
92: statements << restart_sequence_sql(c[:sequence_name], {:restart_position => c[:sequence_start_position]}) if c[:sequence_start_position]
93: end
94: unless c[:create_trigger] == false
95: c[:trigger_name] ||= "BI_#{name}_#{c[:name]}"
96: c[:quoted_name] = quote_identifier(c[:name])
97: trigger_definition = begin if ((new.#{c[:quoted_name]} is null) or (new.#{c[:quoted_name]} = 0)) then begin new.#{c[:quoted_name]} = next value for #{c[:sequence_name]}; end end
98: statements << create_trigger_sql(name, c[:trigger_name], trigger_definition, {:events => [:insert]})
99: end
100: end
101: end
102: [drop_seq_statement, statements]
103: end
create_trigger_sql(table, name, definition, opts={})
click to toggle source
112: def create_trigger_sql(table, name, definition, opts={})
113: events = opts[:events] ? Array(opts[:events]) : [:insert, :update, :delete]
114: whence = opts[:after] ? 'AFTER' : 'BEFORE'
115: inactive = opts[:inactive] ? 'INACTIVE' : 'ACTIVE'
116: position = opts.fetch(:position, 0)
117: sql = CREATE TRIGGER #{quote_identifier(name)} for #{quote_identifier(table)} #{inactive} #{whence} #{events.map{|e| e.to_s.upcase}.join(' OR ')} position #{position} as #{definition}
118: sql
119: end
drop_sequence_sql(name)
click to toggle source
125: def drop_sequence_sql(name)
126: "DROP SEQUENCE #{quote_identifier(name)}"
127: end
remove_cached_schema(table)
click to toggle source
129: def remove_cached_schema(table)
130: clear_primary_key(table)
131: super
132: end
restart_sequence_sql(name, opts={})
click to toggle source
134: def restart_sequence_sql(name, opts={})
135: seq_name = quote_identifier(name)
136: "ALTER SEQUENCE #{seq_name} RESTART WITH #{opts[:restart_position]}"
137: end
tables_or_views(type, opts)
click to toggle source
139: def tables_or_views(type, opts)
140: ds = self[:"rdb$relations"].server(opts[:server]).filter(:"rdb$relation_type" => type, Sequel::SQL::Function.new(:COALESCE, :"rdb$system_flag", 0) => 0).select(:"rdb$relation_name")
141: ds.map{|r| ds.send(:output_identifier, r[:"rdb$relation_name"].rstrip)}
142: end
type_literal_generic_string(column)
click to toggle source
144: def type_literal_generic_string(column)
145: column[:text] ? :"BLOB SUB_TYPE TEXT" : super
146: end