• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef NATIVE_RDB_RDB_STORE_IMPL_H
17 #define NATIVE_RDB_RDB_STORE_IMPL_H
18 
19 #include <list>
20 #include <map>
21 #include <memory>
22 #include <mutex>
23 #include <thread>
24 
25 #include "rdb_store.h"
26 #include "rdb_store_config.h"
27 #include "sqlite_connection_pool.h"
28 #include "sqlite_statement.h"
29 #include "store_session.h"
30 
31 #include "transaction_observer.h"
32 
33 namespace OHOS::NativeRdb {
34 class RdbStoreImpl : public RdbStore, public std::enable_shared_from_this<RdbStoreImpl> {
35 public:
36     static std::shared_ptr<RdbStore> Open(const RdbStoreConfig &config, int &errCode);
37     RdbStoreImpl();
38     ~RdbStoreImpl() override;
39 
40     int Insert(int64_t &outRowId, const std::string &table, const ValuesBucket &initialValues) override;
41     int Replace(int64_t &outRowId, const std::string &table, const ValuesBucket &initialValues) override;
42     int InsertWithConflictResolution(int64_t &outRowId, const std::string &table, const ValuesBucket &initialValues,
43         ConflictResolution conflictResolution) override;
44     int Update(int &changedRows, const std::string &table, const ValuesBucket &values, const std::string &whereClause,
45         const std::vector<std::string> &whereArgs) override;
46     int UpdateWithConflictResolution(int &changedRows, const std::string &table, const ValuesBucket &values,
47         const std::string &whereClause, const std::vector<std::string> &whereArgs,
48         ConflictResolution conflictResolution) override;
49     int Delete(int &deletedRows, const std::string &table, const std::string &whereClause,
50         const std::vector<std::string> &whereArgs) override;
51     std::unique_ptr<AbsSharedResultSet> Query(int &errCode, bool distinct,
52         const std::string &table, const std::vector<std::string> &columns,
53         const std::string &selection, const std::vector<std::string> &selectionArgs, const std::string &groupBy,
54         const std::string &having, const std::string &orderBy, const std::string &limit) override;
55     std::unique_ptr<AbsSharedResultSet> QuerySql(const std::string &sql,
56         const std::vector<std::string> &selectionArgs) override;
57     int ExecuteSql(const std::string &sql, const std::vector<ValueObject> &bindArgs) override;
58     int ExecuteAndGetLong(int64_t &outValue, const std::string &sql, const std::vector<ValueObject> &bindArgs) override;
59     int ExecuteAndGetString(std::string &outValue, const std::string &sql,
60         const std::vector<ValueObject> &bindArgs) override;
61     int ExecuteForLastInsertedRowId(int64_t &outValue, const std::string &sql,
62         const std::vector<ValueObject> &bindArgs) override;
63     int ExecuteForChangedRowCount(int64_t &outValue, const std::string &sql,
64         const std::vector<ValueObject> &bindArgs) override;
65     int Backup(const std::string databasePath, const std::vector<uint8_t> destEncryptKey) override;
66     int Attach(const std::string &alias, const std::string &pathName,
67         const std::vector<uint8_t> destEncryptKey) override;
68     int GetVersion(int &version) override;
69     int SetVersion(int version) override;
70     int BeginTransaction() override;
71     int RollBack() override;
72     int Commit() override;
73     int MarkAsCommit() override;
74     int EndTransaction() override;
75     bool IsInTransaction() override;
76     int ChangeEncryptKey(const std::vector<uint8_t> &newKey) override;
77     std::shared_ptr<SqliteStatement> BeginStepQuery(int &errCode, const std::string sql,
78         const std::vector<std::string> &bindArgs);
79     int EndStepQuery();
80     bool IsOpen() const override;
81     std::string GetPath() override;
82     bool IsReadOnly() const override;
83     bool IsMemoryRdb() const override;
84     int PrepareAndGetInfo(const std::string &sql, bool &outIsReadOnly, int &numParameters,
85         std::vector<std::string> &columnNames);
86     bool IsHoldingConnection() override;
87     int GiveConnectionTemporarily(long milliseconds);
88     int BeginTransactionWithObserver(TransactionObserver *transactionObserver);
89     int ConfigLocale(const std::string localeStr);
90     int ChangeDbFileForRestore(const std::string newPath, const std::string backupPath,
91         const std::vector<uint8_t> &newKey) override;
92     std::string GetName();
93     std::string GetOrgPath();
94     std::string GetFileType();
95     std::string GetFileSecurityLevel();
96     int ExecuteForSharedBlock(int &rowNum, AppDataFwk::SharedBlock *sharedBlock, int startPos, int requiredPos,
97         bool isCountAllRows, std::string sql, std::vector<ValueObject> &bindArgVec);
98     std::unique_ptr<ResultSet> QueryByStep(const std::string &sql,
99         const std::vector<std::string> &selectionArgs) override;
100 
101 
102     std::unique_ptr<AbsSharedResultSet> Query(const AbsRdbPredicates &predicates,
103         const std::vector<std::string> columns) override;
104     int Count(int64_t &outValue, const AbsRdbPredicates &predicates) override;
105     int Update(int &changedRows, const ValuesBucket &values, const AbsRdbPredicates &predicates) override;
106     int Delete(int &deletedRows, const AbsRdbPredicates &predicates) override;
107 
108     bool SetDistributedTables(const std::vector<std::string>& tables) override;
109 
110     std::string ObtainDistributedTableName(const std::string& device, const std::string& table) override;
111 
112     bool Sync(const SyncOption& option, const AbsRdbPredicates& predicate, const SyncCallback& callback) override;
113 
114     bool Subscribe(const SubscribeOption& option, RdbStoreObserver *observer) override;
115 
116     bool UnSubscribe(const SubscribeOption& option, RdbStoreObserver *observer) override;
117 
118     // user must use UDID
119     bool DropDeviceData(const std::vector<std::string>& devices, const DropOption& option) override;
120 
121 private:
122     int InnerOpen(const RdbStoreConfig &config);
123     std::shared_ptr<StoreSession> GetThreadSession();
124     void ReleaseThreadSession();
125     int CheckAttach(const std::string &sql);
126 
127     SqliteConnectionPool *connectionPool;
128     static const int MAX_IDLE_SESSION_SIZE = 5;
129     std::mutex sessionMutex;
130     std::map<std::thread::id, std::pair<std::shared_ptr<StoreSession>, int>> threadMap;
131     std::list<std::shared_ptr<StoreSession>> idleSessions;
132     bool isOpen;
133     std::string path;
134     std::string orgPath;
135     bool isReadOnly;
136     bool isMemoryRdb;
137     std::string name;
138     std::string fileSecurityLevel;
139     std::string fileType;
140     std::stack<TransactionObserver *> transactionObserverStack;
141 
142     DistributedRdb::RdbSyncerParam syncerParam_;
143 };
144 }
145 #endif
146