All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jsoftware.config.dialect.DefaultDialect Maven / Gradle / Ivy

package org.jsoftware.config.dialect;

import org.jsoftware.config.AbstractPatch;
import org.jsoftware.config.Patch;
import org.jsoftware.config.RollbackPatch;
import org.jsoftware.impl.PatchStatement;
import org.jsoftware.log.LogFactory;

import java.sql.*;

/**
 * Default dialect
 * Works with: MySQL, PostgreSQL, H2
 * @author szalik
 */
public class DefaultDialect implements Dialect {
	private static final long serialVersionUID = 1L;


	public String getDbPatchTableName() {
		return DBPATCH_TABLE_NAME;
	}
	
	public PatchExecutionResult executeStatement(Connection c, PatchStatement ps) {
		PatchExecutionResultImpl result = new PatchExecutionResultImpl(ps);
        Statement stm = null;
		try {
			c.clearWarnings();
			stm = c.createStatement();
			executeSql(stm, ps.getCode(), result);
		} catch (SQLException e) {
			result.setCause(e);
			try { 
				result.setSqlWarning(c.getWarnings());
			} catch (SQLException ex) {
                LogFactory.getInstance().warn("Cannot set warnings.", ex);
            }
		} finally {
            if (stm != null) {
                try {
                    stm.close();
                } catch (SQLException ex2) { /* ignore */ }
            }
        }
        return result;
	}

	private void executeSql(Statement stm, String sql, PatchExecutionResultImpl result) throws SQLException {
		String sqlLC = sql.toLowerCase().trim();
		if (sqlLC.startsWith("insert ") || sqlLC.startsWith("update ") || sqlLC.startsWith("delete ")) {
			int duiCount = stm.executeUpdate(sql);
			result.setDmlCount(duiCount);
			String type = sqlLC.substring(0, sqlLC.indexOf(' ')).toUpperCase();
			result.setDmlType(DML_TYPE.valueOf(type));
		} else {
			stm.execute(sql);
		}
	}

	public void lock(Connection con, long timeout) throws SQLException {
//		ResultSet rs = con.createStatement().executeQuery("SELECT patch_db_date FROM " + DBPATCH_TABLE_NAME + " WHERE patch_name IS NULL");
//		try {
//			if (! rs.next()) {
//				throw new RuntimeException("No empty row in " + DBPATCH_TABLE_NAME + " table.");
//			}
//			if (rs.getTimestamp(1) == null) {
//				PreparedStatement ps = con.prepareStatement("UPDATE " + DBPATCH_TABLE_NAME + " SET patch_db_date = ? WHERE patch_name IS NULL");
//				ps.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
//				ps.execute();
//				ps.close();
//				con.commit();
//			} else {
//				throw new SQLException("Database is locked.");
//			}
//		} finally {
//			rs.close();
//		}
	}

	public void releaseLock(Connection con) throws SQLException {
//		Statement stm = con.createStatement();
//		stm.executeUpdate("UPDATE " + DBPATCH_TABLE_NAME + " SET patch_db_date = NULL WHERE patch_name IS NULL");
//		stm.close();
//		con.commit();
	}

	public void savePatchInfoPrepare(Connection con, Patch patch) throws SQLException {
		PreparedStatement ps;
		ps = con.prepareStatement("SELECT * FROM " + DBPATCH_TABLE_NAME + " WHERE patch_name=? AND patch_db_date IS NULL");
		ps.setString(1, patch.getName());
		ResultSet rs = ps.executeQuery();
		boolean addRow = ! rs.next();
		rs.close();
		ps.close();
		if (addRow) {
			ps = con.prepareStatement("INSERT INTO " + DBPATCH_TABLE_NAME + " (patch_name,patch_date,patch_db_date) VALUES (?,?,NULL)");
			ps.setString(1, patch.getName());
			ps.setTimestamp(2, new java.sql.Timestamp(patch.getFile().lastModified()));
			ps.execute();
			ps.close();
		}
		con.commit();
	}
	
	public void savePatchInfoFinal(Connection con, Patch patch) throws SQLException {
		PreparedStatement ps = con.prepareStatement("UPDATE " + DBPATCH_TABLE_NAME + " SET patch_db_date=? WHERE patch_name=?");
		ps.setTimestamp(1, getNow(con));
		ps.setString(2, patch.getName());
		ps.execute();
		ps.close();
	}

    @Override
    public void removePatchInfo(Connection con, RollbackPatch p) throws SQLException {
        PreparedStatement ps = con.prepareStatement("DELETE FROM " + DBPATCH_TABLE_NAME + " WHERE patch_name=?");
        ps.setString(1, p.getName());
        ps.execute();
        ps.close();
    }

    @Override
    public boolean checkIfPatchIsCommitted(Connection con, AbstractPatch patch) throws SQLException {
        PreparedStatement ps = con.prepareStatement("SELECT * FROM " + DBPATCH_TABLE_NAME + " WHERE patch_name=?");
        ps.setString(1, patch.getName());
        ResultSet rs = ps.executeQuery();
        boolean b = rs.next();
        rs.close();
        ps.close();
        return b;
    }

    public void checkAndCreateStruct(Connection con) throws SQLException {
		con.setAutoCommit(true);
		ResultSet rs = con.getMetaData().getTables(null, null, DBPATCH_TABLE_NAME, null);
		boolean tableFound = rs.next();
		rs.close();
		if (! tableFound) {
			try {
				con.createStatement().execute("CREATE TABLE " + DBPATCH_TABLE_NAME + "(patch_name varchar(128), patch_date TIMESTAMP, patch_db_date TIMESTAMP)");
				insertEmptyRow(con);
			} catch (SQLException e) { /* ignore */ }
		} 
		rs = con.createStatement().executeQuery("SELECT patch_name FROM " + DBPATCH_TABLE_NAME +" WHERE patch_name IS NULL");
		if (! rs.next()) {
			insertEmptyRow(con);
		}
		rs.close();
		con.setAutoCommit(false);
	}

	private void insertEmptyRow(Connection con) throws SQLException {
//		Statement stm = con.createStatement();
//		stm.execute("INSERT INTO " + DBPATCH_TABLE_NAME + "(patch_name, patch_date, patch_db_date) VALUES (NULL, NULL, NULL)");
//		stm.close();
//		con.commit();
	}
	
	public Timestamp getNow(Connection con) throws SQLException {
		ResultSet rs = con.createStatement().executeQuery("SELECT now()");
		rs.next();
		Timestamp ts = rs.getTimestamp(1);
		rs.close();
		return ts;
	}


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy