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 #ifdef DISTRIBUTED 32 class MediaLibraryRdbStoreObserver; 33 #endif 34 35 class MediaLibraryDataCallBack; 36 37 class MediaLibraryRdbStore final : public MediaLibraryUnistore { 38 public: 39 EXPORT explicit MediaLibraryRdbStore(const std::shared_ptr<OHOS::AbilityRuntime::Context> &context); 40 EXPORT virtual ~MediaLibraryRdbStore(); 41 42 EXPORT virtual int32_t Init() override; 43 EXPORT int32_t Init(const NativeRdb::RdbStoreConfig &config, int version, NativeRdb::RdbOpenCallback &openCallback); 44 EXPORT virtual void Stop() override; 45 EXPORT static bool CheckRdbStore(); 46 EXPORT virtual int32_t Insert(MediaLibraryCommand &cmd, int64_t &rowId) override; 47 EXPORT virtual int32_t BatchInsert(MediaLibraryCommand &cmd, int64_t& outInsertNum, 48 std::vector<NativeRdb::ValuesBucket>& values) override; 49 EXPORT virtual int32_t Delete(MediaLibraryCommand &cmd, int32_t &deletedRows) override; 50 EXPORT virtual int32_t Update(MediaLibraryCommand &cmd, int32_t &changedRows) override; 51 EXPORT std::shared_ptr<NativeRdb::ResultSet> Query(MediaLibraryCommand &cmd, 52 const std::vector<std::string> &columns) override; 53 EXPORT static std::shared_ptr<NativeRdb::ResultSet> Query(const NativeRdb::AbsRdbPredicates &predicates, 54 const std::vector<std::string> &columns); 55 56 EXPORT int32_t ExecuteSql(const std::string &sql) override; 57 EXPORT std::shared_ptr<NativeRdb::ResultSet> QuerySql(const std::string &sql, 58 const std::vector<std::string> &selectionArgs = std::vector<std::string>()) override; 59 60 EXPORT static int32_t BatchInsert(int64_t &outRowId, const std::string &table, 61 std::vector<NativeRdb::ValuesBucket> &values); 62 EXPORT static void BuildValuesSql(const NativeRdb::ValuesBucket &values, 63 std::vector<NativeRdb::ValueObject> &bindArgs, std::string &sql); 64 EXPORT static void BuildQuerySql(const NativeRdb::AbsRdbPredicates &predicates, 65 const std::vector<std::string> &columns, std::vector<NativeRdb::ValueObject> &bindArgs, std::string &sql); 66 EXPORT static int32_t ExecuteForLastInsertedRowId(const std::string &sql, 67 const std::vector<NativeRdb::ValueObject> &bindArgs); 68 EXPORT static std::shared_ptr<NativeRdb::ResultSet> QueryWithFilter(const NativeRdb::AbsRdbPredicates &predicates, 69 const std::vector<std::string> &columns); 70 EXPORT static int32_t Delete(const NativeRdb::AbsRdbPredicates &predicates); 71 EXPORT static std::shared_ptr<NativeRdb::ResultSet> StepQueryWithoutCheck( 72 const NativeRdb::AbsRdbPredicates &predicates, const std::vector<std::string> &columns); 73 EXPORT static int32_t UpdateWithDateTime(NativeRdb::ValuesBucket &values, 74 const NativeRdb::AbsRdbPredicates &predicates); 75 static void ReplacePredicatesUriToId(NativeRdb::AbsRdbPredicates &predicates); 76 static std::shared_ptr<NativeRdb::ResultSet> GetIndexOfUri(const NativeRdb::AbsRdbPredicates &predicates, 77 const std::vector<std::string> &columns, const std::string &id); 78 static std::shared_ptr<NativeRdb::ResultSet> GetIndexOfUriForPhotos(const NativeRdb::AbsRdbPredicates &predicates, 79 const std::vector<std::string> &columns, const std::string &id); 80 static int32_t GetInt(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::string &column); 81 static std::string GetString(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, const std::string &column); 82 EXPORT static bool ResetAnalysisTables(); 83 EXPORT static bool ResetSearchTables(); 84 EXPORT static int32_t UpdateLastVisitTime(const std::string &id); 85 EXPORT static bool HasColumnInTable(NativeRdb::RdbStore &store, const std::string &columnName, 86 const std::string &tableName); 87 static void AddColumnIfNotExists(NativeRdb::RdbStore &store, const std::string &columnName, 88 const std::string &columnType, const std::string &tableName); 89 EXPORT static int32_t QueryPragma(const std::string &key, int64_t &value); 90 EXPORT static void SetOldVersion(int32_t oldVersion); 91 EXPORT static int32_t GetOldVersion(); 92 EXPORT static void CreateBurstIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 93 EXPORT static void UpdateBurstDirty(const std::shared_ptr<MediaLibraryRdbStore> store); 94 EXPORT static void UpdateReadyOnThumbnailUpgrade(const std::shared_ptr<MediaLibraryRdbStore> store); 95 EXPORT static void UpdateDateTakenToMillionSecond(const std::shared_ptr<MediaLibraryRdbStore> store); 96 EXPORT static void UpdateDateTakenIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 97 EXPORT static void UpdateDateTakenAndDetalTime(const std::shared_ptr<MediaLibraryRdbStore> store); 98 EXPORT static void ClearAudios(const std::shared_ptr<MediaLibraryRdbStore> store); 99 EXPORT static void UpdateIndexForCover(const std::shared_ptr<MediaLibraryRdbStore> store); 100 EXPORT static void UpdateLcdStatusNotUploaded(const std::shared_ptr<MediaLibraryRdbStore> store); 101 EXPORT static void AddReadyCountIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 102 EXPORT static void RevertFixDateAddedIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 103 EXPORT static void AddAlbumIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 104 EXPORT static void UpdateLocationKnowledgeIdx(const std::shared_ptr<MediaLibraryRdbStore> store); 105 EXPORT static void AddCloudEnhancementAlbumIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 106 EXPORT static void AddPhotoDateAddedIndex(const std::shared_ptr<MediaLibraryRdbStore> store); 107 EXPORT static void UpdateLatitudeAndLongitudeDefaultNull(const std::shared_ptr<MediaLibraryRdbStore> store); 108 EXPORT static void UpdatePhotoQualityCloned(const std::shared_ptr<MediaLibraryRdbStore> store); 109 EXPORT static int32_t ReconstructMediaLibraryStorageFormat(const std::shared_ptr<MediaLibraryRdbStore> store); 110 EXPORT static std::shared_ptr<NativeRdb::ResultSet> QueryEditDataExists( 111 const NativeRdb::AbsRdbPredicates &predicates); 112 EXPORT static int32_t InsertInternal(int64_t &outRowId, const std::string &table, NativeRdb::ValuesBucket &row); 113 EXPORT int Update(int &changedRows, const std::string &table, const NativeRdb::ValuesBucket &row, 114 const std::string &whereClause, const std::vector<std::string> &args); 115 EXPORT std::string ObtainDistributedTableName(const std::string &device, const std::string &table, int &errCode); 116 EXPORT int Backup(const std::string &databasePath, const std::vector<uint8_t> &encryptKey = {}); 117 EXPORT int Sync(const DistributedRdb::SyncOption &option, const NativeRdb::AbsRdbPredicates &predicate, 118 const DistributedRdb::AsyncBrief &async); 119 EXPORT std::shared_ptr<NativeRdb::ResultSet> QueryByStep(const std::string &sql, 120 const std::vector<NativeRdb::ValueObject> &args = {}); 121 EXPORT std::shared_ptr<NativeRdb::ResultSet> QueryByStep(const NativeRdb::AbsRdbPredicates &predicates, 122 const std::vector<std::string> &columns = {}); 123 EXPORT int Update(int &changedRows, const NativeRdb::ValuesBucket &row, 124 const NativeRdb::AbsRdbPredicates &predicates); 125 EXPORT int Insert(int64_t &outRowId, const std::string &table, NativeRdb::ValuesBucket &row); 126 EXPORT int Delete(int &deletedRows, const std::string &table, const std::string &whereClause, 127 const std::vector<std::string> &args); 128 EXPORT int Delete(int &deletedRows, const NativeRdb::AbsRdbPredicates &predicates); 129 EXPORT std::shared_ptr<NativeRdb::AbsSharedResultSet> QuerySql(const std::string &sql, 130 const std::vector<NativeRdb::ValueObject> &args); 131 EXPORT int InterruptBackup(); 132 EXPORT bool IsSlaveDiffFromMaster() const; 133 EXPORT int Restore(const std::string &backupPath, const std::vector<uint8_t> &newKey = {}); 134 static int32_t DoDeleteFromPredicates(const NativeRdb::AbsRdbPredicates &predicates, int32_t &deletedRows); 135 int32_t DataCallBackOnCreate(); ExecuteSql(std::string & sql,const std::vector<NativeRdb::ValueObject> & args)136 EXPORT int32_t ExecuteSql(std::string &sql, const std::vector<NativeRdb::ValueObject> &args) 137 { 138 return MediaLibraryRdbStore::GetRaw()->ExecuteSql(sql, args); 139 } 140 static void WalCheckPoint(); 141 EXPORT int ExecuteForChangedRowCount(int64_t &outValue, const std::string &sql, 142 const std::vector<NativeRdb::ValueObject> &args = {}); 143 static void UpdateMediaTypeAndThumbnailReadyIdx(const std::shared_ptr<MediaLibraryRdbStore> rdbStore); 144 145 private: 146 EXPORT static std::shared_ptr<NativeRdb::RdbStore> GetRaw(); 147 EXPORT static const std::string CloudSyncTriggerFunc(const std::vector<std::string> &args); 148 EXPORT static const std::string IsCallerSelfFunc(const std::vector<std::string> &args); 149 EXPORT static const std::string RegexReplaceFunc(const std::vector<std::string> &args); 150 friend class TransactionOperations; 151 static std::shared_ptr<NativeRdb::RdbStore> rdbStore_; 152 EXPORT static const std::string BeginGenerateHighlightThumbnail(const std::vector<std::string>& args); 153 EXPORT static const std::string PhotoAlbumNotifyFunc(const std::vector<std::string>& args); 154 static std::mutex reconstructLock_; 155 static std::mutex walCheckPointMutex_; 156 #ifdef DISTRIBUTED 157 std::shared_ptr<MediaLibraryRdbStoreObserver> rdbStoreObs_; 158 #endif 159 std::string bundleName_ {BUNDLE_NAME}; 160 NativeRdb::RdbStoreConfig config_ {""}; 161 }; 162 163 class CompensateAlbumIdData : public AsyncTaskData { 164 public: CompensateAlbumIdData(const std::shared_ptr<MediaLibraryRdbStore> store,std::mutex & lock)165 CompensateAlbumIdData(const std::shared_ptr<MediaLibraryRdbStore> store, std::mutex &lock) 166 : upgradeStore_(store), lock_(lock){}; 167 virtual ~CompensateAlbumIdData() override = default; 168 std::shared_ptr<MediaLibraryRdbStore> upgradeStore_; 169 std::mutex &lock_; 170 }; 171 172 class MediaLibraryDataCallBack : public NativeRdb::RdbOpenCallback { 173 public: 174 struct DirValuesBucket { 175 int32_t directoryType; 176 std::string dirValues; 177 std::string typeValues; 178 std::string extensionValues; 179 }; 180 181 struct SmartAlbumValuesBucket { 182 int32_t albumId; 183 std::string albumName; 184 int32_t albumType; 185 }; 186 187 int32_t OnCreate(NativeRdb::RdbStore &rdbStore) override; 188 int32_t OnUpgrade(NativeRdb::RdbStore &rdbStore, int32_t oldVersion, int32_t newVersion) override; 189 190 private: 191 int32_t PrepareDir(NativeRdb::RdbStore &store); 192 int32_t PrepareSmartAlbum(NativeRdb::RdbStore &store); 193 194 int32_t InsertDirValues(const DirValuesBucket &dirValuesBucket, NativeRdb::RdbStore &store); 195 int32_t InsertSmartAlbumValues(const SmartAlbumValuesBucket &smartAlbum, NativeRdb::RdbStore &store); 196 }; 197 198 class DeleteFilesTask : public AsyncTaskData { 199 public: DeleteFilesTask(const std::vector<std::string> & ids,const std::vector<std::string> & paths,const std::vector<std::string> & notifyUris,const std::vector<std::string> & dateTakens,const std::vector<int32_t> & subTypes,const std::string & table,int32_t deleteRows,std::string bundleName)200 DeleteFilesTask(const std::vector<std::string> &ids, const std::vector<std::string> &paths, 201 const std::vector<std::string> ¬ifyUris, const std::vector<std::string> &dateTakens, 202 const std::vector<int32_t> &subTypes, const std::string &table, int32_t deleteRows, std::string bundleName) 203 : ids_(ids), paths_(paths), notifyUris_(notifyUris), dateTakens_(dateTakens), subTypes_(subTypes), 204 table_(table), deleteRows_(deleteRows), bundleName_(bundleName) {} 205 virtual ~DeleteFilesTask() override = default; 206 207 std::vector<std::string> ids_; 208 std::vector<std::string> paths_; 209 std::vector<std::string> notifyUris_; 210 std::vector<std::string> dateTakens_; 211 std::vector<int32_t> subTypes_; 212 std::vector<int32_t> isTemps_; 213 std::string table_; 214 int32_t deleteRows_; 215 std::string bundleName_; 216 }; 217 218 #ifdef DISTRIBUTED 219 class MediaLibraryRdbStoreObserver : public NativeRdb::RdbStore::RdbStoreObserver { 220 public: 221 explicit MediaLibraryRdbStoreObserver(const std::string &bundleName); 222 virtual ~MediaLibraryRdbStoreObserver(); 223 void OnChange(const std::vector<std::string> &devices) override; 224 225 private: 226 void NotifyDeviceChange(); 227 static constexpr int NOTIFY_TIME_INTERVAL = 10000; 228 std::unique_ptr<OHOS::Utils::Timer> timer_; 229 uint32_t timerId_ {0}; 230 std::string bundleName_; 231 bool isNotifyDeviceChange_; 232 }; 233 #endif 234 } // namespace Media 235 } // namespace OHOS 236 237 #endif // OHOS_MEDIALIBRARY_RDBSTORE_OPERATIONS_H 238