升级和扫描场景更新年月日数据

Signed-off-by: yangbo <yangbo258@huawei.com>
Change-Id: Ia05b8edff9e60529df4a9f2456b4e232020d33d2
This commit is contained in:
yangbo
2023-10-08 15:15:02 +08:00
parent d01190efe5
commit ca8a927b8a
6 changed files with 92 additions and 73 deletions
@@ -136,20 +136,14 @@ const std::string PhotoColumn::CREATE_PHOTO_TABLE = "CREATE TABLE IF NOT EXISTS
PHOTO_DATE_DAY + " TEXT)";
const std::string PhotoColumn::CREATE_YEAR_INDEX = "CREATE INDEX '" +
PHOTO_DATE_YEAR_INDEX + "'" + " ON " +
PHOTOS_TABLE + " ('" +
PHOTO_DATE_YEAR + "')";
const std::string PhotoColumn::CREATE_YEAR_INDEX = BaseColumn::CreateIndex() +
PHOTO_DATE_YEAR_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_DATE_YEAR + " DESC)";
const std::string PhotoColumn::CREATE_MONTH_INDEX = "CREATE INDEX '" +
PHOTO_DATE_MONTH_INDEX + "'" + " ON " +
PHOTOS_TABLE + " ('" +
PHOTO_DATE_MONTH + "')";
const std::string PhotoColumn::CREATE_MONTH_INDEX = BaseColumn::CreateIndex() +
PHOTO_DATE_MONTH_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_DATE_MONTH + " DESC)";
const std::string PhotoColumn::CREATE_DAY_INDEX = "CREATE INDEX '" +
PHOTO_DATE_DAY_INDEX + "'" + " ON " +
PHOTOS_TABLE + " ('" +
PHOTO_DATE_DAY + "')";
const std::string PhotoColumn::CREATE_DAY_INDEX = BaseColumn::CreateIndex() +
PHOTO_DATE_DAY_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_DATE_DAY + " DESC)";
const std::string PhotoColumn::QUERY_MEDIA_VOLUME = "SELECT sum(" + MediaColumn::MEDIA_SIZE + ") AS " +
MediaColumn::MEDIA_SIZE + "," +
@@ -45,12 +45,12 @@ using namespace OHOS::NativeRdb;
namespace {
class AddYearTaskData : public OHOS::Media::AsyncTaskData {
public:
explicit AddYearTaskData(const shared_ptr<OHOS::Media::MediaLibraryRdbStore> store)
explicit AddYearTaskData(RdbStore* store)
: store_(store)
{
}
virtual ~AddYearTaskData() = default;
shared_ptr<OHOS::Media::MediaLibraryRdbStore> store_;
RdbStore* store_;
};
}
namespace OHOS::Media {
@@ -1269,75 +1269,47 @@ void AddUpdateCloudSyncTrigger(RdbStore &store)
void SetYearMonthDayData(AsyncTaskData *data)
{
auto* taskData = static_cast<AddYearTaskData*>(data);
string queryRowSql = "SELECT " + MEDIA_DATA_DB_DATE_ADDED +"," +
PhotoColumn::MEDIA_ID + " FROM " + PhotoColumn::PHOTOS_TABLE;
auto resultSet = taskData->store_->QuerySql(queryRowSql);
if (resultSet == nullptr || resultSet->GoToFirstRow() != NativeRdb::E_OK) {
MEDIA_ERR_LOG("Can not get dataAdded");
UpdateFail(__FILE__, __LINE__);
return;
}
while (resultSet->GoToNextRow() == NativeRdb::E_OK) {
int64_t dateAdd = GetInt64Val(MEDIA_DATA_DB_DATE_ADDED, resultSet);
int32_t id = GetInt32Val(PhotoColumn::MEDIA_ID, resultSet);
ValuesBucket valuesBucket;
valuesBucket.PutString(PhotoColumn::PHOTO_DATE_YEAR,
MediaFileUtils::StrCreateTime(PhotoColumn::PHOTO_DATE_YEAR_FORMAT, dateAdd));
valuesBucket.PutString(PhotoColumn::PHOTO_DATE_MONTH,
MediaFileUtils::StrCreateTime(PhotoColumn::PHOTO_DATE_MONTH_FORMAT, dateAdd));
valuesBucket.PutString(PhotoColumn::PHOTO_DATE_DAY,
MediaFileUtils::StrCreateTime(PhotoColumn::PHOTO_DATE_DAY_FORMAT, dateAdd));
AbsRdbPredicates yearAbsPred(PhotoColumn::PHOTOS_TABLE);
yearAbsPred.SetWhereClause(MEDIA_DATA_DB_ID + " = ? ");
yearAbsPred.SetWhereArgs({to_string(id)});
taskData->store_->Update(valuesBucket, yearAbsPred);
}
MEDIA_DEBUG_LOG("UpdateYearMonthDayData start");
const vector<string> updateSql = {
"UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET " +
PhotoColumn::PHOTO_DATE_YEAR + " = strftime('%Y', datetime(date_added, 'unixepoch', 'localtime')), " +
PhotoColumn::PHOTO_DATE_MONTH + " = strftime('%Y%m', datetime(date_added, 'unixepoch', 'localtime')), " +
PhotoColumn::PHOTO_DATE_DAY + " = strftime('%Y%m%d', datetime(date_added, 'unixepoch', 'localtime'))",
PhotoColumn::CREATE_YEAR_INDEX,
PhotoColumn::CREATE_MONTH_INDEX,
PhotoColumn::CREATE_DAY_INDEX
};
ExecSqls(updateSql, *(taskData->store_));
MEDIA_DEBUG_LOG("UpdateYearMonthDayData end");
delete taskData;
}
void AddYearMonthDayColumn(RdbStore &store)
{
const std::string alterYear =
"ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
PhotoColumn::PHOTO_DATE_YEAR + " TEXT";
int32_t result = store.ExecuteSql(alterYear);
if (result != NativeRdb::E_OK) {
UpdateFail(__FILE__, __LINE__);
MEDIA_ERR_LOG("Upgrade rdb year error %{private}d", result);
}
const std::string alterMonth =
"ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
PhotoColumn::PHOTO_DATE_MONTH + " TEXT";
result = store.ExecuteSql(alterMonth);
if (result != NativeRdb::E_OK) {
UpdateFail(__FILE__, __LINE__);
MEDIA_ERR_LOG("Upgrade rdb month error %{private}d", result);
}
const std::string alterDay =
"ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
PhotoColumn::PHOTO_DATE_DAY + " TEXT";
result = store.ExecuteSql(alterDay);
if (result != NativeRdb::E_OK) {
UpdateFail(__FILE__, __LINE__);
MEDIA_ERR_LOG("Upgrade rdb day error %{private}d", result);
}
const vector<string> sqls = {
"ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_DATE_YEAR + " TEXT",
"ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_DATE_MONTH + " TEXT",
"ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_DATE_DAY + " TEXT",
};
ExecSqls(sqls, store);
shared_ptr<MediaLibraryAsyncWorker> asyncWorker = MediaLibraryAsyncWorker::GetInstance();
if (asyncWorker == nullptr) {
UpdateFail(__FILE__, __LINE__);
MEDIA_ERR_LOG("asyncWorker is nullptr");
return;
}
shared_ptr<OHOS::Media::MediaLibraryRdbStore> rdbStore =
MediaLibraryUnistoreManager::GetInstance().GetRdbStoreRaw();
auto *taskData = new (nothrow) AddYearTaskData(rdbStore);
auto *taskData = new (nothrow) AddYearTaskData(&store);
if (taskData == nullptr) {
UpdateFail(__FILE__, __LINE__);
MEDIA_ERR_LOG("taskData is nullptr");
return;
}
shared_ptr<MediaLibraryAsyncTask> notifyAsyncTask =
shared_ptr<MediaLibraryAsyncTask> asyncTask =
make_shared<MediaLibraryAsyncTask>(SetYearMonthDayData, taskData);
if (notifyAsyncTask != nullptr) {
asyncWorker->AddTask(notifyAsyncTask, false);
if (asyncTask != nullptr) {
asyncWorker->AddTask(asyncTask, false);
}
}
@@ -114,6 +114,15 @@ public:
void SetAllExif(const VariantData &allExif);
const std::string &GetAllExif() const;
void SetDateYear(const VariantData &dateYear);
const std::string &getDateYear() const;
void SetDateMonth(const VariantData &dateMonth);
const std::string &getDateMonth() const;
void SetDateDay(const VariantData &dateDay);
const std::string &getDateDay() const;
#ifdef MEDIALIBRARY_COMPATIBILITY
void SetPhotoSubType(const VariantData &photoSubType);
int32_t GetPhotoSubType() const;
@@ -155,6 +164,9 @@ private:
int32_t width_;
int32_t duration_;
int32_t orientation_;
string dateYear_;
string dateMonth_;
string dateDay_;
// video, audio, image
int64_t dateTaken_;
@@ -20,6 +20,7 @@
#include "directory_ex.h"
#include "hitrace_meter.h"
#include "ipc_skeleton.h"
#include "media_file_utils.h"
#include "media_log.h"
#include "medialibrary_data_manager_utils.h"
#include "medialibrary_errno.h"
@@ -349,6 +350,10 @@ int32_t MediaScannerObj::BuildData(const struct stat &statInfo)
data_->SetFileSize(statInfo.st_size);
data_->SetFileDateModified(static_cast<int64_t>(statInfo.st_mtime));
data_->SetFileDateAdded(static_cast<int64_t>(statInfo.st_ctime));
int64_t cTime = static_cast<int64_t>(statInfo.st_ctime);
data_->SetDateYear(MediaFileUtils::StrCreateTime(PhotoColumn::PHOTO_DATE_YEAR_FORMAT, cTime));
data_->SetDateMonth(MediaFileUtils::StrCreateTime(PhotoColumn::PHOTO_DATE_MONTH_FORMAT, cTime));
data_->SetDateDay(MediaFileUtils::StrCreateTime(PhotoColumn::PHOTO_DATE_DAY_FORMAT, cTime));
// extension and type
string extension = ScannerUtils::GetFileExtension(path_);
@@ -376,7 +381,6 @@ int32_t MediaScannerObj::GetFileMetadata()
PostEventUtils::GetInstance().PostErrorProcess(ErrType::FILE_OPT_ERR, map);
return E_SYSCALL;
}
int errCode = BuildData(statInfo);
if (errCode != E_OK) {
VariantMap map = {{KEY_ERR_FILE, __FILE__}, {KEY_ERR_LINE, __LINE__}, {KEY_ERR_CODE, errCode},
@@ -474,7 +478,6 @@ int32_t MediaScannerObj::BuildFileInfo(const string &parent, int32_t parentId)
int32_t MediaScannerObj::ScanFileInTraversal(const string &path, const string &parent, int32_t parentId)
{
path_ = path;
if (ScannerUtils::IsFileHidden(path_)) {
MEDIA_ERR_LOG("the file is hidden");
VariantMap map = {{KEY_ERR_FILE, __FILE__}, {KEY_ERR_LINE, __LINE__}, {KEY_ERR_CODE, E_FILE_HIDDEN},
@@ -482,7 +485,6 @@ int32_t MediaScannerObj::ScanFileInTraversal(const string &path, const string &p
PostEventUtils::GetInstance().PostErrorProcess(ErrType::FILE_OPT_ERR, map);
return E_FILE_HIDDEN;
}
int32_t err = GetFileMetadata();
if (err != E_OK) {
if (err != E_SCANNED) {
@@ -713,7 +715,6 @@ int32_t MediaScannerObj::ScanDirInternal()
PostEventUtils::GetInstance().PostErrorProcess(ErrType::DB_OPT_ERR, map);
return err;
}
/* no further operation when stopped */
err = WalkFileTree(dir_, NO_PARENT);
if (err != E_OK) {
@@ -723,7 +724,6 @@ int32_t MediaScannerObj::ScanDirInternal()
PostEventUtils::GetInstance().PostErrorProcess(ErrType::FILE_OPT_ERR, map);
return err;
}
err = CommitTransaction();
if (err != E_OK) {
MEDIA_ERR_LOG("commit transaction err %{public}d", err);
@@ -732,7 +732,6 @@ int32_t MediaScannerObj::ScanDirInternal()
PostEventUtils::GetInstance().PostErrorProcess(ErrType::DB_OPT_ERR, map);
return err;
}
err = CleanupDirectory();
if (err != E_OK) {
MEDIA_ERR_LOG("clean up dir err %{public}d", err);
@@ -131,6 +131,12 @@ static void SetValuesFromMetaDataApi9(const Metadata &metadata, ValuesBucket &va
values.PutLong(MEDIA_DATA_DB_DATE_TAKEN, metadata.GetDateTaken());
values.PutLong(MEDIA_DATA_DB_TIME_PENDING, 0);
if (mediaType == MediaType::MEDIA_TYPE_IMAGE || mediaType == MEDIA_TYPE_VIDEO) {
values.PutString(PhotoColumn::PHOTO_DATE_YEAR, metadata.getDateYear());
values.PutString(PhotoColumn::PHOTO_DATE_MONTH, metadata.getDateMonth());
values.PutString(PhotoColumn::PHOTO_DATE_DAY, metadata.getDateDay());
}
SetValuesFromMetaDataAndType(metadata, values, mediaType, table);
if (isInsert) {
@@ -162,6 +168,9 @@ static void SetValuesFromMetaDataApi10(const Metadata &metadata, ValuesBucket &v
values.PutDouble(PhotoColumn::PHOTO_LATITUDE, metadata.GetLatitude());
values.PutString(PhotoColumn::PHOTO_USER_COMMENT, metadata.GetUserComment());
values.PutString(PhotoColumn::PHOTO_ALL_EXIF, metadata.GetAllExif());
values.PutString(PhotoColumn::PHOTO_DATE_YEAR, metadata.getDateYear());
values.PutString(PhotoColumn::PHOTO_DATE_MONTH, metadata.getDateMonth());
values.PutString(PhotoColumn::PHOTO_DATE_DAY, metadata.getDateDay());
#ifdef MEDIALIBRARY_COMPATIBILITY
if (metadata.GetPhotoSubType() != 0) {
values.PutInt(PhotoColumn::PHOTO_SUBTYPE, metadata.GetPhotoSubType());
@@ -84,6 +84,9 @@ void Metadata::Init()
memberFuncMap_[PhotoColumn::PHOTO_USER_COMMENT] = make_pair(ResultSetDataType::TYPE_STRING,
&Metadata::SetUserComment);
memberFuncMap_[PhotoColumn::PHOTO_ALL_EXIF] = make_pair(ResultSetDataType::TYPE_STRING, &Metadata::SetAllExif);
memberFuncMap_[PhotoColumn::PHOTO_DATE_YEAR] = make_pair(ResultSetDataType::TYPE_STRING, &Metadata::SetDateYear);
memberFuncMap_[PhotoColumn::PHOTO_DATE_MONTH] = make_pair(ResultSetDataType::TYPE_STRING, &Metadata::SetDateMonth);
memberFuncMap_[PhotoColumn::PHOTO_DATE_DAY] = make_pair(ResultSetDataType::TYPE_STRING, &Metadata::SetDateDay);
}
void Metadata::SetFileId(const VariantData &id)
@@ -366,6 +369,36 @@ const string &Metadata::GetAllExif() const
return allExif_;
}
void Metadata::SetDateYear(const VariantData &dateYear)
{
dateYear_ = get<string>(dateYear);
}
const string &Metadata::getDateYear() const
{
return dateYear_;
}
void Metadata::SetDateMonth(const VariantData &dateMonth)
{
dateMonth_ = get<string>(dateMonth);
}
const string &Metadata::getDateMonth() const
{
return dateMonth_;
}
void Metadata::SetDateDay(const VariantData &dateDay)
{
dateDay_ = get<string>(dateDay);
}
const string &Metadata::getDateDay() const
{
return dateDay_;
}
#ifdef MEDIALIBRARY_COMPATIBILITY
void Metadata::SetPhotoSubType(const VariantData &photoSubType)
{