mysqlwrap.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // mysqlwrap.h :
  2. //
  3. #if !defined(AGD_MYSQLWRAP_H__0FDF8710_B26A_4631_A025_705731DF316E__INCLUDED_)
  4. #define AGD_MYSQLWRAP_H__0FDF8710_B26A_4631_A025_705731DF316E__INCLUDED_
  5. #include <stdint.h>
  6. #include <mysql/mysql.h>
  7. #include <string>
  8. #include <unordered_map>
  9. #include <functional>
  10. #include "debug.h"
  11. /////////////////////////////////////////////////////////////////////////////
  12. // mysqlwrap.h - Declarations:
  13. class CMySqlVar
  14. {
  15. public:
  16. CMySqlVar(void);
  17. CMySqlVar(CMySqlVar &&o);
  18. CMySqlVar(const MYSQL_FIELD &rField, const char *pszVal);
  19. virtual ~CMySqlVar(void);
  20. void Clear(void);
  21. bool FromField(const MYSQL_FIELD &rField, const char *pszVal);
  22. inline bool IsValid(void) const {
  23. return m_bValid;}
  24. inline bool IsNumeric(void) const {
  25. return m_bValid && (m_bInteger || m_bReal);}
  26. inline bool IsReal(void) const {
  27. return m_bValid && m_bReal;}
  28. inline bool IsUnsigned(void) const {
  29. return m_bValid && m_bUnsigned;}
  30. inline bool IsNull(void) const {
  31. return m_sqlFt == MYSQL_TYPE_NULL;}
  32. inline enum enum_field_types GetSqlFieldType(void) const {
  33. return m_sqlFt;}
  34. inline const char* StrVal(void) const {
  35. ASSERT(!IsNull());
  36. return m_strVal.c_str();}
  37. inline size_t CopyStrVal(char *s, size_t len, size_t pos = 0) const {
  38. return m_strVal.copy(s, len, pos);}
  39. inline const char* Fieldname(void) const {
  40. return m_strFieldname.c_str();}
  41. inline int FieldnameCmp(const char *pszName) const {
  42. return m_strFieldname.compare(pszName);}
  43. operator int64_t (void) const {
  44. ASSERT(m_bInteger && !IsNull());
  45. return m_bInteger ? m_numVal.iVal : 0;}
  46. operator uint64_t (void) const {
  47. ASSERT(m_bInteger && !IsNull());
  48. return m_bInteger ? m_numVal.uVal : 0;}
  49. #ifndef _TARGET_BUILD
  50. operator long long (void) const {
  51. ASSERT(m_bInteger && !IsNull());
  52. return m_bInteger ? (long long)m_numVal.iVal : 0;}
  53. operator unsigned long long (void) const {
  54. ASSERT(m_bInteger && !IsNull());
  55. return m_bInteger ? (unsigned long long)m_numVal.uVal : 0;}
  56. #endif // _TARGET_BUILD
  57. operator bool (void) const {
  58. ASSERT(m_bInteger && !IsNull());
  59. return m_bInteger ? !!m_numVal.uVal : false;}
  60. operator double (void) const {
  61. ASSERT(m_bReal && !IsNull());
  62. return m_bReal ? m_numVal.fVal : 0.0;}
  63. private:
  64. bool m_bValid;
  65. bool m_bInteger;
  66. bool m_bReal;
  67. bool m_bUnsigned;
  68. bool m_bString;
  69. std::string m_strVal;
  70. std::string m_strFieldname;
  71. enum enum_field_types m_sqlFt;
  72. union
  73. {
  74. int64_t iVal;
  75. uint64_t uVal;
  76. double fVal;
  77. }m_numVal;
  78. };
  79. /////////////////////////////////////////////////////////////////////////////
  80. class CMySqlRow
  81. {
  82. public:
  83. typedef std::unordered_map<std::string, CMySqlVar> CMySqlFieldMap;
  84. public:
  85. CMySqlRow(void);
  86. ~CMySqlRow(void);
  87. public:
  88. void Clear(void);
  89. bool Create(unsigned int nFieldCount, const MYSQL_FIELD *pFields, MYSQL_ROW row);
  90. const CMySqlVar& Value(const char *pszFieldname) const;
  91. inline const CMySqlVar& operator [](const char *pszFieldname) const {
  92. return Value(pszFieldname);}
  93. inline bool IsValid(void) const {
  94. return m_bValid;}
  95. CMySqlFieldMap::const_iterator begin(void);
  96. CMySqlFieldMap::const_iterator end(void);
  97. private:
  98. bool FindField(const char *pszFieldname, CMySqlFieldMap::const_iterator &it) const;
  99. private:
  100. bool m_bValid;
  101. unsigned int m_nFieldCount;
  102. CMySqlFieldMap m_fields;
  103. static const CMySqlVar m_vNul;
  104. };
  105. /////////////////////////////////////////////////////////////////////////////
  106. class CMySqlResult
  107. {
  108. public:
  109. CMySqlResult(MYSQL_RES *pRes, bool err);
  110. virtual ~CMySqlResult(void);
  111. public:
  112. void Free(void);
  113. my_ulonglong RowCount(void) const;
  114. unsigned int FieldCount(void) const;
  115. MYSQL_ROW FetchRow(void);
  116. bool FetchRow(CMySqlRow &row) const;
  117. const MYSQL_FIELD * FetchFields(void) const;
  118. inline bool error(void) const {
  119. return m_bError;}
  120. private:
  121. MYSQL_RES *m_pRes;
  122. bool m_bError;
  123. };
  124. /////////////////////////////////////////////////////////////////////////////
  125. class CMySqlDB
  126. {
  127. public:
  128. CMySqlDB(void);
  129. virtual ~CMySqlDB(void);
  130. public:
  131. bool Init(void) throw();
  132. void Close(void) throw();
  133. bool Connect(const char *host, const char *user, const char *pass, const char *db, unsigned int port = 0, const char *unix_socket = NULL, unsigned long client_flag = 0);
  134. CMySqlResult Query(const char *sql);
  135. int SelectDB(const char *db);
  136. int SetCharSet(const char *pszCharset);
  137. int Options(enum mysql_option option, const void *arg);
  138. std::string EscapeStringQuote(const char *from, char quote);
  139. std::string EscapeString(const char *from);
  140. std::string LastError(void);
  141. unsigned int LastErrno(void);
  142. private:
  143. MYSQL m_mySql;
  144. bool m_fIsInit;
  145. };
  146. /////////////////////////////////////////////////////////////////////////////
  147. #endif // !defined(AGD_MYSQLWRAP_H__0FDF8710_B26A_4631_A025_705731DF316E__INCLUDED_)