require "./database" module Guff class DatabaseUpdater SQL = { get_version: " SELECT value FROM metadata WHERE name = 'version' ", set_version_delete: " DELETE FROM metadata WHERE name = 'version' ", set_version_insert: " INSERT INTO metadata(name, value) VALUES ('version', ?) ", } def self.run(path, config) new(path, config).run end def initialize( @path : String, @config : Config ) @db = Database.new(@path) end def run # get version from database db_version = @db.table_exists?("metadata") ? get_version : 0 app_version = MIGRATIONS.size - 1 if db_version < app_version puts "starting db migration (db = %d, app = %d)" % [ db_version, app_version ] (db_version + 1).upto(app_version) do |v| migrate_to(v) end end end private def migrate_to(version) # map version number to migration id m = MIGRATIONS[version] puts " * migration: %s" % [m[:id]] @db.transaction do # exec queries (m[:sql] as Array(String)).each do |sql| @db.query(sql) end # update database version set_version(version) end end private def get_version (@db.one(SQL[:get_version]) || 0).to_i end private def set_version(version) @db.query(SQL[:set_version_delete]) @db.query(SQL[:set_version_insert], [version.to_s]) end end end