• 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 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> &notifyUris, 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