Skip to content

Instantly share code, notes, and snippets.

@elbosso
Created December 31, 2017 19:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save elbosso/ea1f905629678ed14bf6790c260b167e to your computer and use it in GitHub Desktop.
Save elbosso/ea1f905629678ed14bf6790c260b167e to your computer and use it in GitHub Desktop.
This is a class that tries to update a data model in a relational (HSQL) database. The caller has to provide a resource name base that is then completed following a name schema: The basename plus ".sql" is the initial script for settign up the schema in version 0. all other files are named basename plus "_" plus version number plus ".sql". They …
package de.elbosso.db.domains.modelmgmt;
//This is by no means production-ready code!
/*Copyright (c) 2012-2018.
Juergen Key. Alle Rechte vorbehalten.
Weiterverbreitung und Verwendung in nichtkompilierter oder kompilierter Form,
mit oder ohne Veraenderung, sind unter den folgenden Bedingungen zulaessig:
1. Weiterverbreitete nichtkompilierte Exemplare muessen das obige Copyright,
die Liste der Bedingungen und den folgenden Haftungsausschluss im Quelltext
enthalten.
2. Weiterverbreitete kompilierte Exemplare muessen das obige Copyright,
die Liste der Bedingungen und den folgenden Haftungsausschluss in der
Dokumentation und/oder anderen Materialien, die mit dem Exemplar verbreitet
werden, enthalten.
3. Weder der Name des Autors noch die Namen der Beitragsleistenden
duerfen zum Kennzeichnen oder Bewerben von Produkten, die von dieser Software
abgeleitet wurden, ohne spezielle vorherige schriftliche Genehmigung verwendet
werden.
DIESE SOFTWARE WIRD VOM AUTOR UND DEN BEITRAGSLEISTENDEN OHNE
JEGLICHE SPEZIELLE ODER IMPLIZIERTE GARANTIEN ZUR VERFUEGUNG GESTELLT, DIE
UNTER ANDEREM EINSCHLIESSEN: DIE IMPLIZIERTE GARANTIE DER VERWENDBARKEIT DER
SOFTWARE FUER EINEN BESTIMMTEN ZWECK. AUF KEINEN FALL IST DER AUTOR
ODER DIE BEITRAGSLEISTENDEN FUER IRGENDWELCHE DIREKTEN, INDIREKTEN,
ZUFAELLIGEN, SPEZIELLEN, BEISPIELHAFTEN ODER FOLGENDEN SCHAEDEN (UNTER ANDEREM
VERSCHAFFEN VON ERSATZGUETERN ODER -DIENSTLEISTUNGEN; EINSCHRAENKUNG DER
NUTZUNGSFAEHIGKEIT; VERLUST VON NUTZUNGSFAEHIGKEIT; DATEN; PROFIT ODER
GESCHAEFTSUNTERBRECHUNG), WIE AUCH IMMER VERURSACHT UND UNTER WELCHER
VERPFLICHTUNG AUCH IMMER, OB IN VERTRAG, STRIKTER VERPFLICHTUNG ODER
UNERLAUBTE HANDLUNG (INKLUSIVE FAHRLAESSIGKEIT) VERANTWORTLICH, AUF WELCHEM
WEG SIE AUCH IMMER DURCH DIE BENUTZUNG DIESER SOFTWARE ENTSTANDEN SIND, SOGAR,
WENN SIE AUF DIE MOEGLICHKEIT EINES SOLCHEN SCHADENS HINGEWIESEN WORDEN SIND.
*/
public class Utilities extends java.lang.Object
{
private final static org.apache.log4j.Logger CLASS_LOGGER = org.apache.log4j.Logger.getLogger(Utilities.class);
private static final java.lang.String queryVersionStatement="SELECT version FROM MODELMGMTVERSION";
private static final java.lang.String createVersionTableStatement="CREATE TABLE MODELMGMTVERSION ( version numeric NOT NULL, PRIMARY KEY ( version ));INSERT INTO MODELMGMTVERSION (version) VALUES (0);";
private static final java.lang.String updateVersionStatement="UPDATE MODELMGMTVERSION set version=?";
private Utilities()
{
super();
}
public static void bootstrap(java.sql.Connection dbConnection,java.lang.String baseName) throws java.sql.SQLException
{
if (CLASS_LOGGER.isTraceEnabled()) CLASS_LOGGER.trace(baseName);
java.sql.Statement stmt=dbConnection.createStatement();
java.sql.PreparedStatement pstmt=null;
java.sql.ResultSet rs=null;
int currentVersion=-1;
try
{
pstmt=dbConnection.prepareStatement(queryVersionStatement);
rs=pstmt.executeQuery();
if(rs.next())
currentVersion=rs.getInt(1);
}
catch(java.sql.SQLException exp)
{
}
finally
{
if(rs!=null)
rs.close();
if(pstmt!=null)
pstmt.close();
}
if (CLASS_LOGGER.isTraceEnabled()) CLASS_LOGGER.trace("currentVersion: "+currentVersion);
if(currentVersion<0)
{
pstmt=dbConnection.prepareStatement(createVersionTableStatement);
pstmt.executeUpdate();
pstmt.close();
if (CLASS_LOGGER.isTraceEnabled()) CLASS_LOGGER.trace("resourceName: "+(baseName+".sql"));
java.net.URL url=de.netsysit.util.ResourceLoader.getResource(baseName+".sql");
if (CLASS_LOGGER.isTraceEnabled()) CLASS_LOGGER.trace("url: "+url);
if(url!=null)
{
java.io.InputStream is=null;
try
{
is=url.openStream();
java.lang.String ddlScript=de.elbosso.util.Utilities.readIntoString(is);
pstmt=dbConnection.prepareStatement(ddlScript);
pstmt.execute();
currentVersion++;
}
catch(java.io.IOException exp)
{
throw new java.sql.SQLException(exp.getMessage(),exp);
}
finally
{
if(is!=null)
{
try{is.close();}catch(java.io.IOException exp){}
}
pstmt.close();
}
}
}
int newerVersionNumber=currentVersion+1;
if (CLASS_LOGGER.isTraceEnabled()) CLASS_LOGGER.trace("resourceName: "+(baseName+"_"+(newerVersionNumber)+".sql"));
java.net.URL url=de.netsysit.util.ResourceLoader.getResource(baseName+"_"+(newerVersionNumber)+".sql");
if (CLASS_LOGGER.isTraceEnabled()) CLASS_LOGGER.trace("url: "+url);
while(url!=null)
{
java.io.InputStream is=null;
try
{
is=url.openStream();
java.lang.String ddlScript=de.elbosso.util.Utilities.readIntoString(is);
pstmt=dbConnection.prepareStatement(ddlScript);
pstmt.execute();
currentVersion++;
}
catch(java.io.IOException exp)
{
throw new java.sql.SQLException(exp.getMessage(),exp);
}
finally
{
if(is!=null)
{
try{is.close();}catch(java.io.IOException exp){}
}
pstmt.close();
}
++newerVersionNumber;
if (CLASS_LOGGER.isTraceEnabled()) CLASS_LOGGER.trace("resourceName: "+(baseName+"_"+(newerVersionNumber)+".sql"));
url=de.netsysit.util.ResourceLoader.getResource(baseName+"_"+(newerVersionNumber)+".sql");
if (CLASS_LOGGER.isTraceEnabled()) CLASS_LOGGER.trace("url: "+url);
}
pstmt=dbConnection.prepareStatement(updateVersionStatement);
pstmt.setInt(1,newerVersionNumber-1);
pstmt.executeUpdate();
pstmt.close();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment