Class: Cms::Database
- Inherits:
-
Object
- Object
- Cms::Database
- Defined in:
- lib/bcms_content_syncing/database.rb
Overview
Handles management of Cms database related operations.
Constant Summary collapse
- @@db_map =
{}
Class Method Summary collapse
-
.backup(skip_tables = []) ⇒ Object
Back up the database.
-
.restore(filename) ⇒ Object
Restore a backup created by
backup.
Class Method Details
.backup(skip_tables = []) ⇒ Object
Back up the database. This is fully DB and schema agnostic. It serializes all tables to a single YAML file which is timestamped to when the backup occurred. Creates a copy of that file named ‘backup-latest.yml’ file as well, to make syncing easier.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/bcms_content_syncing/database.rb', line 10 def self.backup(skip_tables=[]) STDERR.puts "** backup **" interesting_tables = ActiveRecord::Base.connection.tables.sort - ['sessions'] - skip_tables backup_dir = File.join(RAILS_ROOT, 'db', 'backup') FileUtils.mkdir_p backup_dir file_name = "backup-#{Time.now.strftime('%Y%m%d-%H%M')}.yml" backup_file = File.join(backup_dir, file_name) STDERR.puts "Backing up to #{backup_file}" data = {} interesting_tables.each do |tbl| STDERR.puts " --> #{tbl}" data[tbl] = ActiveRecord::Base.connection.select_all("select * from #{tbl}") end STDERR.puts "Saving to YAML (may take a few minutes)" File.open(backup_file,'w') do |file| YAML.dump data, file end system "cp db/backup/#{file_name} db/backup/backup-latest.yml" STDERR.puts "Backup complete" end |
.restore(filename) ⇒ Object
Restore a backup created by backup. Deletes all data before importing.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/bcms_content_syncing/database.rb', line 38 def self.restore(filename) data = YAML.load(File.read(filename)) STDERR.puts "Restoring data from #{filename}" data.each_key do |table| if table == 'schema_info' ActiveRecord::Base.connection.execute("delete from schema_info") ActiveRecord::Base.connection.execute("insert into schema_info (version) values (#{data[table].first['version']})") else STDERR.puts " Restoring table #{table} (#{data[table].size} records)" # Create a temporary model to talk to the DB eval %Q{ class TempClass < ActiveRecord::Base set_table_name '#{table}' reset_column_information end } TempClass.delete_all data[table].each do |record| r = TempClass.new(record) r['type'] = record['type'] if record.has_key?('type') r.id = record['id'] if record.has_key?('id') r.save end if ActiveRecord::Base.connection.respond_to?(:reset_pk_sequence!) ActiveRecord::Base.connection.reset_pk_sequence!(table) end end end end |