# HG changeset patch # User Marcin Kuzminski # Date 2010-12-11 13:33:15 # Node ID ad66bd0e560122bd462c6ec8da0832e4f8f53b0b # Parent 12eb1a01819992a30ae3c590bdbaab2f5b1b3102 moved db migration do db manage script, added my cycles for upgrades diff --git a/rhodecode/lib/db_manage.py b/rhodecode/lib/db_manage.py --- a/rhodecode/lib/db_manage.py +++ b/rhodecode/lib/db_manage.py @@ -43,6 +43,9 @@ from rhodecode.model.db import User, Per from sqlalchemy.engine import create_engine +from rhodecode.lib.dbmigrate.migrate.versioning import api +from rhodecode.lib.dbmigrate.migrate.exceptions import \ + DatabaseNotControlledError log = logging.getLogger(__name__) @@ -101,6 +104,76 @@ class DbManage(object): raise log.info('db version set to: %s', __dbversion__) + + def upgrade(self): + """Upgrades given database schema to given revision following + all needed steps, + + :param revision: revision to upgrade to + """ + upgrade = ask_ok('You are about to perform database upgrade, make ' + 'sure You backed up your database before. ' + 'Continue ? [y/n]') + if not upgrade: + sys.exit('Nothing done') + + repository_path = 'rhodecode/lib/dbmigrate' + db_uri = self.dburi + + try: + curr_version = api.db_version(db_uri, repository_path) + msg = ('Found current database under version' + ' control with version %s' % curr_version) + + except (RuntimeError, DatabaseNotControlledError), e: + curr_version = 1 + msg = ('Current database is not under version control. Setting' + ' as version %s' % curr_version) + api.version_control(db_uri, repository_path, curr_version) + + print (msg) + + if curr_version == __dbversion__: + sys.exit('This database is already at the newest version') + + #====================================================================== + # UPGRADE STEPS + #====================================================================== + class UpgradeSteps(object): + + def __init__(self, klass): + self.klass = klass + + def step_0(self): + #step 0 is the schema upgrade, and than follow proper upgrades + print ('attempting to do database upgrade to version %s' \ + % __dbversion__) + api.upgrade(db_uri, repository_path, __dbversion__) + print ('Schema upgrade completed') + + def step_1(self): + pass + + def step_2(self): + print ('Patching repo paths for newer version of RhodeCode') + self.klass.fix_repo_paths() + + print ('Patching default user of RhodeCode') + self.klass.fix_default_user() + + log.info('Changing ui settings') + self.klass.create_ui_settings() + + + upgrade_steps = [0] + range(curr_version + 1, __dbversion__ + 1) + + #CALL THE PROPER ORDER OF STEPS TO PERFORM FULL UPGRADE + for step in upgrade_steps: + print ('performing upgrade step %s' % step) + callable = getattr(UpgradeSteps(self), 'step_%s' % step)() + + + def fix_repo_paths(self): """Fixes a old rhodecode version path into new one without a '*' """ diff --git a/rhodecode/lib/dbmigrate/__init__.py b/rhodecode/lib/dbmigrate/__init__.py --- a/rhodecode/lib/dbmigrate/__init__.py +++ b/rhodecode/lib/dbmigrate/__init__.py @@ -28,10 +28,7 @@ import logging from sqlalchemy import engine_from_config -from rhodecode import __dbversion__ -from rhodecode.lib.dbmigrate.migrate.versioning import api -from rhodecode.lib.dbmigrate.migrate.exceptions import \ - DatabaseNotControlledError + from rhodecode.lib.utils import BasePasterCommand, Command, add_cache from rhodecode.lib.db_manage import DbManage @@ -55,45 +52,13 @@ class UpgradeDb(BasePasterCommand): add_cache(config) - - - repository_path = 'rhodecode/lib/dbmigrate' db_uri = config['sqlalchemy.db1.url'] - try: - curr_version = api.db_version(db_uri, repository_path) - msg = ('Found current database under version' - ' control with version %s' % curr_version) - - except (RuntimeError, DatabaseNotControlledError), e: - curr_version = 1 - msg = ('Current database is not under version control setting' - ' as version %s' % curr_version) - api.version_control(db_uri, repository_path, curr_version) - - self.notify_msg(msg) - - #now we have our dbversion we can do upgrade - self.notify_msg('attempting to do database upgrade to version %s' \ - % __dbversion__) - - api.upgrade(db_uri, repository_path, __dbversion__) - self.notify_msg('Schema upgrade completed') - - #we need to make now some extra operations into database - self.notify_msg('Propagating database updates') - dbmanage = DbManage(log_sql=True, dbconf=db_uri, root=config['here'], tests=False) - self.notify_msg('Patching repo paths for newer version of RhodeCode') - dbmanage.fix_repo_paths() + dbmanage.upgrade() - self.notify_msg('Patching default user of RhodeCode') - dbmanage.fix_default_user() - - self.notify_msg('Changing ui settings') - dbmanage.create_ui_settings() def update_parser(self):