package com.taobao.tddl.repo.mysql.spi;
import java.sql.SQLException;
import com.taobao.tddl.executor.common.ExecutionContext;
import com.taobao.tddl.executor.cursor.ICursorMeta;
import com.taobao.tddl.executor.cursor.ISchematicCursor;
import com.taobao.tddl.executor.record.CloneableRecord;
import com.taobao.tddl.executor.rowset.IRowSet;
import com.taobao.tddl.executor.spi.ITable;
import com.taobao.tddl.optimizer.config.table.IndexMeta;
import com.taobao.tddl.optimizer.core.plan.IPut;
/**
* 集中所有jdbc操作到这个Handler. 这样才能支持同步化和异步化执行
*
* @author Whisper 2013-6-20 上午9:32:46
* @since 3.0.1
*/
public interface GeneralQueryHandler {
/**
* 初始化结果集
*
* @param oneQuery
* @param meta
* @param isStreaming
* @throws SQLException
*/
public abstract void executeQuery(ICursorMeta meta, boolean isStreaming) throws SQLException;
/**
* 自动提交?
*
* @return
* @throws SQLException
*/
public abstract boolean isAutoCommit() throws SQLException;
/**
* 获取结果集
*
* @return
*/
public abstract ISchematicCursor getResultCursor();
/**
* 设置dataSource
*
* @param ds
*/
public abstract void setDs(Object ds);
/**
* 关闭,但不是真关闭
*
* @throws SQLException
*/
public abstract void close() throws SQLException;
/**
* 跳转(不过大部分指针都不支持这个)
*
* @param key
* @param indexMeta
* @return
* @throws Exception
*/
public abstract boolean skipTo(CloneableRecord key, ICursorMeta indexMeta) throws SQLException;
/**
* 指针下移 返回null则表示没有后项了
*
* @return
* @throws Exception
*/
public abstract IRowSet next() throws SQLException;
/**
* 最开始的row
*
* @return
* @throws Exception
*/
public abstract IRowSet first() throws SQLException;
/**
* 最后一个row
*
* @return
* @throws Exception
*/
public abstract IRowSet last() throws SQLException;
/**
* 获取当前row
*
* @return
*/
public abstract IRowSet getCurrent();
/**
* 是否触发过initResultSet()这个方法。 与isDone不同的是这个主要是防止多次提交用。(估计)
*
* @return
*/
public abstract boolean isInited();
/**
* 获取上一个数据
*
* @return
* @throws Exception
*/
public abstract IRowSet prev() throws SQLException;
/**
* 执行一个update语句
*
* @param sqlAndParam
* @return
* @throws SQLException
*/
public void executeUpdate(ExecutionContext executionContext, IPut put, ITable table, IndexMeta meta)
throws SQLException;
/**
* 用于异步化,等同于Future.isDone();
*
* @return
*/
public abstract boolean isDone();
/**
* 用于异步化,等同于Future.cancel();
*/
public abstract void cancel(boolean mayInterruptIfRunning);
/**
* 用于异步化,等同于Future.isCancel();
*
* @return
*/
public abstract boolean isCanceled();
/**
* 指针前移
*
* @throws SQLException
*/
public void beforeFirst() throws SQLException;
}