Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions lib/fx/schema_dumper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,16 @@ def functions(stream)
dumpable_functions_in_database = Fx.database.functions

dumpable_functions_in_database.each do |function|
stream.puts
stream.puts(function.to_schema)
end

stream.puts if dumpable_functions_in_database.any?
end

def triggers(stream)
dumpable_triggers_in_database = Fx.database.triggers

if dumpable_triggers_in_database.any?
stream.puts
end

dumpable_triggers_in_database.each do |trigger|
stream.puts
stream.puts(trigger.to_schema)
end
end
Expand Down
58 changes: 58 additions & 0 deletions spec/fx/schema_dumper_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,64 @@
connection.schema_search_path = "public"
end

it "puts a blank line before each function and trigger" do
connection.create_table :users do |t|
t.string :name
t.string :upper_name
t.string :down_name
end
Fx.database.create_function <<~SQL
CREATE OR REPLACE FUNCTION uppercase_users_name()
RETURNS trigger AS $$
BEGIN
NEW.upper_name = UPPER(NEW.name);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
SQL
sql_definition = <<~SQL
CREATE TRIGGER uppercase_users_name
BEFORE INSERT ON users
FOR EACH ROW
EXECUTE FUNCTION uppercase_users_name();
SQL
connection.create_trigger(
:uppercase_users_name,
sql_definition: sql_definition
)
Fx.database.create_function <<~SQL
CREATE OR REPLACE FUNCTION downcase_users_name()
RETURNS trigger AS $$
BEGIN
NEW.down_name = LOWER(NEW.name);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
SQL
sql_definition = <<~SQL
CREATE TRIGGER downcase_users_name
BEFORE INSERT ON users
FOR EACH ROW
EXECUTE FUNCTION downcase_users_name();
SQL
connection.create_trigger(
:downcase_users_name,
sql_definition: sql_definition
)
stream = StringIO.new
output = stream.string

dump(connection: connection, stream: stream)

pattern = /(?<delimiter>end|SQL)\n\n (?<statement>create_function|create_trigger)/
# a blank line between:
# - the table and the uppercase_users_name function,
# - the uppercase_users_name function and the downcase_users_name function,
# - the downcase_users_name function and the uppercase_users_name trigger,
# - the uppercase_users_name trigger and the downcase_users_name trigger,
expect(output.scan(pattern).size).to eq(4)
end

def dump(connection:, stream:)
if Rails.version >= "7.2"
ActiveRecord::SchemaDumper.dump(connection.pool, stream)
Expand Down