mysql.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. #pragma once
  2. #include "db/mysql.h"
  3. #include "db/sqler.h"
  4. #include "sol/sol.hpp"
  5. #include "basemodule.h"
  6. namespace module
  7. {
  8. /// <summary>
  9. /// 注册
  10. /// </summary>
  11. /// <param name="lua"></param>
  12. void mysql_regist(sol::state* lua);
  13. /// <summary>
  14. /// 结果集
  15. /// </summary>
  16. class mysql_result
  17. {
  18. public:
  19. mysql_result(ylib::mysql::result* result);
  20. ~mysql_result();
  21. /// <summary>
  22. /// 字段数
  23. /// </summary>
  24. /// <returns></returns>
  25. uint32 field_count();
  26. /// <summary>
  27. /// 字段类型
  28. /// </summary>
  29. /// <param name="obj"></param>
  30. /// <returns></returns>
  31. std::string field_type(sol::object obj);
  32. /// <summary>
  33. /// 字段名称
  34. /// </summary>
  35. /// <param name="index"></param>
  36. /// <returns></returns>
  37. std::string field_name(uint32 index);
  38. /// <summary>
  39. /// 结果行
  40. /// </summary>
  41. /// <returns></returns>
  42. size_t row_count();
  43. /// <summary>
  44. /// 下一行
  45. /// </summary>
  46. /// <returns></returns>
  47. bool next();
  48. /// <summary>
  49. /// 取数据
  50. /// </summary>
  51. /// <param name="name"></param>
  52. /// <returns></returns>
  53. sol::object get(sol::object obj, sol::this_state s);
  54. /// <summary>
  55. /// 取结果集到table
  56. /// </summary>
  57. /// <param name="s"></param>
  58. /// <returns></returns>
  59. sol::table table(sol::this_state s);
  60. /// <summary>
  61. /// 注册
  62. /// </summary>
  63. /// <param name="lua"></param>
  64. static void regist(sol::state* lua);
  65. private:
  66. ylib::mysql::result* m_result = nullptr;
  67. };
  68. class mysql_builder {
  69. public:
  70. mysql_builder(bool auto_free_conn) {
  71. this->m_auto_free_conn = auto_free_conn;
  72. }
  73. ~mysql_builder()
  74. {
  75. }
  76. protected:
  77. bool m_auto_free_conn = false;
  78. };
  79. class select :public mysql_builder {
  80. public:
  81. select(ylib::mysql::conn* conn,bool auto_free_conn);
  82. ~select();
  83. module::select& where_i32(const std::string& name, const std::string& expression, int32 value);
  84. module::select& where_i64(const std::string& name, const std::string& expression, int64 value);
  85. module::select& where_dob(const std::string& name, const std::string& expression, double value);
  86. module::select& where_str(const std::string& name, const std::string& expression, const std::string& value);
  87. module::select& where_expression(const std::string& expression);
  88. module::select& where_like(const std::string& name,const std::string& value);
  89. module::select& table(const std::string& table_name);
  90. module::select& field(sol::table table);
  91. module::select& page(uint32 page, uint32 count);
  92. module::select& limit(uint32 start, uint32 count);
  93. module::select& orderby(const std::string& exp);
  94. module::select& groupby(const std::string& exp);
  95. module::select& having(const std::string& exp);
  96. void clear();
  97. std::shared_ptr<module::mysql_result> query();
  98. uint64 count();
  99. static void regist(sol::state* lua);
  100. private:
  101. std::shared_ptr<ylib::select> m_select;
  102. };
  103. class update :public mysql_builder {
  104. public:
  105. update(ylib::mysql::conn* conn, bool auto_free_conn);
  106. ~update();
  107. module::update& table(const std::string& table_name);
  108. module::update& set_i32(const std::string& name, int32 value);
  109. module::update& set_i64(const std::string& name, int64 value);
  110. module::update& set_dob(const std::string& name, double value);
  111. module::update& set_str(const std::string& name, const std::string& value);
  112. module::update& set_blob(const std::string& name, const std::string_view& value);
  113. module::update& set(const std::string& expression);
  114. module::update& where_i32(const std::string& name, const std::string& expression, int32 value);
  115. module::update& where_i64(const std::string& name, const std::string& expression, int64 value);
  116. module::update& where_dob(const std::string& name, const std::string& expression, double value);
  117. module::update& where_str(const std::string& name, const std::string& expression, const std::string& value);
  118. module::update& where_expression(const std::string& expression);
  119. module::update& page(uint32 page, uint32 count);
  120. module::update& limit(uint32 start, uint32 count);
  121. module::update& orderby(const std::string& exp);
  122. uint64 exec();
  123. void clear();
  124. static void regist(sol::state* lua);
  125. private:
  126. std::shared_ptr<ylib::update> m_update;
  127. };
  128. class insert :public mysql_builder {
  129. public:
  130. insert(ylib::mysql::conn* conn, bool auto_free_conn);
  131. ~insert();
  132. module::insert& table(const std::string& table_name);
  133. module::insert& set_i32(const std::string& name, int32 value);
  134. module::insert& set_i64(const std::string& name, int64 value);
  135. module::insert& set_dob(const std::string& name, double value);
  136. module::insert& set_str(const std::string& name, const std::string& value);
  137. module::insert& set_blob(const std::string& name, const std::string_view& value);
  138. module::insert& set_not_ppst(const std::string& name, const std::string& value);
  139. uint64 exec();
  140. void clear();
  141. static void regist(sol::state* lua);
  142. private:
  143. std::shared_ptr<ylib::insert> m_insert;
  144. };
  145. class delete_ :public mysql_builder {
  146. public:
  147. delete_(ylib::mysql::conn* conn, bool auto_free_conn);
  148. ~delete_();
  149. module::delete_& table(const std::string& table_name);
  150. module::delete_& where_i32(const std::string& name, const std::string& expression, int32 value);
  151. module::delete_& where_i64(const std::string& name, const std::string& expression, int64 value);
  152. module::delete_& where_dob(const std::string& name, const std::string& expression, double value);
  153. module::delete_& where_str(const std::string& name, const std::string& expression, const std::string& value);
  154. module::delete_& where_expression(const std::string& expression);
  155. module::delete_& page(uint32 page, uint32 count);
  156. module::delete_& limit(uint32 start, uint32 count);
  157. module::delete_& orderby(const std::string& exp);
  158. uint64 exec();
  159. void clear();
  160. static void regist(sol::state* lua);
  161. private:
  162. std::shared_ptr <ylib::delete_> m_delete;
  163. };
  164. class mysql_prepare_statement{
  165. public:
  166. mysql_prepare_statement(ylib::mysql::prepare_statement* pstt);
  167. ~mysql_prepare_statement();
  168. void set_bigint(uint32 index, const std::string& value);
  169. void set_boolean(uint32 index, bool value);
  170. void set_datetime(uint32 index, const std::string& value);
  171. void set_dob(uint32 index, double value);
  172. void set_i32(uint32 index, int32 value);
  173. void set_i64(uint32 index, int64 value);
  174. void set_null(uint32 index);
  175. void set_str(uint32 index, const std::string_view& value);
  176. void set_blob(uint32 index,const std::string_view& value);
  177. void clear();
  178. uint64 update();
  179. std::shared_ptr<module::mysql_result> query();
  180. static void regist(sol::state* lua);
  181. private:
  182. ylib::mysql::prepare_statement* m_pstt = nullptr;
  183. };
  184. class mysql_conn :public module::base
  185. {
  186. public:
  187. mysql_conn();
  188. mysql_conn(ylib::mysql::conn* conn);
  189. ~mysql_conn();
  190. int connect(const std::string& ipaddress, const std::string& username, const std::string& password, const std::string& database, const std::string& charset, ushort port);
  191. void clear();
  192. std::shared_ptr<module::mysql_prepare_statement> setsql(const std::string& sql);
  193. uint64 insert_id();
  194. void begin(bool autocommit = false);
  195. void commit();
  196. void rollback();
  197. void setDatabase(const std::string& name);
  198. std::string last_error();
  199. std::shared_ptr<module::select> select();
  200. std::shared_ptr<module::insert> insert();
  201. std::shared_ptr<module::update> update();
  202. std::shared_ptr<module::delete_> delete_();
  203. void free();
  204. static void regist(sol::state* lua);
  205. // 通过 imodule 继承
  206. virtual void regist_global(const char* name, sol::state* lua);
  207. virtual void delete_global() { delete this; }
  208. virtual void self_free();
  209. private:
  210. ylib::mysql::conn* m_conn = nullptr;
  211. };
  212. /// <summary>
  213. /// MYSQL连接池
  214. /// </summary>
  215. class mysql :public module::base {
  216. public:
  217. mysql();
  218. ~mysql() override;
  219. /// <summary>
  220. /// 启动
  221. /// </summary>
  222. /// <param name="ipaddress"></param>
  223. /// <param name="username"></param>
  224. /// <param name="password"></param>
  225. /// <param name="database"></param>
  226. /// <param name="charset"></param>
  227. /// <param name="port"></param>
  228. /// <param name="size"></param>
  229. /// <returns></returns>
  230. bool start(const std::string& ipaddress, const std::string& username, const std::string& password, const std::string& database, const std::string& charset, ushort port, int32 size);
  231. /// <summary>
  232. /// 关闭
  233. /// </summary>
  234. void close();
  235. std::shared_ptr<module::select> select();
  236. std::shared_ptr<module::insert> insert();
  237. std::shared_ptr<module::update> update();
  238. std::shared_ptr<module::delete_> delete_();
  239. std::shared_ptr<module::mysql_conn> get();
  240. void recover(std::shared_ptr<module::mysql_conn> conn);
  241. private:
  242. std::shared_ptr<ylib::mysql::pool> m_pool;
  243. // 通过 imodule 继承
  244. virtual void regist_global(const char* name, sol::state* lua);
  245. virtual void delete_global() { delete this; }
  246. virtual void self_free() { }
  247. };
  248. }