• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 #define MLOG_TAG "MediaAssetsRdbOperations"
17 
18 #include "media_assets_rdb_operations.h"
19 
20 #include <string>
21 
22 #include "abs_rdb_predicates.h"
23 #include "media_log.h"
24 #include "form_map.h"
25 #include "medialibrary_formmap_operations.h"
26 #include "medialibrary_rdbstore.h"
27 #include "media_file_uri.h"
28 #include "medialibrary_errno.h"
29 #include "media_facard_photos_column.h"
30 #include "medialibrary_facard_operations.h"
31 #include "ipc_skeleton.h"
32 #include "medialibrary_type_const.h"
33 #include "medialibrary_asset_operations.h"
34 #include "medialibrary_photo_operations.h"
35 #include "vision_column.h"
36 #include "medialibrary_unistore_manager.h"
37 #include "medialibrary_data_manager.h"
38 #include "medialibrary_rdb_utils.h"
39 #include "medialibrary_tracer.h"
40 #include "photo_album_column.h"
41 #include "result_set_utils.h"
42 #include "dfx_manager.h"
43 #include "multistages_capture_manager.h"
44 #include "enhancement_manager.h"
45 #include "media_analysis_helper.h"
46 #include "story_album_column.h"
47 #include "media_app_uri_permission_column.h"
48 #include "media_file_utils.h"
49 #include "mimetype_utils.h"
50 #include "permission_utils.h"
51 #include "userfile_manager_types.h"
52 #include "media_column.h"
53 #include "photo_map_column.h"
54 #include "photo_file_operation.h"
55 #include "medialibrary_rdb_utils.h"
56 #include "thumbnail_service.h"
57 #include "photo_asset_copy_operation.h"
58 #include "medialibrary_photo_operations.h"
59 #include "file_asset.h"
60 #include "medialibrary_app_uri_sensitive_operations.h"
61 #include "medialibrary_app_uri_permission_operations.h"
62 #include "medialibrary_urisensitive_operations.h"
63 #include "medialibrary_uripermission_operations.h"
64 
65 using namespace std;
66 using namespace OHOS::NativeRdb;
67 using namespace OHOS::RdbDataShareAdapter;
68 
69 namespace OHOS::Media {
70 constexpr int32_t PHOTO_HIDDEN_FLAG = 1;
71 constexpr int32_t POSITION_CLOUD_FLAG = 2;
72 constexpr int32_t CLOUD_COPY_DIRTY_FLAG = 7;
73 
74 std::mutex MediaAssetsRdbOperations::facardMutex_;
75 static const string STATUS = "status";
76 static const string LABEL = "label";
77 static const string AESTHETICS_SCORE = "aesthetics_score";
78 static const string OCR = "ocr";
79 static const string SALIENCY = "saliency";
80 static const string FACE = "face";
81 static const string OBJECT = "object";
82 static const string RECOMMENDATION = "recommendation";
83 static const string SEGMENTATION = "segmentation";
84 static const string HEAD = "head";
85 static const string POSE = "pose";
86 
87 static vector<int> NEED_UPDATE_TYPE = {
88     PhotoAlbumSubType::CLASSIFY, PhotoAlbumSubType::PORTRAIT
89 };
MediaAssetsRdbOperations()90 MediaAssetsRdbOperations::MediaAssetsRdbOperations() {}
QueryFileIdIfExists(const string & fileId)91 bool MediaAssetsRdbOperations::QueryFileIdIfExists(const string& fileId)
92 {
93     NativeRdb::RdbPredicates rdbPredicate(PhotoColumn::PHOTOS_TABLE);
94     rdbPredicate.EqualTo(MediaColumn::MEDIA_ID, fileId);
95     vector<string> columns = { MediaColumn::MEDIA_ID };
96     auto resultSet = MediaLibraryRdbStore::Query(rdbPredicate, columns);
97     if (resultSet != nullptr && resultSet->GoToFirstRow() == NativeRdb::E_OK) {
98         MEDIA_INFO_LOG("file id queried already exists!");
99         return true;
100     }
101     return false;
102 }
103 
QueryFormIdIfExists(const string & formId)104 bool MediaAssetsRdbOperations::QueryFormIdIfExists(const string& formId)
105 {
106     NativeRdb::RdbPredicates rdbPredicate(FormMap::FORM_MAP_TABLE);
107     rdbPredicate.EqualTo(FormMap::FORMMAP_FORM_ID, formId);
108     vector<string> columns = { FormMap::FORMMAP_FORM_ID };
109     auto resultSet = MediaLibraryRdbStore::Query(rdbPredicate, columns);
110     if (resultSet != nullptr && resultSet->GoToFirstRow() == NativeRdb::E_OK) {
111         MEDIA_INFO_LOG("form id queried already exists!");
112         return true;
113     }
114     return false;
115 }
116 
RemoveFormInfo(const string & formId)117 int32_t MediaAssetsRdbOperations::RemoveFormInfo(const string& formId)
118 {
119     MEDIA_INFO_LOG("MediaAssetsRdbOperation::RemoveFormInfo enter");
120     NativeRdb::RdbPredicates rdbPredicate(FormMap::FORM_MAP_TABLE);
121     rdbPredicate.EqualTo(FormMap::FORMMAP_FORM_ID, formId);
122     int32_t deleteRows = MediaLibraryRdbStore::Delete(rdbPredicate);
123     CHECK_AND_RETURN_RET_WARN_LOG(deleteRows > 0, deleteRows, "deleteRows: %{public}d", deleteRows);
124     return deleteRows;
125 }
126 
RemoveGalleryFormInfo(const string & formId)127 int32_t MediaAssetsRdbOperations::RemoveGalleryFormInfo(const string& formId)
128 {
129     lock_guard<mutex> lock(facardMutex_);
130     NativeRdb::RdbPredicates rdbPredicate(TabFaCardPhotosColumn::FACARD_PHOTOS_TABLE);
131     rdbPredicate.EqualTo(TabFaCardPhotosColumn::FACARD_PHOTOS_FORM_ID, formId);
132     MediaLibraryFaCardOperations::UnregisterObserver(formId);
133     return MediaLibraryRdbStore::Delete(rdbPredicate);
134 }
135 
SaveFormInfo(const string & formId,const string & uri)136 int32_t MediaAssetsRdbOperations::SaveFormInfo(const string& formId, const string& uri)
137 {
138     ValuesBucket value;
139     value.PutString(FormMap::FORMMAP_URI, uri);
140 
141     if (!uri.empty()) {
142         MediaFileUri mediaUri(uri);
143         CHECK_AND_RETURN_RET_LOG(QueryFileIdIfExists(mediaUri.GetFileId()),
144             E_GET_PRAMS_FAIL, "the fileId is not exist");
145         vector<int64_t> formIds = { std::stoll(formId) };
146         MediaLibraryFormMapOperations::PublishedChange(uri, formIds, true);
147     }
148     if (QueryFormIdIfExists(formId)) {
149         lock_guard<mutex> lock(facardMutex_);
150         RdbPredicates predicates(FormMap::FORM_MAP_TABLE);
151         predicates.EqualTo(FormMap::FORMMAP_FORM_ID, formId);
152         return MediaLibraryRdbStore::UpdateWithDateTime(value, predicates);
153     }
154 
155     value.PutString(FormMap::FORMMAP_FORM_ID, formId);
156     int64_t outRowId = -1;
157     lock_guard<mutex> lock(facardMutex_);
158     int32_t errCode = MediaLibraryRdbStore::InsertInternal(outRowId, FormMap::FORM_MAP_TABLE, value);
159     bool cond = (errCode != NativeRdb::E_OK || outRowId < 0);
160     CHECK_AND_RETURN_RET_LOG(!cond, E_HAS_DB_ERROR, "Insert into db failed, errCode = %{public}d", errCode);
161     return static_cast<int32_t>(outRowId);
162 }
163 
SaveGalleryFormInfo(const vector<string> & formIds,const vector<string> & fileUris)164 int32_t MediaAssetsRdbOperations::SaveGalleryFormInfo(const vector<string>& formIds,
165     const vector<string>& fileUris)
166 {
167     lock_guard<mutex> lock(facardMutex_);
168     vector<ValuesBucket> values;
169     for (size_t i = 0; i < formIds.size(); i++) {
170         ValuesBucket value;
171         value.PutString(TabFaCardPhotosColumn::FACARD_PHOTOS_FORM_ID, formIds[i]);
172         value.PutString(TabFaCardPhotosColumn::FACARD_PHOTOS_ASSET_URI, fileUris[i]);
173         values.emplace_back(value);
174     }
175     int64_t outRowId = 0;
176     int32_t errCode = MediaLibraryRdbStore::BatchInsert(outRowId, TabFaCardPhotosColumn::FACARD_PHOTOS_TABLE,
177         values);
178     bool cond = (errCode != NativeRdb::E_OK || outRowId < 0);
179     CHECK_AND_RETURN_RET_LOG(!cond, E_HAS_DB_ERROR, "Batch Insert into db failed, errCode = %{public}d", errCode);
180     for (size_t i = 0; i < formIds.size(); i++) {
181         MEDIA_INFO_LOG("formId = %{public}s, assetRegisterUri = %{public}s", formIds[i].c_str(),
182             fileUris[i].c_str());
183         MediaLibraryFaCardOperations::RegisterObserver(formIds[i], fileUris[i]);
184     }
185     return static_cast<int32_t>(outRowId);
186 }
187 
CommitEditInsert(const string & editData,int32_t fileId)188 int32_t MediaAssetsRdbOperations::CommitEditInsert(const string& editData, int32_t fileId)
189 {
190     NativeRdb::RdbPredicates rdbPredicate(PhotoColumn::PHOTOS_TABLE);
191     rdbPredicate.EqualTo(MediaColumn::MEDIA_ID, to_string(fileId));
192     vector<string> columns = {
193         PhotoColumn::MEDIA_FILE_PATH,
194         PhotoColumn::MEDIA_NAME,
195         PhotoColumn::PHOTO_EDIT_TIME,
196         PhotoColumn::MEDIA_TIME_PENDING,
197         PhotoColumn::MEDIA_DATE_TRASHED,
198         PhotoColumn::PHOTO_SUBTYPE,
199         PhotoColumn::MOVING_PHOTO_EFFECT_MODE,
200         PhotoColumn::PHOTO_ORIGINAL_SUBTYPE,
201         MediaColumn::MEDIA_DATE_TAKEN,
202         PhotoColumn::PHOTO_OWNER_ALBUM_ID,
203     };
204     auto resultSet = MediaLibraryRdbStore::Query(rdbPredicate, columns);
205     CHECK_AND_RETURN_RET(resultSet != nullptr, E_INVALID_VALUES);
206 
207     shared_ptr<FileAsset> fileAsset = MediaLibraryAssetOperations::GetAssetFromResultSet(resultSet, columns);
208     if (fileAsset == nullptr) {
209         MEDIA_ERR_LOG("Get FileAsset Failed, fileId=%{public}d", fileId);
210         PhotoEditingRecord::GetInstance()->EndCommitEdit(fileId);
211         return E_INVALID_VALUES;
212     }
213     fileAsset->SetId(fileId);
214     int32_t ret = MediaLibraryPhotoOperations::CommitEditInsertExecute(fileAsset, editData);
215     PhotoEditingRecord::GetInstance()->EndCommitEdit(fileId);
216     MEDIA_INFO_LOG("commit edit finished, fileId=%{public}d", fileId);
217     return ret;
218 }
219 
UpdateAnalysisTotal(const string & column,const string & selection)220 static int32_t UpdateAnalysisTotal(const string& column, const string& selection)
221 {
222     ValuesBucket value;
223     value.PutInt(STATUS, 0);
224     value.PutString(column, "0");
225     NativeRdb::RdbPredicates rdbPredicate(VISION_TOTAL_TABLE);
226     rdbPredicate.SetWhereClause(selection);
227     auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
228     if (rdbStore == nullptr) {
229         MEDIA_ERR_LOG("Can not get rdbstore");
230         return E_ERR;
231     }
232     int32_t changeRows = 0;
233     int32_t err = rdbStore->Update(changeRows, value, rdbPredicate);
234     CHECK_AND_RETURN_RET(err == NativeRdb::E_OK, err);
235     return changeRows;
236 }
237 
DeleteFromVisionTable(const string & fileId,const string & column,const string & table,const string & selection)238 static void DeleteFromVisionTable(const string& fileId, const string& column, const string& table,
239     const string& selection)
240 {
241     int32_t updateRows = UpdateAnalysisTotal(column, selection);
242     if (updateRows <= 0) {
243         return;
244     }
245 
246     NativeRdb::RdbPredicates rdbPredicate(table);
247     rdbPredicate.EqualTo(MediaColumn::MEDIA_ID, fileId);
248     MediaLibraryRdbStore::Delete(rdbPredicate);
249 }
250 
DeleteFromVisionTablesForVideo(const string & fileId,const string & table)251 static void DeleteFromVisionTablesForVideo(const string& fileId, const string& table)
252 {
253     NativeRdb::RdbPredicates rdbPredicate(table);
254     rdbPredicate.EqualTo(MediaColumn::MEDIA_ID, fileId);
255     MediaLibraryRdbStore::Delete(rdbPredicate);
256 }
257 
DeleteFromVisionTables(const string & fileId)258 void MediaAssetsRdbOperations::DeleteFromVisionTables(const string& fileId)
259 {
260     string selectionTotal = MediaColumn::MEDIA_ID + " = " + fileId + " AND label = 1";
261     DeleteFromVisionTable(fileId, LABEL, VISION_LABEL_TABLE, selectionTotal);
262     DeleteFromVisionTablesForVideo(fileId, VISION_VIDEO_LABEL_TABLE);
263 
264     selectionTotal = MediaColumn::MEDIA_ID + " = " + fileId + " AND aesthetics_score = 1";
265     DeleteFromVisionTable(fileId, AESTHETICS_SCORE, VISION_AESTHETICS_TABLE, selectionTotal);
266 
267     selectionTotal = MediaColumn::MEDIA_ID + " = " + fileId + " AND ocr = 1";
268     DeleteFromVisionTable(fileId, OCR, VISION_OCR_TABLE, selectionTotal);
269 
270     selectionTotal = MediaColumn::MEDIA_ID + " = " + fileId + " AND saliency = 1";
271     DeleteFromVisionTable(fileId, SALIENCY, VISION_SALIENCY_TABLE, selectionTotal);
272 
273     selectionTotal = MediaColumn::MEDIA_ID + " = " + fileId + " AND face IN (-2, 1, 2, 3, 4)";
274     DeleteFromVisionTable(fileId, FACE, VISION_IMAGE_FACE_TABLE, selectionTotal);
275 
276     selectionTotal = MediaColumn::MEDIA_ID + " = " + fileId + " AND object = 1";
277     DeleteFromVisionTable(fileId, OBJECT, VISION_OBJECT_TABLE, selectionTotal);
278 
279     selectionTotal = MediaColumn::MEDIA_ID + " = " + fileId + " AND recommendation = 1";
280     DeleteFromVisionTable(fileId, RECOMMENDATION, VISION_RECOMMENDATION_TABLE, selectionTotal);
281 
282     selectionTotal = MediaColumn::MEDIA_ID + " = " + fileId + " AND segmentation = 1";
283     DeleteFromVisionTable(fileId, SEGMENTATION, VISION_SEGMENTATION_TABLE, selectionTotal);
284 
285     selectionTotal = MediaColumn::MEDIA_ID + " = " + fileId + " AND head = 1";
286     DeleteFromVisionTable(fileId, HEAD, VISION_HEAD_TABLE, selectionTotal);
287 
288     selectionTotal = MediaColumn::MEDIA_ID + " = " + fileId + " AND pose = 1";
289     DeleteFromVisionTable(fileId, POSE, VISION_POSE_TABLE, selectionTotal);
290 }
291 
QueryAlbumIdIfExists(const std::string & albumId)292 bool MediaAssetsRdbOperations::QueryAlbumIdIfExists(const std::string& albumId)
293 {
294     int32_t count = 0;
295     NativeRdb::RdbPredicates rdbPredicate(PhotoAlbumColumns::TABLE);
296     rdbPredicate.EqualTo(PhotoAlbumColumns::ALBUM_ID, albumId);
297     vector<string> columns = { PhotoAlbumColumns::ALBUM_ID };
298     auto resultSet = MediaLibraryRdbStore::Query(rdbPredicate, columns);
299     if (resultSet != nullptr) {
300         resultSet->GetRowCount(count);
301         resultSet->Close();
302     }
303     return count == 1;
304 }
305 
GrantPhotoUrisPermissionInner(MediaLibraryCommand & cmd,const std::vector<DataShare::DataShareValuesBucket> & values)306 int32_t MediaAssetsRdbOperations::GrantPhotoUrisPermissionInner(MediaLibraryCommand &cmd,
307     const std::vector<DataShare::DataShareValuesBucket> &values)
308 {
309     int32_t ret = UriSensitiveOperations::GrantUriSensitive(cmd, values);
310     CHECK_AND_RETURN_RET(ret >= 0, ret);
311     return UriPermissionOperations::GrantUriPermission(cmd, values);
312 }
313 
CancelPhotoUrisPermissionInner(MediaLibraryCommand & cmd,const DataShare::DataSharePredicates & values)314 int32_t MediaAssetsRdbOperations::CancelPhotoUrisPermissionInner(MediaLibraryCommand &cmd,
315     const DataShare::DataSharePredicates &values)
316 {
317     NativeRdb::RdbPredicates rdbPredicate = RdbUtils::ToPredicates(values,
318         cmd.GetTableName());
319     int32_t errCode = MediaLibraryAppUriPermissionOperations::DeleteOperation(rdbPredicate);
320     MEDIA_INFO_LOG("MediaAssetsService::CancelPhotoUriPermissionInner ret:%{public}d", errCode);
321     return errCode;
322 }
323 
CheckPhotoUriPermissionInner(MediaLibraryCommand & cmd,const DataShare::DataSharePredicates & predicates,const std::vector<std::string> & columns,std::vector<std::string> & outFileIds,std::vector<int32_t> & permissionTypes)324 int32_t MediaAssetsRdbOperations::CheckPhotoUriPermissionInner(MediaLibraryCommand &cmd,
325     const DataShare::DataSharePredicates &predicates, const std::vector<std::string> &columns,
326     std::vector<std::string> &outFileIds, std::vector<int32_t> &permissionTypes)
327 {
328     cmd.SetDataSharePred(predicates);
329     int errCode = 0;
330     auto queryResultSet = MediaLibraryDataManager::GetInstance()->Query(cmd, columns, predicates, errCode);
331     if (queryResultSet == nullptr) {
332         MEDIA_ERR_LOG("queryResultSet is nullptr! errCode: %{public}d", errCode);
333         return errCode;
334     }
335     shared_ptr<DataShareResultSet> dataShareResultSet = make_shared<DataShareResultSet>(queryResultSet);
336     while (dataShareResultSet->GoToNextRow() == NativeRdb::E_OK) {
337         outFileIds.emplace_back(GetStringVal(AppUriPermissionColumn::FILE_ID, dataShareResultSet));
338         permissionTypes.emplace_back(GetInt32Val(AppUriPermissionColumn::PERMISSION_TYPE, dataShareResultSet));
339     }
340     return errCode;
341 }
342 
QueryAssetsUri(const std::vector<std::string> & fileIds,std::vector<std::string> & uris)343 void MediaAssetsRdbOperations::QueryAssetsUri(const std::vector<std::string> &fileIds,
344     std::vector<std::string> &uris)
345 {
346     NativeRdb::RdbPredicates rdbPredicate(PhotoColumn::PHOTOS_TABLE);
347     rdbPredicate.In(MediaColumn::MEDIA_ID, fileIds);
348 
349     std::vector<std::string> columns = {
350         MediaColumn::MEDIA_ID,
351         MediaColumn::MEDIA_NAME,
352         MediaColumn::MEDIA_FILE_PATH
353     };
354     auto resultSet = MediaLibraryRdbStore::Query(rdbPredicate, columns);
355     CHECK_AND_RETURN_LOG(resultSet != nullptr, "resultSet is nullptr");
356 
357     while (resultSet->GoToNextRow() == NativeRdb::E_OK) {
358         std::string fileId = GetStringVal(MediaColumn::MEDIA_ID, resultSet);
359         std::string displayName = GetStringVal(MediaColumn::MEDIA_NAME, resultSet);
360         std::string assetPath = GetStringVal(MediaColumn::MEDIA_FILE_PATH, resultSet);
361 
362         string extrUri = MediaFileUtils::GetExtraUri(displayName, assetPath);
363         uris.push_back(MediaFileUtils::GetUriByExtrConditions(PhotoColumn::PHOTO_URI_PREFIX, fileId, extrUri));
364     }
365     resultSet->Close();
366 }
367 
CheckOprnObject(OperationObject object)368 static bool CheckOprnObject(OperationObject object)
369 {
370     const set<OperationObject> validOprnObjectet = {
371         OperationObject::FILESYSTEM_PHOTO,
372         OperationObject::FILESYSTEM_AUDIO
373     };
374     if (validOprnObjectet.find(object) == validOprnObjectet.end()) {
375         MEDIA_ERR_LOG("input OperationObject %{public}d error!", object);
376         return false;
377     }
378     return true;
379 }
380 
FetchFileAssetFromResultSet(const shared_ptr<NativeRdb::ResultSet> & resultSet,const vector<string> & columns)381 static shared_ptr<FileAsset> FetchFileAssetFromResultSet(
382     const shared_ptr<NativeRdb::ResultSet> &resultSet, const vector<string> &columns)
383 {
384     int32_t count = 0;
385     int32_t currentRowIndex = 0;
386     CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, nullptr, "resultSet is nullptr");
387     CHECK_AND_RETURN_RET_LOG(
388         resultSet->GetRowCount(count) == NativeRdb::E_OK, nullptr, "Cannot get row count of resultset");
389     CHECK_AND_RETURN_RET_LOG(
390         resultSet->GetRowIndex(currentRowIndex) == NativeRdb::E_OK, nullptr, "Cannot get row index of resultset");
391     CHECK_AND_RETURN_RET_LOG(currentRowIndex >= 0 && currentRowIndex < count, nullptr, "Invalid row index");
392 
393     auto fileAsset = make_shared<FileAsset>();
394     auto &map = fileAsset->GetMemberMap();
395     for (const auto &column : columns) {
396         int32_t columnIndex = 0;
397         CHECK_AND_RETURN_RET_LOG(resultSet->GetColumnIndex(column, columnIndex) == NativeRdb::E_OK,
398             nullptr, "Can not get column %{private}s index", column.c_str());
399         CHECK_AND_RETURN_RET_LOG(FILEASSET_MEMBER_MAP.find(column) != FILEASSET_MEMBER_MAP.end(), nullptr,
400             "Can not find column %{private}s from member map", column.c_str());
401         switch (FILEASSET_MEMBER_MAP.at(column)) {
402             case MEMBER_TYPE_INT32: {
403                 int32_t value = 0;
404                 CHECK_AND_RETURN_RET_LOG(resultSet->GetInt(columnIndex, value) == NativeRdb::E_OK, nullptr,
405                     "Can not get int value from column %{private}s", column.c_str());
406                 map[column] = value;
407                 break;
408             }
409             case MEMBER_TYPE_INT64: {
410                 int64_t value = 0;
411                 CHECK_AND_RETURN_RET_LOG(resultSet->GetLong(columnIndex, value) == NativeRdb::E_OK, nullptr,
412                     "Can not get long value from column %{private}s", column.c_str());
413                 map[column] = value;
414                 break;
415             }
416             case MEMBER_TYPE_STRING: {
417                 string value;
418                 CHECK_AND_RETURN_RET_LOG(resultSet->GetString(columnIndex, value) == NativeRdb::E_OK, nullptr,
419                     "Can not get string value from column %{private}s", column.c_str());
420                 map[column] = value;
421                 break;
422             }
423             case MEMBER_TYPE_DOUBLE: {
424                 double value;
425                 CHECK_AND_RETURN_RET_LOG(resultSet->GetDouble(columnIndex, value) == NativeRdb::E_OK, nullptr,
426                     "Can not get double value from column %{private}s", column.c_str());
427                 map[column] = value;
428                 break;
429             }
430         }
431     }
432     return fileAsset;
433 }
434 
GetAssetFromResultSet(const shared_ptr<NativeRdb::ResultSet> & resultSet,const vector<string> & columns)435 static shared_ptr<FileAsset> GetAssetFromResultSet(
436     const shared_ptr<NativeRdb::ResultSet> &resultSet, const vector<string> &columns)
437 {
438     CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, nullptr, "resultSet is nullptr");
439     int32_t count = 0;
440     CHECK_AND_RETURN_RET_LOG(resultSet->GetRowCount(count) == NativeRdb::E_OK, nullptr,
441         "Cannot get row count of resultset");
442     CHECK_AND_RETURN_RET_LOG(count == 1, nullptr, "ResultSet count is %{public}d, not 1", count);
443     CHECK_AND_RETURN_RET_LOG(resultSet->GoToFirstRow() == NativeRdb::E_OK, nullptr, "Cannot go to first row");
444     return FetchFileAssetFromResultSet(resultSet, columns);
445 }
446 
GetFileAssetFromDb(const string & column,const string & value,OperationObject oprnObject,const vector<string> & columns,const string & networkId)447 shared_ptr<FileAsset> MediaAssetsRdbOperations::GetFileAssetFromDb(const string &column,
448     const string &value, OperationObject oprnObject, const vector<string> &columns, const string &networkId)
449 {
450     MediaLibraryTracer tracer;
451     tracer.Start("MediaLibraryAssetOperations::GetFileAssetFromDb");
452     if (!CheckOprnObject(oprnObject) || column.empty() || value.empty()) {
453         return nullptr;
454     }
455 
456     auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
457     if (rdbStore == nullptr) {
458         return nullptr;
459     }
460 
461     MediaLibraryCommand cmd(oprnObject, OperationType::QUERY, networkId);
462     cmd.GetAbsRdbPredicates()->EqualTo(column, value);
463 
464     auto resultSet = rdbStore->Query(cmd, columns);
465     if (resultSet == nullptr) {
466         return nullptr;
467     }
468     return GetAssetFromResultSet(resultSet, columns);
469 }
470 
471 const static vector<string> EDITED_COLUMN_VECTOR = {
472     PhotoColumn::MEDIA_FILE_PATH,
473     PhotoColumn::MEDIA_NAME,
474     PhotoColumn::PHOTO_EDIT_TIME,
475     PhotoColumn::MEDIA_TIME_PENDING,
476     PhotoColumn::MEDIA_DATE_TRASHED,
477     PhotoColumn::PHOTO_SUBTYPE,
478     PhotoColumn::MOVING_PHOTO_EFFECT_MODE,
479     PhotoColumn::PHOTO_ORIGINAL_SUBTYPE,
480     MediaColumn::MEDIA_DATE_TAKEN,
481 };
482 
RevertToOrigin(const int32_t & fileId)483 int32_t MediaAssetsRdbOperations::RevertToOrigin(const int32_t &fileId)
484 {
485     shared_ptr<FileAsset> fileAsset = GetFileAssetFromDb(PhotoColumn::MEDIA_ID,
486         to_string(fileId), OperationObject::FILESYSTEM_PHOTO, EDITED_COLUMN_VECTOR);
487     if (fileAsset == nullptr) {
488         MEDIA_ERR_LOG("Get FileAsset From Uri Failed, fileId:%{public}d", fileId);
489         return E_INVALID_VALUES;
490     }
491     fileAsset->SetId(fileId);
492     CHECK_AND_RETURN_RET(PhotoEditingRecord::GetInstance()->StartRevert(fileId), E_IS_IN_COMMIT);
493 
494     int32_t errCode = MediaLibraryPhotoOperations::DoRevertEdit(fileAsset);
495     PhotoEditingRecord::GetInstance()->EndRevert(fileId);
496     return errCode;
497 }
498 
GrantPhotoUriPermission(MediaLibraryCommand & cmd)499 int32_t MediaAssetsRdbOperations::GrantPhotoUriPermission(MediaLibraryCommand &cmd)
500 {
501     int32_t ret = MediaLibraryAppUriSensitiveOperations::HandleInsertOperation(cmd);
502     CHECK_AND_RETURN_RET(ret == MediaLibraryAppUriSensitiveOperations::SUCCEED, ret);
503     return MediaLibraryAppUriPermissionOperations::HandleInsertOperation(cmd);
504 }
505 
GrantPhotoUrisPermission(MediaLibraryCommand & cmd,const std::vector<DataShare::DataShareValuesBucket> & values)506 int32_t MediaAssetsRdbOperations::GrantPhotoUrisPermission(
507     MediaLibraryCommand &cmd, const std::vector<DataShare::DataShareValuesBucket> &values)
508 {
509     int32_t ret = MediaLibraryAppUriSensitiveOperations::BatchInsert(cmd, values);
510     CHECK_AND_RETURN_RET(ret == MediaLibraryAppUriSensitiveOperations::SUCCEED, ret);
511     CHECK_AND_RETURN_RET(!MediaLibraryAppUriSensitiveOperations::BeForceSensitive(cmd, values), ret);
512     return MediaLibraryAppUriPermissionOperations::BatchInsert(cmd, values);
513 }
514 
CancelPhotoUriPermission(NativeRdb::RdbPredicates & rdbPredicate)515 int32_t MediaAssetsRdbOperations::CancelPhotoUriPermission(NativeRdb::RdbPredicates &rdbPredicate)
516 {
517     return MediaLibraryAppUriPermissionOperations::DeleteOperation(rdbPredicate);
518 }
519 
StartThumbnailCreationTask(NativeRdb::RdbPredicates & rdbPredicate,int32_t requestId)520 int32_t MediaAssetsRdbOperations::StartThumbnailCreationTask(NativeRdb::RdbPredicates &rdbPredicate, int32_t requestId)
521 {
522     MEDIA_INFO_LOG("MediaAssetsRdbOperations::StartThumbnailCreationTask requestId:%{public}d", requestId);
523     return ThumbnailService::GetInstance()->CreateAstcBatchOnDemand(rdbPredicate, requestId);
524 }
525 
StopThumbnailCreationTask(int32_t requestId)526 int32_t MediaAssetsRdbOperations::StopThumbnailCreationTask(int32_t requestId)
527 {
528     MEDIA_INFO_LOG("MediaAssetsRdbOperations::StopThumbnailCreationTask requestId:%{public}d", requestId);
529     ThumbnailService::GetInstance()->CancelAstcBatchTask(requestId);
530     return E_OK;
531 }
532 
QueryEnhancementTaskState(const string & photoUri,QueryCloudEnhancementTaskStateDto & dto)533 int32_t MediaAssetsRdbOperations::QueryEnhancementTaskState(const string& photoUri,
534     QueryCloudEnhancementTaskStateDto& dto)
535 {
536     vector<string> columns = {
537         MediaColumn::MEDIA_ID, PhotoColumn::PHOTO_ID,
538         PhotoColumn::PHOTO_CE_AVAILABLE, PhotoColumn::PHOTO_CE_STATUS_CODE
539     };
540     MediaLibraryCommand cmd(PhotoColumn::PHOTOS_TABLE);
541     DataShare::DataSharePredicates predicates;
542     predicates.EqualTo(MediaColumn::MEDIA_ID, photoUri);
543     cmd.SetDataSharePred(predicates);
544     auto resultSet = EnhancementManager::GetInstance().HandleQueryOperation(cmd, columns);
545     bool cond = (resultSet == nullptr || resultSet->GoToFirstRow() != NativeRdb::E_OK);
546     CHECK_AND_RETURN_RET_LOG(!cond, -E_HAS_DB_ERROR, "Failed to query album!");
547     dto.fileId = GetInt32Val(MediaColumn::MEDIA_ID, resultSet);
548     dto.photoId = GetStringVal(PhotoColumn::PHOTO_ID, resultSet);
549     dto.ceAvailable = GetInt32Val(PhotoColumn::PHOTO_CE_AVAILABLE, resultSet);
550     dto.ceErrorCode = GetInt32Val(PhotoColumn::PHOTO_CE_STATUS_CODE, resultSet);
551     resultSet->Close();
552     return E_OK;
553 }
554 
GetUrisByOldUrisInner(MediaLibraryCommand & cmd,const DataShare::DataSharePredicates & predicates,const std::vector<std::string> & columns)555 std::shared_ptr<DataShare::DataShareResultSet> MediaAssetsRdbOperations::GetUrisByOldUrisInner(MediaLibraryCommand &cmd,
556     const DataShare::DataSharePredicates &predicates, const std::vector<std::string> &columns)
557 {
558     cmd.SetDataSharePred(predicates);
559     int errCode = 0;
560     auto queryResultSet = MediaLibraryDataManager::GetInstance()->Query(cmd, columns, predicates, errCode);
561     if (queryResultSet == nullptr) {
562         MEDIA_ERR_LOG("queryResultSet is nullptr! errCode: %{public}d", errCode);
563         return nullptr;
564     }
565     shared_ptr<DataShareResultSet> dataShareResultSet = make_shared<DataShareResultSet>(queryResultSet);
566     return dataShareResultSet;
567 }
568 } // namespace OHOS::Media