/**
* @brief
数据库结果集类

* @version
V 1.0.0

* @author
王益俊

* @date
创建时间:  2018-04-18\n

* @note
2018-04-18  创建类。\n

* @warning

* @bug

*/

#pragma once

#include <string>
#include <map>
#include <mysql.h>

#include "CDBCommon.h"
#include "CDBHelper.h"

namespace YADB
{
	class CDBResultSet
	{
		friend class CDBConnect;

	private:
		MYSQL_RES* __pQueryRes;//结果集
		MYSQL_ROW __CurRow;//当前记录行
		int __FieldCount;//字段的个数
		CDBHelper __DBHelper;//助手
		std::map<std::string,int> __FNameIndexList;//字段名和字段下标对应列表(key是字段名,value是字段下标)
	private:
		/**
		* @brief
		构建字段名字段下标对应列表函数。

		* @note

		* @warning

		* @bug

		*/
		void __BuildFNameIdxLst();
		/**
		* @brief
		获得原始字符串值函数。

		* @param  [in] int fdIndex  字段下标\n
		* @param  [out] char* szValue  获得的原始字符串值\n
		* @param  [out] bool& IsNull  是否为空\n
		* @param  [out] std::string& Error  错误信息\n

		* @return 返回获得字段值是否成功
		* @return  true  成功\n
		* @return  false  失败\n

		* @note

		* @warning

		* @bug

		*/
		bool __GetField( int fdIndex, char*& szValue, bool& IsNull, std::string& Error );
	public:
		CDBResultSet();
		~CDBResultSet();
		/**
	    * @brief
	    绑定到一个MYSQL结果集函数。

	    * @param  [in] MYSQL_RES *pQueryRes  MYSQL结果集\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回绑定到一个MYSQL结果集是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool Bind( MYSQL_RES *pQueryRes, std::string& Error );
		/**
	    * @brief
	    关闭函数。

	    * @param  无\n

	    * @return 无\n

	    * @note

	    * @warning

	    * @bug

	    */
		void Close();
		/**
	    * @brief
	    查找数据函数。

	    * @param  [in] my_ulonglong Offset  偏移量\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回查找数据是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool SeekData( my_ulonglong Offset, std::string& Error );
		/**
	    * @brief
	    获得下一条记录函数。

	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得下一条记录是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetNextRecod( std::string& Error );
		/**
	    * @brief
	    获得记录数函数。

	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得的记录数
	    * @return  >=0  成功\n
	    * @return  -1  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		my_ulonglong GetRecordCount( std::string& Error );
		/**
	    * @brief
	    获得int字段值函数。

	    * @param  [in] int fdIndex  字段下标\n
	    * @param  [out] int& value  获得的int字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( int fdIndex, int& value, std::string& Error );
		/**
	    * @brief
	    获得unsigned int字段值函数。

	    * @param  [in] int fdIndex  字段下标\n
	    * @param  [out] unsigned int& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( int fdIndex, unsigned int& value, std::string& Error );
		/**
	    * @brief
	    获得long long字段值函数。

	    * @param  [in] int fdIndex  字段下标\n
	    * @param  [out] long long& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( int fdIndex, long long& value, std::string& Error );
		/**
	    * @brief
	    获得std::string字段值函数。

	    * @param  [in] int fdIndex  字段下标\n
	    * @param  [out] std::string& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( int fdIndex, std::string& value, std::string& Error );
		/**
	    * @brief
	    获得char*字段值函数。

	    * @param  [in] int fdIndex  字段下标\n
	    * @param  [out] char* value  获得的字段值\n
	    * @param  [in] int Length  value的最大长度\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( int fdIndex, char* value, int Length, std::string& Error );
		/**
	    * @brief
	    获得bool字段值函数。

	    * @param  [in] int fdIndex  字段下标\n
	    * @param  [out] bool& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( int fdIndex, bool& value, std::string& Error );
		/**
	    * @brief
	    获得float字段值函数。

	    * @param  [in] int fdIndex  字段下标\n
	    * @param  [out] float& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( int fdIndex, float& value, std::string& Error );
		/**
	    * @brief
	    获得double字段值函数。

	    * @param  [in] int fdIndex  字段下标\n
	    * @param  [out] double& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( int fdIndex, double& value, std::string& Error );
		/**
	    * @brief
	    获得MYSQL_TIME字段值函数。

	    * @param  [in] int fdIndex  字段下标\n
	    * @param  [out] MYSQL_TIME& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( int fdIndex, MYSQL_TIME& value, std::string& Error );
		/**
	    * @brief
	    根据字段名获得字段下标函数。

	    * @param  [in] const char* fdName  字段名\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得的字段下标
	    * @return  >=0  成功\n
	    * @return  -1  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		int GetFdIndexByName( const char* fdName, std::string& Error );
		/**
	    * @brief
	    根据字段名获得int字段值函数。

	    * @param  [in] const char* fdName  字段名\n
	    * @param  [out] int& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( const char* fdName, int& value, std::string& Error );
		/**
	    * @brief
	    根据字段名获得long long字段值函数。

	    * @param  [in] const char* fdName  字段名\n
	    * @param  [out] long long& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( const char* fdName, long long& value, std::string& Error );
		/**
	    * @brief
	    根据字段名获得unsigned int字段值函数。

	    * @param  [in] const char* fdName  字段名\n
	    * @param  [out] unsigned int& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( const char* fdName, unsigned int& value, std::string& Error );
		/**
	    * @brief
	    根据字段名获得string字段值函数。

	    * @param  [in] const char* fdName  字段名\n
	    * @param  [out] std::string& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( const char* fdName, std::string& value, std::string& Error );
		/**
	    * @brief
	    根据字段名获得char*字段值函数。

	    * @param  [in] const char* fdName  字段名\n
	    * @param  [out] char* value  获得的字段值\n
	    * @param  [in] int Length  value的长度\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( const char* fdName, char* value, int Length, std::string& Error );
		/**
	    * @brief
	    根据字段名获得bool字段值函数。

	    * @param  [in] const char* fdName  字段名\n
	    * @param  [out] bool& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( const char* fdName, bool& value, std::string& Error );
		/**
	    * @brief
	    根据字段名获得float字段值函数。

	    * @param  [in] const char* fdName  字段名\n
	    * @param  [out] float& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( const char* fdName, float& value, std::string& Error );
		/**
	    * @brief
	    根据字段名获得double字段值函数。

	    * @param  [in] const char* fdName  字段名\n
	    * @param  [out] double& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( const char* fdName, double& value, std::string& Error );
		/**
	    * @brief
	    根据字段名获得MYSQL_TIME字段值函数。

	    * @param  [in] const char* fdName  字段名\n
	    * @param  [out] MYSQL_TIME& value  获得的字段值\n
	    * @param  [out] std::string& Error  错误信息\n

	    * @return 返回获得字段值是否成功
	    * @return  true  成功\n
	    * @return  false  失败\n

	    * @note

	    * @warning

	    * @bug

	    */
		bool GetField( const char* fdName, MYSQL_TIME& value, std::string& Error );
		/**
		* @brief
		判断字段是否为空函数。

		* @param  [in] int fdIndex  字段下标\n
		* @param  [out] std::string& Error  错误信息\n

		* @return 返回字段是否为空
		* @return  1  为空\n
		* @return  0  不为空\n
		* @return  -1  有错误\n

		* @note

		* @warning

		* @bug

		*/
		int IsNull( int fdIndex, std::string& Error );
	};
}
