def upgradeDBSchema(version):
    """Upgrade data base schema to specified version
       UNUSED for now, needs more work
    """
    import os
    import fnmatch
    import MySQLdb
    schemaUpgrade = fnmatch.filter(os.listdir('../sql'), 'update_einsteinDB_schema_*_to_%s.sql' % version)
    try: # only honor the first upgrade to given version
        sqlSchemaUpgrade = open(os.path.join('../sql', schemaUpgrade[0])).read()
        dbCursor         = Status.SQL.cursor(MySQLdb.cursors.DictCursor)
        logMessage('data base schema upgrade starting')
        dbCursor.execute(sqlSchemaUpgrade)
        logMessage('data base schema upgrade complete: %d rows affected' % dbCursor.rowcount)
    except IndexError: # no upgrade found -> fine
        pass
def upgradeEINSTEIN(targetVersion=VERSION, sourceVersion=None, projectIds=None):
    """Perform all defined upgrades to reach the specified version of EINSTEIN"""
    if not sourceVersion: # determine source version
        if projectIds is None: # complete data base upgrade requested
            try:
                sourceVersion = Status.DB.stool.Version['%'].column()[0]
            except KeyError, IndexError: # default version for complete upgrade
                sourceVersion = '1.1'
        else: # default schema version for selected projects
            sourceVersion = '1.1'
        
    if targetVersion == sourceVersion: # no upgrades necessary
        return
    else:
        logMessage('Upgrade to version %s starting' % targetVersion)
    
    if projectIds is not None:
        target = (len(projectIds) == 1) and '1 project' or ('%d projects' % len(projectIds))
    else:
        target = 'data base'
    
    # call all upgrade functions in order of ascending versions and then list order    
    for version in sorted(upgrades.keys()):
        if version > sourceVersion and version <= targetVersion:
            logMessage('Upgrade of %s to version %s starting' % (target, version))
            for upgrade in upgrades[version]:
                logMessage('%s starting' % upgrade.__name__)
                try:
                    upgrade(projectIds)
                except Exception, error: