#ifndef CIVDBCONN_H
#define CIVDBCONN_H
#include "CivTypes.h"
#include "CivAssembly.h"
#include "CivTableTemp.h"

#define DBEXPORT __declspec(dllexport)

/**
 数据库连接接口
*/
class DBEXPORT CivDbConn
{
public:
	CivDbConn();
	virtual ~CivDbConn();

	// 获取组件对象
	virtual bool getNode(CivNode& node)=0;
	virtual bool getPipe(CivPipe& pipe)=0;
	virtual bool getTank(CivTank& tank)=0;
	virtual bool getValve(CivValve& valve)=0;
	virtual bool getPumps(CivPumps& pump)=0;
	virtual bool getReservoirs(CivReservoirs& reservoirs)=0;
	virtual bool getEmitters(CivEmitters& emitter)=0;
	virtual bool getCoordinates(CivCoordinates& coord)=0;
	virtual bool getMixing(CivMixing& mixing)=0;
	virtual bool getParameter(std::vector <CivParameter>& params)=0;
	virtual bool getPatterns(CivPatterns& patterns)=0;
	virtual bool getCurves(CivCurves& curves)=0;
	virtual bool getDemands(CivDemands& demands)=0;
	virtual bool getSources(CivSources& sources)=0;
	virtual bool getStatus(CivStatus& status)=0;
	virtual bool getQuality(CivQuality& quality)=0;
	virtual bool getLabels(CivLabels& labels)=0;
	virtual bool getTags(CivTags& tags)=0;

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

	/**
	*@brief 关闭数据库连接，与具体的数据有关子类实现
	*/
	virtual void close() = 0;

	/**
	*@brief 判断某张表是否存在，判断方法跟具体的数据库有关，延迟到子类实现
	*@param tableName: 表名称
	*/
	virtual bool tableExist(StrQuote tableName) = 0;

	/**
	 *@brief 创建表格
	 */
	virtual bool createTable(CivTableTemp& temp) =0 ;

	/**
	*@brief 根据字段值条件删除数据
	*@param table：表
	*@param filedName：字段名
	*@param fieldValue：字段值
	*/
	virtual bool deleteByField(StrQuote table, StrQuote filedName, StrQuote fieldValue) =0 ;

	/**
	 *@brief 根据时段将结果电表的数据回填到管网节点表
	 *@param currDate 日期字符串， 格式： xxxx-xx-xx
	 *@param interval 时段
	 */
	virtual bool updateNodeByInterval(StrQuote currDate, StrQuote interval)=0;

	/**
	 *@brief 根据时段将结果线表的数据回填到管网管线表
	 *@param currDate 日期字符串， 格式： xxxx-xx-xx
	 *@param interval 时段
	 */
	virtual bool updateLinkByInterval(StrQuote currDate, StrQuote interval)=0;

	/**
	 *@brief 更新点表数据
	 *@param nodeItems：需要更新的值
	 */
	virtual bool updateNode(const NodeResultItems& nodeItems) = 0;

	/**
	 *@brief 更新线表的数据
	 *@param: lineItems: 线数据
	 */
	virtual bool updateLink(const LinkResultItems& lineItems) = 0;

	/**
	 *@brief 执行sql语句
	 *@param: sql 需要执行的sql语句
	 */
	virtual bool execSql(StrQuote sql) = 0;

	/**
	 *@brief 获取指定表的字段信息
	 *@param  fileds 需要查询那些字段
	 *@param  result 查询的结果集
	 */
	virtual bool getFieldValueFromTable(const std::string& table, 
		const std::vector<std::string>& fileds,
		std::vector< std::vector<std::string>>& result) = 0;


	/**
	 *@brief 根据条件获取某表的指定字段的值
	 *@param  table 查询的表
	 *@param  condition 查询条件
	 *@param  fileds 需要查询那些字段
	 *@param  result 查询的结果集
	 */
	virtual bool getValuesFromTableByCondition(const std::string& table,
		const std::string& condition,
		const std::vector<std::string>& fileds,
		std::vector< std::map<std::string, std::string>>& result) = 0;

	virtual void checkHyDrNetTable() = 0;
	// 获取当前执行错误信息
	Str getLastError() const; 
	
	bool isValid() const;

protected:
	bool mIsOpen = false; // 数据库连接信息
	char* mLastError; // 执行sql的错误信息
};


#endif // !CIVDBCONN_H

