From a203e310a0db33f0f3782c6af04f2ca68fd2d0b5 Mon Sep 17 00:00:00 2001 From: qinghaopeng Date: Thu, 10 Jul 2025 16:34:51 +0800 Subject: [PATCH] =?UTF-8?q?=E9=BB=84=E8=93=9D=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off0-by: qinghaopeng --- .../medialibrary_data_extension/BUILD.gn | 1 + .../backgroud_deleted_photo_processor.h | 31 ++ .../include/medialibrary_data_manager.h | 2 +- .../operation/photo_edit_size_operation.h | 42 +++ .../src/backgroud_deleted_photo_processor.cpp | 220 ++++++++++++ .../src/medialibrary_data_manager.cpp | 225 ------------ .../src/medialibrary_photo_operations.cpp | 147 -------- .../src/medialibrary_rdbstore.cpp | 18 - .../src/medialibrary_subscriber.cpp | 52 +-- .../operation/photo_edit_size_operation.cpp | 324 ++++++++++++++++++ 10 files changed, 623 insertions(+), 439 deletions(-) create mode 100644 frameworks/innerkitsimpl/medialibrary_data_extension/include/backgroud_deleted_photo_processor.h create mode 100644 frameworks/innerkitsimpl/medialibrary_data_extension/include/operation/photo_edit_size_operation.h create mode 100644 frameworks/innerkitsimpl/medialibrary_data_extension/src/backgroud_deleted_photo_processor.cpp create mode 100644 frameworks/innerkitsimpl/medialibrary_data_extension/src/operation/photo_edit_size_operation.cpp diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/BUILD.gn b/frameworks/innerkitsimpl/medialibrary_data_extension/BUILD.gn index fe488f06e4..fbd4d275ff 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/BUILD.gn +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/BUILD.gn @@ -605,6 +605,7 @@ ohos_shared_library("medialibrary_data_extension") { "src/operation/photo_day_month_year_operation.cpp", "src/operation/photo_displayname_operation.cpp", "src/operation/photo_file_operation.cpp", + "src/operation/photo_edit_size_operation.cpp", "src/operation/photo_owner_album_id_operation.cpp", "src/operation/photo_source_path_operation.cpp", "src/operation/photo_storage_operation.cpp", diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/include/backgroud_deleted_photo_processor.h b/frameworks/innerkitsimpl/medialibrary_data_extension/include/backgroud_deleted_photo_processor.h new file mode 100644 index 0000000000..c0a726e893 --- /dev/null +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/include/backgroud_deleted_photo_processor.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_MEDIALIBRARY_BACKGROUND_DELETED_PHOTO_PROCESSOR_H +#define OHOS_MEDIALIBRARY_BACKGROUND_DELETED_PHOTO_PROCESSOR_H + +#include +#include "medialibrary_rdbstore.h" + + +namespace OHOS::Media { +#define EXPORT __attribute__ ((visibility ("default"))) +using namespace FileManagement::CloudSync; +class BackgroundCloudFileProcessor { +public: + EXPORT static int32_t ClearDirtyDiskData(); +}; +} // namespace OHOS::Media +#endif // OHOS_MEDIALIBRARY_BACKGROUND_DELETED_PHOTO_PROCESSOR_H \ No newline at end of file diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_data_manager.h b/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_data_manager.h index a1c30d1b84..8da3d59e93 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_data_manager.h +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/include/medialibrary_data_manager.h @@ -114,7 +114,7 @@ public: EXPORT int32_t UpdateDirtyForCloudClone(int32_t version); EXPORT int32_t ClearDirtyHdcData(); EXPORT int32_t ClearDirtyDiskData(); - EXPORT int32_t UpdateMediaSizeFromStorage(); + EXPORT int HandleAnalysisFaceUpdate(MediaLibraryCommand& cmd, NativeRdb::ValuesBucket &value, const DataShare::DataSharePredicates &predicates); private: diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/include/operation/photo_edit_size_operation.h b/frameworks/innerkitsimpl/medialibrary_data_extension/include/operation/photo_edit_size_operation.h new file mode 100644 index 0000000000..4f0dd80b2e --- /dev/null +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/include/operation/photo_edit_size_operation.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2024-2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_MEDIA_PHOTO_EDIT_SIZE_OPERATIOIN_H +#define OHOS_MEDIA_PHOTO_EDIT_SIZE_OPERATIOIN_H + +#include + +#include "medialibrary_rdbstore.h" + +namespace OHOS::Media { +#define EXPORT __attribute__ ((visibility ("default"))) +class PhotoEditSizeOperation { +public: + EXPORT static int32_t CalSingleEditDataSize(const std::string &fileId); + EXPORT static int32_t GetFileIdsAndPathS(const std::shared_ptr rdbStore, + std::vector &fileIds, std::vector &filePaths, std::string startFileId, + bool &hasMore, int32_t limitCount); + EXPORT static int32_t ConvertPhotoCloudPathToLocalData(std::string retrievedPath, std::string &filePath); + EXPORT static int32_t GetFilePathById(const shared_ptr rdbStore, + const std::string &fileId, std::string &filePath); + EXPORT static int32_t GetFileIdByCloudPath(const shared_ptr rdbStore, std::string &fileId, + const std::string &filePath); + EXPORT static int32_t UpdateMediaSizeFromStorage(); + EXPORT static int32_t UpdateSingleEditDataSize(std::shared_ptr rdbStore, + const std::string &photoId, const std::string &editDataDir); + +}; +} // namespace OHOS::Media +#endif // FRAMEWORKS_INNERKITSIMPL_MEDIA_LIBRARY_INCLUDE_PHOTO_EDIT_SIZE_H_ \ No newline at end of file diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/backgroud_deleted_photo_processor.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/backgroud_deleted_photo_processor.cpp new file mode 100644 index 0000000000..3f1fa6ae3b --- /dev/null +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/backgroud_deleted_photo_processor.cpp @@ -0,0 +1,220 @@ +/* + * Copyright (C) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "backgroud_deleted_photo_processor.h" + +#include "media_log.h" +#include "medialibrary_errno.h" +#include "medialibrary_unistore_manager.h" +#include "medialibrary_subscriber.h" +#include "medialibrary_data_manager_utils.h" +#include "preferences.h" +#include "preferences_helper.h" +#include "media_file_utils.h" + +using namespace std; +namespace OHOS::Media { +const std::string DFX_COMMON_XML = "/data/storage/el2/base/preferences/dfx_common.xml"; +const std::string LAST_CLEAR_DISK_DIRTY_DATA_TIME = "last_clear_disk_dirty_data_time"; +static const std::string TASK_PROGRESS_XML = "/data/storage/el2/base/preferences/task_progress.xml"; +static const std::string NO_DELETE_DISK_DATA_INDEX = "no_delete_disk_data_index"; + +static bool IsPathInRdbStore(const std::string& path) +{ + auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore(); + if (!rdbStore) { + MEDIA_ERR_LOG("Failed to get RdbStore instance"); + return true; + } + + std::string sql = "SELECT " + MediaColumn::MEDIA_ID + + " FROM " + PhotoColumn::PHOTOS_TABLE + + " WHERE " + MediaColumn::MEDIA_FILE_PATH + " = ?"; + + std::vector params = {path}; + auto result = rdbStore->QuerySql(sql, params); + if (!result) { + MEDIA_ERR_LOG("Query to get result failed"); + return true; + } + if (result->GoToFirstRow() != NativeRdb::E_OK) { + MEDIA_ERR_LOG("Query path existence failed: %{public}s", path.c_str()); + return false; + } + + return true; +} + +static void ScanAndCleanDirectory(const std::string& directoryPath, const std::string& cloudPath) +{ + if (!std::filesystem::exists(directoryPath) || !std::filesystem::is_directory(directoryPath)) { + MEDIA_INFO_LOG("Directory not found or invalid: %{public}s", directoryPath.c_str()); + return; + } + + for (const auto& entry : std::filesystem::directory_iterator(directoryPath, + std::filesystem::directory_options::skip_permission_denied)) { + const auto& entryPath = entry.path(); + const std::string entryName = entryPath.filename().string(); + std::string entryCloudPath = cloudPath + "/" + entryName; + if (!IsPathInRdbStore(entryCloudPath)) { + const bool isDir = entry.is_directory(); + const std::string pathStr = entryPath.string(); + if (isDir) { + std::filesystem::remove_all(entryPath); + MEDIA_INFO_LOG("Deleted invalid directory: %{public}s", pathStr.c_str()); + } else { + std::filesystem::remove(entryPath); + MEDIA_INFO_LOG("Deleted invalid file: %{public}s", pathStr.c_str()); + } + } + if (!MedialibrarySubscriber::IsCurrentStatusOn()) { + MEDIA_INFO_LOG("Current status is off, skip disk cleanup"); + break; + } + } +} + +static std::vector GetAllPhotoDirectoryIndices() +{ + static const std::vector BASE_DIRS = { + "/storage/media/local/files/Photo", + "/storage/media/local/files/.editData/Photo", + "/storage/media/local/files/.thumbs/Photo" + }; + + std::vector indices; + for (const auto& baseDir : BASE_DIRS) { + if (!std::filesystem::exists(baseDir) || !std::filesystem::is_directory(baseDir)) { + MEDIA_INFO_LOG("Directory not found or invalid: %{public}s", baseDir.c_str()); + continue; + } + for (const auto& entry : std::filesystem::directory_iterator(baseDir, + std::filesystem::directory_options::skip_permission_denied)) { + if (!entry.is_directory()) { + continue; + } + std::string dirName = entry.path().filename().string(); + if (OHOS::Media::MediaLibraryDataManagerUtils::IsNumber(dirName)) { + int32_t index = std::stoi(match.str()); + indices.push_back(index); + } + } + } + return indices; +} + +static void ClearCategoryDirtyDiskData(const std::string& categoryDirTemplate, int32_t& dirIndex) +{ + char fullPath[256]; + if (sprintf_s(fullPath, sizeof(fullPath), categoryDirTemplate.c_str(), dirIndex) <= 0) { + MEDIA_ERR_LOG("Sprintf_s fullPath failed, dirIndex: %{public}d", dirIndex); + return; + } + + char cloudPath[256]; + static const std::string cloudDir = "/storage/cloud/files/Photo/%d"; + if (sprintf_s(cloudPath, sizeof(cloudPath), cloudDir.c_str(), dirIndex) <= 0) { + MEDIA_ERR_LOG("Sprintf_s cloudPath failed, dirIndex: %{public}d", dirIndex); + return; + } + + ScanAndCleanDirectory(fullPath, cloudPath); +} + +static void CleanEndHandler(shared_ptr prefsProgress) +{ + MEDIA_INFO_LOG("All directories cleaned, resetting index to 1"); + prefsProgress->PutInt(NO_DELETE_DISK_DATA_INDEX, 1); + prefsProgress->FlushSync(); + int32_t errCode; + shared_ptr prefsTime = + NativePreferences::PreferencesHelper::GetPreferences(DFX_COMMON_XML, errCode); + if (prefsTime == nullptr) { + MEDIA_ERR_LOG("Get preferences error: %{public}d", errCode); + return; + } + int64_t currentTime = MediaFileUtils::UTCTimeSeconds(); + prefsTime->PutLong(LAST_CLEAR_DISK_DIRTY_DATA_TIME, currentTime); + prefsTime->FlushSync(); +} + +static void GetIndicesHandler(std::vector &indices, shared_ptr prefsProgress) +{ + indices = GetAllPhotoDirectoryIndices(); + if (indices.empty()) { + MEDIA_INFO_LOG("No photo directories to clean, resetting index to 1"); + prefsProgress->PutInt(NO_DELETE_DISK_DATA_INDEX, 1); + prefsProgress->FlushSync(); + return; + } + + std::sort(indices.begin(), indices.end()); + auto last = std::unique(indices.begin(), indices.end()); + indices.erase(last, indices.end()); +} + +int32_t MediaLibraryDataManager::ClearDirtyDiskData() +{ + if (!MedialibrarySubscriber::IsCurrentStatusOn()) { + MEDIA_INFO_LOG("Current status is off, skip disk cleanup"); + return E_OK; + } + int32_t errCode; + shared_ptr prefsProgress = + NativePreferences::PreferencesHelper::GetPreferences(TASK_PROGRESS_XML, errCode); + if (prefsProgress == nullptr) { + MEDIA_ERR_LOG("Get preferences error: %{public}d", errCode); + return errCode; + } + int32_t currentIndex = prefsProgress->GetInt(NO_DELETE_DISK_DATA_INDEX, 0); + std::vector indices; + GetIndicesHandler(indices, prefsProgress); + + auto it = std::lower_bound(indices.begin(), indices.end(), currentIndex); + if ((it == indices.end()) || (*it > indices.back())) { + MEDIA_INFO_LOG("Cleanup completed for all directories, resetting index to 1"); + prefsProgress->PutInt(NO_DELETE_DISK_DATA_INDEX, 1); + prefsProgress->FlushSync(); + return E_OK; + } + + static const std::vector CLEAN_DIR_TEMPLATES = { + "/storage/media/local/files/Photo/%d", + "/storage/media/local/files/.editData/Photo/%d", + "/storage/media/local/files/.thumbs/Photo/%d" + }; + + for (; it != indices.end(); ++it) { + int32_t dirIndex = *it; + + for (const auto& dirTemplate : CLEAN_DIR_TEMPLATES) { + ClearCategoryDirtyDiskData(dirTemplate, dirIndex); + } + if (!MedialibrarySubscriber::IsCurrentStatusOn()) { + MEDIA_INFO_LOG("Current status is off, skip disk cleanup"); + break; + } + } + prefsProgress->PutInt(NO_DELETE_DISK_DATA_INDEX, *it); + prefsProgress->FlushSync(); + + if (it == indices.end()) { + CleanEndHandler(prefsProgress); + } + return E_OK; + +} // namespace Media +} // namespace OHOS diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_data_manager.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_data_manager.cpp index 413a0c4398..1e6fd9fa0a 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_data_manager.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_data_manager.cpp @@ -2183,191 +2183,6 @@ static int32_t SearchDateTakenWhenZero(const shared_ptr rd return E_OK; } -static bool IsPathInRdbStore(const std::string& path) -{ - auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore(); - if (!rdbStore) { - MEDIA_ERR_LOG("Failed to get RdbStore instance"); - return true; - } - - std::string sql = "SELECT " + MediaColumn::MEDIA_ID + - " FROM " + PhotoColumn::PHOTOS_TABLE + - " WHERE " + MediaColumn::MEDIA_FILE_PATH + " = ?"; - - std::vector params = {path}; - auto result = rdbStore->QuerySql(sql, params); - if (!result || (result->GoToFirstRow() != NativeRdb::E_OK)) { - MEDIA_ERR_LOG("Query path existence failed: %{public}s", path.c_str()); - return false; - } - - return true; -} - -static void ScanAndCleanDirectory(const std::string& directoryPath, const std::string& cloudPath) -{ - if (!std::filesystem::exists(directoryPath) || !std::filesystem::is_directory(directoryPath)) { - MEDIA_INFO_LOG("Directory not found or invalid: %{public}s", directoryPath.c_str()); - return; - } - - for (const auto& entry : std::filesystem::directory_iterator(directoryPath, - std::filesystem::directory_options::skip_permission_denied)) { - const auto& entryPath = entry.path(); - const std::string entryName = entryPath.filename().string(); - std::string entryCloudPath = cloudPath + "/" + entryName; - if (!IsPathInRdbStore(entryCloudPath)) { - const bool isDir = entry.is_directory(); - const std::string pathStr = entryPath.string(); - if (isDir) { - std::filesystem::remove_all(entryPath); - MEDIA_INFO_LOG("Deleted invalid directory: %{public}s", pathStr.c_str()); - } else { - std::filesystem::remove(entryPath); - MEDIA_INFO_LOG("Deleted invalid file: %{public}s", pathStr.c_str()); - } - } - if (!MedialibrarySubscriber::IsCurrentStatusOn()) { - MEDIA_INFO_LOG("Current status is off, skip disk cleanup"); - break; - } - } -} - -static std::vector GetAllPhotoDirectoryIndices() -{ - static const std::vector BASE_DIRS = { - "/storage/media/local/files/Photo", - "/storage/media/local/files/.editData/Photo", - "/storage/media/local/files/.thumbs/Photo" - }; - - std::vector indices; - for (const auto& baseDir : BASE_DIRS) { - if (!std::filesystem::exists(baseDir) || !std::filesystem::is_directory(baseDir)) { - MEDIA_INFO_LOG("Directory not found or invalid: %{public}s", baseDir.c_str()); - continue; - } - for (const auto& entry : std::filesystem::directory_iterator(baseDir, - std::filesystem::directory_options::skip_permission_denied)) { - if (!entry.is_directory()) { - continue; - } - std::string dirName = entry.path().filename().string(); - std::regex numRegex(R"(\d+)"); - std::smatch match; - - if (std::regex_search(dirName, match, numRegex)) { - int32_t index = std::stoi(match.str()); - indices.push_back(index); - } - } - } - return indices; -} - -static void ClearCategoryDirtyDiskData(const std::string& categoryDirTemplate, int32_t& dirIndex) -{ - char fullPath[256]; - if (sprintf_s(fullPath, sizeof(fullPath), categoryDirTemplate.c_str(), dirIndex) <= 0) { - MEDIA_ERR_LOG("Sprintf_s fullPath failed, dirIndex: %{public}d", dirIndex); - return; - } - - char cloudPath[256]; - static const std::string cloudDir = "/storage/cloud/files/Photo/%d"; - if (sprintf_s(cloudPath, sizeof(cloudPath), cloudDir.c_str(), dirIndex) <= 0) { - MEDIA_ERR_LOG("Sprintf_s cloudPath failed, dirIndex: %{public}d", dirIndex); - return; - } - - ScanAndCleanDirectory(fullPath, cloudPath); -} - -static void CleanEndHandler(shared_ptr prefsProgress) -{ - MEDIA_INFO_LOG("All directories cleaned, resetting index to 1"); - prefsProgress->PutInt(NO_DELETE_DISK_DATA_INDEX, 1); - prefsProgress->FlushSync(); - int32_t errCode; - shared_ptr prefsTime = - NativePreferences::PreferencesHelper::GetPreferences(DFX_COMMON_XML, errCode); - if (prefsTime == nullptr) { - MEDIA_ERR_LOG("Get preferences error: %{public}d", errCode); - return; - } - int64_t currentTime = MediaFileUtils::UTCTimeSeconds(); - prefsTime->PutLong(LAST_CLEAR_DISK_DIRTY_DATA_TIME, currentTime); - prefsTime->FlushSync(); -} - -static void GetIndicesHandler(std::vector &indices, shared_ptr prefsProgress) -{ - indices = GetAllPhotoDirectoryIndices(); - if (indices.empty()) { - MEDIA_INFO_LOG("No photo directories to clean, resetting index to 1"); - prefsProgress->PutInt(NO_DELETE_DISK_DATA_INDEX, 1); - prefsProgress->FlushSync(); - return; - } - - std::sort(indices.begin(), indices.end()); - auto last = std::unique(indices.begin(), indices.end()); - indices.erase(last, indices.end()); -} - -int32_t MediaLibraryDataManager::ClearDirtyDiskData() -{ - if (!MedialibrarySubscriber::IsCurrentStatusOn()) { - MEDIA_INFO_LOG("Current status is off, skip disk cleanup"); - return E_OK; - } - int32_t errCode; - shared_ptr prefsProgress = - NativePreferences::PreferencesHelper::GetPreferences(TASK_PROGRESS_XML, errCode); - if (prefsProgress == nullptr) { - MEDIA_ERR_LOG("Get preferences error: %{public}d", errCode); - return errCode; - } - int32_t currentIndex = prefsProgress->GetInt(NO_DELETE_DISK_DATA_INDEX, 0); - std::vector indices; - GetIndicesHandler(indices, prefsProgress); - - auto it = std::lower_bound(indices.begin(), indices.end(), currentIndex); - if ((it == indices.end()) || (*it > indices.back())) { - MEDIA_INFO_LOG("Cleanup completed for all directories, resetting index to 1"); - prefsProgress->PutInt(NO_DELETE_DISK_DATA_INDEX, 1); - prefsProgress->FlushSync(); - return E_OK; - } - - static const std::vector CLEAN_DIR_TEMPLATES = { - "/storage/media/local/files/Photo/%d", - "/storage/media/local/files/.editData/Photo/%d", - "/storage/media/local/files/.thumbs/Photo/%d" - }; - - for (; it != indices.end(); ++it) { - int32_t dirIndex = *it; - - for (const auto& dirTemplate : CLEAN_DIR_TEMPLATES) { - ClearCategoryDirtyDiskData(dirTemplate, dirIndex); - } - if (!MedialibrarySubscriber::IsCurrentStatusOn()) { - MEDIA_INFO_LOG("Current status is off, skip disk cleanup"); - break; - } - } - prefsProgress->PutInt(NO_DELETE_DISK_DATA_INDEX, *it); - prefsProgress->FlushSync(); - - if (it == indices.end()) { - CleanEndHandler(prefsProgress); - } - return E_OK; -} - static void Update500EditDataSize(const shared_ptr rdbStore, std::string startFileId, bool &hasMore) { @@ -2420,46 +2235,6 @@ static void Update500EditDataSize(const shared_ptr rdbStor } } -int32_t MediaLibraryDataManager::UpdateMediaSizeFromStorage() -{ - if (!MedialibrarySubscriber::IsCurrentStatusOn()) { - MEDIA_INFO_LOG("Current status is off, skip disk cleanup"); - return E_OK; - } - - auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore(); - if (!rdbStore) { - MEDIA_ERR_LOG("RdbStore is null"); - return E_HAS_DB_ERROR; - } - - int32_t errCode; - shared_ptr prefs = - NativePreferences::PreferencesHelper::GetPreferences(TASK_PROGRESS_XML, errCode); - if (prefs == nullptr) { - MEDIA_ERR_LOG("Get preferences error: %{public}d", errCode); - return errCode; - } - - int32_t startFileId = prefs->GetInt(UPDATE_EDITDATA_SIZE_COUNT, 0); - bool hasMore = true; - while (hasMore) { - if (!MedialibrarySubscriber::IsCurrentStatusOn()) { - MEDIA_INFO_LOG("Current status is off, skip disk cleanup"); - return E_OK; - } - prefs->PutInt(UPDATE_EDITDATA_SIZE_COUNT, startFileId); - prefs->FlushSync(); - Update500EditDataSize(rdbStore, std::to_string(startFileId), hasMore); - // 一次500张图片 - startFileId += 500; - } - - prefs->PutInt(NO_UPDATE_EDITDATA_SIZE, 1); - prefs->FlushSync(); - return E_OK; -} - int32_t MediaLibraryDataManager::BatchInsertMediaAnalysisData(MediaLibraryCommand &cmd, const vector &values) { diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_photo_operations.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_photo_operations.cpp index 4c503d58a2..935fa95500 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_photo_operations.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_photo_operations.cpp @@ -1284,148 +1284,6 @@ static int32_t UpdateIsTempAndDirty(MediaLibraryCommand &cmd, const string &file return updateDirtyRows; } -static int32_t CalSingleEditDataSize(const std::string &fileId) -{ - auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore(); - if (rdbStore == nullptr) { - MEDIA_ERR_LOG("rdbStore is nullptr"); - return E_DB_FAIL; - } - - std::string filePath; - int ret = MediaLibraryPhotoOperations::GetFilePathById(rdbStore, fileId, filePath); - if (ret != E_OK) { - MEDIA_WARN_LOG("Skip invalid file ID: %{public}s (error code: %{public}d)", - fileId.c_str(), ret); - return ret; - } - - return MediaLibraryRdbStore::UpdateEditDataSize(rdbStore, fileId, filePath); -} - -int32_t MediaLibraryPhotoOperations::Get500FileIdsAndPathS(const std::shared_ptr rdbStore, - std::vector &fileIds, std::vector &filePaths, std::string startFileId, bool &hasMore) -{ - fileIds.clear(); - filePaths.clear(); - - MediaLibraryCommand queryCmd(OperationObject::UFM_PHOTO, OperationType::QUERY); - queryCmd.GetAbsRdbPredicates() - ->IsNotNull(MediaColumn::MEDIA_ID) - ->And() - ->IsNotNull(MediaColumn::MEDIA_FILE_PATH); - - if (!startFileId.empty()) { - queryCmd.GetAbsRdbPredicates()->Offset(std::stoi(startFileId)); - } - // 一次查取500个 - queryCmd.GetAbsRdbPredicates()->Limit(500); - - std::vector columns = {MediaColumn::MEDIA_ID, MediaColumn::MEDIA_FILE_PATH}; - - auto result = rdbStore->Query(queryCmd, columns); - if (!result || result->GoToFirstRow() != NativeRdb::E_OK) { - hasMore = false; - MEDIA_ERR_LOG("Query files failed"); - return E_GET_PRAMS_FAIL; - } - - std::string fileId; - std::string filePath; - int count = 0; - do { - fileId = GetStringVal(MediaColumn::MEDIA_ID, result); - filePath = GetStringVal(MediaColumn::MEDIA_FILE_PATH, result); - if (!fileId.empty() && !filePath.empty()) { - fileIds.push_back(fileId); - filePaths.push_back(filePath); - count++; - } - } while (result->GoToNextRow() == NativeRdb::E_OK); - - // 没有取到500个,认为已经取完了所有的数据 - if (count < 500) { - hasMore = false; - } - - return E_OK; -} - -static int32_t ConvertPhotoPathToEditDataDirPath(const std::string &sourcePath, std::string &editDataDir) -{ - if (sourcePath.empty()) { - return E_INVALID_PATH; - } - - editDataDir = MediaLibraryAssetOperations::GetEditDataDirPath(sourcePath); - if (editDataDir.empty()) { - MEDIA_ERR_LOG("Failed to convert path: %{public}s", sourcePath.c_str()); - return E_INVALID_PATH; - } - return E_OK; -} - -static int32_t GetCloudFilePath(const shared_ptr rdbStore, const std::string &fileId, - std::string &filePath) -{ - std::string sql = "SELECT " + MediaColumn::MEDIA_FILE_PATH + - " FROM " + PhotoColumn::PHOTOS_TABLE + - " WHERE " + MediaColumn::MEDIA_ID + " = ?"; - - std::vector params = {fileId}; - auto result = rdbStore->QuerySql(sql, params); - if (!result) { - MEDIA_ERR_LOG("Query failed for fileId: %{public}s", fileId.c_str()); - return E_HAS_DB_ERROR; - } - - if (result->GoToFirstRow() != NativeRdb::E_OK) { - MEDIA_WARN_LOG("File not found for ID: %{public}s", fileId.c_str()); - return E_INVALID_FILEID; - } - - if (result->GetString(0, filePath) != NativeRdb::E_OK || filePath.empty()) { - MEDIA_ERR_LOG("Failed to retrieve file path for ID: %{public}s", fileId.c_str()); - return E_INVALID_FILEID; - } - return E_OK; -} - -int32_t MediaLibraryPhotoOperations::ConvertPhotoCloudPathToLocalData(std::string retrievedPath, std::string &filePath) -{ - static const std::string OLD_PREFIX = "/storage/cloud/"; - static const std::string NEW_PREFIX = "/storage/media/local/"; - if (retrievedPath.compare(0, OLD_PREFIX.length(), OLD_PREFIX) == 0) { - std::string editDataDir; - int32_t ret = ConvertPhotoPathToEditDataDirPath(retrievedPath, editDataDir); - if (ret != E_OK) { - return ret; - } - filePath = NEW_PREFIX + editDataDir.substr(OLD_PREFIX.length()); - MEDIA_INFO_LOG("Converted to local path: %{private}s", filePath.c_str()); - } else { - filePath = std::move(retrievedPath); - } - return E_OK; -} - -int32_t MediaLibraryPhotoOperations::GetFilePathById(const shared_ptr rdbStore, - const std::string &fileId, std::string &filePath) -{ - std::string retrievedPath; - if (GetCloudFilePath(rdbStore, fileId, retrievedPath) != E_OK) { - MEDIA_ERR_LOG("Failed to retrieve file path for ID: %{public}s", fileId.c_str()); - return E_INVALID_FILEID; - } - - if (ConvertPhotoCloudPathToLocalData(retrievedPath, filePath) != E_OK) { - MEDIA_ERR_LOG("Failed to Convert cloue path: %{public}s to local path", retrievedPath.c_str()); - return E_INVALID_FILEID; - } - - return E_OK; -} - int32_t MediaLibraryPhotoOperations::SaveCameraPhoto(MediaLibraryCommand &cmd) { MediaLibraryTracer tracer; @@ -3380,11 +3238,6 @@ int32_t MediaLibraryPhotoOperations::SavePicture(const int32_t &fileType, const MediaFileUtils::CopyFileUtil(assetPath, GetEditDataSourcePath(assetPath)); int32_t ret = MediaChangeEffect::TakeEffectForPicture(picture, editData); FileUtils::DealPicture(photoExtInfo.format, assetPath, picture, isHighQualityPicture); - ret = CalSingleEditDataSize(std::to_string(fileId)); - if (ret != E_OK) { - MEDIA_ERR_LOG("CalSingleEditDataSize failed for fileId: %{public}d (ret code: %{public}d)", - fileId, ret); - } } isHighQualityPicture = (picture == nullptr) ? photoExtInfo.isHighQualityPicture : isHighQualityPicture; if (isHighQualityPicture) { diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdbstore.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdbstore.cpp index 2d5bf2c555..e7c4c93794 100755 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdbstore.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdbstore.cpp @@ -372,24 +372,6 @@ void MediaLibraryRdbStore::UpdateDateTakenIndex(const shared_ptr rdbStore, - const std::string &photoId, const std::string &editDataDir) -{ - size_t size = 0; - MediaFileUtils::StatDirSize(editDataDir, size); - std::string sql = "UPDATE " + PhotoExtColumn::PHOTOS_EXT_TABLE + " " - "SET " + PhotoExtColumn::EDITDATA_SIZE + " = " + std::to_string(size) + " " - "WHERE " + PhotoExtColumn::PHOTO_ID + " = '" + photoId + "'"; - - int32_t ret = rdbStore->ExecuteSql(sql); - if (ret != NativeRdb::E_OK) { - MEDIA_ERR_LOG("Execute SQL failed: %{public}d", ret); - return E_DB_FAIL; - } - return E_OK; -} - void MediaLibraryRdbStore::UpdateDateTakenAndDetalTime(const shared_ptr store) { MEDIA_INFO_LOG("UpdateDateTakenAndDetalTime start"); diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_subscriber.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_subscriber.cpp index 5d38b20848..b727090951 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_subscriber.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_subscriber.cpp @@ -78,6 +78,7 @@ #include "background_cloud_file_processor.h" #ifdef MEDIALIBRARY_FEATURE_CLOUD_ENHANCEMENT #include "enhancement_manager.h" +#include "photo_edit_size_operation.h" #endif using namespace OHOS::AAFwk; @@ -430,10 +431,7 @@ void MedialibrarySubscriber::Init() static void QueryUpdateSize(AsyncTaskData *data) { - auto dataManager = MediaLibraryDataManager::GetInstance(); - CHECK_AND_RETURN_LOG(dataManager != nullptr, "dataManager is nullptr"); - - int32_t result = dataManager->UpdateMediaSizeFromStorage(); + int32_t result = PhotoEditSizeOperation::UpdateMediaSizeFromStorage(); CHECK_AND_PRINT_LOG(result == E_OK, "UpdateMediaSizeFromStorage failed"); } @@ -454,10 +452,9 @@ static int32_t UpdateAllEditDataSize() auto asyncWorker = MediaLibraryAsyncWorker::GetInstance(); CHECK_AND_RETURN_RET_LOG(asyncWorker != nullptr, E_FAIL, "Failed to get async worker instance!"); - shared_ptr updateSizeTask = + shared_ptr updateSizeTask = make_shared(QueryUpdateSize, nullptr); - CHECK_AND_RETURN_RET_LOG(updateSizeTask != nullptr, E_FAIL, - "Failed to create async task for updateBurstTask!"); + CHECK_AND_PRINT_LOG(updateSizeTask != nullptr, E_FAIL, "Failed to create async task for updateBurstTask!"); asyncWorker->AddTask(updateSizeTask, false); return E_SUCCESS; } @@ -472,53 +469,12 @@ static void RecoverBackgroundDownloadCloudMediaAsset() CHECK_AND_PRINT_LOG(ret == E_OK, "RecoverDownloadCloudAsset faild"); } -static void ClearDirtyDiskData(AsyncTaskData *data) -{ - auto dataManager = MediaLibraryDataManager::GetInstance(); - CHECK_AND_RETURN_LOG(dataManager != nullptr, "Failed to MediaLibraryDataManager instance!"); - - int32_t result = dataManager->ClearDirtyDiskData(); - CHECK_AND_PRINT_LOG(result == E_OK, "ClearDirtyDiskData faild, result = %{public}d", result); -} - -static int32_t DoClearDirtyDiskData() -{ - auto asyncWorker = MediaLibraryAsyncWorker::GetInstance(); - CHECK_AND_RETURN_RET_LOG(asyncWorker != nullptr, E_FAIL, - "Failed to get async worker instance"); - shared_ptr clearDirtyDiskDataTask = - make_shared(ClearDirtyDiskData, nullptr); - CHECK_AND_RETURN_RET_LOG(clearDirtyDiskDataTask != nullptr, E_FAIL, - "Failed to create async task for clearDirtyDiskDataTask"); - asyncWorker->AddTask(clearDirtyDiskDataTask, false); - return E_SUCCESS; -} - -void MedialibrarySubscriber::ClearDirtyDiskData() -{ - int32_t errCode; - shared_ptr prefs = - NativePreferences::PreferencesHelper::GetPreferences(DFX_COMMON_XML, errCode); - if (prefs == nullptr) { - MEDIA_ERR_LOG("Get preferences error: %{public}d", errCode); - return; - } - - int64_t lastClearTime = prefs->GetLong(LAST_CLEAR_DISK_DIRTY_DATA_TIME, 0); - int64_t currentTime = MediaFileUtils::UTCTimeSeconds(); - if (currentTime - lastClearTime > THIRTY_DAYS) { - int32_t ret = DoClearDirtyDiskData(); - CHECK_AND_PRINT_LOG(ret == E_OK, "DoClearDirtyDiskData failed"); - } -} - void MedialibrarySubscriber::ClearDirtyData() { int32_t errCode; shared_ptr prefs = NativePreferences::PreferencesHelper::GetPreferences(TASK_PROGRESS_XML, errCode); CHECK_AND_RETURN_LOG(prefs, "Get preferences error: %{public}d", errCode); - ClearDirtyDiskData(); TryClearContinueCloneData(); return; } diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/operation/photo_edit_size_operation.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/operation/photo_edit_size_operation.cpp new file mode 100644 index 0000000000..e18812053b --- /dev/null +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/operation/photo_edit_size_operation.cpp @@ -0,0 +1,324 @@ +/* + * Copyright (C) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "photo_edit_size_operation.h" + +#include "media_log.h" +#include "medialibrary_errno.h" +#include "medialibrary_unistore_manager.h" +#include "medialibrary_asset_operations.h" +#include "medialibrary_subscriber.h" +#include "preferences.h" +#include "preferences_helper.h" +#include "rdb_predicates.h" +#include "result_set_utils.h" +#include "media_file_utils.h" + +using namespace std; +namespace OHOS::Media { + +static const std::string TASK_PROGRESS_XML = "/data/storage/el2/base/preferences/task_progress.xml"; +static const std::string UPDATE_EDITDATA_SIZE_COUNT = "update_editdata_size_count"; +static const std::string NO_UPDATE_EDITDATA_SIZE = "no_update_editdata_size"; + +int32_t CalSingleEditDataSize(const std::string &fileId) +{ + auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore(); + if (rdbStore == nullptr) { + MEDIA_ERR_LOG("rdbStore is nullptr"); + return E_DB_FAIL; + } + + std::string filePath; + int ret = MediaLibraryPhotoOperations::GetFilePathById(rdbStore, fileId, filePath); + if (ret != E_OK) { + MEDIA_WARN_LOG("Skip invalid file ID: %{public}s (error code: %{public}d)", + fileId.c_str(), ret); + return ret; + } + + return PhotoEditSizeOperation::UpdateSingleEditDataSize(rdbStore, fileId, filePath); +} + +static int32_t GetCloudFilePath(const shared_ptr rdbStore, const std::string &fileId, + std::string &filePath) +{ + if (!rdbStore) { + MEDIA_ERR_LOG("GetRdbStore failed"); + return E_HAS_DB_ERROR; + } + + std::string sql = "SELECT " + MediaColumn::MEDIA_FILE_PATH + + " FROM " + PhotoColumn::PHOTOS_TABLE + + " WHERE " + MediaColumn::MEDIA_ID + " = ?"; + + std::vector params = {fileId}; + auto result = rdbStore->QuerySql(sql, params); + if (!result) { + MEDIA_ERR_LOG("Query failed for fileId: %{public}s", fileId.c_str()); + return E_HAS_DB_ERROR; + } + + if (result->GoToFirstRow() != NativeRdb::E_OK) { + MEDIA_WARN_LOG("File not found for ID: %{public}s", fileId.c_str()); + return E_INVALID_FILEID; + } + + if (result->GetString(0, filePath) != NativeRdb::E_OK || filePath.empty()) { + MEDIA_ERR_LOG("Failed to retrieve file path for ID: %{public}s", fileId.c_str()); + return E_INVALID_FILEID; + } + return E_OK; +} + +int32_t PhotoEditSizeOperation::GetFileIdByCloudPath(const shared_ptr rdbStore, std::string &fileId, + const std::string &filePath) +{ + if (!rdbStore) { + MEDIA_ERR_LOG("GetRdbStore failed"); + return E_HAS_DB_ERROR; + } + std::string sql = "SELECT " + MediaColumn::MEDIA_ID+ + " FROM " + PhotoColumn::PHOTOS_TABLE + + " WHERE " + MediaColumn::MEDIA_FILE_PATH + " = ?"; + + std::vector params = {filePath}; + auto result = rdbStore->QuerySql(sql, params); + if (!result) { + MEDIA_ERR_LOG("Query failed for fileId: %{public}s", filePath.c_str()); + return E_HAS_DB_ERROR; + } + + if (result->GoToFirstRow() != NativeRdb::E_OK) { + MEDIA_WARN_LOG("File not found for filePath: %{public}s", filePath.c_str()); + return E_INVALID_FILEID; + } + + if (result->GetString(0, fileId) != NativeRdb::E_OK || fileId.empty()) { + MEDIA_ERR_LOG("Failed to retrieve file path for file path: %{public}s", filePath.c_str()); + return E_INVALID_FILEID; + } + return E_OK; +} + +int32_t PhotoEditSizeOperation::GetFilePathById(const shared_ptr rdbStore, + const std::string &fileId, std::string &filePath) +{ + std::string retrievedPath; + if (GetCloudFilePath(rdbStore, fileId, retrievedPath) != E_OK) { + MEDIA_ERR_LOG("Failed to retrieve file path for ID: %{public}s", fileId.c_str()); + return E_INVALID_FILEID; + } + + if (ConvertPhotoCloudPathToLocalData(retrievedPath, filePath) != E_OK) { + MEDIA_ERR_LOG("Failed to Convert cloue path: %{public}s to local path", retrievedPath.c_str()); + return E_INVALID_FILEID; + } + + return E_OK; +} + +static int32_t ConvertPhotoPathToEditDataDirPath(const std::string &sourcePath, std::string &editDataDir) +{ + if (sourcePath.empty()) { + return E_INVALID_PATH; + } + + editDataDir = MediaLibraryAssetOperations::GetEditDataDirPath(sourcePath); + if (editDataDir.empty()) { + MEDIA_ERR_LOG("Failed to convert path: %{public}s", sourcePath.c_str()); + return E_INVALID_PATH; + } + return E_OK; +} + +int32_t PhotoEditSizeOperation::ConvertPhotoCloudPathToLocalData(std::string retrievedPath, std::string &filePath) +{ + static const std::string OLD_PREFIX = "/storage/cloud/"; + static const std::string NEW_PREFIX = "/storage/media/local/"; + if (retrievedPath.compare(0, OLD_PREFIX.length(), OLD_PREFIX) == 0) { + std::string editDataDir; + int32_t ret = ConvertPhotoPathToEditDataDirPath(retrievedPath, editDataDir); + if (ret != E_OK) { + return ret; + } + filePath = NEW_PREFIX + editDataDir.substr(OLD_PREFIX.length()); + MEDIA_INFO_LOG("Converted to local path: %{private}s", filePath.c_str()); + } else { + filePath = std::move(retrievedPath); + } + return E_OK; +} + +static void UpdateLimitEditDataSize(const shared_ptr rdbStore, std::string startFileId, + bool &hasMore, int32_t limitCount) +{ + std::vector filePaths; + std::vector fileIds; + int32_t ret = PhotoEditSizeOperation::GetFileIdsAndPathS(rdbStore, fileIds, filePaths, startFileId, + hasMore, limitCount); + if (ret != E_OK) { + MEDIA_ERR_LOG("Failed to get filePaths and Ids, error code: %{public}d", ret); + return; + } + + if (filePaths.empty() || fileIds.empty()) { + hasMore = false; + MEDIA_ERR_LOG("No files need to update edit data size"); + return; + } + + MEDIA_INFO_LOG("Start to update edit data size for %{public}zu files", fileIds.size()); + int32_t successCount = 0; + int32_t failedCount = 0; + + for (size_t i = 0; i < fileIds.size(); ++i) { + const auto &fileId = fileIds[i]; + const auto &filePath = filePaths[i]; + + std::string editDataFilePath; + ret = MediaLibraryPhotoOperations::ConvertPhotoCloudPathToLocalData(filePath, editDataFilePath); + if (ret != E_OK) { + MEDIA_WARN_LOG("Skip invalid file ID: %{public}s (error code: %{public}d)", + fileId.c_str(), ret); + failedCount++; + continue; + } + + ret = MediaLibraryRdbStore::UpdateEditDataSize(rdbStore, fileId, editDataFilePath); + if (ret == E_OK) { + successCount++; + } else { + MEDIA_ERR_LOG("Update failed for ID: %{public}s, Path: %{public}s (error code: %{public}d)", + fileId.c_str(), editDataFilePath.c_str(), ret); + failedCount++; + } + } + + MEDIA_INFO_LOG("Edit data size update completed: success=%{public}d, failed=%{public}d", + successCount, failedCount); + if (failedCount > 0) { + MEDIA_WARN_LOG("%{public}d files failed to update, check above logs for details", failedCount); + } +} + +int32_t PhotoEditSizeOperation::UpdateMediaSizeFromStorage() +{ + if (!MedialibrarySubscriber::IsCurrentStatusOn()) { + MEDIA_INFO_LOG("Current status is off, skip disk cleanup"); + return E_OK; + } + + auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore(); + if (!rdbStore) { + MEDIA_ERR_LOG("RdbStore is null"); + return E_HAS_DB_ERROR; + } + + int32_t errCode; + shared_ptr prefs = + NativePreferences::PreferencesHelper::GetPreferences(TASK_PROGRESS_XML, errCode); + if (prefs == nullptr) { + MEDIA_ERR_LOG("Get preferences error: %{public}d", errCode); + return errCode; + } + + int32_t startFileId = prefs->GetInt(UPDATE_EDITDATA_SIZE_COUNT, 0); + bool hasMore = true; + // 一次500张图片 + int32_t limitCount = 500; + while (hasMore) { + if (!MedialibrarySubscriber::IsCurrentStatusOn()) { + MEDIA_INFO_LOG("Current status is off, skip disk cleanup"); + return E_OK; + } + prefs->PutInt(UPDATE_EDITDATA_SIZE_COUNT, startFileId); + prefs->FlushSync(); + Update500EditDataSize(rdbStore, std::to_string(startFileId), hasMore, limitCount); + startFileId += limitCount; + } + + prefs->PutInt(NO_UPDATE_EDITDATA_SIZE, 1); + prefs->FlushSync(); + return E_OK; +} + +int32_t PhotoEditSizeOperation::GetFileIdsAndPathS(const std::shared_ptr rdbStore, + std::vector &fileIds, std::vector &filePaths, std::string startFileId, + bool &hasMore, int32_t limitCount) +{ + fileIds.clear(); + filePaths.clear(); + + NativeRdb::RdbPredicates predicates(PhotoColumn::PHOTOS_TABLE) + predicates + .IsNotNull(MediaColumn::MEDIA_ID) + ->And() + ->IsNotNull(MediaColumn::MEDIA_FILE_PATH); + + if ((!startFileId.empty()) && MediaLibraryDataManagerUtils::IsNumber(startFileId)) { + predicates.Offset(std::stoi(startFileId)); + } + predicates.Limit(limitCount); + + std::vector columns = {MediaColumn::MEDIA_ID, MediaColumn::MEDIA_FILE_PATH}; + + auto result = rdbStore->Query(predicates, columns); + if (!result || result->GoToFirstRow() != NativeRdb::E_OK) { + hasMore = false; + MEDIA_ERR_LOG("Query files failed"); + return E_GET_PRAMS_FAIL; + } + + std::string fileId; + std::string filePath; + int count = 0; + do { + fileId = GetStringVal(MediaColumn::MEDIA_ID, result); + filePath = GetStringVal(MediaColumn::MEDIA_FILE_PATH, result); + if (!fileId.empty() && !filePath.empty()) { + fileIds.push_back(fileId); + filePaths.push_back(filePath); + count++; + } + } while (result->GoToNextRow() == NativeRdb::E_OK); + + if (count < limitCount) { + hasMore = false; + } + + return E_OK; +} + +// 更新单条编辑数据大小 +int32_t PhotoEditSizeOperation::UpdateSingleEditDataSize(std::shared_ptr rdbStore, + const std::string &photoId, const std::string &editDataDir) +{ + size_t size = 0; + MediaFileUtils::StatDirSize(editDataDir, size); + std::string sql = "INSERT INTO " + PhotoExtColumn::PHOTOS_EXT_TABLE + " (" + + PhotoExtColumn::PHOTO_ID + ", " + PhotoExtColumn::EDITDATA_SIZE + + ") VALUES (" + photoId + ", " + std::to_string(size) + ")" + + " ON CONFLICT(" + PhotoExtColumn::PHOTO_ID + ")" + " DO UPDATE SET " + + PhotoExtColumn::EDITDATA_SIZE + " = " + std::to_string(size); + + int32_t ret = rdbStore->ExecuteSql(sql); + if (ret != NativeRdb::E_OK) { + MEDIA_ERR_LOG("Execute SQL failed: %{public}d", ret); + return E_DB_FAIL; + } + return E_OK; +} +} // namespace OHOS::Media -- Gitee