sqlite.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #pragma once
  2. #include <vector>
  3. #include <string>
  4. #include <queue>
  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. namespace ylib::sqlite
  12. {
  13. class result;
  14. class conn;
  15. class prepare_statement;
  16. struct field {
  17. uint32 index = 0;
  18. std::string name;
  19. std::string type_name;
  20. };
  21. struct sqlite_conn_info
  22. {
  23. sqlite_conn_info() = default;
  24. std::string database;
  25. };
  26. class result : public ylib::error_base
  27. {
  28. public:
  29. result(void* handle);
  30. ~result();
  31. // 列名
  32. std::string field_name(uint32 index);
  33. // 列类型
  34. std::string field_type(uint32 index);
  35. std::string field_type(const std::string& name);
  36. // 列数量
  37. uint32 field_count();
  38. // 下一行
  39. bool next();
  40. int32 get_int32(uint32 index);
  41. int32 get_int32(const std::string& name);
  42. int64 get_int64(uint32 index);
  43. int64 get_int64(const std::string& name);
  44. std::string get_string(uint32 index);
  45. std::string get_string(const std::string& name);
  46. double get_double(uint32 index);
  47. double get_double(const std::string& name);
  48. //ylib::buffer get_blob(uint32 index);
  49. //ylib::buffer get_blob(const std::string& name);
  50. private:
  51. void* m_handle = nullptr;
  52. uint32 m_field_count = 0;
  53. std::vector<ylib::sqlite::field> m_fields;
  54. };
  55. class prepare_statement : public ylib::error_base {
  56. public:
  57. prepare_statement();
  58. ~prepare_statement();
  59. void set_bigint(uint32 index, const std::string& value);
  60. void set_double(uint32 index, double value);
  61. void set_int32(uint32 index, int32 value);
  62. void set_int64(uint32 index, int64 value);
  63. void set_null(uint32 index);
  64. void set_string(uint32 index, const std::string& value);
  65. void set_string(uint32 index, const char* data, int size);
  66. void clear();
  67. uint64 update();
  68. ylib::sqlite::result* query();
  69. friend class ylib::sqlite::conn;
  70. private:
  71. ylib::sqlite::result* m_result = nullptr;
  72. void* m_handle = nullptr;
  73. std::queue<std::shared_ptr<std::istringstream>> m_blobs;
  74. };
  75. class conn : public ylib::error_base
  76. {
  77. public:
  78. conn();
  79. ~conn();
  80. bool start(const ylib::sqlite::sqlite_conn_info& info);
  81. void close();
  82. void clear();
  83. ylib::sqlite::prepare_statement* setsql(const std::string& sql);
  84. uint64 insert_id();
  85. bool begin(bool autocommit = false);
  86. bool commit();
  87. bool rollback();
  88. private:
  89. void* m_handle = nullptr;
  90. ylib::sqlite::sqlite_conn_info m_info;
  91. ylib::sqlite::prepare_statement *m_ppst = nullptr;
  92. // 事务状态 0=未开启 1=已开启 2=执行完毕
  93. int m_sw = 0;
  94. };
  95. }