public void upgradeBaseSchema(Connection conn, int currentVersion) { if (!isLoaded()) { throw new TajoInternalError("Database schema files are not loaded."); } final List<SchemaPatch> candidatePatches = new ArrayList<>(); Statement stmt; for (SchemaPatch patch : this.catalogStore.getPatches()) { if (currentVersion >= patch.getPriorVersion()) { candidatePatches.add(patch); } } Collections.sort(candidatePatches); try { stmt = conn.createStatement(); } catch (SQLException e) { throw new TajoInternalError(e); } for (SchemaPatch patch : candidatePatches) { for (DatabaseObject object : patch.getObjects()) { try { stmt.executeUpdate(object.getSql()); LOG.info(object.getName() + " " + object.getType() + " was created or altered."); } catch (SQLException e) { throw new TajoInternalError(e); } } } CatalogUtil.closeQuietly(stmt); }
protected void mergePatches(List<SchemaPatch> patches) { final List<DatabaseObject> objects = new ArrayList<>(); Collections.sort(patches); for (SchemaPatch patch : patches) { validatePatch(patches, patch); objects.clear(); List<DatabaseObject> tempObjects = new ArrayList<>(); tempObjects.addAll(patch.getObjects()); patch.clearObjects(); patch.addObjects(mergeDatabaseObjects(tempObjects)); targetStore.addPatch(patch); } }
protected void validatePatch(List<SchemaPatch> patches, SchemaPatch testPatch) { if (testPatch.getPriorVersion() > testPatch.getNextVersion()) { throw new TajoInternalError("Prior version cannot proceed to next version of patch."); } for (SchemaPatch patch : patches) { if (testPatch.equals(patch)) { continue; } if (testPatch.getPriorVersion() == patch.getPriorVersion()) { LOG.warn("It has the same prior version (" + testPatch.getPriorVersion() + ") of patch."); if (testPatch.getNextVersion() == patch.getNextVersion()) { throw new TajoInternalError( "Duplicate versions of patch found. It will terminate Catalog Store. "); } } if (testPatch.getNextVersion() == patch.getNextVersion()) { LOG.warn("It has the same next version (" + testPatch.getPriorVersion() + ") of patch."); } } }