public void upgrade(InformationCallback stdout) throws PEException { DBHelper helper = new DBHelper(connectProperties); String driver = DBHelper.loadDriver(connectProperties.getProperty(DBHelper.CONN_DRIVER_CLASS)); DBType dbType = DBType.fromDriverClass(driver); DBNative dbn = DBNative.DBNativeFactory.newInstance(dbType); helper.connect(); try { CatalogSchemaVersion latest = CatalogVersions.getCurrentVersion(); CatalogSchemaVersion current = CatalogSchemaVersion.getPersistentVersion(helper); CatalogVersionNumber oldestSupported = CatalogVersions.getOldestUpgradeSupported(); if (current.getSchemaVersion() < oldestSupported.getCatalogVersion().getSchemaVersion()) throw new PEException( "No upgrade available for version " + current.getSchemaVersion() + ": please dump and load"); List<CatalogVersion> versionHistory = CatalogVersions.getVersionHistory(); int currentlyAt = -1; for (int i = 0; i < versionHistory.size(); i++) { if (versionHistory.get(i).getSchemaVersion() == current.getSchemaVersion()) { currentlyAt = i; break; } } if (currentlyAt == -1) throw new PEException( "No known upgrade for catalog schema version " + current.getSchemaVersion()); // keep track of whether an info schema upgrade is needed. if so we will only do it at the // end. boolean requiresInfoSchemaUpgrade = false; int firstUpgrade = currentlyAt + 1; for (int i = firstUpgrade; i < versionHistory.size(); i++) { CatalogVersion cv = versionHistory.get(i); if (cv.hasInfoSchemaUpgrade()) requiresInfoSchemaUpgrade = true; if (cv.getSchemaVersion() == latest.getSchemaVersion()) upgrade(helper, cv, latest, (requiresInfoSchemaUpgrade ? dbn : null), stdout); else upgrade( helper, cv, new CatalogSchemaVersion(cv.getSchemaVersion(), "via upgrade", "current"), null, stdout); } } finally { helper.disconnect(); } }
private void upgrade( DBHelper helper, CatalogVersion cv, CatalogSchemaVersion finalVersion, DBNative dbn, InformationCallback stdout) throws PEException { try { helper.executeQuery("update pe_version set state = 'upgrading'"); cv.upgrade(helper, stdout); if (dbn != null) upgradeInfoSchema(helper, dbn); helper.executeQuery("delete from pe_version"); helper.executeQuery(finalVersion.getInsertCommand()); } catch (SQLException sqle) { throw new PEException("Unable to upgrade to version " + cv.getSchemaVersion(), sqle); } }