changeset 839:ad66bd0e5601 beta

moved db migration do db manage script, added my cycles for upgrades
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 11 Dec 2010 14:33:15 +0100
parents 12eb1a018199
children ee6f345736a6
files rhodecode/lib/db_manage.py rhodecode/lib/dbmigrate/__init__.py
diffstat 2 files changed, 75 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/lib/db_manage.py	Sat Dec 11 04:39:13 2010 +0100
+++ b/rhodecode/lib/db_manage.py	Sat Dec 11 14:33:15 2010 +0100
@@ -43,6 +43,9 @@
 
 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 @@
             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 '*'
         """
--- a/rhodecode/lib/dbmigrate/__init__.py	Sat Dec 11 04:39:13 2010 +0100
+++ b/rhodecode/lib/dbmigrate/__init__.py	Sat Dec 11 14:33:15 2010 +0100
@@ -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 @@
 
         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):