sqlite.h 2.9 KB

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