StatementDetails.java

/*
 * Copyright 2021 Gregory Graham.
 *
 * Commercial licenses are available, please contact info@gregs.co.nz for details.
 * 
 * This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. 
 * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/4.0/ 
 * or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
 * 
 * You are free to:
 *     Share - copy and redistribute the material in any medium or format
 *     Adapt - remix, transform, and build upon the material
 * 
 *     The licensor cannot revoke these freedoms as long as you follow the license terms.               
 *     Under the following terms:
 *                 
 *         Attribution - 
 *             You must give appropriate credit, provide a link to the license, and indicate if changes were made. 
 *             You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
 *         NonCommercial - 
 *             You may not use the material for commercial purposes.
 *         ShareAlike - 
 *             If you remix, transform, or build upon the material, 
 *             you must distribute your contributions under the same license as the original.
 *         No additional restrictions - 
 *             You may not apply legal terms or technological measures that legally restrict others from doing anything the 
 *             license permits.
 * 
 * Check the Creative Commons website for any details, legalese, and updates.
 */
package nz.co.gregs.dbvolution.internal.query;

import java.sql.SQLException;
import java.sql.Statement;
import nz.co.gregs.dbvolution.databases.DBStatement;
import nz.co.gregs.dbvolution.databases.QueryIntention;
import nz.co.gregs.dbvolution.utility.StringCheck;

/**
 *
 * @author gregorygraham
 */
public class StatementDetails {

	private final String sql;
	private Exception exception;
	private QueryIntention intention;

	private String label = "Unlabelled SQL";
	private boolean ignoreExceptions = false;
	private boolean withGeneratedKeys = false;
	private String namedPKColumn;
	private DBStatement activeStatement;
	private Long timeout;

	public StatementDetails(String label, QueryIntention intent, String sql, DBStatement statement) {
		this(label, intent, sql, null, false, false, "", statement);
	}

	public StatementDetails copy() {
		return new StatementDetails(label, intention, sql, exception, withGeneratedKeys, ignoreExceptions, namedPKColumn, activeStatement);
	}

	public StatementDetails(String label, QueryIntention intent, String sql, Exception except, boolean generatedKeys, boolean ignoreExceptions, String pkColumn, DBStatement statement) {
		this.label = label;
		this.sql = sql;
		this.intention = intent;
		this.exception = except;
		this.withGeneratedKeys = generatedKeys;
		this.ignoreExceptions = ignoreExceptions;
		this.namedPKColumn = pkColumn;
		this.activeStatement = statement;
	}

	public String getSql() {
		return sql;
	}

	public Exception getException() {
		return exception;
	}

	public QueryIntention getIntention() {
		return intention;
	}

	public String getLabel() {
		return label;
	}

	public StatementDetails withLabel(String label) {
		this.label = label;
		return this;
	}

	public boolean isIgnoreExceptions() {
		return ignoreExceptions;
	}

	public final void setIgnoreExceptions(boolean ignoreExceptions) {
		this.ignoreExceptions = ignoreExceptions;
	}

	public boolean requiresGeneratedKeys() {
		return withGeneratedKeys;
	}

	public StatementDetails withGeneratedKeys() {
		this.withGeneratedKeys = true;
		return this;
	}

	/**
	 * Calls the appropriate execute method on the Statement and returns the
	 * boolean result.
	 *
	 * @param stmt the statement on which to execute this SQL command
	 * @throws SQLException database errors are propagated
	 */
	public void execute(Statement stmt) throws SQLException {
		if (StringCheck.isNotEmptyNorNull(namedPKColumn)) {
			stmt.execute(sql, new String[]{namedPKColumn});
		} else if (requiresGeneratedKeys()) {
			stmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
		} else {
			stmt.execute(sql);
		}
	}

	public StatementDetails withException(SQLException exp2) {
		this.exception = exp2;
		return this;
	}

	public StatementDetails withNamedPKColumn(String primaryKeyForRetrievingGeneratedKeys) {
		namedPKColumn = primaryKeyForRetrievingGeneratedKeys;
		return this;
	}

	public StatementDetails withIntention(QueryIntention queryIntention) {
		this.intention = queryIntention;
		return this;
	}

	public DBStatement getDBStatement() {
		return activeStatement;
	}

	public void setDBStatement(DBStatement statement) {
		this.activeStatement = statement;
	}

	public void setTimeout(Long timeoutTime) {
		timeout = timeoutTime;
	}

	public Long getTimeout() {
		return timeout;
	}

}