#ifndef CIVPGCONN_H
#define CIVPGCONN_H
#include <libpq-fe.h>

#include "CivDbConn.h"

/**
 postgress 数据库
*/
class DBEXPORT CivPgConn: public CivDbConn
{
public:
	CivPgConn(char* uri);
	virtual ~CivPgConn();

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

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

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

	/**
	*@brief 执行sql语句
	*@sql: 需要执行的sql语句
	*/
	 bool execSql(StrQuote sql) override;
	 bool getNode(CivNode& node) override;
	 bool getPipe(CivPipe& pipe) override;
	 bool getTank(CivTank& tank) override;
	 bool getValve(CivValve& valve) override;
	 bool getPumps(CivPumps& pump) override;
	 bool getReservoirs(CivReservoirs& reservoirs) override;
	 bool getEmitters(CivEmitters& emitter) override;
	 bool getCoordinates(CivCoordinates& coord) override;
	 bool getMixing(CivMixing& mixing) override;
	 bool getParameter(std::vector<CivParameter>& param) override;
	 bool getPatterns(CivPatterns& patterns) override;
	 bool getCurves(CivCurves& curves) override;
	 bool getDemands(CivDemands& demands) override;
	 bool getSources(CivSources& sources) override;
	 bool getStatus(CivStatus& status) override;
	 bool getQuality(CivQuality& quality) override;
	 bool getLabels(CivLabels& labels) override;
	 bool getTags(CivTags& tags) override;

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

	 /**
	 *@brief 根据字段值条件删除数据
	 *@param table：表
	 *@param filedName：字段名
	 *@paramfieldValue：字段值
	 */
	 bool deleteByField(StrQuote table, StrQuote filedName, StrQuote fieldValue) override;
	 bool updateNodeByInterval(StrQuote currDate, StrQuote interval) override;
	 bool updateLinkByInterval(StrQuote currDate, StrQuote interval) override;
	 /**
	  *@brief 更新点表数据
	  *@param nodeItems：需要更新的值
	  */
	 bool updateNode(const NodeResultItems& nodeItems) override;

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

	 bool getFieldValueFromTable(const std::string& table,
		 const std::vector<std::string>& fileds,
		 std::vector< std::vector<std::string>>& result) override;

	 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) override;

	 void  checkHyDrNetTable() override;
	
private:
	PGconn* mConn; // 连接对象
	PGresult* mResult;  // 查询结果集

	char* mUri;
};

#endif // !CIVPGCONN_H
