From acf0c19fa96302158603d21ed4aa66a628e82651 Mon Sep 17 00:00:00 2001 From: broquemonsieur Date: Thu, 21 Dec 2023 02:23:38 -0800 Subject: [PATCH] Add backup creation --- docker/init-invidious-db.sh | 2 ++ src/invidious/database/migrator.cr | 39 +++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/docker/init-invidious-db.sh b/docker/init-invidious-db.sh index 22b4cc5f..afdc001e 100755 --- a/docker/init-invidious-db.sh +++ b/docker/init-invidious-db.sh @@ -1,6 +1,8 @@ #!/bin/bash set -eou pipefail +psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -c "CREATE SCHEMA IF NOT EXISTS backup" + psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < config/sql/channels.sql psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < config/sql/videos.sql psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < config/sql/channel_videos.sql diff --git a/src/invidious/database/migrator.cr b/src/invidious/database/migrator.cr index 660c3203..53260d3f 100644 --- a/src/invidious/database/migrator.cr +++ b/src/invidious/database/migrator.cr @@ -10,10 +10,18 @@ class Invidious::Database::Migrator versions = load_versions ran_migration = false + backed_up = false load_migrations.sort_by(&.version) .each do |migration| next if versions.includes?(migration.version) + + if !backed_up + puts "New migration(s) found: creating database backup" + back_up_database + backed_up = true + end + puts "Running migration: #{migration.class.name}" migration.migrate ran_migration = true @@ -46,4 +54,33 @@ class Invidious::Database::Migrator ) SQL end -end + + private def back_up_database + table_names_request = <<-SQL + SELECT tablename FROM pg_catalog.pg_tables + WHERE schemaname = 'public' + SQL + + table_names = @db.query_all(table_names_request, as: String) + + table_names.try &.each do |name| + copy_table(name) + end + end + + private def copy_table(table_name : String) + @db.exec <<-SQL + CREATE TABLE IF NOT EXISTS backup.#{table_name} ( + id bigserial PRIMARY KEY + ) + SQL + + @db.exec("DROP TABLE backup.#{table_name}") + + @db.exec <<-SQL + SELECT * INTO backup.#{table_name} + FROM public.#{table_name} + SQL + end + +end \ No newline at end of file