package com.quantum.wizards;

import java.sql.SQLException;

import com.quantum.adapters.DatabaseAdapter;
import com.quantum.model.Bookmark;
import com.quantum.model.Column;
import com.quantum.model.Entity;
import com.quantum.model.NotConnectedException;
import com.quantum.sql.MultiSQLServer;
import com.quantum.sql.SQLResultSetResults;
import com.quantum.sql.SQLResults;
import com.quantum.ui.dialog.SQLExceptionDialog;
import com.quantum.util.connection.ConnectionUtil;

import org.eclipse.jface.wizard.WizardPage;

/**
 * @author BC Holmes
 */
public abstract class BaseSQLPage extends WizardPage implements SQLPage {

    protected SQLResultSetResults.Row row;
	protected SQLResultSetResults results;
	private ConnectionUtil connectionUtil = new ConnectionUtil();

    public BaseSQLPage(String pageName) {
        super(pageName);
    }
    public boolean performFinish() {
		Bookmark bookmark = this.results.getBookmark();
		try {
			bookmark.addQuery(getQueryText());
			SQLResults sqlResults = MultiSQLServer.getInstance().execute(bookmark, 
					this.connectionUtil.getConnection(bookmark, getShell()), getQueryText());
			return sqlResults == null ? false : true;
		} catch (SQLException e) {
			SQLExceptionDialog.openException(getShell(), bookmark, e);
			return false;
		}
	}
    
    protected abstract String getQueryText();
    protected void appendColumn(StringBuffer whereClause, Entity entity, String columnName, DatabaseAdapter adapter, String value) {
        
        if (adapter != null && entity != null && getColumn(entity, columnName) != null) {
            Column column = getColumn(entity, columnName);
        	whereClause.append(adapter.quote(value, column.getType(), column.getTypeName()));
        } else {
        	whereClause.append(value);
        }
    }
    /**
	 * @param entity
	 * @param columnName
	 * @return
	 * @throws NotConnectedException
	 * @throws SQLException
	 */
	protected Column getColumn(Entity entity, String columnName)  {
		try {
			return entity == null ? null : entity.getColumn(columnName);
		} catch (NotConnectedException e) {
			return null;
		} catch (SQLException e) {
			return null;
		}
	}
	public void init(SQLResultSetResults results, SQLResultSetResults.Row row) {
    	this.results = results;
		this.row = row;
    }
}