#ifndef CIVDBCONN_H
#define CIVDBCONN
#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(CivParameter& params)=0;
	virtual bool getPatterns(std::vector<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 判断某张表是否存在，判断方法跟具体的数据库有关，延迟到子类实现
	*@tableName: 表名称
	*/
	virtual bool tableExist(StrQuote tableName) = 0;

	/**
	 *@brief 创建表格
	 *@tableName: 表名
	 *@schema:
	 *@tableType：表类型，点结果，线结果
	 */
	bool createTable(CivTableTemp& temp);

	bool isValid() const;


private:
	/**
	 *@brief 获取管网组件数据：管线，节点，水源等（必须组件）
	 *@tableName： 组件表
	 */
	Componets getComponets(StrQuote tableName);

	Componets getComponetsByWhere(StrQuote tableName, StrQuote where);

	/**
	 *@brief  水泵，阀门 (节点转换为管线)
	 *@tableName： 组件表
	 */
	Componets getLikelyPipes(StrQuote tableName);

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

	bool updateNodeByInterval(StrQuote currDate, StrQuote interval);

	bool updateLinkByInterval(StrQuote currDate, StrQuote interval);
	/**
	 *@brief 更新点表数据
	 *@nodeItems：需要更新的值
	 */
	bool updateNode(const NodeResultItems& nodeItems);

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

	// 添加过滤类型字段值
	void addFilter(Str type, Str number);

	// 获取过滤集
	FiledFilter getFilter() const;

	// 获取当前执行错误信息
	Str getLastError() const;

	/**
	 *@brief 根据code值寻数据
	 *@table: 线表
	 *@code: code
	 */
	Componets getValueByCode(StrQuote table, StrQuote code);

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

	/**
	*@brief 清除查询结果集数据
	*/
	virtual void clearResult() = 0;

	/**
	 *@brief 从查询集取出数据
	 *@result: 查询结果集
	 *@comp: 数据容器
	 */
	virtual void getData(Componets& comp) = 0;

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

private:	
	FiledFilter mFilter; // 表名:对应的编号
};


#endif // !CIVDBCONN_H

