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

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

	bool isValid() const;


private:
	/**
	*@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);

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

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

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


#endif // !CIVDBCONN_H

