mysql.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #pragma once
  2. #include <vector>
  3. #include <string>
  4. #include <list>
  5. #ifndef _WIN32
  6. #include <stddef.h>
  7. #endif
  8. #include "base/define.h"
  9. #include "base/error.h"
  10. #include "util/json.h"
  11. #include "util/pool.hpp"
  12. namespace ylib::mysql
  13. {
  14. class pool;
  15. class result;
  16. class conn;
  17. class prepare_statement;
  18. struct field {
  19. uint32 index = 0;
  20. std::string name;
  21. std::string type_name;
  22. };
  23. struct mysql_conn_info
  24. {
  25. mysql_conn_info() {
  26. port = 0;
  27. }
  28. std::string ipaddress;
  29. std::string username;
  30. std::string password;
  31. std::string database;
  32. std::string charset;
  33. uint32 port;
  34. };
  35. class result :public ylib::error_base
  36. {
  37. public:
  38. result(void* handle);
  39. ~result();
  40. // 列名
  41. std::string field_name(uint32 index);
  42. // 列类型
  43. std::string field_type(uint32 index);
  44. std::string field_type(const std::string& name);
  45. // 列数量
  46. uint32 field_count();
  47. // 行数量
  48. size_t row_count();
  49. // 下一行
  50. bool next();
  51. int32 get_int32(uint32 index);
  52. int32 get_int32(const std::string& name);
  53. uint32 get_uint32(uint32 index);
  54. uint32 get_uint32(const std::string& name);
  55. int64 get_int64(uint32 index);
  56. int64 get_int64(const std::string& name);
  57. uint64 get_uint64(uint32 index);
  58. uint64 get_uint64(const std::string& name);
  59. std::string get_string(uint32 index);
  60. std::string get_string(const std::string& name);
  61. bool get_boolean(uint32 index);
  62. bool get_boolean(const std::string& name);
  63. double get_double(uint32 index);
  64. double get_double(const std::string& name);
  65. ylib::buffer get_blob(uint32 index);
  66. ylib::buffer get_blob(const std::string& name);
  67. ylib::json to_json();
  68. private:
  69. void* m_handle = nullptr;
  70. uint32 m_field_count = 0;
  71. uint32 m_row_count = 0;
  72. std::vector<ylib::mysql::field> m_fields;
  73. };
  74. class prepare_statement :public ylib::error_base {
  75. public:
  76. prepare_statement();
  77. ~prepare_statement();
  78. void set_bigint(uint32 index, const std::string& value);
  79. void set_boolean(uint32 index, bool value);
  80. void set_datetime(uint32 index, const std::string& value);
  81. void set_double(uint32 index, double value);
  82. void set_int32(uint32 index, int32 value);
  83. void set_uint32(uint32 index, uint32 value);
  84. void set_int64(uint32 index, int64 value);
  85. void set_uint64(uint32 index, uint64 value);
  86. void set_null(uint32 index);
  87. void set_string(uint32 index, const std::string& value);
  88. void set_string(uint32 index,const char* data,int size);
  89. void set_blob(uint32 index, const char* data, int size);
  90. void clear();
  91. uint64 update();
  92. ylib::mysql::result* query();
  93. friend class ylib::mysql::conn;
  94. private:
  95. ylib::mysql::result* m_result = nullptr;
  96. void* m_handle = nullptr;
  97. std::queue<std::shared_ptr<std::istringstream>> m_blobs;
  98. };
  99. class conn :public ylib::example<ylib::mysql::mysql_conn_info>, public ylib::error_base
  100. {
  101. public:
  102. conn();
  103. ~conn();
  104. virtual EXAMPLE_START_RESULT start(const ylib::mysql::mysql_conn_info& info) override;
  105. virtual void close() override;
  106. virtual void recover() override;
  107. virtual void task_out() override;
  108. void clear();
  109. ylib::mysql::prepare_statement* setsql(const std::string& sql);
  110. uint64 insert_id();
  111. void begin(bool autocommit = false);
  112. void commit();
  113. void rollback();
  114. void setDatabase(const std::string& name);
  115. friend class ylib::mysql::pool;
  116. private:
  117. void* m_handle = nullptr;
  118. ylib::mysql::mysql_conn_info m_info;
  119. class prepare_statement* m_ppst = nullptr;
  120. // 事务状态 0=未开启 1=已开启 2=执行完毕
  121. int m_sw = 0;
  122. };
  123. class pool : public ylib::pool<ylib::mysql::conn, ylib::mysql::mysql_conn_info>
  124. {
  125. public:
  126. pool()
  127. {
  128. }
  129. ~pool()
  130. {
  131. }
  132. };
  133. /// <summary>
  134. /// 协程调用
  135. /// 执行期间会让出协程,并等待再次调度
  136. /// </summary>
  137. /// <param name="ppst"></param>
  138. /// <returns></returns>
  139. std::tuple<bool, std::string> co_query(ylib::mysql::prepare_statement* ppst);
  140. }