/**
* Copyright 2014 Duan Bingnan
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.pinus4j.api;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import org.pinus4j.api.query.IQuery;
import org.pinus4j.cache.IPrimaryCache;
import org.pinus4j.cache.ISecondCache;
import org.pinus4j.cluster.IDBCluster;
import org.pinus4j.cluster.enums.EnumDBMasterSlave;
import org.pinus4j.cluster.enums.EnumSyncAction;
import org.pinus4j.exceptions.DBOperationException;
import org.pinus4j.exceptions.LoadConfigException;
import org.pinus4j.task.ITask;
import org.pinus4j.task.TaskFuture;
import org.pinus4j.transaction.enums.EnumTransactionIsolationLevel;
/**
* main api of pinus.
*
* @author duanbn
*/
public interface PinusClient {
/**********************************************************
* 事务相关
*********************************************************/
/**
* default transaction isolation level is read_commited
*/
void beginTransaction();
void beginTransaction(EnumTransactionIsolationLevel txLevel);
void commit();
void rollback();
/**
* do commit but don't close db connection.
*/
void flush();
/**********************************************************
* 数据处理相关
*********************************************************/
/**
* 提交一个数据处理任务.
*
* @param task 处理任务
* @param clazz 数据对象的Class
* @return
*/
<T> TaskFuture submit(ITask<T> task, Class<T> clazz);
/**
* 提交一个数据处理任务. 可以设置一个查询条件,只处理符合查询条件的数据
*
* @param task 处理任务
* @param clazz 数据对象的Class
* @param query 查询条件
* @return
*/
<T> TaskFuture submit(ITask<T> task, Class<T> clazz, IQuery<T> query);
/**********************************************************
* 数据操作相关
*********************************************************/
/**
* 保存单个数据对象.
*
* @param entity 被@Table标注的数据对象
*/
public void save(Object entity);
/**
* 批量保存数据,获取自增主键.
*
* @param entityList
*/
public void saveBatch(List<? extends Object> entityList);
/**
* 保存批量数据对象. 如果不获取自增主键则会大幅提高保存性能.<br/>
* <b>实体必须是具备唯一自增主键</b>
*
* @param entityList
* @param autoGeneratedKeys 是否获取自增主键值.
*/
public void saveBatch(List<? extends Object> entityList, boolean autoGeneratedKeys);
public void update(Object entity);
public void updateBatch(List<? extends Object> entityList);
public void delete(Object entity);
public void delete(List<? extends Object> entityList);
public void load(Object entity);
public void load(Object entity, boolean useCache);
public void load(Object entity, EnumDBMasterSlave masterSlave);
public void load(Object entity, boolean useCache, EnumDBMasterSlave masterSlave);
public <T> IQuery<T> createQuery(Class<T> clazz);
@Deprecated
public List<Map<String, Object>> findBySQL(SQL sql, Class<?> clazz);
public List<Map<String, Object>> findBySQL(SQL sql, String clusterName);
/**********************************************************
* other相关
*********************************************************/
/**
* 创建一个分布式锁.
*
* @param lockName 锁名称
* @return
*/
Lock createLock(String lockName);
/**
* /** 获取当前使用的数据库集群.
*
* @return 数据库集群
*/
IDBCluster getDBCluster();
/**
* 获取一级缓存控制接口
*
* @return
*/
IPrimaryCache getPrimaryCache();
/**
* 获取二级缓存控制接口
*
* @return
*/
ISecondCache getSecondCache();
/**
* 生成全局唯一的int id. 对一个数据对象的集群全局唯一id.
*
* @param name
* @return 单个数据对象的集群全局唯一id
* @throws DBOperationException 生成id失败
*/
int genClusterUniqueIntId(String name);
/**
* 生成全局唯一的long id. 对一个数据对象的集群全局唯一id.
*
* @param clusterName 数据库集群名
* @param clazz 数据对象class
* @return 单个数据对象的集群全局唯一id
* @throws DBOperationException 生成id失败
*/
long genClusterUniqueLongId(String name);
/**
* 批量生成全局唯一主键.
*
* @param clusterName 数据库集群名
* @param clazz 数据对象class
* @param batchSize 批量数
*/
long[] genClusterUniqueLongIdBatch(String name, int batchSize);
/**
* 批量生成全局唯一主键.
*
* @param clusterName 数据库集群名
* @param clazz 数据对象class
* @param batchSize 批量数
*/
int[] genClusterUniqueIntIdBatch(String name, int batchSize);
/**
* 初始化集群客户端.
*/
void init() throws LoadConfigException;
/**
* 关闭存储.
*/
void destroy();
/**
* 设置数据表同步动作.
*
* @param syncAction
*/
void setSyncAction(EnumSyncAction syncAction);
/**
* 设置扫描的实体对象包. 用户加载分表信息和自动创建数据表.
*
* @param scanPackage
*/
void setScanPackage(String scanPackage);
}