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