diff --git a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdbstore.cpp b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdbstore.cpp index eca1da847735986d8619488b61b8ebfb90cd703b..fbf9bea589a2110dce3d804f61899b9a39db7864 100644 --- a/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdbstore.cpp +++ b/frameworks/innerkitsimpl/medialibrary_data_extension/src/medialibrary_rdbstore.cpp @@ -166,9 +166,16 @@ int32_t MediaLibraryRdbStore::Delete(MediaLibraryCommand &cmd, int32_t &deletedR MEDIA_ERR_LOG("Pointer rdbStore_ is nullptr. Maybe it didn't init successfully."); return E_HAS_DB_ERROR; } - - int32_t ret = rdbStore_->Delete(deletedRows, cmd.GetTableName(), cmd.GetAbsRdbPredicates()->GetWhereClause(), - cmd.GetAbsRdbPredicates()->GetWhereArgs()); + int32_t ret = NativeRdb::E_ERROR; + if (MEDIALIBRARY_TABLE == cmd.GetTableName() || PhotoColumn::PHOTOS_TABLE == cmd.GetTableName()) { + ValuesBucket valuesBucket; + valuesBucket.PutInt(MEDIA_DATA_DB_DIRTY, static_cast(DirtyType::TYPE_DELETED)); + ret = rdbStore_->Update(deletedRows, cmd.GetTableName(), valuesBucket, + cmd.GetAbsRdbPredicates()->GetWhereClause(), cmd.GetAbsRdbPredicates()->GetWhereArgs()); + } else { + ret = rdbStore_->Delete(deletedRows, cmd.GetTableName(), cmd.GetAbsRdbPredicates()->GetWhereClause(), + cmd.GetAbsRdbPredicates()->GetWhereArgs()); + } if (ret != NativeRdb::E_OK) { MEDIA_ERR_LOG("rdbStore_->Delete failed, ret = %{public}d", ret); return E_HAS_DB_ERROR; @@ -211,7 +218,11 @@ shared_ptr MediaLibraryRdbStore::Query(MediaLibraryCommand MEDIA_ERR_LOG("rdbStore_ is nullptr"); return nullptr; } - + if (MEDIALIBRARY_TABLE == cmd.GetTableName() || PhotoColumn::PHOTOS_TABLE == cmd.GetTableName()) { + string strQueryCondition = cmd.GetAbsRdbPredicates()->GetWhereClause(); + strQueryCondition += " AND dirty <> " + std::to_string(static_cast(DirtyType::TYPE_DELETED)); + cmd.GetAbsRdbPredicates()->SetWhereClause(strQueryCondition); + } auto *predicates = cmd.GetAbsRdbPredicates(); #ifdef ML_DEBUG MEDIA_DEBUG_LOG("tablename = %s", cmd.GetTableName().c_str()); @@ -307,9 +318,16 @@ int32_t MediaLibraryRdbStore::Delete(const AbsRdbPredicates &predicates) MEDIA_ERR_LOG("Pointer rdbStore_ is nullptr. Maybe it didn't init successfully."); return E_HAS_DB_ERROR; } - + int err = E_ERR; int32_t deletedRows = 0; - int err = rdbStore_->Delete(deletedRows, predicates); + if (MEDIALIBRARY_TABLE == predicates.GetTableName() || PhotoColumn::PHOTOS_TABLE == predicates.GetTableName()) { + ValuesBucket valuesBucket; + valuesBucket.PutInt(MEDIA_DATA_DB_DIRTY, static_cast(DirtyType::TYPE_DELETED)); + err = rdbStore_->Update(deletedRows, valuesBucket, predicates); + } else { + err = rdbStore_->Delete(deletedRows, predicates); + } + if (err != E_OK) { MEDIA_ERR_LOG("Failed to execute delete, err: %{public}d", err); return E_HAS_DB_ERROR; @@ -668,6 +686,9 @@ int32_t MediaLibraryDataCallBack::OnCreate(RdbStore &store) CREATE_BUNDLE_PREMISSION_TABLE, CREATE_MEDIALIBRARY_ERROR_TABLE, CREATE_REMOTE_THUMBNAIL_TABLE, + CREATE_DELETE_FILE_TRIGGER, + CREATE_FDIRTY_TRIGGER, + CREATE_MDIRTY_TRIGGER, PhotoAlbumColumns::CREATE_TABLE, PhotoAlbumColumns::INDEX_ALBUM_TYPES, PhotoMap::CREATE_TABLE, diff --git a/interfaces/inner_api/media_library_helper/include/medialibrary_db_const.h b/interfaces/inner_api/media_library_helper/include/medialibrary_db_const.h index 92031a9be2370e30f3ad530dcf754327fa363eed..030d92370626ade6db520c6c88d46f9a3dcb5a94 100644 --- a/interfaces/inner_api/media_library_helper/include/medialibrary_db_const.h +++ b/interfaces/inner_api/media_library_helper/include/medialibrary_db_const.h @@ -449,6 +449,34 @@ const std::string QUERY_MEDIA_VOLUME = "SELECT sum(" + MEDIA_DATA_DB_SIZE + ") A MEDIA_DATA_DB_MEDIA_TYPE + " = " + std::to_string(MEDIA_TYPE_AUDIO) + " GROUP BY " + MEDIA_DATA_DB_MEDIA_TYPE; +const std::string CREATE_DELETE_FILE_TRIGGER = "CREATE TRIGGER delete_trigger AFTER UPDATE ON " + + MEDIALIBRARY_TABLE + " FOR EACH ROW WHEN new.dirty = " + + std::to_string(static_cast(DirtyType::TYPE_DELETED)) + + " and OLD.cloud_id is NULL " + + " BEGIN " + + " DELETE FROM " + MEDIALIBRARY_TABLE + " WHERE file_id = old.file_id;" + + " END;"; + +const std::string CREATE_FDIRTY_TRIGGER = "CREATE TRIGGER fdirty_trigger AFTER UPDATE ON " + + MEDIALIBRARY_TABLE + " FOR EACH ROW WHEN OLD.cloud_id IS NOT NULL AND" + + " new.date_modified <> old.date_modified " + + " BEGIN " + + " UPDATE " + MEDIALIBRARY_TABLE + " SET dirty = " + + std::to_string(static_cast(DirtyType::TYPE_FDIRTY)) + + " WHERE file_id = old.file_id;" + + " END;"; + +const std::string CREATE_MDIRTY_TRIGGER = "CREATE TRIGGER mdirty_trigger AFTER UPDATE ON " + + MEDIALIBRARY_TABLE + " FOR EACH ROW WHEN OLD.cloud_id IS NOT NULL" + + " AND new.date_modified = old.date_modified AND old.dirty = " + + std::to_string(static_cast(DirtyType::TYPE_SYNCED)) + + " AND new.dirty = old.dirty " + + " BEGIN " + + " UPDATE " + MEDIALIBRARY_TABLE + " SET dirty = " + + std::to_string(static_cast(DirtyType::TYPE_MDIRTY)) + + " WHERE file_id = old.file_id;" + + " END;"; + /* * Error Table */