Line data Source code
1 : /**
2 : * @file sqlite_store.hpp
3 : * @brief SQLite 持久化存储实现
4 : */
5 :
6 : #pragma once
7 :
8 : #include "storage/store.hpp"
9 : #include <sqlite3.h>
10 : #include <memory>
11 : #include <mutex>
12 :
13 : namespace fix40 {
14 :
15 : /**
16 : * @class SqliteStore
17 : * @brief SQLite 存储实现
18 : *
19 : * 线程安全的 SQLite 存储实现。
20 : * 支持内存数据库 (":memory:") 用于测试。
21 : */
22 : class SqliteStore : public IStore {
23 : public:
24 : /**
25 : * @brief 构造函数
26 : * @param dbPath 数据库文件路径,":memory:" 表示内存数据库
27 : */
28 : explicit SqliteStore(const std::string& dbPath);
29 :
30 : ~SqliteStore() override;
31 :
32 : // 禁止拷贝
33 : SqliteStore(const SqliteStore&) = delete;
34 : SqliteStore& operator=(const SqliteStore&) = delete;
35 :
36 : /**
37 : * @brief 检查数据库是否已打开
38 : */
39 1130 : bool isOpen() const { return db_ != nullptr; }
40 :
41 : // IStore 接口实现
42 : bool saveOrder(const Order& order) override;
43 : bool saveOrderForAccount(const Order& order, const std::string& accountId) override;
44 : bool updateOrder(const Order& order) override;
45 : std::optional<Order> loadOrder(const std::string& clOrdID) override;
46 : std::vector<Order> loadOrdersBySymbol(const std::string& symbol) override;
47 : std::vector<Order> loadOrdersByAccount(const std::string& accountId) override;
48 : std::vector<Order> loadActiveOrders() override;
49 : std::vector<Order> loadAllOrders() override;
50 :
51 : bool saveTrade(const StoredTrade& trade) override;
52 : std::vector<StoredTrade> loadTradesByOrder(const std::string& clOrdID) override;
53 : std::vector<StoredTrade> loadTradesBySymbol(const std::string& symbol) override;
54 :
55 : bool saveSessionState(const SessionState& state) override;
56 : std::optional<SessionState> loadSessionState(
57 : const std::string& senderCompID, const std::string& targetCompID) override;
58 :
59 : bool saveMessage(const StoredMessage& msg) override;
60 : std::vector<StoredMessage> loadMessages(
61 : const std::string& senderCompID, const std::string& targetCompID,
62 : int beginSeqNum, int endSeqNum) override;
63 : bool deleteMessagesForSession(
64 : const std::string& senderCompID, const std::string& targetCompID) override;
65 : bool deleteMessagesOlderThan(int64_t timestamp) override;
66 :
67 : // 账户存储
68 : bool saveAccount(const Account& account) override;
69 : std::optional<Account> loadAccount(const std::string& accountId) override;
70 : std::vector<Account> loadAllAccounts() override;
71 : bool deleteAccount(const std::string& accountId) override;
72 :
73 : // 持仓存储
74 : bool savePosition(const Position& position) override;
75 : std::optional<Position> loadPosition(
76 : const std::string& accountId, const std::string& instrumentId) override;
77 : std::vector<Position> loadPositionsByAccount(const std::string& accountId) override;
78 : std::vector<Position> loadAllPositions() override;
79 : bool deletePosition(const std::string& accountId, const std::string& instrumentId) override;
80 : bool deletePositionsByAccount(const std::string& accountId) override;
81 :
82 : private:
83 : /**
84 : * @brief 初始化数据库表
85 : */
86 : bool initTables();
87 :
88 : /**
89 : * @brief 执行 SQL 语句
90 : */
91 : bool execute(const std::string& sql);
92 :
93 : /**
94 : * @brief 从 SQLite 结果行提取 Order 对象
95 : */
96 : Order extractOrder(sqlite3_stmt* stmt);
97 :
98 : /**
99 : * @brief 从 SQLite 结果行提取 StoredTrade 对象
100 : */
101 : StoredTrade extractTrade(sqlite3_stmt* stmt);
102 :
103 : /**
104 : * @brief 从 SQLite 结果行提取 Account 对象
105 : */
106 : Account extractAccount(sqlite3_stmt* stmt);
107 :
108 : /**
109 : * @brief 从 SQLite 结果行提取 Position 对象
110 : */
111 : Position extractPosition(sqlite3_stmt* stmt);
112 :
113 : sqlite3* db_ = nullptr;
114 : mutable std::mutex mutex_;
115 : };
116 :
117 : } // namespace fix40
|