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