Beispiel #1
0
 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();
   }
 }