package com.jbidwatcher; import com.jbidwatcher.util.db.Database; import com.jbidwatcher.util.db.Table; import com.jbidwatcher.util.StringTools; import com.jbidwatcher.util.Record; import com.jbidwatcher.util.HashBacked; import com.jbidwatcher.util.config.JConfig; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.text.NumberFormat; /** * Created by IntelliJ IDEA. * User: Morgan * Date: Jun 24, 2007 * Time: 5:32:20 AM * * Centralize all code to do upgrading-related operations in this class. */ public class Upgrader { public static void upgrade() throws SQLException, IllegalAccessException, InstantiationException, ClassNotFoundException { Database db = new Database(null); if(dbMake(db)) { db.commit(); db.shutdown(); db = dbMigrate(); } db.commit(); db.shutdown(); } private static Database dbMigrate() throws IllegalAccessException, SQLException, ClassNotFoundException, InstantiationException { Table schemaInfo = new Table("schema_info"); List<Record> info = schemaInfo.findAll(); if(info != null) { Record first = info.get(0); HashBacked record = new HashBacked(first); int version = record.getInteger("version", -1); if(version != -1) { int last_version = version; version++; NumberFormat nf = NumberFormat.getIntegerInstance(); nf.setMinimumIntegerDigits(3); Statement s = schemaInfo.getDB().getStatement(); while(runFile(schemaInfo.getDB(), s, "/db/" + nf.format(version) + ".sql")) { record.setInteger("version", version); schemaInfo.updateMap("schema_info", "version", Integer.toString(last_version), record.getBacking()); last_version = version; version++; } } } return schemaInfo.getDB(); } private static boolean tableExists(Statement s, String tableName) throws SQLException { ResultSet rs = s.getConnection().getMetaData().getTables(null, null, tableName, null); boolean result = rs.next(); rs.close(); return result; } private static boolean dbMake(Database db) { try { /* Creating a statement lets us issue commands against the connection. */ Statement mS = db.getStatement(); boolean schema_info_exists = tableExists(mS, "schema_info"); if(!schema_info_exists) schema_info_exists = tableExists(mS, "SCHEMA_INFO"); if(!schema_info_exists) { runFile(db, mS, "/jbidwatcher.sql"); JConfig.setConfiguration("jbidwatcher.created_db", "true"); } else { JConfig.log().logDebug("Auction information database already exists."); } } catch (SQLException se) { System.err.println(se); return false; } return true; } private static boolean runFile(Database db, Statement mS, String filename) throws SQLException { String sql = StringTools.cat(JConfig.getResource(filename)); if(sql != null && sql.length() != 0) { String[] statements = sql.split("(?m)^$"); for (String statement : statements) { db.executeCanonicalizedSQL(mS, statement); } JConfig.log().logDebug("Executed " + filename + "."); JConfig.log().logDebug("Created database and various tables."); return true; } else { return false; } } }