#pragma once
#include <string>
#include <map>
#include <vector>


/**
	数据库连接类
*/
class  CivConnection
{
public:
	CivConnection();
	virtual ~CivConnection();

	/**
	*@brief 建立数据，与具体的数据有关子类实现
	*/
	virtual bool connect(const std::string& url) = 0;

	/**
	 *@brief 关闭数据，与具体的数据有关子类实现
	 */
	virtual bool disconnect() = 0;

	/**
	*@brief 执行查询操作，与具体的数据有关子类实现
	*@param sql 执行sql语句
	*/
	virtual bool execSql(const std::string& sql) = 0;

	/**
	*@brief 获取查询结果
	*@param sql 结果集
	*/
	virtual bool queryResult(std::vector<std::map<std::string, std::string>>& result) = 0;

	virtual bool beginTransaction() = 0;

	virtual bool commitTransaction() = 0;
	/**
	*@brief 删除数据
	*@param table  表名
	*@param result 需要更新的字段和字段值映射
	*@param where 条件
	*/
	bool update(const std::string& table, const std::map<std::string, std::string>& result, const std::string& where = "1=1");

	/**
	*@brief 删除数据
	*@param table  表名
	*@param where 删除条件
	*/
	bool del(const std::string& table, const std::string& where = "1=1");

	/**
	*@brief 往数据库表插入数据
	*@param table  表名
	*@param result 需要添加的数据，字段和字段值的
	*/
	bool insert(const std::string& table, const std::map<std::string, std::string>& result);

	bool insertBulk(const std::string& table, 
		const std::vector<std::string>& fields,
		const std::vector<std::vector<std::string>>& result);
	/**
	*@brief 执行查询操作，与具体的数据有关子类实现
	*@param [in] table 待查询的表名
	*@param [in] fields 需要查询的字段
	*@param [in] result 查询结果
	*@param [in] where 查询条件语句,默认
	*/
	bool query(const std::string& table, 
		const std::vector<std::string>&fields, 
		std::vector<std::map <std::string,std::string>>& result , 
		const std::string& where = "1=1");

	// 获取信息
	std::string getLastError() const;

protected:
	std::string mLastError;
};
