• 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 
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