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 OHOS_MEDIALIBRARY_RDBSTORE_H 17 #define OHOS_MEDIALIBRARY_RDBSTORE_H 18 19 #include <memory> 20 #include <mutex> 21 22 #include "medialibrary_async_worker.h" 23 #include "medialibrary_unistore.h" 24 #include "timer.h" 25 #include "value_object.h" 26 #include "medialibrary_rdb_transaction.h" 27 28 namespace OHOS { 29 namespace Media { 30 #define EXPORT __attribute__ ((visibility ("default"))) 31 32 class MediaLibraryDataCallBack; 33 34 class MediaLibraryRdbStore final : public MediaLibraryUnistore { 35 public: 36 EXPORT explicit MediaLibraryRdbStore(const std::shared_ptr<OHOS::AbilityRuntime::Context> &context); 37 EXPORT virtual ~MediaLibraryRdbStore(); 38 39 EXPORT virtual int32_t Init() override; 40 EXPORT int32_t Init(const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback); 41 EXPORT virtual void Stop() override; 42 EXPORT static bool CheckRdbStore(); 43 EXPORT virtual int32_t Insert(MediaLibraryCommand &cmd, int64_t &rowId) override; 44 EXPORT virtual int32_t BatchInsert(MediaLibraryCommand &cmd, int64_t& outInsertNum, 45 std::vector<NativeRdb::ValuesBucket>& values) override; 46 EXPORT virtual int32_t Delete(MediaLibraryCommand &cmd, int32_t &deletedRows) override; 47 EXPORT virtual int32_t Update(MediaLibraryCommand &cmd, int32_t &changedRows) override; 48 EXPORT std::shared_ptr<NativeRdb::ResultSet> Query(MediaLibraryCommand &cmd, 49 const std::vector<std::string> &columns) override; 50 EXPORT static std::shared_ptr<NativeRdb::ResultSet> Query(const NativeRdb::AbsRdbPredicates &predicates, 51 const std::vector<std::string> &columns); 52 53 EXPORT int32_t ExecuteSql(const std::string &sql) override; 54 EXPORT std::shared_ptr<NativeRdb::ResultSet> QuerySql(const std::string &sql, 55 const std::vector<std::string> &selectionArgs = std::vector<std::string>()) override; 56 57 EXPORT static int32_t BatchInsert(int64_t &outRowId, const std::string &table, 58 std::vector<NativeRdb::ValuesBucket> &values); 59 EXPORT static void BuildValuesSql(const NativeRdb::ValuesBucket &values, 60 std::vector<NativeRdb::ValueObject> &bindArgs, std::string &sql); 61 EXPORT static void BuildQuerySql(const NativeRdb::AbsRdbPredicates &predicates, 62 const std::vector<std::string> &columns, std::vector<NativeRdb::ValueObject> &bindArgs, std::string &sql); 63 EXPORT static int32_t ExecuteForLastInsertedRowId(const std::string &sql, 64 const std::vector<NativeRdb::ValueObject> &bindArgs); 65 EXPORT static std::shared_ptr<NativeRdb::ResultSet> QueryWithFilter(const NativeRdb::AbsRdbPredicates &predicates, 66 const std::vector<std::string> &columns); 67 EXPORT static int32_t Delete(const NativeRdb::AbsRdbPredicates &predicates); 68 EXPORT static std::shared_ptr<NativeRdb::ResultSet> StepQueryWithoutCheck( 69 const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> &columns); 70 EXPORT static int32_t UpdateWithDateTime(NativeRdb::ValuesBucket &values, 71 const NativeRdb::AbsRdbPredicates &predicates); 72 static void ReplacePredicatesUriToId(NativeRdb::AbsRdbPredicates &predicates); 73 static std::shared_ptr<NativeRdb::ResultSet> GetIndexOfUri(const NativeRdb::AbsRdbPredicates &predicates, 74 const std::vector<std::string> &columns, const std::string &id); 75 static std::shared_ptr<NativeRdb::ResultSet> GetIndexOfUriForPhotos(const NativeRdb::AbsRdbPredicates &predicates, 76 const std::vector<std::string> &columns, const std::string &id); 77 EXPORT static int32_t GetInt(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::string &column); 78 EXPORT static std::string GetString(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, 79 const std::string &column); 80 EXPORT static bool ResetAnalysisTables(); 81 EXPORT static bool ResetSearchTables(); 82 EXPORT static int32_t UpdateLastVisitTime(const std::string &id); 83 EXPORT static bool HasColumnInTable(NativeRdb::RdbStore &store, const std::string &columnName, 84 const std::string &tableName); 85 static void AddColumnIfNotExists(NativeRdb::RdbStore &store, const std::string &columnName, 86 const std::string &columnType, const std::string &tableName); 87 EXPORT static int32_t QueryPragma(const std::string &key, int64_t &value); 88 EXPORT static void SetOldVersion(int32_t oldVersion); 89 EXPORT static int32_t GetOldVersion(); 90 EXPORT static void CreateBurstIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 91 EXPORT static void UpdateBurstDirty(const std::shared_ptr<MediaLibraryRdbStore> store); 92 EXPORT static void UpdateReadyOnThumbnailUpgrade(const std::shared_ptr<MediaLibraryRdbStore> store); 93 EXPORT static void UpdateDateTakenToMillionSecond(const std::shared_ptr<MediaLibraryRdbStore> store); 94 EXPORT static void AddIndexForFileIdAsync(const std::shared_ptr<MediaLibraryRdbStore> store); 95 EXPORT static void UpdateDateTakenIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 96 EXPORT static void UpdateDateTakenAndDetalTime(const std::shared_ptr<MediaLibraryRdbStore> store); 97 EXPORT static void ClearAudios(const std::shared_ptr<MediaLibraryRdbStore> store); 98 EXPORT static void UpdateIndexForCover(const std::shared_ptr<MediaLibraryRdbStore> store); 99 EXPORT static void UpdateLcdStatusNotUploaded(const std::shared_ptr<MediaLibraryRdbStore> store); 100 EXPORT static void AddReadyCountIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 101 EXPORT static void RevertFixDateAddedIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 102 EXPORT static void AddAlbumIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 103 EXPORT static void UpdateLocationKnowledgeIdx(const std::shared_ptr<MediaLibraryRdbStore> store); 104 EXPORT static void AddAlbumSubtypeAndNameIdx(const std::shared_ptr<MediaLibraryRdbStore> store); 105 EXPORT static void UpdateThumbnailVisibleAndIdx(const std::shared_ptr<MediaLibraryRdbStore> store); 106 EXPORT static void AddCloudEnhancementAlbumIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 107 EXPORT static void AddPhotoDateAddedIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 108 EXPORT static void AddPhotoWhiteBlocksIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 109 EXPORT static void AddPhotoSortIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 110 EXPORT static void UpdateLatitudeAndLongitudeDefaultNull(const std::shared_ptr<MediaLibraryRdbStore> store); 111 EXPORT static void UpdatePhotoQualityCloned(const std::shared_ptr<MediaLibraryRdbStore> store); 112 EXPORT static void UpdateMdirtyTriggerForTdirty(const std::shared_ptr<MediaLibraryRdbStore> store); 113 EXPORT static int32_t ReconstructMediaLibraryStorageFormat(const std::shared_ptr<MediaLibraryRdbStore> store); 114 EXPORT static std::shared_ptr<NativeRdb::ResultSet> QueryEditDataExists( 115 const NativeRdb::AbsRdbPredicates &predicates); 116 EXPORT static int32_t InsertInternal(int64_t &outRowId, const std::string &table, NativeRdb::ValuesBucket &row); 117 EXPORT int Update(int &changedRows, const std::string &table, const NativeRdb::ValuesBucket &row, 118 const std::string &whereClause, const std::vector<std::string> &args); 119 EXPORT std::string ObtainDistributedTableName(const std::string &device, const std::string &table, int &errCode); 120 EXPORT int Backup(const std::string &databasePath, const std::vector<uint8_t> &encryptKey = {}); 121 EXPORT int Backup(const std::string &databasePath, bool integrityCheck, 122 const std::vector<uint8_t> &encryptKey = {}); 123 EXPORT int Sync(const DistributedRdb::SyncOption &option, const NativeRdb::AbsRdbPredicates &predicate, 124 const DistributedRdb::AsyncBrief &async); 125 EXPORT std::shared_ptr<NativeRdb::ResultSet> QueryByStep(const std::string &sql, 126 const std::vector<NativeRdb::ValueObject> &args = {}); 127 EXPORT std::shared_ptr<NativeRdb::ResultSet> QueryByStep(const NativeRdb::AbsRdbPredicates &predicates, 128 const std::vector<std::string> &columns = {}); 129 EXPORT int Update(int &changedRows, const NativeRdb::ValuesBucket &row, 130 const NativeRdb::AbsRdbPredicates &predicates); 131 EXPORT int Insert(int64_t &outRowId, const std::string &table, NativeRdb::ValuesBucket &row); 132 EXPORT int Delete(int &deletedRows, const std::string &table, const std::string &whereClause, 133 const std::vector<std::string> &args); 134 EXPORT int Delete(int &deletedRows, const NativeRdb::AbsRdbPredicates &predicates); 135 EXPORT std::shared_ptr<NativeRdb::AbsSharedResultSet> QuerySql(const std::string &sql, 136 const std::vector<NativeRdb::ValueObject> &args); 137 EXPORT int InterruptBackup(); 138 EXPORT bool IsSlaveDiffFromMaster() const; 139 EXPORT int Restore(const std::string &backupPath, const std::vector<uint8_t> &newKey = {}); 140 static int32_t DoDeleteFromPredicates(const NativeRdb::AbsRdbPredicates &predicates, int32_t &deletedRows); 141 int32_t DataCallBackOnCreate(); ExecuteSql(std::string & sql,const std::vector<NativeRdb::ValueObject> & args)142 EXPORT int32_t ExecuteSql(std::string &sql, const std::vector<NativeRdb::ValueObject> &args) 143 { 144 return MediaLibraryRdbStore::GetRaw()->ExecuteSql(sql, args); 145 } 146 147 EXPORT static std::pair<int32_t, NativeRdb::Results> BatchInsert(const std::string &table, 148 std::vector<NativeRdb::ValuesBucket> &values, const std::string &returningField); 149 EXPORT std::pair<int32_t, NativeRdb::Results> Update(const NativeRdb::ValuesBucket &row, 150 const NativeRdb::AbsRdbPredicates &predicates, const std::string &returningField); 151 EXPORT std::pair<int32_t, NativeRdb::Results> Delete(const NativeRdb::AbsRdbPredicates &predicates, 152 const std::string &returningField); 153 EXPORT std::pair<int32_t, NativeRdb::Results> Execute(const std::string &sql, 154 const std::vector<NativeRdb::ValueObject> &args, const std::string &returningField); 155 156 static void WalCheckPoint(); 157 EXPORT int ExecuteForChangedRowCount(int64_t &outValue, const std::string &sql, 158 const std::vector<NativeRdb::ValueObject> &args = {}); 159 EXPORT static void UpdateMediaTypeAndThumbnailReadyIdx(const std::shared_ptr<MediaLibraryRdbStore> rdbStore); 160 EXPORT static std::shared_ptr<NativeRdb::ResultSet> QueryMovingPhotoVideoReady( 161 const NativeRdb::AbsRdbPredicates &predicaties); 162 EXPORT static int32_t UpdateEditDataSize(std::shared_ptr<MediaLibraryRdbStore> rdbStore, 163 const std::string &photoId, const std::string &photoPath); 164 165 private: 166 EXPORT static std::shared_ptr<NativeRdb::RdbStore> GetRaw(); 167 EXPORT static const std::string CloudSyncTriggerFunc(const std::vector<std::string> &args); 168 EXPORT static const std::string IsCallerSelfFunc(const std::vector<std::string> &args); 169 EXPORT static const std::string RegexReplaceFunc(const std::vector<std::string> &args); 170 static int32_t BatchInsertCommon(int64_t &outRowCount, const std::string &table, 171 std::vector<NativeRdb::ValuesBucket> &values, std::function<int32_t()> execBatchInsert); 172 friend class TransactionOperations; 173 static std::shared_ptr<NativeRdb::RdbStore> rdbStore_; 174 EXPORT static const std::string BeginGenerateHighlightThumbnail(const std::vector<std::string>& args); 175 EXPORT static const std::string PhotoAlbumNotifyFunc(const std::vector<std::string>& args); 176 static std::mutex reconstructLock_; 177 static std::mutex walCheckPointMutex_; 178 NativeRdb::RdbStoreConfig config_ {""}; 179 }; 180 181 class CompensateAlbumIdData : public AsyncTaskData { 182 public: CompensateAlbumIdData(const std::shared_ptr<MediaLibraryRdbStore> store,std::mutex & lock)183 CompensateAlbumIdData(const std::shared_ptr<MediaLibraryRdbStore> store, std::mutex &lock) 184 : upgradeStore_(store), lock_(lock){}; 185 virtual ~CompensateAlbumIdData() override = default; 186 std::shared_ptr<MediaLibraryRdbStore> upgradeStore_; 187 std::mutex &lock_; 188 }; 189 190 class MediaLibraryDataCallBack : public NativeRdb::RdbOpenCallback { 191 public: 192 struct DirValuesBucket { 193 int32_t directoryType; 194 std::string dirValues; 195 std::string typeValues; 196 std::string extensionValues; 197 }; 198 199 struct SmartAlbumValuesBucket { 200 int32_t albumId; 201 std::string albumName; 202 int32_t albumType; 203 }; 204 205 int32_t OnCreate(NativeRdb::RdbStore &rdbStore) override; 206 int32_t OnUpgrade(NativeRdb::RdbStore &rdbStore, int32_t oldVersion, int32_t newVersion) override; 207 208 private: 209 int32_t PrepareDir(NativeRdb::RdbStore &store); 210 int32_t PrepareSmartAlbum(NativeRdb::RdbStore &store); 211 212 int32_t InsertDirValues(const DirValuesBucket &dirValuesBucket, NativeRdb::RdbStore &store); 213 int32_t InsertSmartAlbumValues(const SmartAlbumValuesBucket &smartAlbum, NativeRdb::RdbStore &store); 214 }; 215 } // namespace Media 216 } // namespace OHOS 217 218 #endif // OHOS_MEDIALIBRARY_RDBSTORE_OPERATIONS_H 219