view src/nabble/model/DbUpdater.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line source

package nabble.model;

import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fschmidt.db.DbDatabase;


final class DbUpdater {
	private static final Logger logger = LoggerFactory.getLogger(DbUpdater.class);

	final DbDatabase db;
	final String schema;
	private int dbVersion;
	Connection con;
	Statement stmt;

	DbUpdater(DbDatabase db,String schema) {
		this.db = db;
		this.schema = schema;
		dbVersion = databaseVersion();
	}

	int databaseVersion() {
		return databaseVersion(db,schema);
	}

	static int databaseVersion(DbDatabase db,String schema) {
		try {
			Connection con = db.getConnection();
			try {
				Statement stmt = con.createStatement();
				ResultSet rs = stmt.executeQuery(
					"select version from "+schema+".version"
				);
				rs.next();
				int dbVersion = rs.getInt("version");
				stmt.close();
				return dbVersion;
			} finally {
				con.close();
			}
		} catch(SQLException e) {
			throw new RuntimeException(e);
		}
	}

	int dbVersion() {
		return dbVersion;
	}

	void begin()
		throws SQLException
	{
		con = db.getConnection();
		con.setAutoCommit(false);
		stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE);
		logger.error(schema+" step "+dbVersion);
	}

	void commit()
		throws SQLException
	{
		stmt.executeUpdate(
			"update "+schema+".version set version=" + (++dbVersion)
		);
		stmt.close();
		con.commit();
		con.close();
		con = null;
	}

	void exec(String sql)
		throws SQLException
	{
		if( sql != null ) {
			if( sql.trim().toLowerCase().startsWith("select ") ) {
				stmt.executeQuery(sql);
			} else {
				stmt.executeUpdate(sql);
			}
		}
	}

	void execStep(String sql)
		throws SQLException
	{
		begin();
		exec(sql);
		commit();
	}

	void close() {
		if( con != null ) {
			try {
				con.close();
			} catch(SQLException e) {
				logger.error(schema,e);
			}
			con = null;
		}
	}

}