diff options
author | Jacob Vosmaer <contact@jacobvosmaer.nl> | 2015-09-18 16:33:38 +0200 |
---|---|---|
committer | Jacob Vosmaer <contact@jacobvosmaer.nl> | 2015-09-18 16:57:33 +0200 |
commit | b9bbad5298e2d50bb424dad2f91a1ab75a36c687 (patch) | |
tree | f8671b2a21adb622d1f9e62f52e821c85b10d90b /lib/backup | |
parent | bf1e976d918bc343a0739e05c6f62c76f4035ba2 (diff) | |
download | gitlab-ci-b9bbad5298e2d50bb424dad2f91a1ab75a36c687.tar.gz |
Integrate mysql-to-postgres conversion
Diffstat (limited to 'lib/backup')
-rw-r--r-- | lib/backup/database.rb | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/lib/backup/database.rb b/lib/backup/database.rb index e63dcb8..3d09c8c 100644 --- a/lib/backup/database.rb +++ b/lib/backup/database.rb @@ -1,4 +1,5 @@ require 'yaml' +require 'open3' module Backup class Database @@ -17,7 +18,7 @@ module Backup FileUtils.mkdir_p(@db_dir) unless Dir.exists?(@db_dir) end - def dump + def dump(mysql_to_postgresql=false) FileUtils.rm_f(db_file_name) compress_rd, compress_wr = IO.pipe compress_pid = spawn(*%W(gzip -c), in: compress_rd, out: [db_file_name, 'w', 0600]) @@ -26,7 +27,9 @@ module Backup dump_pid = case config["adapter"] when /^mysql/ then $progress.print "Dumping MySQL database #{config['database']} ... " - spawn('mysqldump', *mysql_args, config['database'], *TABLES, out: compress_wr) + args = mysql_args + args << '--compatible=postgresql' if mysql_to_postgresql + spawn('mysqldump', *args, config['database'], *TABLES, out: compress_wr) when "postgresql" then $progress.print "Dumping PostgreSQL database #{config['database']} ... " pg_env @@ -38,6 +41,42 @@ module Backup report_success(success) abort 'Backup failed' unless success + convert_to_postgresql if mysql_to_postgresql + end + + def convert_to_postgresql + mysql_dump_gz = db_file_name + '.mysql' + psql_dump_gz = db_file_name + '.psql' + drop_indexes_sql = File.join(db_dir, 'drop_indexes.sql') + + File.rename(db_file_name, mysql_dump_gz) + + $progress.print "Converting MySQL database dump to Postgres ... " + statuses = Open3.pipeline( + %W(gzip -cd #{mysql_dump_gz}), + %W(python lib/support/mysql-postgresql-converter/db_converter.py - - #{drop_indexes_sql}), + %W(gzip -c), + out: [psql_dump_gz, 'w', 0600] + ) + + if !statuses.compact.all?(&:success?) + abort "mysql-to-postgresql-converter failed" + end + $progress.puts '[DONE]'.green + + $progress.print "Splicing in 'DROP INDEX' statements ... " + statuses = Open3.pipeline( + %W(lib/support/mysql-postgresql-converter/splice_drop_indexes #{psql_dump_gz} #{drop_indexes_sql}), + %W(gzip -c), + out: [db_file_name, 'w', 0600] + ) + if !statuses.compact.all?(&:success?) + abort "Failed to splice in 'DROP INDEXES' statements" + end + + $progress.puts '[DONE]'.green + ensure + FileUtils.rm_f([mysql_dump_gz, psql_dump_gz, drop_indexes_sql]) end def restore |