1 /*
2 * Copyright (C) 2022 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 #define MLOG_TAG "RdbStore"
16
17 #include "medialibrary_rdbstore.h"
18
19 #include <mutex>
20 #include <regex>
21 #include <thread>
22 #include <chrono>
23
24 #include "album_plugin_table_event_handler.h"
25 #include "cloud_sync_helper.h"
26 #include "custom_records_column.h"
27 #include "dfx_manager.h"
28 #include "dfx_timer.h"
29 #include "dfx_const.h"
30 #include "dfx_reporter.h"
31 #include "ipc_skeleton.h"
32 #include "location_column.h"
33 #include "media_column.h"
34 #include "media_app_uri_permission_column.h"
35 #include "media_file_uri.h"
36 #include "media_file_utils.h"
37 #include "media_log.h"
38 #include "media_remote_thumbnail_column.h"
39 #include "media_smart_album_column.h"
40 #include "medialibrary_album_fusion_utils.h"
41 #include "medialibrary_album_compatibility_fusion_sql.h"
42 #include "medialibrary_business_record_column.h"
43 #include "medialibrary_db_const_sqls.h"
44 #include "medialibrary_errno.h"
45 #include "medialibrary_object_utils.h"
46 #include "medialibrary_photo_operations.h"
47 #include "medialibrary_restore.h"
48 #include "medialibrary_tracer.h"
49 #include "media_container_types.h"
50 #include "media_scanner.h"
51 #include "media_scanner_manager.h"
52 #ifdef META_RECOVERY_SUPPORT
53 #include "medialibrary_meta_recovery.h"
54 #endif
55 #include "medialibrary_notify.h"
56 #include "medialibrary_operation_record.h"
57 #include "medialibrary_rdb_utils.h"
58 #include "medialibrary_unistore_manager.h"
59 #include "moving_photo_processor.h"
60 #include "parameters.h"
61 #include "parameter.h"
62 #include "photo_album_column.h"
63 #include "photo_file_utils.h"
64 #include "photo_map_column.h"
65 #include "post_event_utils.h"
66 #include "rdb_sql_utils.h"
67 #include "result_set_utils.h"
68 #include "source_album.h"
69 #include "tab_old_photos_table_event_handler.h"
70 #include "tab_facard_photos_table_event_handler.h"
71 #include "vision_column.h"
72 #include "vision_ocr_column.h"
73 #include "form_map.h"
74 #include "search_column.h"
75 #include "shooting_mode_column.h"
76 #include "story_cover_info_column.h"
77 #include "story_db_sqls.h"
78 #include "story_play_info_column.h"
79 #include "dfx_const.h"
80 #include "dfx_timer.h"
81 #include "dfx_utils.h"
82 #include "vision_multi_crop_column.h"
83 #include "preferences.h"
84 #include "preferences_helper.h"
85 #include "thumbnail_service.h"
86 #include "medialibrary_rdb_transaction.h"
87 #include "table_event_handler.h"
88 #include "values_buckets.h"
89 #include "medialibrary_data_manager.h"
90 #include "medialibrary_notify_new.h"
91 #include "photo_map_table_event_handler.h"
92 #include "media_app_uri_sensitive_column.h"
93
94 using namespace std;
95 using namespace OHOS::NativeRdb;
96 namespace OHOS::Media {
97 const std::string DIR_ALL_AUDIO_CONTAINER_TYPE = "." + AUDIO_CONTAINER_TYPE_AAC + "?" +
98 "." + AUDIO_CONTAINER_TYPE_MP3 + "?" +
99 "." + AUDIO_CONTAINER_TYPE_FLAC + "?" +
100 "." + AUDIO_CONTAINER_TYPE_WAV + "?" +
101 "." + AUDIO_CONTAINER_TYPE_OGG + "?" +
102 "." + AUDIO_CONTAINER_TYPE_M4A + "?";
103
104 const std::string DIR_ALL_VIDEO_CONTAINER_TYPE = "." + VIDEO_CONTAINER_TYPE_MP4 + "?" +
105 "." + VIDEO_CONTAINER_TYPE_3GP + "?" +
106 "." + VIDEO_CONTAINER_TYPE_MPG + "?" +
107 "." + VIDEO_CONTAINER_TYPE_MOV + "?" +
108 "." + VIDEO_CONTAINER_TYPE_WEBM + "?" +
109 "." + VIDEO_CONTAINER_TYPE_MKV + "?" +
110 "." + VIDEO_CONTAINER_TYPE_H264 + "?" +
111 "." + VIDEO_CONTAINER_TYPE_MPEG + "?" +
112 "." + VIDEO_CONTAINER_TYPE_TS + "?" +
113 "." + VIDEO_CONTAINER_TYPE_M4V + "?" +
114 "." + VIDEO_CONTAINER_TYPE_3G2 + "?";
115
116 const std::string DIR_ALL_IMAGE_CONTAINER_TYPE = "." + IMAGE_CONTAINER_TYPE_BMP + "?" +
117 "." + IMAGE_CONTAINER_TYPE_BM + "?" +
118 "." + IMAGE_CONTAINER_TYPE_GIF + "?" +
119 "." + IMAGE_CONTAINER_TYPE_JPG + "?" +
120 "." + IMAGE_CONTAINER_TYPE_JPEG + "?" +
121 "." + IMAGE_CONTAINER_TYPE_JPE + "?" +
122 "." + IMAGE_CONTAINER_TYPE_PNG + "?" +
123 "." + IMAGE_CONTAINER_TYPE_WEBP + "?" +
124 "." + IMAGE_CONTAINER_TYPE_RAW + "?" +
125 "." + IMAGE_CONTAINER_TYPE_SVG + "?" +
126 "." + IMAGE_CONTAINER_TYPE_HEIF + "?";
127
128 const std::string CAMERA_EXTENSION_VALUES = DIR_ALL_IMAGE_CONTAINER_TYPE + DIR_ALL_VIDEO_CONTAINER_TYPE;
129
130 const std::string VIDEO_EXTENSION_VALUES = DIR_ALL_VIDEO_CONTAINER_TYPE;
131
132 const std::string PIC_EXTENSION_VALUES = DIR_ALL_IMAGE_CONTAINER_TYPE;
133
134 const std::string AUDIO_EXTENSION_VALUES = DIR_ALL_AUDIO_CONTAINER_TYPE;
135
136 const std::string RDB_CONFIG = "/data/storage/el2/base/preferences/rdb_config.xml";
137
138 const std::string RDB_OLD_VERSION = "rdb_old_version";
139
140 const std::string SLAVE = "slave";
141
142 constexpr ssize_t RDB_WAL_LIMIT_SIZE = 1024 * 1024 * 1024; /* default wal file maximum size : 1GB */
143 constexpr ssize_t RDB_CHECK_WAL_SIZE = 50 * 1024 * 1024; /* check wal file size : 50MB */
144 std::mutex MediaLibraryRdbStore::walCheckPointMutex_;
145
146 shared_ptr<NativeRdb::RdbStore> MediaLibraryRdbStore::rdbStore_;
147
148 std::mutex MediaLibraryRdbStore::reconstructLock_;
149
150 int32_t oldVersion_ = -1;
151
152 constexpr int32_t POS_ALBUM_ID = 0;
153
154 constexpr int32_t POS_PATH = 1;
155
156 const int TRASH_ALBUM_TYPE_VALUES = 2;
157
158 const int32_t ARG_COUNT = 2;
159 const std::string TRASH_ALBUM_NAME_VALUES = "TrashAlbum";
160 struct UniqueMemberValuesBucket {
161 std::string assetMediaType;
162 int32_t startNumber;
163 };
164
165
166 struct ShootingModeValueBucket {
167 int32_t albumType;
168 int32_t albumSubType;
169 std::string albumName;
170 };
171
ExecSqlWithRetry(std::function<int32_t ()> execSql)172 static int32_t ExecSqlWithRetry(std::function<int32_t()> execSql)
173 {
174 int32_t currentTime = 0;
175 int32_t busyRetryTime = 0;
176 int32_t err = NativeRdb::E_OK;
177 bool isSkipCloudSync = false;
178 while (busyRetryTime < MAX_BUSY_TRY_TIMES && currentTime <= MAX_TRY_TIMES) {
179 err = execSql();
180 if (err == NativeRdb::E_OK) {
181 break;
182 } else if (err == NativeRdb::E_SQLITE_LOCKED) {
183 std::this_thread::sleep_for(std::chrono::milliseconds(TRANSACTION_WAIT_INTERVAL));
184 currentTime++;
185 MEDIA_ERR_LOG("execSql busy, err: %{public}d, currentTime: %{public}d", err, currentTime);
186 } else if (err == NativeRdb::E_SQLITE_BUSY || err == NativeRdb::E_DATABASE_BUSY) {
187 busyRetryTime++;
188 MEDIA_ERR_LOG("execSql busy, err:%{public}d, busyRetryTime:%{public}d", err, busyRetryTime);
189 if (err == NativeRdb::E_SQLITE_BUSY && !isSkipCloudSync) {
190 MEDIA_INFO_LOG("Stop cloud sync");
191 FileManagement::CloudSync::CloudSyncManager::GetInstance()
192 .StopSync("com.ohos.medialibrary.medialibrarydata");
193 isSkipCloudSync = true;
194 }
195 } else {
196 MEDIA_ERR_LOG("execSql failed, err: %{public}d, currentTime: %{public}d", err, currentTime);
197 break;
198 }
199 }
200 if (isSkipCloudSync) {
201 MEDIA_INFO_LOG("recover cloud sync after execsql busy");
202 CloudSyncHelper::GetInstance()->StartSync();
203 }
204 return err;
205 }
206
CloudSyncTriggerFunc(const std::vector<std::string> & args)207 const std::string MediaLibraryRdbStore::CloudSyncTriggerFunc(const std::vector<std::string> &args)
208 {
209 CloudSyncHelper::GetInstance()->StartSync();
210 return "";
211 }
212
BeginGenerateHighlightThumbnail(const std::vector<std::string> & args)213 const std::string MediaLibraryRdbStore::BeginGenerateHighlightThumbnail(const std::vector<std::string> &args)
214 {
215 if (args.size() < STAMP_PARAM || args[STAMP_PARAM_ZERO].empty() || args[STAMP_PARAM_ONE].empty() ||
216 args[STAMP_PARAM_TWO].empty() || args[STAMP_PARAM_THREE].empty()) {
217 MEDIA_ERR_LOG("Invalid input: args must contain at least 4 non-empty strings");
218 return "";
219 }
220 std::string id = args[STAMP_PARAM_ZERO].c_str();
221 std::string tracks = args[STAMP_PARAM_ONE].c_str();
222 std::string trigger = args[STAMP_PARAM_TWO].c_str();
223 std::string genType = args[STAMP_PARAM_THREE].c_str();
224 MEDIA_INFO_LOG("id = %{public}s, tracks = %{public}s, trigger = %{public}s", id.c_str(),
225 tracks.c_str(), trigger.c_str());
226 ThumbnailService::GetInstance()->TriggerHighlightThumbnail(id, tracks, trigger, genType);
227 return "";
228 }
229
IsCallerSelfFunc(const std::vector<std::string> & args)230 const std::string MediaLibraryRdbStore::IsCallerSelfFunc(const std::vector<std::string> &args)
231 {
232 return "true";
233 }
234
235 constexpr int REGEXP_REPLACE_PARAM_NUM = 3;
RegexReplaceFunc(const std::vector<std::string> & args)236 const std::string MediaLibraryRdbStore::RegexReplaceFunc(const std::vector<std::string> &args)
237 {
238 if (args.size() < REGEXP_REPLACE_PARAM_NUM) {
239 MEDIA_ERR_LOG("Invalid arg count %{public}zu: args must contain at least 3 strings", args.size());
240 return "";
241 }
242 const std::string &input = args[0];
243 const std::string &pattern = args[1];
244 const std::string &replacement = args[2];
245
246 std::regex re(pattern);
247 return std::regex_replace(input, re, replacement);
248 }
249
PhotoAlbumNotifyFunc(const std::vector<std::string> & args)250 const std::string MediaLibraryRdbStore::PhotoAlbumNotifyFunc(const std::vector<std::string> &args)
251 {
252 if (args.size() < 1) {
253 MEDIA_ERR_LOG("Invalid input: args must contain at least 1 strings");
254 return "";
255 }
256 std::string path = args[POS_PATH].c_str();
257 size_t slavePosition = path.find(SLAVE);
258 if (slavePosition != string::npos) {
259 MEDIA_DEBUG_LOG("not notify slave db");
260 return "";
261 }
262 std::string albumId = args[POS_ALBUM_ID].c_str();
263 if (!all_of(albumId.begin(), albumId.end(), ::isdigit)) {
264 MEDIA_ERR_LOG("Invalid albunId PhotoAlbumNotifyFunc Abortion");
265 return "";
266 }
267
268 MEDIA_DEBUG_LOG("albumId = %{public}s", albumId.c_str());
269 auto watch = MediaLibraryNotify::GetInstance();
270 CHECK_AND_RETURN_RET_LOG(watch != nullptr, "", "Failed to get MediaLibraryNotify");
271 watch->Notify(MediaFileUtils::GetUriByExtrConditions(PhotoAlbumColumns::ALBUM_URI_PREFIX, albumId),
272 NotifyType::NOTIFY_ADD);
273
274 Notification::MediaLibraryNotifyNew::AddAlbum(albumId);
275 MEDIA_INFO_LOG("AccurateRefresh PhotoAlbumNotifyFunc albumId = %{public}s", albumId.c_str());
276 return "";
277 }
278
MediaLibraryRdbStore(const shared_ptr<OHOS::AbilityRuntime::Context> & context)279 MediaLibraryRdbStore::MediaLibraryRdbStore(const shared_ptr<OHOS::AbilityRuntime::Context> &context)
280 {
281 if (context == nullptr) {
282 MEDIA_ERR_LOG("Failed to get context");
283 return;
284 }
285 string databaseDir = context->GetDatabaseDir();
286 string name = MEDIA_DATA_ABILITY_DB_NAME;
287 int32_t errCode = 0;
288 string realPath = RdbSqlUtils::GetDefaultDatabasePath(databaseDir, name, errCode);
289 config_.SetHaMode(HAMode::MANUAL_TRIGGER);
290 config_.SetAllowRebuild(true);
291 config_.SetName(move(name));
292 config_.SetPath(move(realPath));
293 config_.SetBundleName(context->GetBundleName());
294 config_.SetArea(context->GetArea());
295 config_.SetSecurityLevel(SecurityLevel::S3);
296 config_.SetScalarFunction("cloud_sync_func", 0, CloudSyncTriggerFunc);
297 config_.SetScalarFunction("is_caller_self_func", 0, IsCallerSelfFunc);
298 config_.SetScalarFunction("REGEXP_REPLACE", REGEXP_REPLACE_PARAM_NUM, RegexReplaceFunc);
299 config_.SetScalarFunction("begin_generate_highlight_thumbnail", STAMP_PARAM, BeginGenerateHighlightThumbnail);
300 config_.SetWalLimitSize(RDB_WAL_LIMIT_SIZE);
301 config_.SetScalarFunction("photo_album_notify_func", ARG_COUNT, PhotoAlbumNotifyFunc);
302 }
303
304 bool g_upgradeErr = false;
UpdateFail(const string & errFile,const int & errLine)305 void UpdateFail(const string &errFile, const int &errLine)
306 {
307 g_upgradeErr = true;
308 VariantMap map = {{KEY_ERR_FILE, errFile}, {KEY_ERR_LINE, errLine}};
309 PostEventUtils::GetInstance().PostErrorProcess(ErrType::DB_UPGRADE_ERR, map);
310 }
311
ExecSqls(const vector<string> & sqls,RdbStore & store)312 static int32_t ExecSqls(const vector<string> &sqls, RdbStore &store)
313 {
314 int32_t err = NativeRdb::E_OK;
315 for (const auto &sql : sqls) {
316 err = ExecSqlWithRetry([&]() { return store.ExecuteSql(sql); });
317 if (err != NativeRdb::E_OK) {
318 MEDIA_ERR_LOG("Failed to exec: %{private}s", sql.c_str());
319 /* try update as much as possible */
320 UpdateFail(__FILE__, __LINE__);
321 continue;
322 }
323 }
324 return NativeRdb::E_OK;
325 }
326
CreateBurstIndex(const shared_ptr<MediaLibraryRdbStore> store)327 void MediaLibraryRdbStore::CreateBurstIndex(const shared_ptr<MediaLibraryRdbStore> store)
328 {
329 const vector<string> sqls = {
330 PhotoColumn::DROP_SCHPT_DAY_INDEX,
331 PhotoColumn::CREATE_SCHPT_DAY_INDEX,
332 PhotoColumn::DROP_SCHPT_HIDDEN_TIME_INDEX,
333 PhotoColumn::CREATE_SCHPT_HIDDEN_TIME_INDEX,
334 PhotoColumn::DROP_PHOTO_FAVORITE_INDEX,
335 PhotoColumn::CREATE_PHOTO_FAVORITE_INDEX,
336 PhotoColumn::DROP_INDEX_SCTHP_ADDTIME,
337 PhotoColumn::INDEX_SCTHP_ADDTIME,
338 PhotoColumn::DROP_SCHPT_MEDIA_TYPE_INDEX,
339 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_INDEX,
340 PhotoColumn::CREATE_PHOTO_BURSTKEY_INDEX
341 };
342 MEDIA_INFO_LOG("start create idx_burstkey");
343 ExecSqls(sqls, *store->GetRaw().get());
344 MEDIA_INFO_LOG("end create idx_burstkey");
345 }
346
UpdateBurstDirty(const shared_ptr<MediaLibraryRdbStore> store)347 void MediaLibraryRdbStore::UpdateBurstDirty(const shared_ptr<MediaLibraryRdbStore> store)
348 {
349 const vector<string> sqls = {
350 "UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET " + PhotoColumn::PHOTO_DIRTY + " = " +
351 to_string(static_cast<int32_t>(DirtyTypes::TYPE_NEW)) + " WHERE " + PhotoColumn::PHOTO_SUBTYPE + " = " +
352 to_string(static_cast<int32_t>(PhotoSubType::BURST)) + " AND " + PhotoColumn::PHOTO_DIRTY + " = -1 ",
353 };
354 MEDIA_INFO_LOG("start UpdateBurstDirty");
355 ExecSqls(sqls, *store->GetRaw().get());
356 MEDIA_INFO_LOG("end UpdateBurstDirty");
357 }
358
UpdateReadyOnThumbnailUpgrade(const shared_ptr<MediaLibraryRdbStore> store)359 void MediaLibraryRdbStore::UpdateReadyOnThumbnailUpgrade(const shared_ptr<MediaLibraryRdbStore> store)
360 {
361 const vector<string> sqls = {
362 PhotoColumn::UPDATE_READY_ON_THUMBNAIL_UPGRADE,
363 };
364 MEDIA_INFO_LOG("start update ready for thumbnail upgrade");
365 ExecSqls(sqls, *store->GetRaw().get());
366 MEDIA_INFO_LOG("finish update ready for thumbnail upgrade");
367 }
368
UpdateDateTakenToMillionSecond(const shared_ptr<MediaLibraryRdbStore> store)369 void MediaLibraryRdbStore::UpdateDateTakenToMillionSecond(const shared_ptr<MediaLibraryRdbStore> store)
370 {
371 MEDIA_INFO_LOG("UpdateDateTakenToMillionSecond start");
372 const vector<string> updateSql = {
373 "UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET " +
374 MediaColumn::MEDIA_DATE_TAKEN + " = " + MediaColumn::MEDIA_DATE_TAKEN + "*1000 WHERE " +
375 MediaColumn::MEDIA_DATE_TAKEN + " < 1e10",
376 };
377 ExecSqls(updateSql, *store->GetRaw().get());
378 MEDIA_INFO_LOG("UpdateDateTakenToMillionSecond end");
379 }
380
UpdateDateTakenIndex(const shared_ptr<MediaLibraryRdbStore> store)381 void MediaLibraryRdbStore::UpdateDateTakenIndex(const shared_ptr<MediaLibraryRdbStore> store)
382 {
383 const vector<string> sqls = {
384 PhotoColumn::DROP_SCHPT_MEDIA_TYPE_INDEX,
385 PhotoColumn::DROP_PHOTO_FAVORITE_INDEX,
386 PhotoColumn::DROP_INDEX_SCTHP_ADDTIME,
387 PhotoColumn::DROP_INDEX_SCHPT_READY,
388 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_INDEX,
389 PhotoColumn::CREATE_PHOTO_FAVORITE_INDEX,
390 PhotoColumn::INDEX_SCTHP_ADDTIME,
391 PhotoColumn::INDEX_SCHPT_READY,
392 };
393 MEDIA_INFO_LOG("update index for datetaken change start");
394 ExecSqls(sqls, *store->GetRaw().get());
395 MEDIA_INFO_LOG("update index for datetaken change end");
396 }
397
398 // 更新单条编辑数据大小
UpdateEditDataSize(std::shared_ptr<MediaLibraryRdbStore> rdbStore,const std::string & photoId,const std::string & editDataDir)399 int32_t MediaLibraryRdbStore::UpdateEditDataSize(std::shared_ptr<MediaLibraryRdbStore> rdbStore,
400 const std::string &photoId, const std::string &editDataDir)
401 {
402 size_t size = 0;
403 MediaFileUtils::StatDirSize(editDataDir, size);
404 std::string sql = "UPDATE " + PhotoExtColumn::PHOTOS_EXT_TABLE + " "
405 "SET " + PhotoExtColumn::EDITDATA_SIZE + " = " + std::to_string(size) + " "
406 "WHERE " + PhotoExtColumn::PHOTO_ID + " = '" + photoId + "'";
407
408 int32_t ret = rdbStore->ExecuteSql(sql);
409 if (ret != NativeRdb::E_OK) {
410 MEDIA_ERR_LOG("Execute SQL failed: %{public}d", ret);
411 return E_DB_FAIL;
412 }
413 return E_OK;
414 }
415
UpdateDateTakenAndDetalTime(const shared_ptr<MediaLibraryRdbStore> store)416 void MediaLibraryRdbStore::UpdateDateTakenAndDetalTime(const shared_ptr<MediaLibraryRdbStore> store)
417 {
418 MEDIA_INFO_LOG("UpdateDateTakenAndDetalTime start");
419 string updateDateTakenSql = "UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET " + MediaColumn::MEDIA_DATE_TAKEN +
420 " = " + PhotoColumn::MEDIA_DATE_MODIFIED + "," + PhotoColumn::PHOTO_DETAIL_TIME +
421 " = strftime('%Y:%m:%d %H:%M:%S', " + MediaColumn::MEDIA_DATE_MODIFIED +
422 "/1000, 'unixepoch', 'localtime')" + " WHERE " + MediaColumn::MEDIA_DATE_TAKEN + " = 0";
423 string updateDetalTimeSql = "UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET " + PhotoColumn::PHOTO_DETAIL_TIME +
424 " = strftime('%Y:%m:%d %H:%M:%S', " + MediaColumn::MEDIA_DATE_TAKEN + "/1000, 'unixepoch', 'localtime')" +
425 " WHERE " + PhotoColumn::PHOTO_DETAIL_TIME + " IS NULL";
426 const vector<string> updateSql = {
427 updateDateTakenSql,
428 updateDetalTimeSql,
429 };
430 ExecSqls(updateSql, *store->GetRaw().get());
431 MEDIA_INFO_LOG("UpdateDateTakenAndDetalTime end");
432 }
433
ClearAudios(const shared_ptr<MediaLibraryRdbStore> store)434 void MediaLibraryRdbStore::ClearAudios(const shared_ptr<MediaLibraryRdbStore> store)
435 {
436 const vector<string> sqls = {
437 "DELETE From Audios",
438 };
439 MEDIA_INFO_LOG("clear audios start");
440 ExecSqls(sqls, *store->GetRaw().get());
441 MEDIA_INFO_LOG("clear audios end");
442 }
443
UpdateIndexForCover(const shared_ptr<MediaLibraryRdbStore> store)444 void MediaLibraryRdbStore::UpdateIndexForCover(const shared_ptr<MediaLibraryRdbStore> store)
445 {
446 const vector<string> sqls = {
447 PhotoColumn::DROP_SCHPT_MEDIA_TYPE_INDEX,
448 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_INDEX,
449 };
450 MEDIA_INFO_LOG("update index for photo album cover start");
451 ExecSqls(sqls, *store->GetRaw().get());
452 MEDIA_INFO_LOG("update index for photo album cover end");
453 }
454
UpdateLcdStatusNotUploaded(const std::shared_ptr<MediaLibraryRdbStore> store)455 void MediaLibraryRdbStore::UpdateLcdStatusNotUploaded(const std::shared_ptr<MediaLibraryRdbStore> store)
456 {
457 const vector<string> sqls = {
458 PhotoColumn::UPDATE_LCD_STATUS_NOT_UPLOADED,
459 };
460 MEDIA_INFO_LOG("start update lcd status for photos have not been uploaded");
461 ExecSqls(sqls, *store->GetRaw().get());
462 MEDIA_INFO_LOG("finish update lcd status for photos have not been uploaded");
463
464 MEDIA_INFO_LOG("start CheckLcdSizeAndUpdateStatus");
465 ThumbnailService::GetInstance()->CheckLcdSizeAndUpdateStatus();
466 MEDIA_INFO_LOG("finish CheckLcdSizeAndUpdateStatus");
467 }
468
AddReadyCountIndex(const shared_ptr<MediaLibraryRdbStore> store)469 void MediaLibraryRdbStore::AddReadyCountIndex(const shared_ptr<MediaLibraryRdbStore> store)
470 {
471 MEDIA_INFO_LOG("start add ready count index");
472 const vector<string> sqls = {
473 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_COUNT_READY_INDEX,
474 PhotoColumn::CREATE_SCHPT_YEAR_COUNT_READY_INDEX,
475 PhotoColumn::CREATE_SCHPT_MONTH_COUNT_READY_INDEX,
476 };
477 ExecSqls(sqls, *store->GetRaw().get());
478 MEDIA_INFO_LOG("end add ready count index");
479 }
480
RevertFixDateAddedIndex(const shared_ptr<MediaLibraryRdbStore> store)481 void MediaLibraryRdbStore::RevertFixDateAddedIndex(const shared_ptr<MediaLibraryRdbStore> store)
482 {
483 MEDIA_INFO_LOG("start revert fix date added index");
484 const vector<string> sqls = {
485 PhotoColumn::DROP_INDEX_SCTHP_ADDTIME,
486 PhotoColumn::INDEX_SCTHP_ADDTIME,
487 PhotoColumn::DROP_INDEX_SCHPT_ADDTIME_ALBUM,
488 };
489 ExecSqls(sqls, *store->GetRaw().get());
490 MEDIA_INFO_LOG("end revert fix date added index");
491 }
492
AddCloudEnhancementAlbumIndex(const shared_ptr<MediaLibraryRdbStore> store)493 void MediaLibraryRdbStore::AddCloudEnhancementAlbumIndex(const shared_ptr<MediaLibraryRdbStore> store)
494 {
495 const vector<string> sqls = {
496 PhotoColumn::CREATE_SCHPT_CLOUD_ENHANCEMENT_ALBUM_INDEX
497 };
498 MEDIA_INFO_LOG("start create idx_schpt_cloud_enhancement_album_index");
499 ExecSqls(sqls, *store->GetRaw().get());
500 MEDIA_INFO_LOG("end create idx_schpt_cloud_enhancement_album_index");
501 }
502
AddAlbumIndex(const shared_ptr<MediaLibraryRdbStore> store)503 void MediaLibraryRdbStore::AddAlbumIndex(const shared_ptr<MediaLibraryRdbStore> store)
504 {
505 MEDIA_INFO_LOG("start add album index");
506 const vector<string> sqls = {
507 PhotoColumn::INDEX_SCHPT_ALBUM_GENERAL,
508 PhotoColumn::INDEX_SCHPT_ALBUM,
509 };
510 ExecSqls(sqls, *store->GetRaw().get());
511 MEDIA_INFO_LOG("end add album index");
512 }
513
UpdateLocationKnowledgeIdx(const shared_ptr<MediaLibraryRdbStore> store)514 void MediaLibraryRdbStore::UpdateLocationKnowledgeIdx(const shared_ptr<MediaLibraryRdbStore> store)
515 {
516 MEDIA_INFO_LOG("start update location knowledge index");
517 const vector<string> sqls = {
518 DROP_KNOWLEDGE_INDEX,
519 CREATE_NEW_KNOWLEDGE_INDEX
520 };
521 ExecSqls(sqls, *store->GetRaw().get());
522 MEDIA_INFO_LOG("end update location knowledge index");
523 }
524
AddAlbumSubtypeAndNameIdx(const shared_ptr<MediaLibraryRdbStore> store)525 void MediaLibraryRdbStore::AddAlbumSubtypeAndNameIdx(const shared_ptr<MediaLibraryRdbStore> store)
526 {
527 MEDIA_INFO_LOG("start to add album subtype and name index");
528 const vector<string> sqls = {
529 CREATE_ANALYSIS_ALBUM_SUBTYPE_NAME_INDEX,
530 CREATE_ANALYSIS_ALBUM_TAG_ID_INDEX
531 };
532 ExecSqls(sqls, *store->GetRaw().get());
533 MEDIA_INFO_LOG("end add album subtype and name index");
534 }
535
UpdateThumbnailVisibleAndIdx(const shared_ptr<MediaLibraryRdbStore> store)536 void MediaLibraryRdbStore::UpdateThumbnailVisibleAndIdx(const shared_ptr<MediaLibraryRdbStore> store)
537 {
538 MEDIA_INFO_LOG("start to update thumbnailvisible and index");
539 const vector<string> sqls = {
540 "UPDATE " + PhotoColumn::PHOTOS_TABLE +
541 " SET thumbnail_visible = "
542 " CASE "
543 " WHEN thumbnail_ready > 0 THEN 1 "
544 " ELSE 0 "
545 " END ",
546 PhotoColumn::DROP_INDEX_SCHPT_READY,
547 PhotoColumn::INDEX_SCHPT_READY,
548 };
549 ExecSqls(sqls, *store->GetRaw().get());
550 MEDIA_INFO_LOG("end update thumbnailvisible and index");
551 }
552
UpdateMediaTypeAndThumbnailReadyIdx(const shared_ptr<MediaLibraryRdbStore> rdbStore)553 void MediaLibraryRdbStore::UpdateMediaTypeAndThumbnailReadyIdx(const shared_ptr<MediaLibraryRdbStore> rdbStore)
554 {
555 bool cond = (rdbStore == nullptr || !rdbStore->CheckRdbStore());
556 CHECK_AND_RETURN_LOG(!cond, "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
557
558 const vector<string> sqls = {
559 PhotoColumn::DROP_SCHPT_MEDIA_TYPE_COUNT_READY_INDEX,
560 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_COUNT_READY_INDEX,
561 PhotoColumn::DROP_INDEX_SCHPT_READY,
562 PhotoColumn::INDEX_SCHPT_READY,
563 };
564
565 MEDIA_INFO_LOG("start update idx_schpt_media_type_ready and idx_schpt_thumbnail_ready");
566 ExecSqls(sqls, *rdbStore->GetRaw().get());
567 MEDIA_INFO_LOG("end update idx_schpt_media_type_ready and idx_schpt_thumbnail_ready");
568 }
569
Init()570 int32_t MediaLibraryRdbStore::Init()
571 {
572 MEDIA_INFO_LOG("Init rdb store: [version: %{public}d]", MEDIA_RDB_VERSION);
573 CHECK_AND_RETURN_RET(rdbStore_ == nullptr, E_OK);
574
575 int32_t errCode = 0;
576 MediaLibraryDataCallBack rdbDataCallBack;
577 MediaLibraryTracer tracer;
578 tracer.Start("MediaLibraryRdbStore::Init GetRdbStore");
579 rdbStore_ = RdbHelper::GetRdbStore(config_, MEDIA_RDB_VERSION, rdbDataCallBack, errCode);
580 tracer.Finish();
581 CHECK_AND_RETURN_RET_LOG(rdbStore_ != nullptr, errCode, "GetRdbStore is failed");
582 int version = 0;
583 NativeRdb::RebuiltType rebuilt;
584 bool isRebuilt = rdbStore_->GetRebuilt(rebuilt) == NativeRdb::E_OK && rebuilt == NativeRdb::RebuiltType::REBUILT;
585 bool isInitVersion = rdbStore_->GetVersion(version) == NativeRdb::E_OK && version == 0;
586 if (isRebuilt || isInitVersion) {
587 MEDIA_INFO_LOG("MediaLibraryRdbStore::Init, OnCreate, isRebuilt: %{public}d isInitVersion: %{public}d",
588 static_cast<uint32_t>(isRebuilt), static_cast<uint32_t>(isInitVersion));
589 rdbDataCallBack.OnCreate(*rdbStore_);
590 }
591 MEDIA_INFO_LOG("MediaLibraryRdbStore::Init(), SUCCESS");
592 return E_OK;
593 }
594
AddPhotoDateAddedIndex(const shared_ptr<MediaLibraryRdbStore> store)595 void MediaLibraryRdbStore::AddPhotoDateAddedIndex(const shared_ptr<MediaLibraryRdbStore> store)
596 {
597 MEDIA_INFO_LOG("start AddPhotoDateAddedIndex");
598 const vector<string> sqls = {
599 PhotoColumn::INDEX_SCTHP_PHOTO_DATEADDED,
600 };
601 ExecSqls(sqls, *store->GetRaw().get());
602 MEDIA_INFO_LOG("end AddPhotoDateAddedIndex");
603 }
604
AddPhotoWhiteBlocksIndex(const shared_ptr<MediaLibraryRdbStore> store)605 void MediaLibraryRdbStore::AddPhotoWhiteBlocksIndex(const shared_ptr<MediaLibraryRdbStore> store)
606 {
607 MEDIA_INFO_LOG("start AddPhotoWhiteBlocksIndex");
608 const vector<string> sqls = {
609 PhotoColumn::INDEX_QUERY_THUMBNAIL_WHITE_BLOCKS,
610 };
611 ExecSqls(sqls, *store->GetRaw().get());
612 MEDIA_INFO_LOG("end AddPhotoWhiteBlocksIndex");
613 }
614
AddPhotoSortIndex(const std::shared_ptr<MediaLibraryRdbStore> store)615 void MediaLibraryRdbStore::AddPhotoSortIndex(const std::shared_ptr<MediaLibraryRdbStore> store)
616 {
617 MEDIA_INFO_LOG("start AddPhotoSortIndex");
618 const vector<string> sqls = {
619 PhotoColumn::CREATE_PHOTO_SORT_MEDIA_TYPE_DATE_ADDED_INDEX,
620 PhotoColumn::CREATE_PHOTO_SORT_MEDIA_TYPE_DATE_TAKEN_INDEX,
621 PhotoColumn::CREATE_PHOTO_SORT_IN_ALBUM_DATE_ADDED_INDEX,
622 PhotoColumn::CREATE_PHOTO_SORT_IN_ALBUM_DATE_TAKEN_INDEX,
623 };
624 ExecSqls(sqls, *store->GetRaw().get());
625 MEDIA_INFO_LOG("End AddPhotoSortIndex");
626 }
627
UpdateLatitudeAndLongitudeDefaultNull(const std::shared_ptr<MediaLibraryRdbStore> store)628 void MediaLibraryRdbStore::UpdateLatitudeAndLongitudeDefaultNull(const std::shared_ptr<MediaLibraryRdbStore> store)
629 {
630 MEDIA_INFO_LOG("start Update LatitudeAndLongitude Default Null");
631 const vector<string> sqls = {
632 PhotoColumn::INDEX_LATITUDE,
633 PhotoColumn::INDEX_LONGITUDE,
634 PhotoColumn::UPDATE_LATITUDE_AND_LONGITUDE_DEFAULT_NULL,
635 };
636 ExecSqls(sqls, *store->GetRaw().get());
637 MEDIA_INFO_LOG("end Update LatitudeAndLongitude Default Null");
638 }
639
UpdatePhotoQualityCloned(const std::shared_ptr<MediaLibraryRdbStore> store)640 void MediaLibraryRdbStore::UpdatePhotoQualityCloned(const std::shared_ptr<MediaLibraryRdbStore> store)
641 {
642 MEDIA_INFO_LOG("start UpdatePhotoQualityCloned");
643 const vector<string> sqls = {
644 PhotoColumn::UPDATE_PHOTO_QUALITY_OF_NULL_PHOTO_ID,
645 };
646 ExecSqls(sqls, *store->GetRaw().get());
647 MEDIA_INFO_LOG("end UpdatePhotoQualityCloned");
648 }
649
UpdateMdirtyTriggerForTdirty(const std::shared_ptr<MediaLibraryRdbStore> store)650 void MediaLibraryRdbStore::UpdateMdirtyTriggerForTdirty(const std::shared_ptr<MediaLibraryRdbStore> store)
651 {
652 MEDIA_INFO_LOG("start UpdateMdirtyTriggerForTdirty");
653 const string dropMdirtyCreateTrigger = "DROP TRIGGER IF EXISTS photos_mdirty_trigger";
654 int32_t ret = ExecSqlWithRetry([&]() { return store->ExecuteSql(dropMdirtyCreateTrigger); });
655 if (ret != NativeRdb::E_OK) {
656 MEDIA_ERR_LOG("drop photos_mdirty_trigger fail, ret = %{public}d", ret);
657 UpdateFail(__FILE__, __LINE__);
658 }
659
660 ret = ExecSqlWithRetry([&]() { return store->ExecuteSql(PhotoColumn::CREATE_PHOTOS_MDIRTY_TRIGGER); });
661 if (ret != NativeRdb::E_OK) {
662 MEDIA_ERR_LOG("add photos_mdirty_trigger fail, ret = %{public}d", ret);
663 UpdateFail(__FILE__, __LINE__);
664 }
665 MEDIA_INFO_LOG("end UpdateMdirtyTriggerForTdirty");
666 }
667
Init(const RdbStoreConfig & config,int version,RdbOpenCallback & openCallback)668 int32_t MediaLibraryRdbStore::Init(const RdbStoreConfig &config, int version, RdbOpenCallback &openCallback)
669 {
670 MEDIA_INFO_LOG("Init rdb store: [version: %{public}d]", version);
671 if (rdbStore_ != nullptr) {
672 return E_OK;
673 }
674 int32_t errCode = 0;
675 MediaLibraryTracer tracer;
676 tracer.Start("MediaLibraryRdbStore::Init GetRdbStore with config");
677 rdbStore_ = RdbHelper::GetRdbStore(config, version, openCallback, errCode);
678 tracer.Finish();
679 if (rdbStore_ == nullptr) {
680 MEDIA_ERR_LOG("GetRdbStore with config is failed");
681 return errCode;
682 }
683 MEDIA_INFO_LOG("MediaLibraryRdbStore::Init with config, SUCCESS");
684 return E_OK;
685 }
686
687 MediaLibraryRdbStore::~MediaLibraryRdbStore() = default;
688
Stop()689 void MediaLibraryRdbStore::Stop()
690 {
691 rdbStore_ = nullptr;
692 }
693
CheckRdbStore()694 bool MediaLibraryRdbStore::CheckRdbStore()
695 {
696 return rdbStore_ != nullptr;
697 }
698
GetRaw()699 shared_ptr<NativeRdb::RdbStore> MediaLibraryRdbStore::GetRaw()
700 {
701 return rdbStore_;
702 }
703
AddDefaultPhotoValues(ValuesBucket & values)704 static void AddDefaultPhotoValues(ValuesBucket& values)
705 {
706 ValueObject tmpValue;
707 if (values.GetObject(MediaColumn::MEDIA_NAME, tmpValue)) {
708 string newDisplayName {};
709 tmpValue.GetString(newDisplayName);
710 values.PutString(PhotoColumn::PHOTO_MEDIA_SUFFIX, ScannerUtils::GetFileExtension(newDisplayName));
711 }
712 }
713
Insert(MediaLibraryCommand & cmd,int64_t & rowId)714 int32_t MediaLibraryRdbStore::Insert(MediaLibraryCommand &cmd, int64_t &rowId)
715 {
716 DfxTimer dfxTimer(DfxType::RDB_INSERT, INVALID_DFX, RDB_TIME_OUT, false);
717 MediaLibraryTracer tracer;
718 tracer.Start("MediaLibraryRdbStore::Insert");
719 if (!MediaLibraryRdbStore::CheckRdbStore()) {
720 MEDIA_ERR_LOG("Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
721 return E_HAS_DB_ERROR;
722 }
723 if (cmd.GetTableName() == PhotoColumn::PHOTOS_TABLE) {
724 AddDefaultPhotoValues(cmd.GetValueBucket());
725 }
726
727 int32_t ret = ExecSqlWithRetry([&]() {
728 return MediaLibraryRdbStore::GetRaw()->Insert(rowId, cmd.GetTableName(), cmd.GetValueBucket());
729 });
730 if (ret != NativeRdb::E_OK) {
731 MEDIA_ERR_LOG("rdbStore_->Insert failed, ret = %{public}d", ret);
732 MediaLibraryRestore::GetInstance().CheckRestore(ret);
733 return E_HAS_DB_ERROR;
734 }
735
736 MEDIA_DEBUG_LOG("rdbStore_->Insert end, rowId = %d, ret = %{public}d", (int)rowId, ret);
737 return ret;
738 }
739
BatchInsert(int64_t & outRowId,const std::string & table,std::vector<NativeRdb::ValuesBucket> & values)740 int32_t MediaLibraryRdbStore::BatchInsert(int64_t &outRowId, const std::string &table,
741 std::vector<NativeRdb::ValuesBucket> &values)
742 {
743 DfxTimer dfxTimer(DfxType::RDB_INSERT, INVALID_DFX, RDB_TIME_OUT, false);
744 MediaLibraryTracer tracer;
745 tracer.Start("MediaLibraryRdbStore::BatchInsert");
746 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
747 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
748 if (table == PhotoColumn::PHOTOS_TABLE) {
749 for (auto& value : values) {
750 AddDefaultPhotoValues(value);
751 }
752 }
753 int32_t ret = ExecSqlWithRetry([&]() {
754 return MediaLibraryRdbStore::GetRaw()->BatchInsert(outRowId, table, values);
755 });
756 if (ret != NativeRdb::E_OK) {
757 MEDIA_ERR_LOG("rdbStore_->BatchInsert failed, ret = %{public}d", ret);
758 MediaLibraryRestore::GetInstance().CheckRestore(ret);
759 return E_HAS_DB_ERROR;
760 }
761
762 MEDIA_DEBUG_LOG("rdbStore_->BatchInsert end, rowId = %d, ret = %{public}d", (int)outRowId, ret);
763 return ret;
764 }
765
BatchInsert(MediaLibraryCommand & cmd,int64_t & outInsertNum,std::vector<ValuesBucket> & values)766 int32_t MediaLibraryRdbStore::BatchInsert(MediaLibraryCommand &cmd, int64_t& outInsertNum,
767 std::vector<ValuesBucket>& values)
768 {
769 DfxTimer dfxTimer(DfxType::RDB_BATCHINSERT, INVALID_DFX, RDB_TIME_OUT, false);
770 MediaLibraryTracer tracer;
771 tracer.Start("MediaLibraryRdbStore::BatchInsert");
772 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
773 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
774 if (cmd.GetTableName() == PhotoColumn::PHOTOS_TABLE) {
775 for (auto& value : values) {
776 AddDefaultPhotoValues(value);
777 }
778 }
779 int32_t ret = ExecSqlWithRetry([&]() {
780 return MediaLibraryRdbStore::GetRaw()->BatchInsert(outInsertNum, cmd.GetTableName(), values);
781 });
782 if (ret != NativeRdb::E_OK) {
783 MEDIA_ERR_LOG("rdbStore_->BatchInsert failed, ret = %{public}d", ret);
784 MediaLibraryRestore::GetInstance().CheckRestore(ret);
785 return E_HAS_DB_ERROR;
786 }
787 tracer.Finish();
788 MEDIA_DEBUG_LOG("rdbStore_->BatchInsert end, rowId = %d, ret = %{public}d", (int)outInsertNum, ret);
789 return ret;
790 }
791
InsertInternal(int64_t & outRowId,const std::string & table,NativeRdb::ValuesBucket & row)792 int32_t MediaLibraryRdbStore::InsertInternal(int64_t &outRowId, const std::string &table,
793 NativeRdb::ValuesBucket &row)
794 {
795 return ExecSqlWithRetry([&]() { return MediaLibraryRdbStore::GetRaw()->Insert(outRowId, table, row); });
796 }
797
DoDeleteFromPredicates(const AbsRdbPredicates & predicates,int32_t & deletedRows)798 int32_t MediaLibraryRdbStore::DoDeleteFromPredicates(const AbsRdbPredicates &predicates, int32_t &deletedRows)
799 {
800 DfxTimer dfxTimer(DfxType::RDB_DELETE, INVALID_DFX, RDB_TIME_OUT, false);
801 if (!MediaLibraryRdbStore::CheckRdbStore()) {
802 MEDIA_ERR_LOG("Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
803 return E_HAS_DB_ERROR;
804 }
805 int32_t ret = NativeRdb::E_ERROR;
806 string tableName = predicates.GetTableName();
807 ValuesBucket valuesBucket;
808 if (tableName == MEDIALIBRARY_TABLE || tableName == PhotoColumn::PHOTOS_TABLE) {
809 valuesBucket.PutInt(MEDIA_DATA_DB_DIRTY, static_cast<int32_t>(DirtyType::TYPE_DELETED));
810 valuesBucket.PutInt(MEDIA_DATA_DB_SYNC_STATUS, static_cast<int32_t>(SyncStatusType::TYPE_UPLOAD));
811 valuesBucket.PutLong(PhotoColumn::PHOTO_META_DATE_MODIFIED, MediaFileUtils::UTCTimeMilliSeconds());
812 ret = ExecSqlWithRetry([&]() {
813 return MediaLibraryRdbStore::GetRaw()->Update(deletedRows, tableName, valuesBucket,
814 predicates.GetWhereClause(), predicates.GetWhereArgs());
815 });
816 MEDIA_INFO_LOG("delete photos permanently, ret: %{public}d", ret);
817 } else if (tableName == PhotoAlbumColumns::TABLE) {
818 valuesBucket.PutInt(PhotoAlbumColumns::ALBUM_DIRTY, static_cast<int32_t>(DirtyType::TYPE_DELETED));
819 ret = ExecSqlWithRetry([&]() {
820 return MediaLibraryRdbStore::GetRaw()->Update(deletedRows, tableName, valuesBucket,
821 predicates.GetWhereClause(), predicates.GetWhereArgs());
822 });
823 } else if (tableName == PhotoMap::TABLE) {
824 valuesBucket.PutInt(PhotoMap::DIRTY, static_cast<int32_t>(DirtyType::TYPE_DELETED));
825 ret = ExecSqlWithRetry([&]() {
826 return MediaLibraryRdbStore::GetRaw()->Update(deletedRows, tableName, valuesBucket,
827 predicates.GetWhereClause(), predicates.GetWhereArgs());
828 });
829 } else {
830 ret = ExecSqlWithRetry([&]() {
831 return MediaLibraryRdbStore::GetRaw()->Delete(deletedRows, tableName, predicates.GetWhereClause(),
832 predicates.GetWhereArgs());
833 });
834 }
835 return ret;
836 }
837
Delete(MediaLibraryCommand & cmd,int32_t & deletedRows)838 int32_t MediaLibraryRdbStore::Delete(MediaLibraryCommand &cmd, int32_t &deletedRows)
839 {
840 MediaLibraryTracer tracer;
841 tracer.Start("RdbStore->DeleteByCmd");
842 /* local delete */
843 int32_t ret = DoDeleteFromPredicates(*(cmd.GetAbsRdbPredicates()), deletedRows);
844 if (ret != NativeRdb::E_OK) {
845 MEDIA_ERR_LOG("rdbStore_->Delete failed, ret = %{public}d", ret);
846 MediaLibraryRestore::GetInstance().CheckRestore(ret);
847 return E_HAS_DB_ERROR;
848 }
849 CloudSyncHelper::GetInstance()->StartSync();
850 return ret;
851 }
852
Update(MediaLibraryCommand & cmd,int32_t & changedRows)853 int32_t MediaLibraryRdbStore::Update(MediaLibraryCommand &cmd, int32_t &changedRows)
854 {
855 if (!MediaLibraryRdbStore::CheckRdbStore()) {
856 MEDIA_ERR_LOG("rdbStore_ is nullptr");
857 return E_HAS_DB_ERROR;
858 }
859
860 if (cmd.GetTableName() == PhotoColumn::PHOTOS_TABLE) {
861 cmd.GetValueBucket().PutLong(PhotoColumn::PHOTO_META_DATE_MODIFIED,
862 MediaFileUtils::UTCTimeMilliSeconds());
863 cmd.GetValueBucket().PutLong(PhotoColumn::PHOTO_LAST_VISIT_TIME,
864 MediaFileUtils::UTCTimeMilliSeconds());
865 }
866
867 DfxTimer dfxTimer(DfxType::RDB_UPDATE_BY_CMD, INVALID_DFX, RDB_TIME_OUT, false);
868 MediaLibraryTracer tracer;
869 tracer.Start("RdbStore->UpdateByCmd");
870 int32_t ret = ExecSqlWithRetry([&]() {
871 return MediaLibraryRdbStore::GetRaw()->Update(changedRows, cmd.GetTableName(), cmd.GetValueBucket(),
872 cmd.GetAbsRdbPredicates()->GetWhereClause(), cmd.GetAbsRdbPredicates()->GetWhereArgs());
873 });
874 if (ret != NativeRdb::E_OK) {
875 MEDIA_ERR_LOG("rdbStore_->Update failed, ret = %{public}d", ret);
876 MediaLibraryRestore::GetInstance().CheckRestore(ret);
877 return E_HAS_DB_ERROR;
878 }
879 return ret;
880 }
881
GetIndexOfUri(const AbsRdbPredicates & predicates,const vector<string> & columns,const string & id)882 shared_ptr<NativeRdb::ResultSet> MediaLibraryRdbStore::GetIndexOfUri(const AbsRdbPredicates &predicates,
883 const vector<string> &columns, const string &id)
884 {
885 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), nullptr, "rdbStore_ is nullptr");
886 MediaLibraryTracer tracer;
887 tracer.Start("GetIndexOfUri");
888 string sql;
889 sql.append("SELECT ").append(PHOTO_INDEX).append(" From (");
890 sql.append(RdbSqlUtils::BuildQueryString(predicates, columns));
891 sql.append(") where "+ MediaColumn::MEDIA_ID + " = ").append(id);
892 MEDIA_DEBUG_LOG("sql = %{private}s", sql.c_str());
893 const vector<string> &args = predicates.GetWhereArgs();
894 for (const auto &arg : args) {
895 MEDIA_DEBUG_LOG("arg = %{private}s", arg.c_str());
896 }
897 auto resultSet = MediaLibraryRdbStore::GetRaw()->QuerySql(sql, args);
898 MediaLibraryRestore::GetInstance().CheckResultSet(resultSet);
899 return resultSet;
900 }
901
QueryEditDataExists(const NativeRdb::AbsRdbPredicates & predicates)902 shared_ptr<NativeRdb::ResultSet> MediaLibraryRdbStore::QueryEditDataExists(
903 const NativeRdb::AbsRdbPredicates &predicates)
904 {
905 vector<string> columns = { MediaColumn::MEDIA_FILE_PATH };
906 shared_ptr<NativeRdb::ResultSet> resultSet = Query(predicates, columns);
907 bool cond = (resultSet == nullptr || resultSet->GoToFirstRow() != NativeRdb::E_OK);
908 CHECK_AND_RETURN_RET_LOG(!cond, nullptr, "query edit data err");
909
910 CHECK_AND_RETURN_RET_LOG(CheckRdbStore(), nullptr, "rdbStore_ is nullptr. Maybe it didn't init successfully.");
911
912 string photoPath = GetStringVal(MediaColumn::MEDIA_FILE_PATH, resultSet);
913
914 cond = MediaFileUtils::IsFileExists(PhotoFileUtils::GetEditDataPath(photoPath)) ||
915 MediaFileUtils::IsFileExists(PhotoFileUtils::GetEditDataCameraPath(photoPath));
916 CHECK_AND_RETURN_RET(!cond,
917 MediaLibraryRdbStore::GetRaw()->QuerySql("SELECT 1 AS hasEditData"));
918 return MediaLibraryRdbStore::GetRaw()->QuerySql("SELECT 0 AS hasEditData");
919 }
920
QueryMovingPhotoVideoReady(const NativeRdb::AbsRdbPredicates & predicates)921 shared_ptr<NativeRdb::ResultSet> MediaLibraryRdbStore::QueryMovingPhotoVideoReady(
922 const NativeRdb::AbsRdbPredicates &predicates)
923 {
924 vector<string> columns = { MediaColumn::MEDIA_FILE_PATH };
925 shared_ptr<NativeRdb::ResultSet> resultSet = Query(predicates, columns);
926 bool cond = (resultSet == nullptr || resultSet->GoToFirstRow() != NativeRdb::E_OK);
927 CHECK_AND_RETURN_RET_LOG(!cond, resultSet, "query moving photo video ready err");
928
929 string photoPath = GetStringVal(MediaColumn::MEDIA_FILE_PATH, resultSet);
930 size_t fileSize;
931 auto videoPath = MediaFileUtils::GetMovingPhotoVideoPath(photoPath);
932 cond = MediaFileUtils::GetFileSize(videoPath, fileSize) && (fileSize > 0);
933 MEDIA_DEBUG_LOG("photoPath:%{public}s, videoPath:%{public}s, video size:%zu",
934 DfxUtils::GetSafePath(photoPath).c_str(), DfxUtils::GetSafePath(videoPath).c_str(), fileSize);
935 CHECK_AND_RETURN_RET(!cond, MediaLibraryRdbStore::GetRaw()->QuerySql("SELECT 1 AS movingPhotoVideoReady"));
936 return MediaLibraryRdbStore::GetRaw()->QuerySql("SELECT 0 AS movingPhotoVideoReady");
937 }
938
GetIndexOfUriForPhotos(const AbsRdbPredicates & predicates,const vector<string> & columns,const string & id)939 shared_ptr<NativeRdb::ResultSet> MediaLibraryRdbStore::GetIndexOfUriForPhotos(const AbsRdbPredicates &predicates,
940 const vector<string> &columns, const string &id)
941 {
942 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), nullptr, "rdbStore_ is nullptr");
943 MediaLibraryTracer tracer;
944 tracer.Start("GetIndexOfUriForPhotos");
945 string sql;
946 sql.append(RdbSqlUtils::BuildQueryString(predicates, columns));
947 MEDIA_DEBUG_LOG("sql = %{private}s", sql.c_str());
948 const vector<string> &args = predicates.GetWhereArgs();
949 for (const auto &arg : args) {
950 MEDIA_DEBUG_LOG("arg = %{private}s", arg.c_str());
951 }
952 auto resultSet = MediaLibraryRdbStore::GetRaw()->QuerySql(sql, args);
953 MediaLibraryRestore::GetInstance().CheckResultSet(resultSet);
954 return resultSet;
955 }
956
UpdateLastVisitTime(const string & id)957 int32_t MediaLibraryRdbStore::UpdateLastVisitTime(const string &id)
958 {
959 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR, "rdbStore_ is nullptr");
960 MediaLibraryTracer tracer;
961 tracer.Start("UpdateLastVisitTime");
962 ValuesBucket values;
963 int32_t changedRows = 0;
964 values.PutLong(PhotoColumn::PHOTO_LAST_VISIT_TIME, MediaFileUtils::UTCTimeMilliSeconds());
965 string whereClause = MediaColumn::MEDIA_ID + " = ?";
966 vector<string> whereArgs = {id};
967 int32_t ret = ExecSqlWithRetry([&]() {
968 return MediaLibraryRdbStore::GetRaw()->Update(changedRows, PhotoColumn::PHOTOS_TABLE, values, whereClause,
969 whereArgs);
970 });
971 if (ret != NativeRdb::E_OK || changedRows <= 0) {
972 MEDIA_ERR_LOG("rdbStore_->UpdateLastVisitTime failed, changedRows = %{public}d, ret = %{public}d",
973 changedRows, ret);
974 MediaLibraryRestore::GetInstance().CheckRestore(ret);
975 }
976 return changedRows;
977 }
978
Query(MediaLibraryCommand & cmd,const vector<string> & columns)979 shared_ptr<NativeRdb::ResultSet> MediaLibraryRdbStore::Query(MediaLibraryCommand &cmd,
980 const vector<string> &columns)
981 {
982 if (!MediaLibraryRdbStore::CheckRdbStore()) {
983 MEDIA_ERR_LOG("rdbStore_ is nullptr");
984 VariantMap map = {{KEY_ERR_FILE, __FILE__}, {KEY_ERR_LINE, __LINE__}, {KEY_ERR_CODE, E_HAS_DB_ERROR},
985 {KEY_OPT_TYPE, OptType::QUERY}};
986 PostEventUtils::GetInstance().PostErrorProcess(ErrType::DB_OPT_ERR, map);
987 return nullptr;
988 }
989
990 MediaLibraryTracer tracer;
991 tracer.Start("RdbStore->QueryByCmd");
992 #ifdef MEDIALIBRARY_COMPATIBILITY
993 auto predicates = cmd.GetAbsRdbPredicates();
994 MEDIA_DEBUG_LOG("tablename = %{private}s", predicates->GetTableName().c_str());
995 for (const auto &col : columns) {
996 MEDIA_DEBUG_LOG("col = %{private}s", col.c_str());
997 }
998 MEDIA_DEBUG_LOG("whereClause = %{private}s", predicates->GetWhereClause().c_str());
999 const vector<string> &args = predicates->GetWhereArgs();
1000 for (const auto &arg : args) {
1001 MEDIA_DEBUG_LOG("whereArgs = %{private}s", arg.c_str());
1002 }
1003 MEDIA_DEBUG_LOG("limit = %{public}d", predicates->GetLimit());
1004 #endif
1005
1006 /*
1007 * adapter pattern:
1008 * Reuse predicates-based query so that no need to modify both func
1009 * if later logic changes take place
1010 */
1011 auto resultSet = QueryWithFilter(*cmd.GetAbsRdbPredicates(), columns);
1012 if (resultSet == nullptr) {
1013 VariantMap map = {{KEY_ERR_FILE, __FILE__}, {KEY_ERR_LINE, __LINE__}, {KEY_ERR_CODE, E_HAS_DB_ERROR},
1014 {KEY_OPT_TYPE, OptType::QUERY}};
1015 PostEventUtils::GetInstance().PostErrorProcess(ErrType::DB_OPT_ERR, map);
1016 }
1017 return resultSet;
1018 }
1019
PrintPredicatesInfo(const AbsRdbPredicates & predicates,const vector<string> & columns)1020 static void PrintPredicatesInfo(const AbsRdbPredicates& predicates, const vector<string>& columns)
1021 {
1022 string argsInfo;
1023 for (const auto& arg : predicates.GetWhereArgs()) {
1024 if (!argsInfo.empty()) {
1025 argsInfo += ", ";
1026 }
1027 argsInfo += arg;
1028 }
1029 MEDIA_DEBUG_LOG("Predicates Statement is %{public}s", RdbSqlUtils::BuildQueryString(predicates, columns).c_str());
1030 MEDIA_DEBUG_LOG("PhotosApp Predicates Args are %{public}s", argsInfo.c_str());
1031 }
1032
QueryWithFilter(const AbsRdbPredicates & predicates,const vector<string> & columns)1033 shared_ptr<NativeRdb::ResultSet> MediaLibraryRdbStore::QueryWithFilter(const AbsRdbPredicates &predicates,
1034 const vector<string> &columns)
1035 {
1036 if (!MediaLibraryRdbStore::CheckRdbStore()) {
1037 MEDIA_ERR_LOG("rdbStore_ is nullptr");
1038 VariantMap map = {{KEY_ERR_FILE, __FILE__}, {KEY_ERR_LINE, __LINE__}, {KEY_ERR_CODE, E_HAS_DB_ERROR},
1039 {KEY_OPT_TYPE, OptType::QUERY}};
1040 PostEventUtils::GetInstance().PostErrorProcess(ErrType::DB_OPT_ERR, map);
1041 return nullptr;
1042 }
1043
1044 /* add filter */
1045 MediaLibraryRdbUtils::AddQueryFilter(const_cast<AbsRdbPredicates &>(predicates));
1046 DfxTimer dfxTimer(RDB_QUERY, INVALID_DFX, RDB_TIME_OUT, false);
1047 MediaLibraryTracer tracer;
1048 tracer.Start("RdbStore->QueryByPredicates");
1049 PrintPredicatesInfo(predicates, columns);
1050 auto resultSet = MediaLibraryRdbStore::GetRaw()->QueryByStep(predicates, columns);
1051 MediaLibraryRestore::GetInstance().CheckResultSet(resultSet);
1052 if (resultSet == nullptr) {
1053 VariantMap map = {{KEY_ERR_FILE, __FILE__}, {KEY_ERR_LINE, __LINE__}, {KEY_ERR_CODE, E_HAS_DB_ERROR},
1054 {KEY_OPT_TYPE, OptType::QUERY}};
1055 PostEventUtils::GetInstance().PostErrorProcess(ErrType::DB_OPT_ERR, map);
1056 }
1057 return resultSet;
1058 }
1059
ExecuteSql(const string & sql)1060 int32_t MediaLibraryRdbStore::ExecuteSql(const string &sql)
1061 {
1062 if (!MediaLibraryRdbStore::CheckRdbStore()) {
1063 MEDIA_ERR_LOG("Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
1064 return E_HAS_DB_ERROR;
1065 }
1066 DfxTimer dfxTimer(RDB_EXECUTE_SQL, INVALID_DFX, RDB_TIME_OUT, false);
1067 MediaLibraryTracer tracer;
1068 tracer.Start("RdbStore->ExecuteSql");
1069 int32_t ret = ExecSqlWithRetry([&]() { return MediaLibraryRdbStore::GetRaw()->ExecuteSql(sql); });
1070 if (ret != NativeRdb::E_OK) {
1071 MEDIA_ERR_LOG("rdbStore_->ExecuteSql failed, ret = %{public}d", ret);
1072 MediaLibraryRestore::GetInstance().CheckRestore(ret);
1073 return E_HAS_DB_ERROR;
1074 }
1075 return ret;
1076 }
1077
QueryPragma(const string & key,int64_t & value)1078 int32_t MediaLibraryRdbStore::QueryPragma(const string &key, int64_t &value)
1079 {
1080 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
1081 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
1082 std::shared_ptr<ResultSet> resultSet = MediaLibraryRdbStore::GetRaw()->QuerySql("PRAGMA " + key);
1083 MediaLibraryRestore::GetInstance().CheckResultSet(resultSet);
1084 if (resultSet == nullptr || resultSet->GoToFirstRow() != NativeRdb::E_OK) {
1085 MEDIA_ERR_LOG("rdbStore_->QuerySql failed");
1086 return E_HAS_DB_ERROR;
1087 }
1088 resultSet->GetLong(0, value);
1089 resultSet->Close();
1090 return E_OK;
1091 }
1092
BuildValuesSql(const NativeRdb::ValuesBucket & values,vector<ValueObject> & bindArgs,string & sql)1093 void MediaLibraryRdbStore::BuildValuesSql(const NativeRdb::ValuesBucket &values, vector<ValueObject> &bindArgs,
1094 string &sql)
1095 {
1096 map<string, ValueObject> valuesMap;
1097 values.GetAll(valuesMap);
1098 sql.append("(");
1099 for (auto iter = valuesMap.begin(); iter != valuesMap.end(); iter++) {
1100 sql.append(((iter == valuesMap.begin()) ? "" : ", "));
1101 sql.append(iter->first); // columnName
1102 bindArgs.push_back(iter->second); // columnValue
1103 }
1104
1105 sql.append(") select ");
1106 for (size_t i = 0; i < valuesMap.size(); i++) {
1107 sql.append(((i == 0) ? "?" : ", ?"));
1108 }
1109 sql.append(" ");
1110 }
1111
BuildQuerySql(const AbsRdbPredicates & predicates,const vector<string> & columns,vector<ValueObject> & bindArgs,string & sql)1112 void MediaLibraryRdbStore::BuildQuerySql(const AbsRdbPredicates &predicates, const vector<string> &columns,
1113 vector<ValueObject> &bindArgs, string &sql)
1114 {
1115 sql.append(RdbSqlUtils::BuildQueryString(predicates, columns));
1116 const vector<string> &args = predicates.GetWhereArgs();
1117 for (const auto &arg : args) {
1118 bindArgs.emplace_back(arg);
1119 }
1120 }
1121
StepQueryWithoutCheck(const AbsRdbPredicates & predicates,const vector<string> & columns)1122 shared_ptr<NativeRdb::ResultSet> MediaLibraryRdbStore::StepQueryWithoutCheck(const AbsRdbPredicates &predicates,
1123 const vector<string> &columns)
1124 {
1125 if (!MediaLibraryRdbStore::CheckRdbStore()) {
1126 MEDIA_ERR_LOG("rdbStore_ is nullptr");
1127 VariantMap map = { { KEY_ERR_FILE, __FILE__ },
1128 { KEY_ERR_LINE, __LINE__ },
1129 { KEY_ERR_CODE, E_HAS_DB_ERROR },
1130 { KEY_OPT_TYPE, OptType::QUERY } };
1131 PostEventUtils::GetInstance().PostErrorProcess(ErrType::DB_OPT_ERR, map);
1132 return nullptr;
1133 }
1134
1135 MediaLibraryRdbUtils::AddQueryFilter(const_cast<AbsRdbPredicates &>(predicates));
1136 DfxTimer dfxTimer(RDB_QUERY, INVALID_DFX, RDB_TIME_OUT, false);
1137 MediaLibraryTracer tracer;
1138 tracer.Start("StepQueryWithoutCheck");
1139 MEDIA_DEBUG_LOG("Predicates Statement is %{public}s", predicates.GetStatement().c_str());
1140 auto resultSet = MediaLibraryRdbStore::GetRaw()->QueryByStep(predicates, columns, false);
1141 if (resultSet == nullptr) {
1142 VariantMap map = { { KEY_ERR_FILE, __FILE__ },
1143 { KEY_ERR_LINE, __LINE__ },
1144 { KEY_ERR_CODE, E_HAS_DB_ERROR },
1145 { KEY_OPT_TYPE, OptType::QUERY } };
1146 PostEventUtils::GetInstance().PostErrorProcess(ErrType::DB_OPT_ERR, map);
1147 }
1148 return resultSet;
1149 }
1150
1151 /**
1152 * Returns last insert row id. If insert succeed but no new rows inserted, then return -1.
1153 * Return E_HAS_DB_ERROR on error cases.
1154 */
ExecuteForLastInsertedRowId(const string & sql,const vector<ValueObject> & bindArgs)1155 int32_t MediaLibraryRdbStore::ExecuteForLastInsertedRowId(const string &sql, const vector<ValueObject> &bindArgs)
1156 {
1157 if (!MediaLibraryRdbStore::CheckRdbStore()) {
1158 MEDIA_ERR_LOG("Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
1159 return E_HAS_DB_ERROR;
1160 }
1161
1162 int64_t lastInsertRowId = 0;
1163 int32_t err = ExecSqlWithRetry(
1164 [&]() { return MediaLibraryRdbStore::GetRaw()->ExecuteForLastInsertedRowId(lastInsertRowId, sql, bindArgs); });
1165 if (err != E_OK) {
1166 MEDIA_ERR_LOG("Failed to execute insert, err: %{public}d", err);
1167 MediaLibraryRestore::GetInstance().CheckRestore(err);
1168 return E_HAS_DB_ERROR;
1169 }
1170 return lastInsertRowId;
1171 }
1172
Delete(const AbsRdbPredicates & predicates)1173 int32_t MediaLibraryRdbStore::Delete(const AbsRdbPredicates &predicates)
1174 {
1175 int err = E_ERR;
1176 int32_t deletedRows = 0;
1177 err = DoDeleteFromPredicates(predicates, deletedRows);
1178 if (err != E_OK) {
1179 MEDIA_ERR_LOG("Failed to execute delete, err: %{public}d", err);
1180 MediaLibraryRestore::GetInstance().CheckRestore(err);
1181 return E_HAS_DB_ERROR;
1182 }
1183 CloudSyncHelper::GetInstance()->StartSync();
1184 return deletedRows;
1185 }
1186
1187 /**
1188 * Return changed rows on success, or negative values on error cases.
1189 */
UpdateWithDateTime(ValuesBucket & values,const AbsRdbPredicates & predicates)1190 int32_t MediaLibraryRdbStore::UpdateWithDateTime(ValuesBucket &values,
1191 const AbsRdbPredicates &predicates)
1192 {
1193 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
1194 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
1195
1196 if (predicates.GetTableName() == PhotoColumn::PHOTOS_TABLE) {
1197 values.PutLong(PhotoColumn::PHOTO_META_DATE_MODIFIED, MediaFileUtils::UTCTimeMilliSeconds());
1198 values.PutLong(PhotoColumn::PHOTO_LAST_VISIT_TIME, MediaFileUtils::UTCTimeMilliSeconds());
1199 }
1200
1201 DfxTimer dfxTimer(DfxType::RDB_UPDATE, INVALID_DFX, RDB_TIME_OUT, false);
1202 MediaLibraryTracer tracer;
1203 tracer.Start("MediaLibraryRdbStore::Update by predicates");
1204 int32_t changedRows = -1;
1205 int32_t err =
1206 ExecSqlWithRetry([&]() { return MediaLibraryRdbStore::GetRaw()->Update(changedRows, values, predicates); });
1207 if (err != E_OK) {
1208 MEDIA_ERR_LOG("Failed to execute update, err: %{public}d", err);
1209 MediaLibraryRestore::GetInstance().CheckRestore(err);
1210 return E_HAS_DB_ERROR;
1211 }
1212
1213 return changedRows;
1214 }
1215
QuerySql(const string & sql,const vector<string> & selectionArgs)1216 shared_ptr<NativeRdb::ResultSet> MediaLibraryRdbStore::QuerySql(const string &sql, const vector<string> &selectionArgs)
1217 {
1218 if (!MediaLibraryRdbStore::CheckRdbStore()) {
1219 MEDIA_ERR_LOG("Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
1220 VariantMap map = {{KEY_ERR_FILE, __FILE__}, {KEY_ERR_LINE, __LINE__}, {KEY_ERR_CODE, E_HAS_DB_ERROR},
1221 {KEY_OPT_TYPE, OptType::QUERY}};
1222 PostEventUtils::GetInstance().PostErrorProcess(ErrType::DB_OPT_ERR, map);
1223 return nullptr;
1224 }
1225
1226 MediaLibraryTracer tracer;
1227 tracer.Start("RdbStore->QuerySql");
1228 auto resultSet = MediaLibraryRdbStore::GetRaw()->QuerySql(sql, selectionArgs);
1229 MediaLibraryRestore::GetInstance().CheckResultSet(resultSet);
1230 if (resultSet == nullptr) {
1231 VariantMap map = {{KEY_ERR_FILE, __FILE__}, {KEY_ERR_LINE, __LINE__}, {KEY_ERR_CODE, E_HAS_DB_ERROR},
1232 {KEY_OPT_TYPE, OptType::QUERY}};
1233 PostEventUtils::GetInstance().PostErrorProcess(ErrType::DB_OPT_ERR, map);
1234 }
1235
1236 return resultSet;
1237 }
1238
ReplacePredicatesUriToId(AbsRdbPredicates & predicates)1239 void MediaLibraryRdbStore::ReplacePredicatesUriToId(AbsRdbPredicates &predicates)
1240 {
1241 const vector<string> &whereUriArgs = predicates.GetWhereArgs();
1242 vector<string> whereIdArgs;
1243 whereIdArgs.reserve(whereUriArgs.size());
1244 for (const auto &arg : whereUriArgs) {
1245 if (!MediaFileUtils::StartsWith(arg, PhotoColumn::PHOTO_URI_PREFIX)) {
1246 whereIdArgs.push_back(arg);
1247 continue;
1248 }
1249 whereIdArgs.push_back(MediaFileUri::GetPhotoId(arg));
1250 }
1251
1252 predicates.SetWhereArgs(whereIdArgs);
1253 }
1254
GetInt(const shared_ptr<ResultSet> & resultSet,const string & column)1255 int32_t MediaLibraryRdbStore::GetInt(const shared_ptr<ResultSet> &resultSet, const string &column)
1256 {
1257 return get<int32_t>(ResultSetUtils::GetValFromColumn(column, resultSet, TYPE_INT32));
1258 }
1259
GetString(const shared_ptr<ResultSet> & resultSet,const string & column)1260 string MediaLibraryRdbStore::GetString(const shared_ptr<ResultSet> &resultSet, const string &column)
1261 {
1262 return get<string>(ResultSetUtils::GetValFromColumn(column, resultSet, TYPE_STRING));
1263 }
1264
BuildInsertSystemAlbumSql(const ValuesBucket & values,const AbsRdbPredicates & predicates,string & sql,vector<ValueObject> & bindArgs)1265 inline void BuildInsertSystemAlbumSql(const ValuesBucket &values, const AbsRdbPredicates &predicates,
1266 string &sql, vector<ValueObject> &bindArgs)
1267 {
1268 // Build insert sql
1269 sql.append("INSERT").append(" OR ROLLBACK ").append(" INTO ").append(PhotoAlbumColumns::TABLE).append(" ");
1270 MediaLibraryRdbStore::BuildValuesSql(values, bindArgs, sql);
1271 sql.append(" WHERE NOT EXISTS (");
1272 MediaLibraryRdbStore::BuildQuerySql(predicates, { PhotoAlbumColumns::ALBUM_ID }, bindArgs, sql);
1273 sql.append(");");
1274 }
1275
PrepareAlbumPlugin(RdbStore & store)1276 int32_t PrepareAlbumPlugin(RdbStore &store)
1277 {
1278 AlbumPluginTableEventHandler albumPluginTableEventHander;
1279 int32_t ret = albumPluginTableEventHander.OnCreate(store);
1280 // after initiate album_plugin table, add 2 default album into PhotoAlbum.
1281 ExecSqlWithRetry([&]() {
1282 return store.ExecuteSql(CREATE_DEFALUT_ALBUM_FOR_NO_RELATIONSHIP_ASSET);
1283 });
1284 ExecSqlWithRetry([&]() {
1285 return store.ExecuteSql(CREATE_HIDDEN_ALBUM_FOR_DUAL_ASSET);
1286 });
1287 return ret;
1288 }
1289
PrepareSystemAlbums(RdbStore & store)1290 int32_t PrepareSystemAlbums(RdbStore &store)
1291 {
1292 ValuesBucket values;
1293 int32_t err = E_FAIL;
1294 MEDIA_INFO_LOG("PrepareSystemAlbums start");
1295 auto [errCode, transaction] = store.CreateTransaction(OHOS::NativeRdb::Transaction::DEFERRED);
1296 DfxTransaction reporter{ __func__ };
1297 if (errCode != NativeRdb::E_OK || transaction == nullptr) {
1298 reporter.ReportError(DfxTransaction::AbnormalType::CREATE_ERROR, errCode);
1299 MEDIA_ERR_LOG("transaction failed, err:%{public}d", errCode);
1300 return errCode;
1301 }
1302 for (int32_t i = PhotoAlbumSubType::SYSTEM_START; i <= PhotoAlbumSubType::SYSTEM_END; i++) {
1303 values.PutInt(PhotoAlbumColumns::ALBUM_TYPE, PhotoAlbumType::SYSTEM);
1304 values.PutInt(PhotoAlbumColumns::ALBUM_SUBTYPE, i);
1305 values.PutInt(PhotoAlbumColumns::ALBUM_ORDER, i - PhotoAlbumSubType::SYSTEM_START);
1306
1307 AbsRdbPredicates predicates(PhotoAlbumColumns::TABLE);
1308 predicates.EqualTo(PhotoAlbumColumns::ALBUM_TYPE, to_string(PhotoAlbumType::SYSTEM));
1309 predicates.EqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, to_string(i));
1310
1311 string sql;
1312 vector<ValueObject> bindArgs;
1313 BuildInsertSystemAlbumSql(values, predicates, sql, bindArgs);
1314 auto res = transaction->Execute(sql, bindArgs);
1315 err = res.first;
1316 if (err != E_OK) {
1317 reporter.ReportError(DfxTransaction::AbnormalType::EXECUTE_ERROR, err);
1318 transaction->Rollback();
1319 MEDIA_ERR_LOG("Execute sql failed, err: %{public}d", err);
1320 return err;
1321 }
1322 values.Clear();
1323 }
1324 err = transaction->Commit();
1325 if (err != NativeRdb::E_OK) {
1326 reporter.ReportError(DfxTransaction::AbnormalType::COMMIT_ERROR, err);
1327 MEDIA_ERR_LOG("transaction Commit failed, err: %{public}d", err);
1328 } else {
1329 reporter.ReportIfTimeout();
1330 }
1331 return E_OK;
1332 }
1333
PrepareDir(RdbStore & store)1334 int32_t MediaLibraryDataCallBack::PrepareDir(RdbStore &store)
1335 {
1336 DirValuesBucket cameraDir = {
1337 CAMERA_DIRECTORY_TYPE_VALUES, CAMERA_DIR_VALUES, CAMERA_TYPE_VALUES, CAMERA_EXTENSION_VALUES
1338 };
1339 DirValuesBucket videoDir = {
1340 VIDEO_DIRECTORY_TYPE_VALUES, VIDEO_DIR_VALUES, VIDEO_TYPE_VALUES, VIDEO_EXTENSION_VALUES
1341 };
1342 DirValuesBucket pictureDir = {
1343 PIC_DIRECTORY_TYPE_VALUES, PIC_DIR_VALUES, PIC_TYPE_VALUES, PIC_EXTENSION_VALUES
1344 };
1345 DirValuesBucket audioDir = {
1346 AUDIO_DIRECTORY_TYPE_VALUES, AUDIO_DIR_VALUES, AUDIO_TYPE_VALUES, AUDIO_EXTENSION_VALUES
1347 };
1348 DirValuesBucket documentDir = {
1349 DOC_DIRECTORY_TYPE_VALUES, DOCS_PATH, DOC_TYPE_VALUES, DOC_EXTENSION_VALUES
1350 };
1351 DirValuesBucket downloadDir = {
1352 DOWNLOAD_DIRECTORY_TYPE_VALUES, DOCS_PATH, DOWNLOAD_TYPE_VALUES, DOWNLOAD_EXTENSION_VALUES
1353 };
1354
1355 vector<DirValuesBucket> dirValuesBuckets = {
1356 cameraDir, videoDir, pictureDir, audioDir, documentDir, downloadDir
1357 };
1358
1359 for (const auto& dirValuesBucket : dirValuesBuckets) {
1360 int32_t insertResult = InsertDirValues(dirValuesBucket, store);
1361 CHECK_AND_PRINT_LOG(insertResult == NativeRdb::E_OK,
1362 "insert failed, insertResult: %{public}d", insertResult);
1363 }
1364 return NativeRdb::E_OK;
1365 }
1366
InsertDirValues(const DirValuesBucket & dirValuesBucket,RdbStore & store)1367 int32_t MediaLibraryDataCallBack::InsertDirValues(const DirValuesBucket &dirValuesBucket, RdbStore &store)
1368 {
1369 ValuesBucket valuesBucket;
1370 valuesBucket.PutInt(DIRECTORY_DB_DIRECTORY_TYPE, dirValuesBucket.directoryType);
1371 valuesBucket.PutString(DIRECTORY_DB_DIRECTORY, dirValuesBucket.dirValues);
1372 valuesBucket.PutString(DIRECTORY_DB_MEDIA_TYPE, dirValuesBucket.typeValues);
1373 valuesBucket.PutString(DIRECTORY_DB_EXTENSION, dirValuesBucket.extensionValues);
1374 int64_t outRowId = -1;
1375 int32_t insertResult = ExecSqlWithRetry([&]() {
1376 return store.InsertWithConflictResolution(outRowId, MEDIATYPE_DIRECTORY_TABLE, valuesBucket,
1377 ConflictResolution::ON_CONFLICT_REPLACE);
1378 });
1379 MEDIA_DEBUG_LOG("insert dir outRowId: %{public}ld insertResult: %{public}d", (long)outRowId, insertResult);
1380 return insertResult;
1381 }
1382
PrepareSmartAlbum(RdbStore & store)1383 int32_t MediaLibraryDataCallBack::PrepareSmartAlbum(RdbStore &store)
1384 {
1385 SmartAlbumValuesBucket trashAlbum = {
1386 TRASH_ALBUM_ID_VALUES, TRASH_ALBUM_NAME_VALUES, TRASH_ALBUM_TYPE_VALUES
1387 };
1388
1389 SmartAlbumValuesBucket favAlbum = {
1390 FAVOURITE_ALBUM_ID_VALUES, FAVOURTIE_ALBUM_NAME_VALUES, FAVOURITE_ALBUM_TYPE_VALUES
1391 };
1392
1393 vector<SmartAlbumValuesBucket> smartAlbumValuesBuckets = {
1394 trashAlbum, favAlbum
1395 };
1396
1397 for (const auto& smartAlbum : smartAlbumValuesBuckets) {
1398 if (InsertSmartAlbumValues(smartAlbum, store) != NativeRdb::E_OK) {
1399 MEDIA_ERR_LOG("Prepare smartAlbum failed");
1400 return NativeRdb::E_ERROR;
1401 }
1402 }
1403 return NativeRdb::E_OK;
1404 }
1405
InsertShootingModeAlbumValues(const string & albumName,RdbStore & store)1406 static int32_t InsertShootingModeAlbumValues(
1407 const string& albumName, RdbStore &store)
1408 {
1409 ValuesBucket valuesBucket;
1410 valuesBucket.PutInt(SMARTALBUM_DB_ALBUM_TYPE, SHOOTING_MODE_TYPE);
1411 valuesBucket.PutInt(COMPAT_ALBUM_SUBTYPE, SHOOTING_MODE_SUB_TYPE);
1412 valuesBucket.PutString(MEDIA_DATA_DB_ALBUM_NAME, albumName);
1413 valuesBucket.PutInt(MEDIA_DATA_DB_COUNT, 0);
1414 valuesBucket.PutInt(MEDIA_DATA_DB_IS_LOCAL, 1); // local album is 1.
1415 int64_t outRowId = -1;
1416 int32_t insertResult = ExecSqlWithRetry([&]() {
1417 return store.InsertWithConflictResolution(outRowId, ANALYSIS_ALBUM_TABLE, valuesBucket,
1418 ConflictResolution::ON_CONFLICT_REPLACE);
1419 });
1420 return insertResult;
1421 }
1422
QueryExistingShootingModeAlbumNames(RdbStore & store,vector<string> & existingAlbumNames)1423 static int32_t QueryExistingShootingModeAlbumNames(RdbStore& store, vector<string>& existingAlbumNames)
1424 {
1425 string queryRowSql = "SELECT album_name FROM " + ANALYSIS_ALBUM_TABLE +
1426 " WHERE album_subtype = " + to_string(PhotoAlbumSubType::SHOOTING_MODE);
1427 auto resultSet = store.QuerySql(queryRowSql);
1428 CHECK_AND_RETURN_RET_LOG(resultSet != nullptr, E_FAIL,
1429 "Can not get shootingMode album names, resultSet is nullptr");
1430 while (resultSet->GoToNextRow() == NativeRdb::E_OK) {
1431 string albumName = GetStringVal("album_name", resultSet);
1432 if (!albumName.empty()) {
1433 existingAlbumNames.push_back(albumName);
1434 }
1435 }
1436 return E_SUCCESS;
1437 }
1438
PrepareShootingModeAlbum(RdbStore & store)1439 static int32_t PrepareShootingModeAlbum(RdbStore &store)
1440 {
1441 vector<string> existingAlbumNames;
1442 if (QueryExistingShootingModeAlbumNames(store, existingAlbumNames) != E_SUCCESS) {
1443 MEDIA_ERR_LOG("Query existing shootingMode album names failed");
1444 return NativeRdb::E_ERROR;
1445 }
1446 for (int i = static_cast<int>(ShootingModeAlbumType::START);
1447 i <= static_cast<int>(ShootingModeAlbumType::END); ++i) {
1448 string albumName = to_string(i);
1449 if (find(existingAlbumNames.begin(), existingAlbumNames.end(), albumName) != existingAlbumNames.end()) {
1450 continue;
1451 }
1452 if (InsertShootingModeAlbumValues(albumName, store) != NativeRdb::E_OK) {
1453 MEDIA_ERR_LOG("Prepare shootingMode album failed");
1454 return NativeRdb::E_ERROR;
1455 }
1456 }
1457 return NativeRdb::E_OK;
1458 }
1459
InsertSmartAlbumValues(const SmartAlbumValuesBucket & smartAlbum,RdbStore & store)1460 int32_t MediaLibraryDataCallBack::InsertSmartAlbumValues(const SmartAlbumValuesBucket &smartAlbum, RdbStore &store)
1461 {
1462 ValuesBucket valuesBucket;
1463 valuesBucket.PutInt(SMARTALBUM_DB_ID, smartAlbum.albumId);
1464 valuesBucket.PutString(SMARTALBUM_DB_NAME, smartAlbum.albumName);
1465 valuesBucket.PutInt(SMARTALBUM_DB_ALBUM_TYPE, smartAlbum.albumType);
1466 int64_t outRowId = -1;
1467 int32_t insertResult = ExecSqlWithRetry([&]() {
1468 return store.InsertWithConflictResolution(outRowId, SMARTALBUM_TABLE, valuesBucket,
1469 ConflictResolution::ON_CONFLICT_REPLACE);
1470 });
1471 return insertResult;
1472 }
1473
InsertUniqueMemberTableValues(const UniqueMemberValuesBucket & uniqueMemberValues,RdbStore & store)1474 static int32_t InsertUniqueMemberTableValues(const UniqueMemberValuesBucket &uniqueMemberValues,
1475 RdbStore &store)
1476 {
1477 ValuesBucket valuesBucket;
1478 valuesBucket.PutString(ASSET_MEDIA_TYPE, uniqueMemberValues.assetMediaType);
1479 valuesBucket.PutInt(UNIQUE_NUMBER, uniqueMemberValues.startNumber);
1480 int64_t outRowId = -1;
1481 int32_t insertResult = ExecSqlWithRetry([&]() {
1482 return store.InsertWithConflictResolution(outRowId, ASSET_UNIQUE_NUMBER_TABLE, valuesBucket,
1483 ConflictResolution::ON_CONFLICT_REPLACE);
1484 });
1485 return insertResult;
1486 }
1487
PrepareUniqueMemberTable(RdbStore & store)1488 static int32_t PrepareUniqueMemberTable(RdbStore &store)
1489 {
1490 string queryRowSql = "SELECT COUNT(*) as count FROM " + ASSET_UNIQUE_NUMBER_TABLE;
1491 auto resultSet = store.QuerySql(queryRowSql);
1492 if (resultSet == nullptr || resultSet->GoToFirstRow() != NativeRdb::E_OK) {
1493 MEDIA_ERR_LOG("Can not get AssetUniqueNumberTable count");
1494 UpdateFail(__FILE__, __LINE__);
1495 return NativeRdb::E_ERROR;
1496 }
1497 if (GetInt32Val("count", resultSet) != 0) {
1498 MEDIA_DEBUG_LOG("AssetUniqueNumberTable is already inited");
1499 return E_OK;
1500 }
1501
1502 UniqueMemberValuesBucket imageBucket = { IMAGE_ASSET_TYPE, 0 };
1503 UniqueMemberValuesBucket videoBucket = { VIDEO_ASSET_TYPE, 0 };
1504 UniqueMemberValuesBucket audioBucket = { AUDIO_ASSET_TYPE, 0 };
1505
1506 vector<UniqueMemberValuesBucket> uniqueNumberValueBuckets = {
1507 imageBucket, videoBucket, audioBucket
1508 };
1509
1510 for (const auto& uniqueNumberValueBucket : uniqueNumberValueBuckets) {
1511 if (InsertUniqueMemberTableValues(uniqueNumberValueBucket, store) != NativeRdb::E_OK) {
1512 MEDIA_ERR_LOG("Prepare smartAlbum failed");
1513 UpdateFail(__FILE__, __LINE__);
1514 return NativeRdb::E_ERROR;
1515 }
1516 }
1517 return NativeRdb::E_OK;
1518 }
1519
TriggerDeleteAlbumClearMap()1520 static const string &TriggerDeleteAlbumClearMap()
1521 {
1522 static const string TRIGGER_CLEAR_MAP = BaseColumn::CreateTrigger() + "photo_album_clear_map" +
1523 " AFTER DELETE ON " + PhotoAlbumColumns::TABLE +
1524 " BEGIN " +
1525 "DELETE FROM " + PhotoMap::TABLE +
1526 " WHERE " + PhotoMap::ALBUM_ID + "=" + "OLD." + PhotoAlbumColumns::ALBUM_ID + ";" +
1527 " END;";
1528 return TRIGGER_CLEAR_MAP;
1529 }
1530
TriggerAddAssets()1531 static const string &TriggerAddAssets()
1532 {
1533 static const string TRIGGER_ADD_ASSETS = BaseColumn::CreateTrigger() + "photo_album_insert_asset" +
1534 " AFTER INSERT ON " + PhotoMap::TABLE +
1535 " BEGIN " +
1536 "UPDATE " + PhotoAlbumColumns::TABLE + " SET " +
1537 PhotoAlbumColumns::ALBUM_COUNT + " = " + PhotoAlbumColumns::ALBUM_COUNT + " + 1 " +
1538 "WHERE " + PhotoAlbumColumns::ALBUM_ID + " = " + "NEW." + PhotoMap::ALBUM_ID + ";" +
1539 " END;";
1540 return TRIGGER_ADD_ASSETS;
1541 }
1542
TriggerRemoveAssets()1543 static const string &TriggerRemoveAssets()
1544 {
1545 static const string TRIGGER_REMOVE_ASSETS = BaseColumn::CreateTrigger() + "photo_album_delete_asset" +
1546 " AFTER DELETE ON " + PhotoMap::TABLE +
1547 " BEGIN " +
1548 "UPDATE " + PhotoAlbumColumns::TABLE + " SET " +
1549 PhotoAlbumColumns::ALBUM_COUNT + " = " + PhotoAlbumColumns::ALBUM_COUNT + " - 1 " +
1550 "WHERE " + PhotoAlbumColumns::ALBUM_ID + " = " + "OLD." + PhotoMap::ALBUM_ID + ";" +
1551 " END;";
1552 return TRIGGER_REMOVE_ASSETS;
1553 }
1554
TriggerDeletePhotoClearMap()1555 static const string &TriggerDeletePhotoClearMap()
1556 {
1557 static const string TRIGGER_DELETE_ASSETS = BaseColumn::CreateTrigger() + "delete_photo_clear_map" +
1558 " AFTER DELETE ON " + PhotoColumn::PHOTOS_TABLE +
1559 " BEGIN " +
1560 "DELETE FROM " + PhotoMap::TABLE +
1561 " WHERE " + PhotoMap::ASSET_ID + "=" + "OLD." + MediaColumn::MEDIA_ID + ";" +
1562 "DELETE FROM " + ANALYSIS_PHOTO_MAP_TABLE +
1563 " WHERE " + PhotoMap::ASSET_ID + "=" + "OLD." + MediaColumn::MEDIA_ID + ";" +
1564 " END;";
1565 return TRIGGER_DELETE_ASSETS;
1566 }
1567
QueryAlbumJoinMap()1568 static const string &QueryAlbumJoinMap()
1569 {
1570 static const string QUERY_ALBUM_JOIN_MAP = " SELECT " + PhotoAlbumColumns::ALBUM_ID +
1571 " FROM " + PhotoAlbumColumns::TABLE + " INNER JOIN " + PhotoMap::TABLE + " ON " +
1572 PhotoAlbumColumns::ALBUM_ID + " = " + PhotoMap::ALBUM_ID + " AND " +
1573 PhotoMap::ASSET_ID + " = " + "NEW." + MediaColumn::MEDIA_ID;
1574 return QUERY_ALBUM_JOIN_MAP;
1575 }
1576
SetHiddenUpdateCount()1577 static const string &SetHiddenUpdateCount()
1578 {
1579 // Photos.hidden 1 -> 0
1580 static const string SET_HIDDEN_UPDATE_COUNT = " UPDATE " + PhotoAlbumColumns::TABLE +
1581 " SET " + PhotoAlbumColumns::ALBUM_COUNT + " = " + PhotoAlbumColumns::ALBUM_COUNT + " + 1" +
1582 " WHERE " + PhotoAlbumColumns::ALBUM_ID + " IN (" +
1583 QueryAlbumJoinMap() + " WHERE " +
1584 "NEW." + MediaColumn::MEDIA_HIDDEN + " = 0" + " AND " +
1585 "(OLD." + MediaColumn::MEDIA_HIDDEN + " - NEW." + MediaColumn::MEDIA_HIDDEN + " > 0)" +
1586 ");";
1587 return SET_HIDDEN_UPDATE_COUNT;
1588 }
1589
SetTrashUpdateCount()1590 static const string &SetTrashUpdateCount()
1591 {
1592 // Photos.date_trashed timestamp -> 0
1593 static const string SET_TRASH_UPDATE_COUNT = " UPDATE " + PhotoAlbumColumns::TABLE +
1594 " SET " + PhotoAlbumColumns::ALBUM_COUNT + " = " + PhotoAlbumColumns::ALBUM_COUNT + " + 1" +
1595 " WHERE " + PhotoAlbumColumns::ALBUM_ID + " IN (" +
1596 QueryAlbumJoinMap() + " WHERE " +
1597 "SIGN(NEW." + MediaColumn::MEDIA_DATE_TRASHED + ") = 0" + " AND " +
1598 "NEW." + MediaColumn::MEDIA_HIDDEN + " = 0" + " AND " +
1599 "(" +
1600 "SIGN(OLD." + MediaColumn::MEDIA_DATE_TRASHED + ") - " +
1601 "SIGN(NEW." + MediaColumn::MEDIA_DATE_TRASHED + ") > 0" +
1602 ")" +
1603 ");";
1604 return SET_TRASH_UPDATE_COUNT;
1605 }
1606
UnSetHiddenUpdateCount()1607 static const string &UnSetHiddenUpdateCount()
1608 {
1609 // Photos.hidden 0 -> 1
1610 static const string UNSET_HIDDEN_UPDATE_COUNT = " UPDATE " + PhotoAlbumColumns::TABLE +
1611 " SET " + PhotoAlbumColumns::ALBUM_COUNT + " = " + PhotoAlbumColumns::ALBUM_COUNT + " - 1" +
1612 " WHERE " + PhotoAlbumColumns::ALBUM_ID + " IN (" +
1613 QueryAlbumJoinMap() + " WHERE " +
1614 "NEW." + MediaColumn::MEDIA_HIDDEN + " = 1" + " AND " +
1615 "(NEW." + MediaColumn::MEDIA_HIDDEN + " - OLD." + MediaColumn::MEDIA_HIDDEN + " > 0)" +
1616 ");";
1617 return UNSET_HIDDEN_UPDATE_COUNT;
1618 }
1619
UnSetTrashUpdateCount()1620 static const string &UnSetTrashUpdateCount()
1621 {
1622 // Photos.date_trashed 0 -> timestamp
1623 static const string UNSET_TRASH_UPDATE_COUNT = " UPDATE " + PhotoAlbumColumns::TABLE +
1624 " SET " + PhotoAlbumColumns::ALBUM_COUNT + " = " + PhotoAlbumColumns::ALBUM_COUNT + " - 1" +
1625 " WHERE " + PhotoAlbumColumns::ALBUM_ID + " IN (" +
1626 QueryAlbumJoinMap() + " WHERE " +
1627 "SIGN(NEW." + MediaColumn::MEDIA_DATE_TRASHED + ") = 1" + " AND " +
1628 "NEW." + MediaColumn::MEDIA_HIDDEN + " = 0" + " AND " +
1629 "(" +
1630 "SIGN(NEW." + MediaColumn::MEDIA_DATE_TRASHED + ") - "
1631 "SIGN(OLD." + MediaColumn::MEDIA_DATE_TRASHED + ") > 0" +
1632 ")" +
1633 ");";
1634 return UNSET_TRASH_UPDATE_COUNT;
1635 }
1636
TriggerUpdateUserAlbumCount()1637 static const string &TriggerUpdateUserAlbumCount()
1638 {
1639 static const string TRIGGER_UPDATE_USER_ALBUM_COUNT = BaseColumn::CreateTrigger() + "update_user_album_count" +
1640 " AFTER UPDATE ON " + PhotoColumn::PHOTOS_TABLE +
1641 " BEGIN " +
1642 SetHiddenUpdateCount() +
1643 SetTrashUpdateCount() +
1644 UnSetHiddenUpdateCount() +
1645 UnSetTrashUpdateCount() +
1646 " END;";
1647 return TRIGGER_UPDATE_USER_ALBUM_COUNT;
1648 }
1649
TriggerDeletePhotoClearAppUriPermission()1650 static const string &TriggerDeletePhotoClearAppUriPermission()
1651 {
1652 static const string TRIGGER_PHOTO_DELETE_APP_URI_PERMISSION = BaseColumn::CreateTrigger() +
1653 "delete_photo_clear_App_uri_permission" + " AFTER DELETE ON " + PhotoColumn::PHOTOS_TABLE +
1654 " BEGIN " +
1655 "DELETE FROM " + AppUriPermissionColumn::APP_URI_PERMISSION_TABLE +
1656 " WHERE " + AppUriPermissionColumn::FILE_ID + "=" + "OLD." + MediaColumn::MEDIA_ID +
1657 " AND " + AppUriPermissionColumn::URI_TYPE + "=" + std::to_string(AppUriPermissionColumn::URI_PHOTO) + ";" +
1658 " END;";
1659 return TRIGGER_PHOTO_DELETE_APP_URI_PERMISSION;
1660 }
1661
TriggerDeleteAudioClearAppUriPermission()1662 static const string &TriggerDeleteAudioClearAppUriPermission()
1663 {
1664 static const string TRIGGER_AUDIO_DELETE_APP_URI_PERMISSION = BaseColumn::CreateTrigger() +
1665 "delete_audio_clear_App_uri_permission" + " AFTER DELETE ON " + AudioColumn::AUDIOS_TABLE +
1666 " BEGIN " +
1667 "DELETE FROM " + AppUriPermissionColumn::APP_URI_PERMISSION_TABLE +
1668 " WHERE " + AppUriPermissionColumn::FILE_ID + "=" + "OLD." + MediaColumn::MEDIA_ID +
1669 " AND " + AppUriPermissionColumn::URI_TYPE + "=" + std::to_string(AppUriPermissionColumn::URI_AUDIO) + ";" +
1670 " END;";
1671 return TRIGGER_AUDIO_DELETE_APP_URI_PERMISSION;
1672 }
1673
1674 static const vector<string> onCreateSqlStrs = {
1675 CREATE_MEDIA_TABLE,
1676 PhotoColumn::CREATE_PHOTO_TABLE,
1677 PhotoColumn::CREATE_CLOUD_ID_INDEX,
1678 PhotoColumn::INDEX_SCTHP_ADDTIME,
1679 PhotoColumn::CREATE_PHOTO_SORT_IN_ALBUM_DATE_TAKEN_INDEX,
1680 PhotoColumn::INDEX_SCHPT_ALBUM_GENERAL,
1681 PhotoColumn::INDEX_SCHPT_ALBUM,
1682 PhotoColumn::INDEX_SCTHP_PHOTO_DATEADDED,
1683 PhotoColumn::CREATE_PHOTO_SORT_IN_ALBUM_DATE_ADDED_INDEX,
1684 PhotoColumn::CREATE_PHOTO_SHOOTING_MODE_ALBUM_GENERAL_INDEX,
1685 PhotoColumn::CREATE_PHOTO_BURST_MODE_ALBUM_INDEX,
1686 PhotoColumn::CREATE_PHOTO_FRONT_CAMERA_ALBUM_INDEX,
1687 PhotoColumn::CREATE_PHOTO_RAW_IMAGE_ALBUM_INDEX,
1688 PhotoColumn::CREATE_PHOTO_MOVING_PHOTO_ALBUM_INDEX,
1689 PhotoColumn::INDEX_QUERY_THUMBNAIL_WHITE_BLOCKS,
1690 PhotoColumn::INDEX_CAMERA_SHOT_KEY,
1691 PhotoColumn::INDEX_SCHPT_READY,
1692 PhotoColumn::CREATE_YEAR_INDEX,
1693 PhotoColumn::CREATE_MONTH_INDEX,
1694 PhotoColumn::CREATE_DAY_INDEX,
1695 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_INDEX,
1696 PhotoColumn::CREATE_SCHPT_DAY_INDEX,
1697 PhotoColumn::CREATE_SCHPT_YEAR_COUNT_READY_INDEX,
1698 PhotoColumn::CREATE_SCHPT_MONTH_COUNT_READY_INDEX,
1699 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_COUNT_READY_INDEX,
1700 PhotoColumn::CREATE_HIDDEN_TIME_INDEX,
1701 PhotoColumn::CREATE_SCHPT_HIDDEN_TIME_INDEX,
1702 PhotoColumn::CREATE_PHOTO_FAVORITE_INDEX,
1703 PhotoColumn::CREATE_PHOTOS_DELETE_TRIGGER,
1704 PhotoColumn::CREATE_PHOTOS_FDIRTY_TRIGGER,
1705 PhotoColumn::CREATE_PHOTOS_MDIRTY_TRIGGER,
1706 PhotoColumn::CREATE_PHOTOS_INSERT_CLOUD_SYNC,
1707 PhotoColumn::CREATE_PHOTOS_UPDATE_CLOUD_SYNC,
1708 PhotoColumn::CREATE_PHOTOS_METADATA_DIRTY_TRIGGER,
1709 AudioColumn::CREATE_AUDIO_TABLE,
1710 CREATE_SMARTALBUM_TABLE,
1711 CREATE_SMARTALBUMMAP_TABLE,
1712 CREATE_DEVICE_TABLE,
1713 CREATE_CATEGORY_SMARTALBUMMAP_TABLE,
1714 CREATE_ASSET_UNIQUE_NUMBER_TABLE,
1715 CREATE_ALBUM_REFRESH_TABLE,
1716 CREATE_IMAGE_VIEW,
1717 CREATE_VIDEO_VIEW,
1718 CREATE_AUDIO_VIEW,
1719 CREATE_ALBUM_VIEW,
1720 CREATE_SMARTALBUMASSETS_VIEW,
1721 CREATE_ASSETMAP_VIEW,
1722 CREATE_MEDIATYPE_DIRECTORY_TABLE,
1723 CREATE_BUNDLE_PREMISSION_TABLE,
1724 CREATE_MEDIALIBRARY_ERROR_TABLE,
1725 CREATE_REMOTE_THUMBNAIL_TABLE,
1726 CREATE_FILES_DELETE_TRIGGER,
1727 CREATE_FILES_MDIRTY_TRIGGER,
1728 CREATE_FILES_FDIRTY_TRIGGER,
1729 CREATE_INSERT_CLOUD_SYNC_TRIGGER,
1730 PhotoAlbumColumns::CREATE_TABLE,
1731 PhotoAlbumColumns::INDEX_ALBUM_TYPES,
1732 PhotoAlbumColumns::CREATE_ALBUM_INSERT_TRIGGER,
1733 PhotoAlbumColumns::CREATE_ALBUM_MDIRTY_TRIGGER,
1734 PhotoAlbumColumns::CREATE_ALBUM_DELETE_TRIGGER,
1735 PhotoAlbumColumns::ALBUM_DELETE_ORDER_TRIGGER,
1736 PhotoAlbumColumns::ALBUM_INSERT_ORDER_TRIGGER,
1737 PhotoMap::CREATE_TABLE,
1738 TriggerDeletePhotoClearMap(),
1739 CREATE_TAB_ANALYSIS_OCR,
1740 CREATE_TAB_ANALYSIS_LABEL,
1741 CREATE_TAB_ANALYSIS_VIDEO_LABEL,
1742 CREATE_TAB_ANALYSIS_AESTHETICS,
1743 CREATE_TAB_VIDEO_ANALYSIS_AESTHETICS,
1744 CREATE_TAB_ANALYSIS_SALIENCY_DETECT,
1745 CREATE_TAB_ANALYSIS_OBJECT,
1746 CREATE_TAB_ANALYSIS_RECOMMENDATION,
1747 CREATE_TAB_ANALYSIS_SEGMENTATION,
1748 CREATE_TAB_ANALYSIS_COMPOSITION,
1749 CREATE_TAB_ANALYSIS_HEAD,
1750 CREATE_TAB_ANALYSIS_POSE,
1751 CREATE_TAB_IMAGE_FACE,
1752 CREATE_TAB_VIDEO_FACE,
1753 CREATE_TAB_FACE_TAG,
1754 CREATE_TAB_ANALYSIS_TOTAL_FOR_ONCREATE,
1755 CREATE_VISION_UPDATE_TRIGGER,
1756 CREATE_VISION_DELETE_TRIGGER,
1757 CREATE_VISION_INSERT_TRIGGER_FOR_ONCREATE,
1758 CREATE_IMAGE_FACE_INDEX,
1759 CREATE_IMAGE_FACE_TAG_ID_INDEX,
1760 CREATE_VIDEO_FACE_INDEX,
1761 CREATE_OBJECT_INDEX,
1762 CREATE_RECOMMENDATION_INDEX,
1763 CREATE_COMPOSITION_INDEX,
1764 CREATE_HEAD_INDEX,
1765 CREATE_POSE_INDEX,
1766 CREATE_GEO_KNOWLEDGE_TABLE,
1767 CREATE_GEO_DICTIONARY_TABLE,
1768 CREATE_ANALYSIS_ALBUM_FOR_ONCREATE,
1769 CREATE_ANALYSIS_ALBUM_GROUP_TAG_INDEX,
1770 CREATE_ANALYSIS_ALBUM_SUBTYPE_NAME_INDEX,
1771 CREATE_ANALYSIS_ALBUM_TAG_ID_INDEX,
1772 CREATE_ANALYSIS_ALBUM_MAP,
1773 CREATE_HIGHLIGHT_ALBUM_TABLE,
1774 CREATE_HIGHLIGHT_COVER_INFO_TABLE,
1775 CREATE_HIGHLIGHT_PLAY_INFO_TABLE,
1776 CREATE_USER_PHOTOGRAPHY_INFO_TABLE,
1777 CREATE_INSERT_SOURCE_PHOTO_CREATE_SOURCE_ALBUM_TRIGGER,
1778 CREATE_INSERT_SOURCE_UPDATE_ALBUM_ID_TRIGGER,
1779 INSERT_PHOTO_UPDATE_ALBUM_BUNDLENAME,
1780 CREATE_SOURCE_ALBUM_INDEX,
1781 FormMap::CREATE_FORM_MAP_TABLE,
1782 CREATE_DICTIONARY_INDEX,
1783 DROP_KNOWLEDGE_INDEX,
1784 CREATE_NEW_KNOWLEDGE_INDEX,
1785 CREATE_CITY_NAME_INDEX,
1786 CREATE_LOCATION_KEY_INDEX,
1787 CREATE_IDX_FILEID_FOR_ANALYSIS_TOTAL,
1788 CREATE_IDX_FILEID_FOR_ANALYSIS_PHOTO_MAP,
1789 CREATE_TAB_ANALYSIS_ALBUM_TOTAL,
1790 CREATE_TOTAL_INSERT_TRIGGER_FOR_ADD_ANALYSIS_ALBUM_TOTAL,
1791 CREATE_VISION_UPDATE_TRIGGER_FOR_UPDATE_ANALYSIS_ALBUM_TOTAL_STATUS,
1792 CREATE_ANALYSIS_ALBUM_ASET_MAP_TABLE,
1793 CREATE_ANALYSIS_ASSET_SD_MAP_TABLE,
1794 CREATE_TAB_ASSET_ALBUM_OPERATION,
1795 CREATE_OPERATION_ASSET_INSERT_TRIGGER,
1796 CREATE_OPERATION_ASSET_DELETE_TRIGGER,
1797 CREATE_OPERATION_ASSET_UPDATE_TRIGGER,
1798 CREATE_OPERATION_ALBUM_INSERT_TRIGGER,
1799 CREATE_OPERATION_ALBUM_DELETE_TRIGGER,
1800 CREATE_OPERATION_ALBUM_UPDATE_TRIGGER,
1801 CREATE_ANALYSIS_PHOTO_MAP_MAP_ASSET_INDEX,
1802
1803 // search
1804 CREATE_SEARCH_TOTAL_TABLE,
1805 CREATE_SEARCH_INSERT_TRIGGER,
1806 CREATE_SEARCH_UPDATE_TRIGGER,
1807 CREATE_SEARCH_UPDATE_STATUS_TRIGGER,
1808 CREATE_SEARCH_DELETE_TRIGGER,
1809 CREATE_IDX_FILEID_FOR_SEARCH_INDEX,
1810 CREATE_ALBUM_UPDATE_SEARCH_TRIGGER,
1811 CREATE_ANALYSIS_UPDATE_SEARCH_TRIGGER,
1812 CREATE_ANALYSIS_ALBUM_UPDATE_SEARCH_TRIGGER,
1813 MedialibraryBusinessRecordColumn::CREATE_TABLE,
1814 MedialibraryBusinessRecordColumn::CREATE_BUSINESS_KEY_INDEX,
1815 PhotoExtColumn::CREATE_PHOTO_EXT_TABLE,
1816 PhotoColumn::CREATE_PHOTO_DISPLAYNAME_INDEX,
1817 AppUriPermissionColumn::CREATE_APP_URI_PERMISSION_TABLE,
1818 AppUriPermissionColumn::CREATE_URI_URITYPE_TOKENID_INDEX,
1819 TriggerDeletePhotoClearAppUriPermission(),
1820 TriggerDeleteAudioClearAppUriPermission(),
1821 PhotoColumn::CREATE_PHOTO_BURSTKEY_INDEX,
1822 PhotoColumn::UPDATA_PHOTOS_DATA_UNIQUE,
1823 PhotoColumn::INSERT_GENERATE_HIGHLIGHT_THUMBNAIL,
1824 PhotoColumn::UPDATE_GENERATE_HIGHLIGHT_THUMBNAIL,
1825 PhotoColumn::INDEX_HIGHLIGHT_FILEID,
1826 PhotoColumn::CREATE_SCHPT_CLOUD_ENHANCEMENT_ALBUM_INDEX,
1827 PhotoColumn::INDEX_LATITUDE,
1828 PhotoColumn::INDEX_LONGITUDE,
1829 CREATE_PHOTO_STATUS_FOR_SEARCH_INDEX,
1830 CustomRecordsColumns::CREATE_TABLE,
1831 PhotoColumn::CREATE_PHOTO_SORT_MEDIA_TYPE_DATE_TAKEN_INDEX,
1832 PhotoColumn::CREATE_PHOTO_SORT_MEDIA_TYPE_DATE_ADDED_INDEX,
1833 };
1834
ExecuteSql(RdbStore & store)1835 static int32_t ExecuteSql(RdbStore &store)
1836 {
1837 for (const string& sqlStr : onCreateSqlStrs) {
1838 auto ret = ExecSqlWithRetry([&]() { return store.ExecuteSql(sqlStr); });
1839 CHECK_AND_RETURN_RET(ret == NativeRdb::E_OK, NativeRdb::E_ERROR);
1840 }
1841 CHECK_AND_RETURN_RET(TabOldPhotosTableEventHandler().OnCreate(store) == NativeRdb::E_OK,
1842 NativeRdb::E_ERROR);
1843 if (TabFaCardPhotosTableEventHandler().OnCreate(store) != NativeRdb::E_OK) {
1844 return NativeRdb::E_ERROR;
1845 }
1846 TableEventHandler().OnCreate(MediaLibraryUnistoreManager::GetInstance().GetRdbStore());
1847 return NativeRdb::E_OK;
1848 }
1849
OnCreate(RdbStore & store)1850 int32_t MediaLibraryDataCallBack::OnCreate(RdbStore &store)
1851 {
1852 MEDIA_INFO_LOG("Rdb OnCreate");
1853 #ifdef META_RECOVERY_SUPPORT
1854 NativeRdb::RebuiltType rebuilt = NativeRdb::RebuiltType::NONE;
1855 store.GetRebuilt(rebuilt);
1856 #endif
1857
1858 if (ExecuteSql(store) != NativeRdb::E_OK) {
1859 return NativeRdb::E_ERROR;
1860 }
1861
1862 #ifdef META_RECOVERY_SUPPORT
1863 if (rebuilt == NativeRdb::RebuiltType::REBUILT) {
1864 // set Rebuilt flag
1865 MediaLibraryMetaRecovery::GetInstance().SetRdbRebuiltStatus(true);
1866 }
1867 #endif
1868
1869 if (PrepareSystemAlbums(store) != NativeRdb::E_OK) {
1870 return NativeRdb::E_ERROR;
1871 }
1872
1873 if (PrepareAlbumPlugin(store) != NativeRdb::E_OK) {
1874 return NativeRdb::E_ERROR;
1875 }
1876
1877 if (PrepareDir(store) != NativeRdb::E_OK) {
1878 return NativeRdb::E_ERROR;
1879 }
1880
1881 if (PrepareSmartAlbum(store) != NativeRdb::E_OK) {
1882 return NativeRdb::E_ERROR;
1883 }
1884
1885 if (PrepareUniqueMemberTable(store) != NativeRdb::E_OK) {
1886 return NativeRdb::E_ERROR;
1887 }
1888
1889 PrepareShootingModeAlbum(store);
1890
1891 MediaLibraryRdbStore::SetOldVersion(MEDIA_RDB_VERSION);
1892 return NativeRdb::E_OK;
1893 }
1894
VersionAddCloud(RdbStore & store)1895 void VersionAddCloud(RdbStore &store)
1896 {
1897 const std::string alterCloudId = "ALTER TABLE " + MEDIALIBRARY_TABLE +
1898 " ADD COLUMN " + MEDIA_DATA_DB_CLOUD_ID +" TEXT";
1899 int32_t result = ExecSqlWithRetry([&]() { return store.ExecuteSql(alterCloudId); });
1900 if (result != NativeRdb::E_OK) {
1901 UpdateFail(__FILE__, __LINE__);
1902 MEDIA_ERR_LOG("Upgrade rdb cloud_id error %{private}d", result);
1903 }
1904 const std::string alterDirty = "ALTER TABLE " + MEDIALIBRARY_TABLE +
1905 " ADD COLUMN " + MEDIA_DATA_DB_DIRTY +" INT DEFAULT 0";
1906 result = ExecSqlWithRetry([&]() { return store.ExecuteSql(alterDirty); });
1907 if (result != NativeRdb::E_OK) {
1908 UpdateFail(__FILE__, __LINE__);
1909 MEDIA_ERR_LOG("Upgrade rdb dirty error %{private}d", result);
1910 }
1911 const std::string alterSyncStatus = "ALTER TABLE " + MEDIALIBRARY_TABLE +
1912 " ADD COLUMN " + MEDIA_DATA_DB_SYNC_STATUS +" INT DEFAULT 0";
1913 result = ExecSqlWithRetry([&]() { return store.ExecuteSql(alterSyncStatus); });
1914 if (result != NativeRdb::E_OK) {
1915 UpdateFail(__FILE__, __LINE__);
1916 MEDIA_ERR_LOG("Upgrade rdb syncStatus error %{private}d", result);
1917 }
1918 const std::string alterPosition = "ALTER TABLE " + MEDIALIBRARY_TABLE +
1919 " ADD COLUMN " + MEDIA_DATA_DB_POSITION +" INT DEFAULT 1";
1920 result = ExecSqlWithRetry([&]() { return store.ExecuteSql(alterPosition); });
1921 if (result != NativeRdb::E_OK) {
1922 UpdateFail(__FILE__, __LINE__);
1923 MEDIA_ERR_LOG("Upgrade rdb position error %{private}d", result);
1924 }
1925 }
1926
AddPortraitInAnalysisAlbum(RdbStore & store)1927 static void AddPortraitInAnalysisAlbum(RdbStore &store)
1928 {
1929 static const vector<string> executeSqlStrs = {
1930 ADD_TAG_ID_COLUMN_FOR_ALBUM,
1931 ADD_USER_OPERATION_COLUMN_FOR_ALBUM,
1932 ADD_GROUP_TAG_COLUMN_FOR_ALBUM,
1933 ADD_USER_DISPLAY_LEVEL_COLUMN_FOR_ALBUM,
1934 ADD_IS_ME_COLUMN_FOR_ALBUM,
1935 ADD_IS_REMOVED_COLUMN_FOR_ALBUM,
1936 ADD_RENAME_OPERATION_COLUMN_FOR_ALBUM,
1937 CREATE_ANALYSIS_ALBUM_UPDATE_SEARCH_TRIGGER
1938 };
1939 MEDIA_INFO_LOG("start add aesthetic composition tables");
1940 ExecSqls(executeSqlStrs, store);
1941 }
1942
AddMetaModifiedColumn(RdbStore & store)1943 void AddMetaModifiedColumn(RdbStore &store)
1944 {
1945 const std::string alterMetaModified =
1946 "ALTER TABLE " + MEDIALIBRARY_TABLE + " ADD COLUMN " +
1947 MEDIA_DATA_DB_META_DATE_MODIFIED + " BIGINT DEFAULT 0";
1948 int32_t result = ExecSqlWithRetry([&]() { return store.ExecuteSql(alterMetaModified); });
1949 if (result != NativeRdb::E_OK) {
1950 UpdateFail(__FILE__, __LINE__);
1951 MEDIA_ERR_LOG("Upgrade rdb meta_date_modified error %{private}d", result);
1952 }
1953 const std::string alterSyncStatus = "ALTER TABLE " + MEDIALIBRARY_TABLE +
1954 " ADD COLUMN " + MEDIA_DATA_DB_SYNC_STATUS + " INT DEFAULT 0";
1955 result = ExecSqlWithRetry([&]() { return store.ExecuteSql(alterSyncStatus); });
1956 if (result != NativeRdb::E_OK) {
1957 UpdateFail(__FILE__, __LINE__);
1958 MEDIA_ERR_LOG("Upgrade rdb syncStatus error %{private}d", result);
1959 }
1960 }
1961
AddTableType(RdbStore & store)1962 void AddTableType(RdbStore &store)
1963 {
1964 const std::string alterTableName =
1965 "ALTER TABLE " + BUNDLE_PERMISSION_TABLE + " ADD COLUMN " + PERMISSION_TABLE_TYPE + " INT";
1966 int32_t result = ExecSqlWithRetry([&]() { return store.ExecuteSql(alterTableName); });
1967 if (result != NativeRdb::E_OK) {
1968 UpdateFail(__FILE__, __LINE__);
1969 MEDIA_ERR_LOG("Upgrade rdb table_name error %{private}d", result);
1970 }
1971 }
1972
API10TableCreate(RdbStore & store)1973 void API10TableCreate(RdbStore &store)
1974 {
1975 static const vector<string> executeSqlStrs = {
1976 PhotoColumn::CREATE_PHOTO_TABLE,
1977 PhotoColumn::INDEX_SCTHP_ADDTIME,
1978 PhotoColumn::INDEX_CAMERA_SHOT_KEY,
1979 PhotoColumn::CREATE_PHOTOS_DELETE_TRIGGER,
1980 PhotoColumn::CREATE_PHOTOS_FDIRTY_TRIGGER,
1981 PhotoColumn::CREATE_PHOTOS_MDIRTY_TRIGGER,
1982 PhotoColumn::CREATE_PHOTOS_INSERT_CLOUD_SYNC,
1983 AudioColumn::CREATE_AUDIO_TABLE,
1984 CREATE_ASSET_UNIQUE_NUMBER_TABLE,
1985 CREATE_FILES_DELETE_TRIGGER,
1986 CREATE_FILES_MDIRTY_TRIGGER,
1987 CREATE_FILES_FDIRTY_TRIGGER,
1988 CREATE_INSERT_CLOUD_SYNC_TRIGGER,
1989 PhotoAlbumColumns::CREATE_TABLE,
1990 PhotoAlbumColumns::INDEX_ALBUM_TYPES,
1991 PhotoMap::CREATE_TABLE,
1992 FormMap::CREATE_FORM_MAP_TABLE,
1993 TriggerDeleteAlbumClearMap(),
1994 TriggerAddAssets(),
1995 TriggerRemoveAssets(),
1996 TriggerDeletePhotoClearMap(),
1997 TriggerUpdateUserAlbumCount(),
1998 };
1999
2000 for (size_t i = 0; i < executeSqlStrs.size(); i++) {
2001 auto result = ExecSqlWithRetry([&]() { return store.ExecuteSql(executeSqlStrs[i]); });
2002 if (result != NativeRdb::E_OK) {
2003 UpdateFail(__FILE__, __LINE__);
2004 MEDIA_ERR_LOG("upgrade fail idx:%{public}zu", i);
2005 }
2006 }
2007 }
2008
ModifySyncStatus(RdbStore & store)2009 void ModifySyncStatus(RdbStore &store)
2010 {
2011 const std::string dropSyncStatus = "ALTER TABLE " + MEDIALIBRARY_TABLE + " DROP column syncing";
2012 auto result = ExecSqlWithRetry([&]() { return store.ExecuteSql(dropSyncStatus); });
2013 if (result != NativeRdb::E_OK) {
2014 UpdateFail(__FILE__, __LINE__);
2015 MEDIA_ERR_LOG("Upgrade rdb syncing error %{private}d", result);
2016 }
2017
2018 const std::string addSyncStatus = "ALTER TABLE " + MEDIALIBRARY_TABLE + " ADD COLUMN " +
2019 MEDIA_DATA_DB_SYNC_STATUS +" INT DEFAULT 0";
2020 result = ExecSqlWithRetry([&]() { return store.ExecuteSql(addSyncStatus); });
2021 if (result != NativeRdb::E_OK) {
2022 UpdateFail(__FILE__, __LINE__);
2023 MEDIA_ERR_LOG("Upgrade rdb syncStatus error %{private}d", result);
2024 }
2025 }
2026
ModifyDeleteTrigger(RdbStore & store)2027 void ModifyDeleteTrigger(RdbStore &store)
2028 {
2029 /* drop old delete trigger */
2030 const std::string dropDeleteTrigger = "DROP TRIGGER IF EXISTS photos_delete_trigger";
2031 if (ExecSqlWithRetry([&]() { return store.ExecuteSql(dropDeleteTrigger); }) != NativeRdb::E_OK) {
2032 UpdateFail(__FILE__, __LINE__);
2033 MEDIA_ERR_LOG("upgrade fail: drop old delete trigger");
2034 }
2035
2036 /* create new delete trigger */
2037 if (ExecSqlWithRetry([&]() { return store.ExecuteSql(PhotoColumn::CREATE_PHOTOS_DELETE_TRIGGER); }) !=
2038 NativeRdb::E_OK) {
2039 UpdateFail(__FILE__, __LINE__);
2040 MEDIA_ERR_LOG("upgrade fail: create new delete trigger");
2041 }
2042 }
2043
AddCloudVersion(RdbStore & store)2044 void AddCloudVersion(RdbStore &store)
2045 {
2046 const std::string addSyncStatus = "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
2047 PhotoColumn::PHOTO_CLOUD_VERSION +" BIGINT DEFAULT 0";
2048 auto result = ExecSqlWithRetry([&]() { return store.ExecuteSql(addSyncStatus); });
2049 if (result != NativeRdb::E_OK) {
2050 UpdateFail(__FILE__, __LINE__);
2051 MEDIA_ERR_LOG("Upgrade rdb cloudVersion error %{private}d", result);
2052 }
2053 }
2054
UpdateCloudPathSql(const string & table,const string & column)2055 static string UpdateCloudPathSql(const string &table, const string &column)
2056 {
2057 static const string LOCAL_PATH = "/storage/media/local/";
2058 static const string CLOUD_PATH = "/storage/cloud/";
2059 /*
2060 * replace only once:
2061 * UPDATE photos
2062 * SET data = ([replace](substring(data, 1, len(local_path)), local_path, cloud_path) ||
2063 * substring(data, len(local_path) + 1));
2064 */
2065 return "UPDATE " + table + " SET " + column + " = (REPLACE(SUBSTRING(" +
2066 column + ", 1, " + to_string(LOCAL_PATH.length()) + "), '" +
2067 LOCAL_PATH + "', '" + CLOUD_PATH + "') || SUBSTRING(" + column + ", " +
2068 to_string(LOCAL_PATH.length() + 1) + "))" +
2069 " WHERE " + column + " LIKE '" + LOCAL_PATH + "%';";
2070 }
2071
UpdateMdirtyTriggerForSdirty(RdbStore & store)2072 static void UpdateMdirtyTriggerForSdirty(RdbStore &store)
2073 {
2074 const string dropMdirtyCreateTrigger = "DROP TRIGGER IF EXISTS photos_mdirty_trigger";
2075 int32_t ret = ExecSqlWithRetry([&]() { return store.ExecuteSql(dropMdirtyCreateTrigger); });
2076 if (ret != NativeRdb::E_OK) {
2077 MEDIA_ERR_LOG("drop photos_mdirty_trigger fail, ret = %{public}d", ret);
2078 UpdateFail(__FILE__, __LINE__);
2079 }
2080
2081 ret = ExecSqlWithRetry([&]() { return store.ExecuteSql(PhotoColumn::CREATE_PHOTOS_MDIRTY_TRIGGER); });
2082 if (ret != NativeRdb::E_OK) {
2083 MEDIA_ERR_LOG("add photos_mdirty_trigger fail, ret = %{public}d", ret);
2084 UpdateFail(__FILE__, __LINE__);
2085 }
2086 }
2087
UpdateCloudPath(RdbStore & store)2088 static int32_t UpdateCloudPath(RdbStore &store)
2089 {
2090 const vector<string> updateCloudPath = {
2091 UpdateCloudPathSql(MEDIALIBRARY_TABLE, MEDIA_DATA_DB_FILE_PATH),
2092 UpdateCloudPathSql(MEDIALIBRARY_TABLE, MEDIA_DATA_DB_RECYCLE_PATH),
2093 UpdateCloudPathSql(MEDIALIBRARY_ERROR_TABLE, MEDIA_DATA_ERROR),
2094 UpdateCloudPathSql(PhotoColumn::PHOTOS_TABLE, MediaColumn::MEDIA_FILE_PATH),
2095 };
2096 auto result = ExecSqls(updateCloudPath, store);
2097 if (result != NativeRdb::E_OK) {
2098 UpdateFail(__FILE__, __LINE__);
2099 }
2100 return result;
2101 }
2102
UpdateAPI10Table(RdbStore & store)2103 void UpdateAPI10Table(RdbStore &store)
2104 {
2105 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP INDEX IF EXISTS idx_sthp_dateadded"); });
2106 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP INDEX IF EXISTS photo_album_types"); });
2107 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS photos_delete_trigger"); });
2108 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS photos_fdirty_trigger"); });
2109 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS photos_mdirty_trigger"); });
2110 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS photo_insert_cloud_sync_trigger"); });
2111 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS delete_trigger"); });
2112 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS mdirty_trigger"); });
2113 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS fdirty_trigger"); });
2114 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS insert_cloud_sync_trigger"); });
2115 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS photo_album_clear_map"); });
2116 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS photo_album_insert_asset"); });
2117 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS photo_album_delete_asset"); });
2118 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS delete_photo_clear_map"); });
2119 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TRIGGER IF EXISTS update_user_album_count"); });
2120 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TABLE IF EXISTS Photos"); });
2121 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TABLE IF EXISTS Audios"); });
2122 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TABLE IF EXISTS UniqueNumber"); });
2123 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TABLE IF EXISTS PhotoAlbum"); });
2124 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TABLE IF EXISTS PhotoMap"); });
2125 ExecSqlWithRetry([&]() { return store.ExecuteSql("DROP TABLE IF EXISTS FormMap"); });
2126
2127 API10TableCreate(store);
2128 if (PrepareSystemAlbums(store) != NativeRdb::E_OK) {
2129 UpdateFail(__FILE__, __LINE__);
2130 }
2131
2132 if (PrepareUniqueMemberTable(store) != NativeRdb::E_OK) {
2133 UpdateFail(__FILE__, __LINE__);
2134 }
2135
2136 // set scan error
2137 MediaScannerManager::GetInstance()->ErrorRecord();
2138 }
2139
AddLocationTables(RdbStore & store)2140 static void AddLocationTables(RdbStore &store)
2141 {
2142 static const vector<string> executeSqlStrs = {
2143 CREATE_GEO_DICTIONARY_TABLE,
2144 CREATE_GEO_KNOWLEDGE_TABLE,
2145 };
2146 MEDIA_INFO_LOG("start init location db");
2147 ExecSqls(executeSqlStrs, store);
2148 }
2149
UpdateLocationTables(RdbStore & store)2150 static void UpdateLocationTables(RdbStore &store)
2151 {
2152 static const vector<string> executeSqlStrs = {
2153 "DROP TABLE IF EXISTS tab_geo_dictionary",
2154 "DROP TABLE IF EXISTS tab_geo_knowledge",
2155 CREATE_GEO_DICTIONARY_TABLE,
2156 CREATE_GEO_KNOWLEDGE_TABLE,
2157 };
2158 MEDIA_INFO_LOG("fix location db");
2159 ExecSqls(executeSqlStrs, store);
2160 }
2161
AddAnalysisTables(RdbStore & store)2162 static void AddAnalysisTables(RdbStore &store)
2163 {
2164 static const vector<string> executeSqlStrs = {
2165 "DROP TABLE IF EXISTS tab_analysis_label",
2166 CREATE_TAB_ANALYSIS_OCR,
2167 CREATE_TAB_ANALYSIS_LABEL,
2168 CREATE_TAB_ANALYSIS_AESTHETICS,
2169 CREATE_TAB_ANALYSIS_TOTAL,
2170 CREATE_VISION_UPDATE_TRIGGER,
2171 CREATE_VISION_DELETE_TRIGGER,
2172 CREATE_VISION_INSERT_TRIGGER,
2173 INIT_TAB_ANALYSIS_TOTAL,
2174 };
2175 MEDIA_INFO_LOG("start init vision db");
2176 ExecSqls(executeSqlStrs, store);
2177 }
2178
AddFaceTables(RdbStore & store)2179 static void AddFaceTables(RdbStore &store)
2180 {
2181 static const vector<string> executeSqlStrs = {
2182 CREATE_TAB_IMAGE_FACE,
2183 CREATE_TAB_FACE_TAG,
2184 DROP_INSERT_VISION_TRIGGER,
2185 CREATE_INSERT_VISION_TRIGGER_FOR_ADD_FACE,
2186 ADD_FACE_STATUS_COLUMN,
2187 UPDATE_TOTAL_VALUE,
2188 UPDATE_NOT_SUPPORT_VALUE,
2189 CREATE_IMAGE_FACE_INDEX
2190 };
2191 MEDIA_INFO_LOG("start add face tables");
2192 ExecSqls(executeSqlStrs, store);
2193 }
2194
AddSaliencyTables(RdbStore & store)2195 static void AddSaliencyTables(RdbStore &store)
2196 {
2197 static const vector<string> executeSqlStrs = {
2198 CREATE_TAB_ANALYSIS_SALIENCY_DETECT,
2199 DROP_INSERT_VISION_TRIGGER,
2200 CREATE_VISION_INSERT_TRIGGER_FOR_ADD_SALIENCY,
2201 ADD_SALIENCY_STATUS_COLUMN,
2202 UPDATE_SALIENCY_TOTAL_VALUE,
2203 UPDATE_SALIENCY_NOT_SUPPORT_VALUE
2204 };
2205 MEDIA_INFO_LOG("start add saliency tables");
2206 ExecSqls(executeSqlStrs, store);
2207 }
2208
AddVideoLabelTable(RdbStore & store)2209 static void AddVideoLabelTable(RdbStore &store)
2210 {
2211 static const vector<string> executeSqlStrs = {
2212 CREATE_TAB_ANALYSIS_VIDEO_LABEL,
2213 DROP_INSERT_VISION_TRIGGER,
2214 DROP_UPDATE_VISION_TRIGGER,
2215 CREATE_VISION_INSERT_TRIGGER_FOR_ADD_VIDEO_LABEL,
2216 CREATE_VISION_UPDATE_TRIGGER_FOR_ADD_VIDEO_LABEL,
2217 };
2218 MEDIA_INFO_LOG("start add video label tables");
2219 ExecSqls(executeSqlStrs, store);
2220 }
2221
UpdateVideoLabelTable(RdbStore & store)2222 static void UpdateVideoLabelTable(RdbStore &store)
2223 {
2224 static const vector<string> executeSqlStrs = {
2225 "DROP TABLE IF EXISTS tab_analysis_video_label",
2226 CREATE_TAB_ANALYSIS_VIDEO_LABEL,
2227 };
2228 MEDIA_INFO_LOG("start update video label tables");
2229 ExecSqls(executeSqlStrs, store);
2230 }
2231
AddSourceAlbumTrigger(RdbStore & store)2232 static void AddSourceAlbumTrigger(RdbStore &store)
2233 {
2234 static const vector<string> executeSqlStrs = {
2235 DROP_INSERT_PHOTO_INSERT_SOURCE_ALBUM,
2236 DROP_INSERT_PHOTO_UPDATE_SOURCE_ALBUM,
2237 DROP_UPDATE_PHOTO_UPDATE_SOURCE_ALBUM,
2238 DROP_DELETE_PHOTO_UPDATE_SOURCE_ALBUM,
2239 INSERT_PHOTO_INSERT_SOURCE_ALBUM,
2240 INSERT_PHOTO_UPDATE_SOURCE_ALBUM,
2241 UPDATE_PHOTO_UPDATE_SOURCE_ALBUM,
2242 DELETE_PHOTO_UPDATE_SOURCE_ALBUM,
2243 };
2244 MEDIA_INFO_LOG("start add source album trigger");
2245 ExecSqls(executeSqlStrs, store);
2246 }
2247
RemoveSourceAlbumToAnalysis(RdbStore & store)2248 static void RemoveSourceAlbumToAnalysis(RdbStore &store)
2249 {
2250 static const vector<string> executeSqlStrs = {
2251 DROP_INSERT_PHOTO_INSERT_SOURCE_ALBUM,
2252 DROP_INSERT_PHOTO_UPDATE_SOURCE_ALBUM,
2253 DROP_UPDATE_PHOTO_UPDATE_SOURCE_ALBUM,
2254 DROP_DELETE_PHOTO_UPDATE_SOURCE_ALBUM,
2255 CLEAR_SOURCE_ALBUM_PHOTO_MAP,
2256 CLEAR_SYSTEM_SOURCE_ALBUM,
2257 INSERT_PHOTO_INSERT_SOURCE_ALBUM,
2258 INSERT_PHOTO_UPDATE_SOURCE_ALBUM,
2259 UPDATE_PHOTO_UPDATE_SOURCE_ALBUM,
2260 DELETE_PHOTO_UPDATE_SOURCE_ALBUM,
2261 };
2262 MEDIA_INFO_LOG("start add source album trigger");
2263 ExecSqls(executeSqlStrs, store);
2264 }
2265
MoveSourceAlbumToPhotoAlbumAndAddColumns(RdbStore & store)2266 static void MoveSourceAlbumToPhotoAlbumAndAddColumns(RdbStore &store)
2267 {
2268 static const vector<string> executeSqlStrs = {
2269 DROP_INSERT_PHOTO_INSERT_SOURCE_ALBUM,
2270 DROP_INSERT_PHOTO_UPDATE_SOURCE_ALBUM,
2271 DROP_UPDATE_PHOTO_UPDATE_SOURCE_ALBUM,
2272 DROP_DELETE_PHOTO_UPDATE_SOURCE_ALBUM,
2273 ADD_SOURCE_ALBUM_BUNDLE_NAME,
2274 INSERT_SOURCE_ALBUMS_FROM_PHOTOS,
2275 INSERT_SOURCE_ALBUM_MAP_FROM_PHOTOS,
2276 CLEAR_SOURCE_ALBUM_ANALYSIS_PHOTO_MAP,
2277 CLEAR_ANALYSIS_SOURCE_ALBUM,
2278 INSERT_PHOTO_INSERT_SOURCE_ALBUM,
2279 INSERT_PHOTO_UPDATE_SOURCE_ALBUM,
2280 UPDATE_PHOTO_UPDATE_SOURCE_ALBUM,
2281 DELETE_PHOTO_UPDATE_SOURCE_ALBUM,
2282 };
2283 MEDIA_INFO_LOG("start move source album to photo album & add columns");
2284 ExecSqls(executeSqlStrs, store);
2285 }
2286
ModifySourceAlbumTriggers(RdbStore & store)2287 static void ModifySourceAlbumTriggers(RdbStore &store)
2288 {
2289 static const vector<string> executeSqlStrs = {
2290 DROP_INSERT_PHOTO_INSERT_SOURCE_ALBUM,
2291 DROP_INSERT_PHOTO_UPDATE_SOURCE_ALBUM,
2292 DROP_UPDATE_PHOTO_UPDATE_SOURCE_ALBUM,
2293 DROP_DELETE_PHOTO_UPDATE_SOURCE_ALBUM,
2294 DROP_SOURCE_ALBUM_INDEX,
2295 ADD_SOURCE_ALBUM_LOCAL_LANGUAGE,
2296 CREATE_SOURCE_ALBUM_INDEX,
2297 INSERT_SOURCE_ALBUMS_FROM_PHOTOS_FULL,
2298 INSERT_SOURCE_ALBUM_MAP_FROM_PHOTOS_FULL,
2299 INSERT_PHOTO_INSERT_SOURCE_ALBUM,
2300 INSERT_PHOTO_UPDATE_SOURCE_ALBUM,
2301 };
2302 MEDIA_INFO_LOG("start modify source album triggers");
2303 ExecSqls(executeSqlStrs, store);
2304 MediaLibraryRdbUtils::UpdateSourceAlbumInternal(MediaLibraryUnistoreManager::GetInstance().GetRdbStore());
2305 MEDIA_INFO_LOG("end modify source album triggers");
2306 }
2307
AddAnalysisAlbum(RdbStore & store)2308 static void AddAnalysisAlbum(RdbStore &store)
2309 {
2310 static const vector<string> executeSqlStrs = {
2311 "ALTER TABLE tab_analysis_ocr ADD COLUMN width INT;",
2312 "ALTER TABLE tab_analysis_ocr ADD COLUMN height INT;",
2313 CREATE_ANALYSIS_ALBUM,
2314 CREATE_ANALYSIS_ALBUM_MAP,
2315 };
2316 MEDIA_INFO_LOG("start init vision album");
2317 ExecSqls(executeSqlStrs, store);
2318 }
2319
AddAestheticCompositionTables(RdbStore & store)2320 static void AddAestheticCompositionTables(RdbStore &store)
2321 {
2322 static const vector<string> executeSqlStrs = {
2323 CREATE_TAB_ANALYSIS_OBJECT,
2324 CREATE_TAB_ANALYSIS_RECOMMENDATION,
2325 CREATE_TAB_ANALYSIS_SEGMENTATION,
2326 CREATE_TAB_ANALYSIS_COMPOSITION,
2327 DROP_INSERT_VISION_TRIGGER,
2328 CREATE_VISION_INSERT_TRIGGER_FOR_ADD_AC,
2329 AC_ADD_OBJECT_COLUMN_FOR_TOTAL,
2330 AC_UPDATE_OBJECT_TOTAL_VALUE,
2331 AC_UPDATE_OBJECT_TOTAL_NOT_SUPPORT_VALUE,
2332 AC_ADD_RECOMMENDATION_COLUMN_FOR_TOTAL,
2333 AC_UPDATE_RECOMMENDATION_TOTAL_VALUE,
2334 AC_UPDATE_RECOMMENDATION_TOTAL_NOT_SUPPORT_VALUE,
2335 AC_ADD_SEGMENTATION_COLUMN_FOR_TOTAL,
2336 AC_UPDATE_SEGMENTATION_TOTAL_VALUE,
2337 AC_UPDATE_SEGMENTATION_TOTAL_NOT_SUPPORT_VALUE,
2338 AC_ADD_COMPOSITION_COLUMN_FOR_TOTAL,
2339 AC_UPDATE_COMPOSITION_TOTAL_VALUE,
2340 AC_UPDATE_COMPOSITION_TOTAL_NOT_SUPPORT_VALUE,
2341 CREATE_OBJECT_INDEX,
2342 CREATE_RECOMMENDATION_INDEX,
2343 CREATE_COMPOSITION_INDEX,
2344 };
2345 MEDIA_INFO_LOG("start add aesthetic composition tables");
2346 ExecSqls(executeSqlStrs, store);
2347 }
2348
UpdateSpecForAddScreenshot(RdbStore & store)2349 static void UpdateSpecForAddScreenshot(RdbStore &store)
2350 {
2351 static const vector<string> executeSqlStrs = {
2352 DROP_INSERT_VISION_TRIGGER,
2353 CREATE_VISION_INSERT_TRIGGER_FOR_UPDATE_SPEC,
2354 };
2355 MEDIA_INFO_LOG("update media analysis service specifications for add screenshot");
2356 ExecSqls(executeSqlStrs, store);
2357 }
2358
AddHeadAndPoseTables(RdbStore & store)2359 static void AddHeadAndPoseTables(RdbStore &store)
2360 {
2361 static const vector<string> executeSqlStrs = {
2362 CREATE_TAB_ANALYSIS_HEAD,
2363 CREATE_TAB_ANALYSIS_POSE,
2364 DROP_INSERT_VISION_TRIGGER,
2365 CREATE_VISION_INSERT_TRIGGER_FOR_ADD_HEAD_AND_POSE,
2366 ADD_HEAD_STATUS_COLUMN,
2367 UPDATE_HEAD_TOTAL_VALUE,
2368 UPDATE_HEAD_NOT_SUPPORT_VALUE,
2369 ADD_POSE_STATUS_COLUMN,
2370 UPDATE_POSE_TOTAL_VALUE,
2371 UPDATE_POSE_NOT_SUPPORT_VALUE,
2372 CREATE_HEAD_INDEX,
2373 CREATE_POSE_INDEX,
2374 };
2375 MEDIA_INFO_LOG("start add head and pose tables");
2376 ExecSqls(executeSqlStrs, store);
2377 }
2378
AddFaceOcclusionAndPoseTypeColumn(RdbStore & store)2379 static void AddFaceOcclusionAndPoseTypeColumn(RdbStore &store)
2380 {
2381 MEDIA_INFO_LOG("start add face occlusion and pose type column");
2382 MediaLibraryRdbStore::AddColumnIfNotExists(store, FACE_OCCLUSION, "INT", VISION_IMAGE_FACE_TABLE);
2383 MediaLibraryRdbStore::AddColumnIfNotExists(store, POSE_TYPE, "INT", VISION_POSE_TABLE);
2384 }
2385
AddSegmentationColumns(RdbStore & store)2386 static void AddSegmentationColumns(RdbStore &store)
2387 {
2388 const string addNameOnSegmentation = "ALTER TABLE " + VISION_SEGMENTATION_TABLE + " ADD COLUMN " +
2389 SEGMENTATION_NAME + " INT";
2390 const string addProbOnSegmentation = "ALTER TABLE " + VISION_SEGMENTATION_TABLE + " ADD COLUMN " +
2391 PROB + " REAL";
2392
2393 const vector<string> addSegmentationColumns = { addNameOnSegmentation, addProbOnSegmentation };
2394 ExecSqls(addSegmentationColumns, store);
2395 }
2396
AddSearchTable(RdbStore & store)2397 static void AddSearchTable(RdbStore &store)
2398 {
2399 static const vector<string> executeSqlStrs = {
2400 "DROP TABLE IF EXISTS " + SEARCH_TOTAL_TABLE,
2401 "DROP TRIGGER IF EXISTS " + INSERT_SEARCH_TRIGGER,
2402 "DROP TRIGGER IF EXISTS " + UPDATE_SEARCH_TRIGGER,
2403 "DROP TRIGGER IF EXISTS " + UPDATE_SEARCH_STATUS_TRIGGER,
2404 "DROP TRIGGER IF EXISTS " + DELETE_SEARCH_TRIGGER,
2405 "DROP TRIGGER IF EXISTS " + ALBUM_MAP_INSERT_SEARCH_TRIGGER,
2406 "DROP TRIGGER IF EXISTS " + ALBUM_MAP_DELETE_SEARCH_TRIGGER,
2407 "DROP TRIGGER IF EXISTS " + ALBUM_UPDATE_SEARCH_TRIGGER,
2408 "DROP TRIGGER IF EXISTS " + ANALYSIS_UPDATE_SEARCH_TRIGGER,
2409 CREATE_SEARCH_TOTAL_TABLE,
2410 CREATE_SEARCH_INSERT_TRIGGER,
2411 CREATE_SEARCH_UPDATE_TRIGGER,
2412 CREATE_SEARCH_UPDATE_STATUS_TRIGGER,
2413 CREATE_SEARCH_DELETE_TRIGGER,
2414 CREATE_ALBUM_UPDATE_SEARCH_TRIGGER,
2415 CREATE_ANALYSIS_UPDATE_SEARCH_TRIGGER,
2416 };
2417 MEDIA_INFO_LOG("start init search db");
2418 ExecSqls(executeSqlStrs, store);
2419 }
2420
UpdateInsertPhotoUpdateAlbumTrigger(RdbStore & store)2421 static void UpdateInsertPhotoUpdateAlbumTrigger(RdbStore &store)
2422 {
2423 static const vector<string> executeSqlStrs = {
2424 INSERT_PHOTO_UPDATE_ALBUM_BUNDLENAME,
2425 };
2426 MEDIA_INFO_LOG("start update insert photo update album");
2427 ExecSqls(executeSqlStrs, store);
2428 }
2429
ResetSearchTables()2430 bool MediaLibraryRdbStore::ResetSearchTables()
2431 {
2432 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), false,
2433 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
2434
2435 static const vector<string> executeSqlStrs = {
2436 "DROP TABLE IF EXISTS " + SEARCH_TOTAL_TABLE,
2437 "DROP TRIGGER IF EXISTS " + INSERT_SEARCH_TRIGGER,
2438 "DROP TRIGGER IF EXISTS " + UPDATE_SEARCH_TRIGGER,
2439 "DROP TRIGGER IF EXISTS " + UPDATE_SEARCH_STATUS_TRIGGER,
2440 "DROP TRIGGER IF EXISTS " + DELETE_SEARCH_TRIGGER,
2441 "DROP TRIGGER IF EXISTS " + ALBUM_MAP_INSERT_SEARCH_TRIGGER,
2442 "DROP TRIGGER IF EXISTS " + ALBUM_MAP_DELETE_SEARCH_TRIGGER,
2443 "DROP TRIGGER IF EXISTS " + ALBUM_UPDATE_SEARCH_TRIGGER,
2444 "DROP TRIGGER IF EXISTS " + ANALYSIS_UPDATE_SEARCH_TRIGGER,
2445 };
2446 MEDIA_INFO_LOG("start update search db");
2447 ExecSqls(executeSqlStrs, *rdbStore_);
2448 AddSearchTable(*rdbStore_);
2449 return true;
2450 }
2451
ResetAnalysisTables()2452 bool MediaLibraryRdbStore::ResetAnalysisTables()
2453 {
2454 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), false,
2455 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
2456
2457 static const vector<string> executeSqlStrs = {
2458 "DROP TRIGGER IF EXISTS delete_vision_trigger",
2459 "DROP TRIGGER IF EXISTS insert_vision_trigger",
2460 "DROP TRIGGER IF EXISTS update_vision_trigger",
2461 "DROP TABLE IF EXISTS tab_analysis_ocr",
2462 "DROP TABLE IF EXISTS tab_analysis_label",
2463 "DROP TABLE IF EXISTS tab_analysis_saliency_detect",
2464 "DROP TABLE IF EXISTS tab_analysis_aesthetics_score",
2465 "DROP TABLE IF EXISTS tab_analysis_object",
2466 "DROP TABLE IF EXISTS tab_analysis_recommendation",
2467 "DROP TABLE IF EXISTS tab_analysis_segmentation",
2468 "DROP TABLE IF EXISTS tab_analysis_composition",
2469 "DROP TABLE IF EXISTS tab_analysis_total",
2470 "DROP TABLE IF EXISTS tab_analysis_image_face",
2471 "DROP TABLE IF EXISTS tab_analysis_face_tag",
2472 "DROP TABLE IF EXISTS tab_analysis_head",
2473 "DROP TABLE IF EXISTS tab_analysis_pose",
2474 };
2475 MEDIA_INFO_LOG("start update analysis table");
2476 ExecSqls(executeSqlStrs, *rdbStore_);
2477 AddAnalysisTables(*rdbStore_);
2478 AddFaceTables(*rdbStore_);
2479 AddAestheticCompositionTables(*rdbStore_);
2480 AddSaliencyTables(*rdbStore_);
2481 UpdateSpecForAddScreenshot(*rdbStore_);
2482 AddHeadAndPoseTables(*rdbStore_);
2483 AddSegmentationColumns(*rdbStore_);
2484 AddFaceOcclusionAndPoseTypeColumn(*rdbStore_);
2485 AddVideoLabelTable(*rdbStore_);
2486
2487 return true;
2488 }
2489
AddPackageNameColumnOnTables(RdbStore & store)2490 static void AddPackageNameColumnOnTables(RdbStore &store)
2491 {
2492 static const string ADD_PACKAGE_NAME_ON_PHOTOS = "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE +
2493 " ADD COLUMN " + PhotoColumn::MEDIA_PACKAGE_NAME + " TEXT";
2494 static const string ADD_PACKAGE_NAME_ON_AUDIOS = "ALTER TABLE " + AudioColumn::AUDIOS_TABLE +
2495 " ADD COLUMN " + AudioColumn::MEDIA_PACKAGE_NAME + " TEXT";
2496 static const string ADD_PACKAGE_NAME_ON_FILES = "ALTER TABLE " + MEDIALIBRARY_TABLE +
2497 " ADD COLUMN " + MEDIA_DATA_DB_PACKAGE_NAME + " TEXT";
2498
2499 int32_t result = ExecSqlWithRetry([&]() { return store.ExecuteSql(ADD_PACKAGE_NAME_ON_PHOTOS); });
2500 if (result != NativeRdb::E_OK) {
2501 UpdateFail(__FILE__, __LINE__);
2502 MEDIA_ERR_LOG("Failed to update PHOTOS");
2503 }
2504 result = ExecSqlWithRetry([&]() { return store.ExecuteSql(ADD_PACKAGE_NAME_ON_AUDIOS); });
2505 if (result != NativeRdb::E_OK) {
2506 UpdateFail(__FILE__, __LINE__);
2507 MEDIA_ERR_LOG("Failed to update AUDIOS");
2508 }
2509 result = ExecSqlWithRetry([&]() { return store.ExecuteSql(ADD_PACKAGE_NAME_ON_FILES); });
2510 if (result != NativeRdb::E_OK) {
2511 UpdateFail(__FILE__, __LINE__);
2512 MEDIA_ERR_LOG("Failed to update FILES");
2513 }
2514 }
2515
UpdateCloudAlbum(RdbStore & store)2516 void UpdateCloudAlbum(RdbStore &store)
2517 {
2518 /* album - add columns */
2519 const std::string addAlbumDirty = "ALTER TABLE " + PhotoAlbumColumns::TABLE +
2520 " ADD COLUMN " + PhotoAlbumColumns::ALBUM_DIRTY + " INT DEFAULT " +
2521 to_string(static_cast<int32_t>(DirtyTypes::TYPE_NEW)) + ";";
2522 int32_t ret = ExecSqlWithRetry([&]() { return store.ExecuteSql(addAlbumDirty); });
2523 if (ret != NativeRdb::E_OK) {
2524 MEDIA_ERR_LOG("upgrade fail %{public}d: add ablum dirty", ret);
2525 UpdateFail(__FILE__, __LINE__);
2526 }
2527 const std::string addAlbumCloudId = "ALTER TABLE " + PhotoAlbumColumns::TABLE +
2528 " ADD COLUMN " + PhotoAlbumColumns::ALBUM_CLOUD_ID + " TEXT;";
2529 ret = ExecSqlWithRetry([&]() { return store.ExecuteSql(addAlbumCloudId); });
2530 if (ret != NativeRdb::E_OK) {
2531 MEDIA_ERR_LOG("upgrade fail %{public}d: add ablum cloud id", ret);
2532 UpdateFail(__FILE__, __LINE__);
2533 }
2534 /* album - add triggers */
2535 ret = ExecSqlWithRetry([&]() { return store.ExecuteSql(PhotoAlbumColumns::CREATE_ALBUM_INSERT_TRIGGER); });
2536 if (ret != NativeRdb::E_OK) {
2537 MEDIA_ERR_LOG("upgrade fail %{public}d: create album insert trigger", ret);
2538 UpdateFail(__FILE__, __LINE__);
2539 }
2540 ret = ExecSqlWithRetry([&]() { return store.ExecuteSql(PhotoAlbumColumns::CREATE_ALBUM_MDIRTY_TRIGGER); });
2541 if (ret != NativeRdb::E_OK) {
2542 MEDIA_ERR_LOG("upgrade fail %{public}d: create album modify trigger", ret);
2543 UpdateFail(__FILE__, __LINE__);
2544 }
2545 ret = ExecSqlWithRetry([&]() { return store.ExecuteSql(PhotoAlbumColumns::CREATE_ALBUM_DELETE_TRIGGER); });
2546 if (ret != NativeRdb::E_OK) {
2547 MEDIA_ERR_LOG("upgrade fail %{public}d: create album delete trigger", ret);
2548 UpdateFail(__FILE__, __LINE__);
2549 }
2550 /* album map - add columns */
2551 const std::string addAlbumMapColumns = "ALTER TABLE " + PhotoMap::TABLE +
2552 " ADD COLUMN " + PhotoMap::DIRTY +" INT DEFAULT " +
2553 to_string(static_cast<int32_t>(DirtyTypes::TYPE_NEW)) + ";";
2554 ret = ExecSqlWithRetry([&]() { return store.ExecuteSql(addAlbumMapColumns); });
2555 if (ret != NativeRdb::E_OK) {
2556 MEDIA_ERR_LOG("upgrade fail %{public}d: add ablum columns", ret);
2557 UpdateFail(__FILE__, __LINE__);
2558 }
2559 }
2560
AddCameraShotKey(RdbStore & store)2561 static void AddCameraShotKey(RdbStore &store)
2562 {
2563 static const string ADD_CAMERA_SHOT_KEY_ON_PHOTOS = "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE +
2564 " ADD COLUMN " + PhotoColumn::CAMERA_SHOT_KEY + " TEXT";
2565 int32_t result = ExecSqlWithRetry([&]() { return store.ExecuteSql(ADD_CAMERA_SHOT_KEY_ON_PHOTOS); });
2566 if (result != NativeRdb::E_OK) {
2567 UpdateFail(__FILE__, __LINE__);
2568 MEDIA_ERR_LOG("Failed to update PHOTOS");
2569 }
2570 result = ExecSqlWithRetry([&]() { return store.ExecuteSql(PhotoColumn::INDEX_CAMERA_SHOT_KEY); });
2571 if (result != NativeRdb::E_OK) {
2572 UpdateFail(__FILE__, __LINE__);
2573 MEDIA_ERR_LOG("Failed to create CAMERA_SHOT_KEY index");
2574 }
2575 }
2576
RemoveAlbumCountTrigger(RdbStore & store)2577 void RemoveAlbumCountTrigger(RdbStore &store)
2578 {
2579 const vector<string> removeAlbumCountTriggers = {
2580 BaseColumn::DropTrigger() + "update_user_album_count",
2581 BaseColumn::DropTrigger() + "photo_album_insert_asset",
2582 BaseColumn::DropTrigger() + "photo_album_delete_asset",
2583 };
2584 ExecSqls(removeAlbumCountTriggers, store);
2585 }
2586
AddExifAndUserComment(RdbStore & store)2587 void AddExifAndUserComment(RdbStore &store)
2588 {
2589 const string addUserCommentOnPhotos = "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE +
2590 " ADD COLUMN " + PhotoColumn::PHOTO_USER_COMMENT + " TEXT";
2591
2592 const string addAllExifOnPhotos = "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE +
2593 " ADD COLUMN " + PhotoColumn::PHOTO_ALL_EXIF + " TEXT";
2594
2595 const vector<string> addExifColumns = { addUserCommentOnPhotos, addAllExifOnPhotos };
2596 ExecSqls(addExifColumns, store);
2597 }
2598
AddUpdateCloudSyncTrigger(RdbStore & store)2599 void AddUpdateCloudSyncTrigger(RdbStore &store)
2600 {
2601 const vector<string> addUpdateCloudSyncTrigger = { PhotoColumn::CREATE_PHOTOS_UPDATE_CLOUD_SYNC };
2602 ExecSqls(addUpdateCloudSyncTrigger, store);
2603 }
2604
UpdateYearMonthDayData(RdbStore & store)2605 void UpdateYearMonthDayData(RdbStore &store)
2606 {
2607 MEDIA_DEBUG_LOG("UpdateYearMonthDayData start");
2608 const vector<string> updateSql = {
2609 "DROP TRIGGER IF EXISTS naturalbase_rdb_Audios_ON_DELETE",
2610 "DROP TRIGGER IF EXISTS naturalbase_rdb_Audios_ON_INSERT",
2611 "DROP TRIGGER IF EXISTS naturalbase_rdb_Audios_ON_UPDATE",
2612 "DROP TRIGGER IF EXISTS naturalbase_rdb_Files_ON_DELETE",
2613 "DROP TRIGGER IF EXISTS naturalbase_rdb_Files_ON_INSERT",
2614 "DROP TRIGGER IF EXISTS naturalbase_rdb_Files_ON_UPDATE",
2615 "DROP TRIGGER IF EXISTS naturalbase_rdb_Photos_ON_DELETE",
2616 "DROP TRIGGER IF EXISTS naturalbase_rdb_Photos_ON_INSERT",
2617 "DROP TRIGGER IF EXISTS naturalbase_rdb_Photos_ON_UPDATE",
2618 "DROP INDEX IF EXISTS " + PhotoColumn::PHOTO_DATE_YEAR_INDEX,
2619 "DROP INDEX IF EXISTS " + PhotoColumn::PHOTO_DATE_MONTH_INDEX,
2620 "DROP INDEX IF EXISTS " + PhotoColumn::PHOTO_DATE_DAY_INDEX,
2621 "UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET " +
2622 PhotoColumn::PHOTO_DATE_YEAR + " = strftime('%Y', datetime(date_added, 'unixepoch', 'localtime')), " +
2623 PhotoColumn::PHOTO_DATE_MONTH + " = strftime('%Y%m', datetime(date_added, 'unixepoch', 'localtime')), " +
2624 PhotoColumn::PHOTO_DATE_DAY + " = strftime('%Y%m%d', datetime(date_added, 'unixepoch', 'localtime'))",
2625 PhotoColumn::CREATE_YEAR_INDEX,
2626 PhotoColumn::CREATE_MONTH_INDEX,
2627 PhotoColumn::CREATE_DAY_INDEX,
2628 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_INDEX,
2629 };
2630 ExecSqls(updateSql, store);
2631 MEDIA_DEBUG_LOG("UpdateYearMonthDayData end");
2632 }
2633
FixIndexOrder(RdbStore & store)2634 void FixIndexOrder(RdbStore &store)
2635 {
2636 const vector<string> updateSql = {
2637 "DROP INDEX IF EXISTS " + PhotoColumn::PHOTO_DATE_YEAR_INDEX,
2638 "DROP INDEX IF EXISTS " + PhotoColumn::PHOTO_DATE_MONTH_INDEX,
2639 "DROP INDEX IF EXISTS " + PhotoColumn::PHOTO_DATE_DAY_INDEX,
2640 "DROP INDEX IF EXISTS idx_media_type",
2641 "DROP INDEX IF EXISTS idx_sthp_dateadded",
2642 PhotoColumn::CREATE_YEAR_INDEX,
2643 PhotoColumn::CREATE_MONTH_INDEX,
2644 PhotoColumn::CREATE_DAY_INDEX,
2645 PhotoColumn::INDEX_SCTHP_ADDTIME,
2646 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_INDEX,
2647 PhotoColumn::CREATE_SCHPT_DAY_INDEX,
2648 };
2649 ExecSqls(updateSql, store);
2650 }
2651
AddYearMonthDayColumn(RdbStore & store)2652 void AddYearMonthDayColumn(RdbStore &store)
2653 {
2654 const vector<string> sqls = {
2655 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_DATE_YEAR + " TEXT",
2656 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_DATE_MONTH + " TEXT",
2657 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_DATE_DAY + " TEXT",
2658 };
2659 ExecSqls(sqls, store);
2660 }
2661
AddCleanFlagAndThumbStatus(RdbStore & store)2662 void AddCleanFlagAndThumbStatus(RdbStore &store)
2663 {
2664 const vector<string> addSyncStatus = {
2665 "DROP INDEX IF EXISTS idx_shpt_date_added",
2666 "DROP INDEX IF EXISTS idx_shpt_media_type",
2667 "DROP INDEX IF EXISTS idx_shpt_date_day",
2668 BaseColumn::AlterTableAddIntColumn(PhotoColumn::PHOTOS_TABLE, PhotoColumn::PHOTO_CLEAN_FLAG),
2669 BaseColumn::AlterTableAddIntColumn(PhotoColumn::PHOTOS_TABLE, PhotoColumn::PHOTO_THUMB_STATUS),
2670 PhotoColumn::INDEX_SCTHP_ADDTIME,
2671 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_INDEX,
2672 PhotoColumn::CREATE_SCHPT_DAY_INDEX,
2673 };
2674 int32_t result = ExecSqls(addSyncStatus, store);
2675 CHECK_AND_PRINT_LOG(result == NativeRdb::E_OK,
2676 "Upgrade rdb need clean and thumb status error %{private}d", result);
2677 }
2678
AddCloudIndex(RdbStore & store)2679 void AddCloudIndex(RdbStore &store)
2680 {
2681 const vector<string> sqls = {
2682 "DROP INDEX IF EXISTS " + PhotoColumn::PHOTO_CLOUD_ID_INDEX,
2683 PhotoColumn::CREATE_CLOUD_ID_INDEX,
2684 };
2685 ExecSqls(sqls, store);
2686 }
2687
AddPhotoEditTimeColumn(RdbStore & store)2688 static void AddPhotoEditTimeColumn(RdbStore &store)
2689 {
2690 const string addEditTimeOnPhotos = "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE +
2691 " ADD COLUMN " + PhotoColumn::PHOTO_EDIT_TIME + " BIGINT DEFAULT 0";
2692 const vector<string> addEditTime = { addEditTimeOnPhotos };
2693 ExecSqls(addEditTime, store);
2694 }
2695
AddShootingModeColumn(RdbStore & store)2696 void AddShootingModeColumn(RdbStore &store)
2697 {
2698 const std::string addShootringMode =
2699 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
2700 PhotoColumn::PHOTO_SHOOTING_MODE + " TEXT";
2701 const vector<string> addShootingModeColumn = { addShootringMode };
2702 int32_t result = ExecSqls(addShootingModeColumn, store);
2703 CHECK_AND_PRINT_LOG(result == NativeRdb::E_OK, "Upgrade rdb shooting_mode error %{private}d", result);
2704 }
2705
AddShootingModeTagColumn(RdbStore & store)2706 void AddShootingModeTagColumn(RdbStore &store)
2707 {
2708 const std::string addShootringModeTag =
2709 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
2710 PhotoColumn::PHOTO_SHOOTING_MODE_TAG + " TEXT";
2711 const std::string dropExpiredClearMapTrigger =
2712 "DROP TRIGGER IF EXISTS delete_photo_clear_map";
2713 const vector<string> addShootingModeTagColumn = {addShootringModeTag,
2714 dropExpiredClearMapTrigger, TriggerDeletePhotoClearMap()};
2715 int32_t result = ExecSqls(addShootingModeTagColumn, store);
2716 CHECK_AND_PRINT_LOG(result == NativeRdb::E_OK, "Upgrade rdb shooting_mode error %{private}d", result);
2717 }
2718
AddHiddenViewColumn(RdbStore & store)2719 static void AddHiddenViewColumn(RdbStore &store)
2720 {
2721 vector<string> upgradeSqls = {
2722 BaseColumn::AlterTableAddIntColumn(PhotoAlbumColumns::TABLE, PhotoAlbumColumns::CONTAINS_HIDDEN),
2723 BaseColumn::AlterTableAddIntColumn(PhotoAlbumColumns::TABLE, PhotoAlbumColumns::HIDDEN_COUNT),
2724 BaseColumn::AlterTableAddTextColumn(PhotoAlbumColumns::TABLE, PhotoAlbumColumns::HIDDEN_COVER),
2725 };
2726 ExecSqls(upgradeSqls, store);
2727 }
2728
ModifyMdirtyTriggers(RdbStore & store)2729 static void ModifyMdirtyTriggers(RdbStore &store)
2730 {
2731 /* drop old mdirty trigger */
2732 const vector<string> dropMdirtyTriggers = {
2733 "DROP TRIGGER IF EXISTS photos_mdirty_trigger",
2734 "DROP TRIGGER IF EXISTS mdirty_trigger",
2735 };
2736 if (ExecSqls(dropMdirtyTriggers, store) != NativeRdb::E_OK) {
2737 UpdateFail(__FILE__, __LINE__);
2738 MEDIA_ERR_LOG("upgrade fail: drop old mdirty trigger");
2739 }
2740
2741 /* create new mdirty trigger */
2742 if (ExecSqlWithRetry([&]() { return store.ExecuteSql(PhotoColumn::CREATE_PHOTOS_MDIRTY_TRIGGER); }) !=
2743 NativeRdb::E_OK) {
2744 UpdateFail(__FILE__, __LINE__);
2745 MEDIA_ERR_LOG("upgrade fail: create new photos mdirty trigger");
2746 }
2747
2748 if (ExecSqlWithRetry([&]() { return store.ExecuteSql(CREATE_FILES_MDIRTY_TRIGGER); }) != NativeRdb::E_OK) {
2749 UpdateFail(__FILE__, __LINE__);
2750 MEDIA_ERR_LOG("upgrade fail: create new mdirty trigger");
2751 }
2752 }
2753
AddLastVisitTimeColumn(RdbStore & store)2754 static void AddLastVisitTimeColumn(RdbStore &store)
2755 {
2756 const vector<string> sqls = {
2757 "ALTER TABLE " + AudioColumn::AUDIOS_TABLE + " DROP time_visit ",
2758 "ALTER TABLE " + REMOTE_THUMBNAIL_TABLE + " DROP time_visit ",
2759 "ALTER TABLE " + MEDIALIBRARY_TABLE + " DROP time_visit ",
2760 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " DROP time_visit ",
2761 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
2762 PhotoColumn::PHOTO_LAST_VISIT_TIME + " BIGINT DEFAULT 0",
2763 };
2764 int32_t result = ExecSqls(sqls, store);
2765 CHECK_AND_PRINT_LOG(result == NativeRdb::E_OK, "Upgrade rdb last_visit_time error %{private}d", result);
2766 }
2767
AddHiddenTimeColumn(RdbStore & store)2768 void AddHiddenTimeColumn(RdbStore &store)
2769 {
2770 const vector<string> sqls = {
2771 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE +
2772 " ADD COLUMN " + PhotoColumn::PHOTO_HIDDEN_TIME + " BIGINT DEFAULT 0",
2773 PhotoColumn::CREATE_HIDDEN_TIME_INDEX,
2774 };
2775 ExecSqls(sqls, store);
2776 }
2777
AddAlbumOrderColumn(RdbStore & store)2778 void AddAlbumOrderColumn(RdbStore &store)
2779 {
2780 const std::string addAlbumOrderColumn =
2781 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
2782 PhotoAlbumColumns::ALBUM_ORDER + " INT";
2783 const std::string initOriginOrder =
2784 "UPDATE " + PhotoAlbumColumns::TABLE + " SET " +
2785 PhotoAlbumColumns::ALBUM_ORDER + " = rowid";
2786 const std::string albumDeleteTrigger =
2787 " CREATE TRIGGER IF NOT EXISTS update_order_trigger AFTER DELETE ON " + PhotoAlbumColumns::TABLE +
2788 " FOR EACH ROW " +
2789 " BEGIN " +
2790 " UPDATE " + PhotoAlbumColumns::TABLE + " SET album_order = album_order - 1" +
2791 " WHERE album_order > old.album_order;" +
2792 " END";
2793 const std::string albumInsertTrigger =
2794 " CREATE TRIGGER IF NOT EXISTS insert_order_trigger AFTER INSERT ON " + PhotoAlbumColumns::TABLE +
2795 " BEGIN " +
2796 " UPDATE " + PhotoAlbumColumns::TABLE + " SET album_order = (" +
2797 " SELECT COALESCE(MAX(album_order), 0) + 1 FROM " + PhotoAlbumColumns::TABLE +
2798 ") WHERE rowid = new.rowid;" +
2799 " END";
2800
2801 const vector<string> addAlbumOrder = { addAlbumOrderColumn, initOriginOrder,
2802 albumDeleteTrigger, albumInsertTrigger};
2803 int32_t result = ExecSqls(addAlbumOrder, store);
2804 CHECK_AND_PRINT_LOG(result == NativeRdb::E_OK, "Upgrade rdb album order error %{private}d", result);
2805 }
2806
AddFormMap(RdbStore & store)2807 static void AddFormMap(RdbStore &store)
2808 {
2809 int32_t result = ExecSqlWithRetry([&]() { return store.ExecuteSql(FormMap::CREATE_FORM_MAP_TABLE); });
2810 if (result != NativeRdb::E_OK) {
2811 UpdateFail(__FILE__, __LINE__);
2812 MEDIA_ERR_LOG("Failed to update PHOTOS");
2813 }
2814 }
2815
FixDocsPath(RdbStore & store)2816 static void FixDocsPath(RdbStore &store)
2817 {
2818 vector<string> sqls = {
2819 "UPDATE Files SET "
2820 " data = REPLACE(data, '/storage/cloud/files/Documents', '/storage/cloud/files/Docs/Documents'),"
2821 " data = REPLACE(data, '/storage/cloud/files/Download', '/storage/cloud/files/Docs/Download'),"
2822 " relative_path = REPLACE(relative_path, 'Documents/', 'Docs/Documents/'),"
2823 " relative_path = REPLACE(relative_path, 'Download/', 'Docs/Download/')"
2824 " WHERE data LIKE '/storage/cloud/files/Documents%' OR "
2825 " data LIKE '/storage/cloud/files/Download%' OR"
2826 " relative_path LIKE 'Documents/%' OR"
2827 " relative_path LIKE 'Download/%';",
2828 "UPDATE MediaTypeDirectory SET directory = 'Docs/' WHERE directory_type = 4 OR directory_type = 5",
2829 };
2830
2831 ExecSqls(sqls, store);
2832 }
2833
AddImageVideoCount(RdbStore & store)2834 static void AddImageVideoCount(RdbStore &store)
2835 {
2836 const vector<string> sqls = {
2837 "ALTER TABLE " + PhotoAlbumColumns::TABLE +
2838 " ADD COLUMN " + PhotoAlbumColumns::ALBUM_IMAGE_COUNT + " INT DEFAULT 0",
2839 "ALTER TABLE " + PhotoAlbumColumns::TABLE +
2840 " ADD COLUMN " + PhotoAlbumColumns::ALBUM_VIDEO_COUNT + " INT DEFAULT 0",
2841 };
2842 }
2843
AddSCHPTHiddenTimeIndex(RdbStore & store)2844 static void AddSCHPTHiddenTimeIndex(RdbStore &store)
2845 {
2846 const vector<string> sqls = {
2847 PhotoColumn::CREATE_SCHPT_HIDDEN_TIME_INDEX,
2848 };
2849 ExecSqls(sqls, store);
2850 }
2851
UpdateClassifyDirtyData(RdbStore & store)2852 static void UpdateClassifyDirtyData(RdbStore &store)
2853 {
2854 static const vector<string> executeSqlStrs = {
2855 DROP_TABLE_ANALYSISALBUM,
2856 DROP_TABLE_ANALYSISPHOTOMAP,
2857 ALTER_WIDTH_COLUMN,
2858 ALTER_HEIGHT_COLUMN,
2859 CREATE_ANALYSIS_ALBUM,
2860 CREATE_ANALYSIS_ALBUM_MAP,
2861 CREATE_TAB_IMAGE_FACE,
2862 CREATE_TAB_FACE_TAG,
2863 DROP_INSERT_VISION_TRIGGER,
2864 CREATE_INSERT_VISION_TRIGGER_FOR_ADD_FACE,
2865 ADD_FACE_STATUS_COLUMN,
2866 UPDATE_TOTAL_VALUE,
2867 UPDATE_NOT_SUPPORT_VALUE,
2868 CREATE_IMAGE_FACE_INDEX
2869 };
2870 MEDIA_INFO_LOG("start clear dirty data");
2871 ExecSqls(executeSqlStrs, store);
2872 }
2873
UpdateGeoTables(RdbStore & store)2874 static void UpdateGeoTables(RdbStore &store)
2875 {
2876 const vector<string> sqls = {
2877 "ALTER TABLE tab_geo_dictionary RENAME TO " + GEO_DICTIONARY_TABLE,
2878 "ALTER TABLE tab_geo_knowledge RENAME TO " + GEO_KNOWLEDGE_TABLE,
2879 CREATE_DICTIONARY_INDEX,
2880 DROP_KNOWLEDGE_INDEX,
2881 CREATE_NEW_KNOWLEDGE_INDEX,
2882 CREATE_CITY_NAME_INDEX,
2883 CREATE_LOCATION_KEY_INDEX,
2884 };
2885 ExecSqls(sqls, store);
2886 }
2887
UpdatePhotosMdirtyTrigger(RdbStore & store)2888 static void UpdatePhotosMdirtyTrigger(RdbStore& store)
2889 {
2890 string dropSql = "DROP TRIGGER IF EXISTS photos_mdirty_trigger";
2891 if (ExecSqlWithRetry([&]() { return store.ExecuteSql(dropSql); }) != NativeRdb::E_OK) {
2892 MEDIA_ERR_LOG("Failed to drop old photos_mdirty_trigger: %{private}s", dropSql.c_str());
2893 UpdateFail(__FILE__, __LINE__);
2894 }
2895
2896 if (ExecSqlWithRetry([&]() { return store.ExecuteSql(PhotoColumn::CREATE_PHOTOS_MDIRTY_TRIGGER); }) !=
2897 NativeRdb::E_OK) {
2898 UpdateFail(__FILE__, __LINE__);
2899 MEDIA_ERR_LOG("Failed to upgrade new photos_mdirty_trigger, %{private}s",
2900 PhotoColumn::CREATE_PHOTOS_MDIRTY_TRIGGER.c_str());
2901 }
2902 }
2903
AddIndexForFileId(RdbStore & store)2904 static void AddIndexForFileId(RdbStore& store)
2905 {
2906 const vector<string> sqls = {
2907 CREATE_IDX_FILEID_FOR_SEARCH_INDEX,
2908 CREATE_IDX_FILEID_FOR_ANALYSIS_TOTAL,
2909 CREATE_IDX_FILEID_FOR_ANALYSIS_PHOTO_MAP,
2910 };
2911 MEDIA_INFO_LOG("start AddIndexForFileId");
2912 ExecSqls(sqls, store);
2913 }
2914
AddIndexForFileIdAsync(const shared_ptr<MediaLibraryRdbStore> store)2915 void MediaLibraryRdbStore::AddIndexForFileIdAsync(const shared_ptr<MediaLibraryRdbStore> store)
2916 {
2917 MEDIA_INFO_LOG("AddIndexForFileIdAsync start");
2918 const vector<string> updateSql = {
2919 CREATE_IDX_FILEID_FOR_SEARCH_INDEX,
2920 CREATE_IDX_FILEID_FOR_ANALYSIS_TOTAL,
2921 CREATE_IDX_FILEID_FOR_ANALYSIS_PHOTO_MAP,
2922 };
2923 ExecSqls(updateSql, *store->GetRaw().get());
2924 MEDIA_INFO_LOG("AddIndexForFileIdAsync end");
2925 }
2926
AddMetaRecovery(RdbStore & store)2927 static void AddMetaRecovery(RdbStore& store)
2928 {
2929 const vector<string> sqls = {"ALTER TABLE " + PhotoColumn::PHOTOS_TABLE +
2930 " ADD COLUMN " + PhotoColumn::PHOTO_METADATA_FLAGS + " INT DEFAULT 0",
2931 PhotoColumn::CREATE_PHOTOS_METADATA_DIRTY_TRIGGER,
2932 };
2933 MEDIA_INFO_LOG("start AddMetaRecovery");
2934 ExecSqls(sqls, store);
2935 }
2936
AddCloudEnhancementAlbum(RdbStore & store)2937 static void AddCloudEnhancementAlbum(RdbStore& store)
2938 {
2939 ValuesBucket values;
2940 int32_t err = E_FAIL;
2941 values.PutInt(PhotoAlbumColumns::ALBUM_TYPE, PhotoAlbumType::SYSTEM);
2942 values.PutInt(PhotoAlbumColumns::ALBUM_SUBTYPE, PhotoAlbumSubType::CLOUD_ENHANCEMENT);
2943 values.PutInt(PhotoAlbumColumns::ALBUM_ORDER,
2944 PhotoAlbumSubType::CLOUD_ENHANCEMENT - PhotoAlbumSubType::SYSTEM_START);
2945
2946 AbsRdbPredicates predicates(PhotoAlbumColumns::TABLE);
2947 predicates.EqualTo(PhotoAlbumColumns::ALBUM_TYPE, to_string(PhotoAlbumType::SYSTEM));
2948 predicates.EqualTo(PhotoAlbumColumns::ALBUM_SUBTYPE, to_string(PhotoAlbumSubType::CLOUD_ENHANCEMENT));
2949
2950 string sql;
2951 vector<ValueObject> bindArgs;
2952 // Build insert sql
2953 sql.append("INSERT").append(" INTO ").append(PhotoAlbumColumns::TABLE).append(" ");
2954 MediaLibraryRdbStore::BuildValuesSql(values, bindArgs, sql);
2955 sql.append(" WHERE NOT EXISTS (");
2956 MediaLibraryRdbStore::BuildQuerySql(predicates, { PhotoAlbumColumns::ALBUM_ID }, bindArgs, sql);
2957 sql.append(");");
2958 err = store.ExecuteSql(sql, bindArgs);
2959 values.Clear();
2960 if (err != E_OK) {
2961 MEDIA_ERR_LOG("Add cloud enhancement album failed, err: %{public}d", err);
2962 }
2963 }
2964
AddHighlightTriggerColumn(RdbStore & store)2965 void AddHighlightTriggerColumn(RdbStore &store)
2966 {
2967 const vector<string> sqls = {
2968 "ALTER TABLE " + PhotoColumn::HIGHLIGHT_TABLE + " ADD COLUMN " +
2969 PhotoColumn::MEDIA_DATA_DB_HIGHLIGHT_TRIGGER + " INT DEFAULT 0"
2970 };
2971 MEDIA_INFO_LOG("start add highlight trigger column");
2972 ExecSqls(sqls, store);
2973 MEDIA_INFO_LOG("end add highlight trigger column");
2974 }
2975
AddHighlightInsertAndUpdateTrigger(RdbStore & store)2976 void AddHighlightInsertAndUpdateTrigger(RdbStore &store)
2977 {
2978 const vector<string> sqls = {
2979 PhotoColumn::INSERT_GENERATE_HIGHLIGHT_THUMBNAIL,
2980 PhotoColumn::UPDATE_GENERATE_HIGHLIGHT_THUMBNAIL
2981 };
2982 MEDIA_INFO_LOG("start add highlight insert and update trigger");
2983 ExecSqls(sqls, store);
2984 MEDIA_INFO_LOG("end add highlight insert and update trigger");
2985 }
2986
AddHighlightIndex(RdbStore & store)2987 void AddHighlightIndex(RdbStore &store)
2988 {
2989 const vector<string> addHighlightIndex = { PhotoColumn::INDEX_HIGHLIGHT_FILEID };
2990 MEDIA_INFO_LOG("start add highlight index");
2991 ExecSqls(addHighlightIndex, store);
2992 MEDIA_INFO_LOG("end add highlight index");
2993 }
2994
UpdateSearchIndexTriggerForCleanFlag(RdbStore & store)2995 static void UpdateSearchIndexTriggerForCleanFlag(RdbStore& store)
2996 {
2997 const vector<string> sqls = {
2998 "DROP TRIGGER IF EXISTS update_search_status_trigger",
2999 CREATE_SEARCH_UPDATE_STATUS_TRIGGER,
3000 };
3001 MEDIA_INFO_LOG("start update search index for clean flag");
3002 ExecSqls(sqls, store);
3003 }
3004
UpdateAlbumRefreshTable(RdbStore & store)3005 static void UpdateAlbumRefreshTable(RdbStore &store)
3006 {
3007 const vector<string> sqls = {
3008 CREATE_ALBUM_REFRESH_TABLE,
3009 };
3010 ExecSqls(sqls, store);
3011 }
3012
AddCoverPlayVersionColumns(RdbStore & store)3013 static void AddCoverPlayVersionColumns(RdbStore& store)
3014 {
3015 const vector<string> sqls = {
3016 "ALTER TABLE " + HIGHLIGHT_COVER_INFO_TABLE +
3017 " ADD COLUMN " + COVER_SERVICE_VERSION + " INT DEFAULT 0",
3018 "ALTER TABLE " + HIGHLIGHT_PLAY_INFO_TABLE +
3019 " ADD COLUMN " + PLAY_SERVICE_VERSION + " INT DEFAULT 0",
3020 };
3021 MEDIA_INFO_LOG("start add cover play version columns");
3022 ExecSqls(sqls, store);
3023 }
3024
AddMovingPhotoRelatedData(RdbStore & store)3025 static void AddMovingPhotoRelatedData(RdbStore &store)
3026 {
3027 const vector<string> sqls = {
3028 CREATE_TAB_VIDEO_ANALYSIS_AESTHETICS,
3029 };
3030 MEDIA_INFO_LOG("start create video aesthetics score table");
3031 ExecSqls(sqls, store);
3032 }
3033
UpdateFavoriteIndex(RdbStore & store)3034 static void UpdateFavoriteIndex(RdbStore &store)
3035 {
3036 MEDIA_INFO_LOG("Upgrade rdb UpdateFavoriteIndex");
3037 const vector<string> sqls = {
3038 PhotoColumn::CREATE_PHOTO_FAVORITE_INDEX,
3039 PhotoColumn::DROP_SCHPT_MEDIA_TYPE_INDEX,
3040 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_INDEX,
3041 };
3042 ExecSqls(sqls, store);
3043 }
3044
AddMissingUpdates(RdbStore & store)3045 static void AddMissingUpdates(RdbStore &store)
3046 {
3047 MEDIA_INFO_LOG("start add missing updates");
3048 vector<string> sqls;
3049 bool hasShootingModeTag = MediaLibraryRdbStore::HasColumnInTable(store, PhotoColumn::PHOTO_SHOOTING_MODE_TAG,
3050 PhotoColumn::PHOTOS_TABLE);
3051 if (!hasShootingModeTag) {
3052 MEDIA_INFO_LOG("start add shooting mode tag");
3053 const vector<string> sqls = {
3054 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_SHOOTING_MODE_TAG +
3055 " TEXT",
3056 };
3057 ExecSqls(sqls, store);
3058 }
3059 bool hasBundleName = MediaLibraryRdbStore::HasColumnInTable(store, PhotoAlbumColumns::ALBUM_BUNDLE_NAME,
3060 PhotoAlbumColumns::TABLE);
3061 bool hasLocalLanguage = MediaLibraryRdbStore::HasColumnInTable(store, PhotoAlbumColumns::ALBUM_LOCAL_LANGUAGE,
3062 PhotoAlbumColumns::TABLE);
3063 if (!hasBundleName) {
3064 MoveSourceAlbumToPhotoAlbumAndAddColumns(store);
3065 ModifySourceAlbumTriggers(store);
3066 } else if (!hasLocalLanguage) {
3067 ModifySourceAlbumTriggers(store);
3068 } else {
3069 MEDIA_INFO_LOG("both columns exist, no need to start source album related updates");
3070 }
3071 MEDIA_INFO_LOG("start add cloud index");
3072 AddCloudIndex(store);
3073 MEDIA_INFO_LOG("start update photos mdirty trigger");
3074 UpdatePhotosMdirtyTrigger(store);
3075 MEDIA_INFO_LOG("end add missing updates");
3076 }
3077
AddMultiStagesCaptureColumns(RdbStore & store)3078 void AddMultiStagesCaptureColumns(RdbStore &store)
3079 {
3080 const vector<string> sqls = {
3081 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_ID + " TEXT",
3082 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_QUALITY + " INT",
3083 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_FIRST_VISIT_TIME +
3084 " BIGINT DEFAULT 0",
3085 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_DEFERRED_PROC_TYPE +
3086 " INT DEFAULT 0",
3087 };
3088 ExecSqls(sqls, store);
3089 }
3090
UpdateMillisecondDate(RdbStore & store)3091 void UpdateMillisecondDate(RdbStore &store)
3092 {
3093 MEDIA_DEBUG_LOG("UpdateMillisecondDate start");
3094 const vector<string> updateSql = {
3095 "UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET " +
3096 MediaColumn::MEDIA_DATE_ADDED + " = " + MediaColumn::MEDIA_DATE_ADDED + "*1000," +
3097 MediaColumn::MEDIA_DATE_MODIFIED + " = " + MediaColumn::MEDIA_DATE_MODIFIED + "*1000," +
3098 MediaColumn::MEDIA_DATE_TRASHED + " = " + MediaColumn::MEDIA_DATE_TRASHED + "*1000;",
3099 "UPDATE " + AudioColumn::AUDIOS_TABLE + " SET " +
3100 MediaColumn::MEDIA_DATE_ADDED + " = " + MediaColumn::MEDIA_DATE_ADDED + "*1000," +
3101 MediaColumn::MEDIA_DATE_MODIFIED + " = " + MediaColumn::MEDIA_DATE_MODIFIED + "*1000," +
3102 MediaColumn::MEDIA_DATE_TRASHED + " = " + MediaColumn::MEDIA_DATE_TRASHED + "*1000;",
3103 "UPDATE " + PhotoAlbumColumns::TABLE + " SET " +
3104 MediaColumn::MEDIA_DATE_MODIFIED + " = " + MediaColumn::MEDIA_DATE_MODIFIED + "*1000;",
3105 "UPDATE " + MEDIALIBRARY_TABLE + " SET " +
3106 MediaColumn::MEDIA_DATE_ADDED + " = " + MediaColumn::MEDIA_DATE_ADDED + "*1000," +
3107 MediaColumn::MEDIA_DATE_MODIFIED + " = " + MediaColumn::MEDIA_DATE_MODIFIED + "*1000;",
3108 };
3109 ExecSqls(updateSql, store);
3110 MEDIA_DEBUG_LOG("UpdateMillisecondDate end");
3111 }
3112
AddHasAstcColumns(RdbStore & store)3113 void AddHasAstcColumns(RdbStore &store)
3114 {
3115 const vector<string> sqls = {
3116 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_HAS_ASTC + " INT DEFAULT 0 ",
3117 };
3118 ExecSqls(sqls, store);
3119 }
3120
AddAddressDescriptionColumns(RdbStore & store)3121 void AddAddressDescriptionColumns(RdbStore &store)
3122 {
3123 const vector<string> sqls = {
3124 "ALTER TABLE " + GEO_KNOWLEDGE_TABLE + " ADD COLUMN " + CITY_NAME + " TEXT",
3125 "ALTER TABLE " + GEO_KNOWLEDGE_TABLE + " ADD COLUMN " + ADDRESS_DESCRIPTION + " TEXT",
3126 };
3127 ExecSqls(sqls, store);
3128 }
3129
AddIsLocalAlbum(RdbStore & store)3130 void AddIsLocalAlbum(RdbStore &store)
3131 {
3132 const vector<string> sqls = {
3133 ADD_IS_LOCAL_COLUMN_FOR_ALBUM,
3134 ADD_PHOTO_ALBUM_IS_LOCAL,
3135 };
3136 MEDIA_INFO_LOG("start add islocal column");
3137 ExecSqls(sqls, store);
3138 }
3139
AddSourceAndTargetTokenForUriPermission(RdbStore & store)3140 void AddSourceAndTargetTokenForUriPermission(RdbStore &store)
3141 {
3142 const vector<string> sqls = {
3143 "ALTER TABLE " + AppUriPermissionColumn::APP_URI_PERMISSION_TABLE + " ADD COLUMN " +
3144 AppUriPermissionColumn::SOURCE_TOKENID + " BIGINT",
3145 "ALTER TABLE " + AppUriPermissionColumn::APP_URI_PERMISSION_TABLE + " ADD COLUMN " +
3146 AppUriPermissionColumn::TARGET_TOKENID + " BIGINT",
3147 AppUriPermissionColumn::DROP_URI_URITYPE_APPID_INDEX,
3148 AppUriPermissionColumn::CREATE_URI_URITYPE_TOKENID_INDEX,
3149 };
3150 MEDIA_INFO_LOG("start add islocal column");
3151 ExecSqls(sqls, store);
3152 }
3153
UpdateAOI(RdbStore & store)3154 void UpdateAOI(RdbStore &store)
3155 {
3156 const vector<string> sqls = {
3157 "ALTER TABLE " + GEO_KNOWLEDGE_TABLE + " ADD COLUMN " + AOI + " TEXT ",
3158 "ALTER TABLE " + GEO_KNOWLEDGE_TABLE + " ADD COLUMN " + POI + " TEXT ",
3159 "ALTER TABLE " + GEO_KNOWLEDGE_TABLE + " ADD COLUMN " + FIRST_AOI + " TEXT ",
3160 "ALTER TABLE " + GEO_KNOWLEDGE_TABLE + " ADD COLUMN " + FIRST_POI + " TEXT ",
3161 "ALTER TABLE " + GEO_KNOWLEDGE_TABLE + " ADD COLUMN " + LOCATION_VERSION + " TEXT ",
3162 "ALTER TABLE " + GEO_KNOWLEDGE_TABLE + " ADD COLUMN " + FIRST_AOI_CATEGORY + " TEXT ",
3163 "ALTER TABLE " + GEO_KNOWLEDGE_TABLE + " ADD COLUMN " + FIRST_POI_CATEGORY + " TEXT ",
3164 "ALTER TABLE " + GEO_KNOWLEDGE_TABLE + " ADD COLUMN " + FILE_ID + " INT ",
3165 DROP_KNOWLEDGE_INDEX,
3166 CREATE_NEW_KNOWLEDGE_INDEX,
3167 };
3168 MEDIA_INFO_LOG("start init aoi info of geo db");
3169 ExecSqls(sqls, store);
3170 }
3171
UpdateVideoFaceTable(RdbStore & store)3172 void UpdateVideoFaceTable(RdbStore &store)
3173 {
3174 const vector<string> sqls = {
3175 "DROP TABLE IF EXISTS " + VISION_VIDEO_FACE_TABLE,
3176 CREATE_TAB_VIDEO_FACE,
3177 };
3178 MEDIA_INFO_LOG("start update video face db");
3179 ExecSqls(sqls, store);
3180 }
3181
AddHighlightChangeFunction(RdbStore & store)3182 void AddHighlightChangeFunction(RdbStore &store)
3183 {
3184 const vector<string> sqls = {
3185 "ALTER TABLE " + ANALYSIS_PHOTO_MAP_TABLE + " ADD COLUMN " + ORDER_POSITION + " INT ",
3186 "ALTER TABLE " + HIGHLIGHT_COVER_INFO_TABLE + " ADD COLUMN " + COVER_STATUS + " INT ",
3187 "ALTER TABLE " + HIGHLIGHT_PLAY_INFO_TABLE + " ADD COLUMN " + PLAY_INFO_STATUS + " INT ",
3188 "ALTER TABLE " + HIGHLIGHT_ALBUM_TABLE + " ADD COLUMN " + HIGHLIGHT_PIN_TIME + " BIGINT ",
3189 };
3190 MEDIA_INFO_LOG("start add highlight change function");
3191 ExecSqls(sqls, store);
3192 }
3193
AddAestheticsScoreFileds(RdbStore & store)3194 void AddAestheticsScoreFileds(RdbStore &store)
3195 {
3196 const vector<string> sqls = {
3197 "ALTER TABLE " + VISION_AESTHETICS_TABLE + " ADD COLUMN " + AESTHETICS_ALL_VERSION + " TEXT ",
3198 "ALTER TABLE " + VISION_AESTHETICS_TABLE + " ADD COLUMN " + AESTHETICS_SCORE_ALL + " INT NOT NULL DEFAULT 0 ",
3199 "ALTER TABLE " + VISION_AESTHETICS_TABLE + " ADD COLUMN " + IS_FILTERED_HARD + " BOOLEAN NOT NULL DEFAULT 0 ",
3200 "ALTER TABLE " + VISION_AESTHETICS_TABLE + " ADD COLUMN " + CLARITY_SCORE_ALL + " DOUBLE NOT NULL DEFAULT 0 ",
3201 "ALTER TABLE " + VISION_AESTHETICS_TABLE + " ADD COLUMN " +
3202 SATURATION_SCORE_ALL + " DOUBLE NOT NULL DEFAULT 0 ",
3203 "ALTER TABLE " + VISION_AESTHETICS_TABLE + " ADD COLUMN " + LUMINANCE_SCORE_ALL + " DOUBLE NOT NULL DEFAULT 0 ",
3204 "ALTER TABLE " + VISION_AESTHETICS_TABLE + " ADD COLUMN " + SEMANTICS_SCORE + " DOUBLE NOT NULL DEFAULT 0 ",
3205 "ALTER TABLE " + VISION_AESTHETICS_TABLE + " ADD COLUMN " +
3206 IS_BLACK_WHITE_STRIPE + " BOOLEAN NOT NULL DEFAULT 0 ",
3207 "ALTER TABLE " + VISION_AESTHETICS_TABLE + " ADD COLUMN " + IS_BLURRY + " BOOLEAN NOT NULL DEFAULT 0 ",
3208 "ALTER TABLE " + VISION_AESTHETICS_TABLE + " ADD COLUMN " + IS_MOSAIC + " BOOLEAN NOT NULL DEFAULT 0 ",
3209 "ALTER TABLE " + VISION_TOTAL_TABLE + " ADD COLUMN " + AESTHETICS_SCORE_ALL_STATUS + " INT NOT NULL DEFAULT 0 ",
3210 };
3211 MEDIA_INFO_LOG("start add aesthetics score fields");
3212 ExecSqls(sqls, store);
3213 }
3214
AddAlbumsOrderKeysColumn(RdbStore & store)3215 static void AddAlbumsOrderKeysColumn(RdbStore &store)
3216 {
3217 const vector<string> sqls = {
3218 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
3219 PhotoAlbumColumns::ALBUMS_ORDER + " INT NOT NULL DEFAULT -1",
3220 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
3221 PhotoAlbumColumns::ORDER_SECTION + " INT NOT NULL DEFAULT -1",
3222 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
3223 PhotoAlbumColumns::ORDER_TYPE + " INT NOT NULL DEFAULT -1",
3224 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
3225 PhotoAlbumColumns::ORDER_STATUS + " INT NOT NULL DEFAULT 0",
3226 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
3227 PhotoAlbumColumns::STYLE2_ALBUMS_ORDER + " INT NOT NULL DEFAULT -1",
3228 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
3229 PhotoAlbumColumns::STYLE2_ORDER_SECTION + " INT NOT NULL DEFAULT -1",
3230 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
3231 PhotoAlbumColumns::STYLE2_ORDER_TYPE + " INT NOT NULL DEFAULT -1",
3232 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
3233 PhotoAlbumColumns::STYLE2_ORDER_STATUS + " INT NOT NULL DEFAULT 0",
3234 };
3235 MEDIA_INFO_LOG("Add album order keys column start");
3236 ExecSqls(sqls, store);
3237 }
3238
AddStoryTables(RdbStore & store)3239 void AddStoryTables(RdbStore &store)
3240 {
3241 const vector<string> executeSqlStrs = {
3242 CREATE_HIGHLIGHT_ALBUM_TABLE,
3243 CREATE_HIGHLIGHT_COVER_INFO_TABLE,
3244 CREATE_HIGHLIGHT_PLAY_INFO_TABLE,
3245 CREATE_USER_PHOTOGRAPHY_INFO_TABLE,
3246 "ALTER TABLE " + VISION_LABEL_TABLE + " ADD COLUMN " + SALIENCY_SUB_PROB + " TEXT",
3247 };
3248 MEDIA_INFO_LOG("start init story db");
3249 ExecSqls(executeSqlStrs, store);
3250 }
3251
UpdateAnalysisTables(RdbStore & store)3252 void UpdateAnalysisTables(RdbStore &store)
3253 {
3254 const vector<string> executeSqlStrs = {
3255 "ALTER TABLE " + VISION_OCR_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3256 "ALTER TABLE " + VISION_LABEL_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3257 "ALTER TABLE " + VISION_VIDEO_LABEL_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3258 "ALTER TABLE " + VISION_AESTHETICS_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3259 "ALTER TABLE " + VISION_SALIENCY_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3260 "ALTER TABLE " + VISION_OBJECT_TABLE + " ADD COLUMN " + SCALE_X + " REAL DEFAULT 0 ",
3261 "ALTER TABLE " + VISION_OBJECT_TABLE + " ADD COLUMN " + SCALE_Y + " REAL DEFAULT 0 ",
3262 "ALTER TABLE " + VISION_OBJECT_TABLE + " ADD COLUMN " + SCALE_WIDTH + " REAL DEFAULT 0 ",
3263 "ALTER TABLE " + VISION_OBJECT_TABLE + " ADD COLUMN " + SCALE_HEIGHT + " REAL DEFAULT 0 ",
3264 "ALTER TABLE " + VISION_OBJECT_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3265 "ALTER TABLE " + VISION_RECOMMENDATION_TABLE + " ADD COLUMN " + SCALE_X + " REAL DEFAULT 0 ",
3266 "ALTER TABLE " + VISION_RECOMMENDATION_TABLE + " ADD COLUMN " + SCALE_Y + " REAL DEFAULT 0 ",
3267 "ALTER TABLE " + VISION_RECOMMENDATION_TABLE + " ADD COLUMN " + SCALE_WIDTH + " REAL DEFAULT 0 ",
3268 "ALTER TABLE " + VISION_RECOMMENDATION_TABLE + " ADD COLUMN " + SCALE_HEIGHT + " REAL DEFAULT 0 ",
3269 "ALTER TABLE " + VISION_RECOMMENDATION_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3270 "ALTER TABLE " + VISION_SEGMENTATION_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3271 "ALTER TABLE " + VISION_COMPOSITION_TABLE + " ADD COLUMN " + SCALE_X + " REAL DEFAULT 0 ",
3272 "ALTER TABLE " + VISION_COMPOSITION_TABLE + " ADD COLUMN " + SCALE_Y + " REAL DEFAULT 0 ",
3273 "ALTER TABLE " + VISION_COMPOSITION_TABLE + " ADD COLUMN " + SCALE_WIDTH + " REAL DEFAULT 0 ",
3274 "ALTER TABLE " + VISION_COMPOSITION_TABLE + " ADD COLUMN " + SCALE_HEIGHT + " REAL DEFAULT 0 ",
3275 "ALTER TABLE " + VISION_COMPOSITION_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3276 "ALTER TABLE " + VISION_HEAD_TABLE + " ADD COLUMN " + SCALE_X + " REAL DEFAULT 0 ",
3277 "ALTER TABLE " + VISION_HEAD_TABLE + " ADD COLUMN " + SCALE_Y + " REAL DEFAULT 0 ",
3278 "ALTER TABLE " + VISION_HEAD_TABLE + " ADD COLUMN " + SCALE_WIDTH + " REAL DEFAULT 0 ",
3279 "ALTER TABLE " + VISION_HEAD_TABLE + " ADD COLUMN " + SCALE_HEIGHT + " REAL DEFAULT 0 ",
3280 "ALTER TABLE " + VISION_HEAD_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3281 "ALTER TABLE " + VISION_POSE_TABLE + " ADD COLUMN " + SCALE_X + " REAL DEFAULT 0 ",
3282 "ALTER TABLE " + VISION_POSE_TABLE + " ADD COLUMN " + SCALE_Y + " REAL DEFAULT 0 ",
3283 "ALTER TABLE " + VISION_POSE_TABLE + " ADD COLUMN " + SCALE_WIDTH + " REAL DEFAULT 0 ",
3284 "ALTER TABLE " + VISION_POSE_TABLE + " ADD COLUMN " + SCALE_HEIGHT + " REAL DEFAULT 0 ",
3285 "ALTER TABLE " + VISION_POSE_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3286 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3287 "ALTER TABLE " + VISION_FACE_TAG_TABLE + " ADD COLUMN " + ANALYSIS_VERSION + " TEXT ",
3288 };
3289 MEDIA_INFO_LOG("update analysis tables of db");
3290 ExecSqls(executeSqlStrs, store);
3291 }
3292
UpdateHighlightTables(RdbStore & store)3293 void UpdateHighlightTables(RdbStore &store)
3294 {
3295 const vector<string> executeSqlStrs = {
3296 "DROP TABLE IF EXISTS tab_story_album",
3297 "DROP TABLE IF EXISTS tab_story_cover_info",
3298 "DROP TABLE IF EXISTS tab_story_play_info",
3299 CREATE_HIGHLIGHT_ALBUM_TABLE,
3300 CREATE_HIGHLIGHT_COVER_INFO_TABLE,
3301 CREATE_HIGHLIGHT_PLAY_INFO_TABLE,
3302 "ALTER TABLE " + GEO_KNOWLEDGE_TABLE + " ADD COLUMN " + LOCATION_TYPE + " TEXT",
3303 };
3304 MEDIA_INFO_LOG("update highlight db");
3305 ExecSqls(executeSqlStrs, store);
3306 }
3307
UpdateHighlightCoverTables(RdbStore & store)3308 void UpdateHighlightCoverTables(RdbStore &store)
3309 {
3310 const vector<string> executeSqlStrs = {
3311 "DROP TABLE IF EXISTS tab_highlight_cover_info",
3312 CREATE_HIGHLIGHT_COVER_INFO_TABLE,
3313 };
3314 MEDIA_INFO_LOG("update highlight cover db");
3315 ExecSqls(executeSqlStrs, store);
3316 }
3317
UpdateHighlightTablePrimaryKey(RdbStore & store)3318 void UpdateHighlightTablePrimaryKey(RdbStore &store)
3319 {
3320 const vector<string> executeSqlStrs = {
3321 "DROP TABLE IF EXISTS tab_highlight_album",
3322 "DROP TABLE IF EXISTS tab_highlight_cover_info",
3323 CREATE_HIGHLIGHT_ALBUM_TABLE,
3324 CREATE_HIGHLIGHT_COVER_INFO_TABLE,
3325 };
3326 MEDIA_INFO_LOG("update primary key of highlight db");
3327 ExecSqls(executeSqlStrs, store);
3328 }
3329
AddBussinessRecordAlbum(RdbStore & store)3330 void AddBussinessRecordAlbum(RdbStore &store)
3331 {
3332 string updateDirtyForShootingMode = "UPDATE Photos SET dirty = 2 WHERE position <> 1 AND " +
3333 PhotoColumn::PHOTO_SHOOTING_MODE + " is not null AND " +
3334 PhotoColumn::PHOTO_SHOOTING_MODE + " != ''";
3335 const vector<string> sqls = {
3336 MedialibraryBusinessRecordColumn::CREATE_TABLE,
3337 MedialibraryBusinessRecordColumn::CREATE_BUSINESS_KEY_INDEX,
3338 updateDirtyForShootingMode,
3339 };
3340
3341 MEDIA_INFO_LOG("start add bussiness record album");
3342 ExecSqls(sqls, store);
3343 UpdatePhotosMdirtyTrigger(store);
3344 }
3345
AddIsCoverSatisfiedColumn(RdbStore & store)3346 void AddIsCoverSatisfiedColumn(RdbStore &store)
3347 {
3348 const vector<string> sqls = {
3349 ADD_IS_COVER_SATISFIED_FOR_ALBUM,
3350 };
3351 ExecSqls(sqls, store);
3352 }
3353
AddOwnerAppId(RdbStore & store)3354 void AddOwnerAppId(RdbStore &store)
3355 {
3356 const vector<string> sqls = {
3357 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + MediaColumn::MEDIA_OWNER_APPID + " TEXT",
3358 "ALTER TABLE " + AudioColumn::AUDIOS_TABLE + " ADD COLUMN " + MediaColumn::MEDIA_OWNER_APPID + " TEXT"
3359 };
3360 MEDIA_INFO_LOG("start add owner_appid column");
3361 ExecSqls(sqls, store);
3362 }
3363
UpdateThumbnailReadyColumn(RdbStore & store)3364 void UpdateThumbnailReadyColumn(RdbStore &store)
3365 {
3366 const vector<string> sqls = {
3367 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " RENAME COLUMN " + PhotoColumn::PHOTO_HAS_ASTC
3368 + " TO " + PhotoColumn::PHOTO_THUMBNAIL_READY,
3369 };
3370 MEDIA_INFO_LOG("update has_astc to thumbnail_ready begin");
3371 ExecSqls(sqls, store);
3372 MEDIA_INFO_LOG("update has_astc to thumbnail_ready finished");
3373 }
3374
AddOwnerAppIdToFiles(RdbStore & store)3375 void AddOwnerAppIdToFiles(RdbStore &store)
3376 {
3377 const vector<string> sqls = {
3378 "ALTER TABLE " + MEDIALIBRARY_TABLE + " ADD COLUMN " + MediaColumn::MEDIA_OWNER_APPID + " TEXT"
3379 };
3380 MEDIA_INFO_LOG("start add owner_appid column to files table");
3381 ExecSqls(sqls, store);
3382 MEDIA_INFO_LOG("add owner_appid column to files table finished");
3383 }
3384
AddDynamicRangeType(RdbStore & store)3385 void AddDynamicRangeType(RdbStore &store)
3386 {
3387 const vector<string> sqls = {
3388 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3389 PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE + " INT DEFAULT 0"
3390 };
3391 MEDIA_INFO_LOG("start add dynamic_range_type column");
3392 ExecSqls(sqls, store);
3393 }
3394
AddLcdAndThumbSizeColumns(RdbStore & store)3395 void AddLcdAndThumbSizeColumns(RdbStore &store)
3396 {
3397 const vector<string> sqls = {
3398 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_LCD_SIZE + " TEXT",
3399 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_THUMB_SIZE + " TEXT",
3400 };
3401 ExecSqls(sqls, store);
3402 }
3403
UpdatePhotoAlbumTigger(RdbStore & store)3404 void UpdatePhotoAlbumTigger(RdbStore &store)
3405 {
3406 static const vector<string> executeSqlStrs = {
3407 "DROP TRIGGER IF EXISTS album_modify_trigger",
3408 PhotoAlbumColumns::CREATE_ALBUM_MDIRTY_TRIGGER,
3409 };
3410 MEDIA_INFO_LOG("Start update album modify trigger");
3411 ExecSqls(executeSqlStrs, store);
3412 }
3413
AddMovingPhotoEffectMode(RdbStore & store)3414 static void AddMovingPhotoEffectMode(RdbStore &store)
3415 {
3416 const vector<string> sqls = {
3417 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3418 PhotoColumn::MOVING_PHOTO_EFFECT_MODE + " INT DEFAULT 0"
3419 };
3420 MEDIA_INFO_LOG("start add moving_photo_effect_mode column");
3421 ExecSqls(sqls, store);
3422 }
3423
AddBurstCoverLevelAndBurstKey(RdbStore & store)3424 void AddBurstCoverLevelAndBurstKey(RdbStore &store)
3425 {
3426 const vector<string> sqls = {
3427 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_BURST_COVER_LEVEL +
3428 " INT DEFAULT 1",
3429 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_BURST_KEY + " TEXT",
3430 };
3431 MEDIA_INFO_LOG("start add burst_cover_level and burst_key column");
3432 ExecSqls(sqls, store);
3433 }
3434
AddCloudEnhancementColumns(RdbStore & store)3435 static void AddCloudEnhancementColumns(RdbStore &store)
3436 {
3437 const vector<string> sqls = {
3438 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3439 PhotoColumn::PHOTO_CE_AVAILABLE + " INT DEFAULT 0",
3440 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3441 PhotoColumn::PHOTO_CE_STATUS_CODE + " INT ",
3442 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3443 PhotoColumn::PHOTO_STRONG_ASSOCIATION + " INT DEFAULT 0",
3444 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3445 PhotoColumn::PHOTO_ASSOCIATE_FILE_ID + " INT DEFAULT 0",
3446 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3447 PhotoColumn::PHOTO_HAS_CLOUD_WATERMARK + " INT DEFAULT 0",
3448 };
3449 MEDIA_INFO_LOG("start add cloud enhancement columns");
3450 ExecSqls(sqls, store);
3451 }
3452
AddIsAutoColumns(RdbStore & store)3453 static void AddIsAutoColumns(RdbStore &store)
3454 {
3455 const vector<string> sqls = {
3456 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3457 PhotoColumn::PHOTO_IS_AUTO + " INT DEFAULT 0 NOT NULL",
3458 };
3459 MEDIA_INFO_LOG("start add is_auto column for auto cloud enhancement");
3460 ExecSqls(sqls, store);
3461 }
3462
AddThumbnailReady(RdbStore & store)3463 static void AddThumbnailReady(RdbStore &store)
3464 {
3465 const vector<string> sqls = {
3466 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3467 PhotoColumn::PHOTO_THUMBNAIL_READY + " INT DEFAULT 0",
3468 };
3469 MEDIA_INFO_LOG("start add thumbnail ready columns");
3470 ExecSqls(sqls, store);
3471 }
3472
AddCheckFlag(RdbStore & store)3473 static void AddCheckFlag(RdbStore &store)
3474 {
3475 const vector<string> sqls = {
3476 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3477 PhotoColumn::PHOTO_CHECK_FLAG + " INT DEFAULT 0",
3478 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
3479 PhotoAlbumColumns::ALBUM_CHECK_FLAG + " INT DEFAULT 0",
3480 };
3481 MEDIA_INFO_LOG("start add check_flag columns");
3482 ExecSqls(sqls, store);
3483 MEDIA_INFO_LOG("end add check_flag columns");
3484 }
3485
IsColumnExists(RdbStore & store,const std::string & tableName,const std::string & columnName)3486 static bool IsColumnExists(RdbStore &store, const std::string& tableName,
3487 const std::string& columnName)
3488 {
3489 std::string checkSql = "PRAGMA table_info(" + tableName + ")";
3490 std::vector<NativeRdb::ValueObject> args;
3491 auto resultSet = store.QuerySql(checkSql, args);
3492 CHECK_AND_RETURN_RET(resultSet != nullptr, false);
3493
3494 while (resultSet->GoToNextRow() == NativeRdb::E_OK) {
3495 std::string name;
3496 resultSet->GetString(1, name);
3497 CHECK_AND_RETURN_RET(name != columnName, true);
3498 }
3499
3500 return false;
3501 }
3502
CheckIfPhotoColumnExists(RdbStore & store,unordered_map<string,bool> & photoColumnExists)3503 static void CheckIfPhotoColumnExists(RdbStore &store, unordered_map<string, bool> &photoColumnExists)
3504 {
3505 std::string checkSql = "PRAGMA table_info(" + PhotoColumn::PHOTOS_TABLE + ")";
3506 std::vector<NativeRdb::ValueObject> args;
3507 auto resultSet = store.QuerySql(checkSql, args);
3508 CHECK_AND_RETURN_LOG(resultSet != nullptr, "Failed to query %{private}s", checkSql.c_str());
3509
3510 while (resultSet->GoToNextRow() == NativeRdb::E_OK) {
3511 std::string name;
3512 resultSet->GetString(1, name);
3513 if (photoColumnExists.find(name) != photoColumnExists.end()) {
3514 photoColumnExists[name] = true;
3515 }
3516 }
3517 }
3518
AddCloudEnhanceColumnsFix(RdbStore & store)3519 static void AddCloudEnhanceColumnsFix(RdbStore& store)
3520 {
3521 MEDIA_INFO_LOG("Start checking cloud enhancement column");
3522 bool hasColumn = IsColumnExists(store, PhotoColumn::PHOTOS_TABLE, PhotoColumn::PHOTO_CE_AVAILABLE);
3523 MEDIA_INFO_LOG("End checking cloud enhancement column: %{public}d", hasColumn);
3524 if (!hasColumn) {
3525 AddCloudEnhancementColumns(store);
3526 MEDIA_INFO_LOG("Add Cloud Enhance Cols completed successfully");
3527 }
3528 }
3529
AddDynamicRangeColumnsFix(RdbStore & store)3530 static void AddDynamicRangeColumnsFix(RdbStore& store)
3531 {
3532 MEDIA_INFO_LOG("Start checking dynamic_range_type column");
3533 bool hasColumn = IsColumnExists(store, PhotoColumn::PHOTOS_TABLE, PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE);
3534 MEDIA_INFO_LOG("End checking dynamic_range_type column: %{public}d", hasColumn);
3535 if (!hasColumn) {
3536 AddDynamicRangeType(store);
3537 MEDIA_INFO_LOG("Add Dynamic Range Cols completed successfully");
3538 }
3539 }
3540
AddThumbnailReadyColumnsFix(RdbStore & store)3541 static void AddThumbnailReadyColumnsFix(RdbStore& store)
3542 {
3543 MEDIA_INFO_LOG("Start checking thumbnail_ready column");
3544 bool hasColumn = IsColumnExists(store, PhotoColumn::PHOTOS_TABLE, PhotoColumn::PHOTO_THUMBNAIL_READY);
3545 MEDIA_INFO_LOG("End checking thumbnail_ready column: %{public}d", hasColumn);
3546 if (!hasColumn) {
3547 AddThumbnailReady(store);
3548 MEDIA_INFO_LOG("Add ThumbnailReady Column");
3549 }
3550 }
3551
UpdateSourcePhotoAlbumTrigger(RdbStore & store)3552 static void UpdateSourcePhotoAlbumTrigger(RdbStore &store)
3553 {
3554 MEDIA_INFO_LOG("start update source photo album trigger");
3555 const vector<string> sqls = {
3556 DROP_INSERT_SOURCE_PHOTO_CREATE_SOURCE_ALBUM_TRIGGER,
3557 CREATE_INSERT_SOURCE_PHOTO_CREATE_SOURCE_ALBUM_TRIGGER,
3558 };
3559 ExecSqls(sqls, store);
3560 MEDIA_INFO_LOG("end update source photo album trigger");
3561 }
3562
UpdateSearchStatusTriggerForOwnerAlbumId(RdbStore & store)3563 static void UpdateSearchStatusTriggerForOwnerAlbumId(RdbStore &store)
3564 {
3565 MEDIA_INFO_LOG("start update search status trigger for owner album id");
3566 const vector<string> sqls = {
3567 "DROP TRIGGER IF EXISTS " + UPDATE_SEARCH_STATUS_TRIGGER,
3568 CREATE_SEARCH_UPDATE_STATUS_TRIGGER,
3569 };
3570 ExecSqls(sqls, store);
3571 MEDIA_INFO_LOG("end update search status trigger for owner album id");
3572 }
3573
UpdateSearchStatusTriggerForIsFavorite(RdbStore & store)3574 static void UpdateSearchStatusTriggerForIsFavorite(RdbStore &store)
3575 {
3576 MEDIA_INFO_LOG("start update search status trigger for is favorite");
3577 const vector<string> sqls = {
3578 "DROP TRIGGER IF EXISTS " + UPDATE_SEARCH_STATUS_TRIGGER,
3579 CREATE_SEARCH_UPDATE_STATUS_TRIGGER,
3580 };
3581 ExecSqls(sqls, store);
3582 MEDIA_INFO_LOG("end update search status trigger for is favorite");
3583 }
3584
AddHighlightAnalysisProgress(RdbStore & store)3585 static void AddHighlightAnalysisProgress(RdbStore &store)
3586 {
3587 const vector<string> sqls = {
3588 "ALTER TABLE " + USER_PHOTOGRAPHY_INFO_TABLE + " ADD COLUMN " + HIGHLIGHT_ANALYSIS_PROGRESS + " TEXT"
3589 };
3590 MEDIA_INFO_LOG("start add highlight_analysis_progress column");
3591 ExecSqls(sqls, store);
3592 }
3593
AddRefreshAlbumStatusColumn(RdbStore & store)3594 static void AddRefreshAlbumStatusColumn(RdbStore &store)
3595 {
3596 MEDIA_INFO_LOG("start add status column for refresh album table");
3597 const vector<string> sqls = {
3598 "ALTER TABLE " + ALBUM_REFRESH_TABLE + " ADD COLUMN " +
3599 ALBUM_REFRESH_STATUS + " INT DEFAULT 0 NOT NULL"
3600 };
3601 ExecSqls(sqls, store);
3602 MEDIA_INFO_LOG("end add status column for refresh album table");
3603 }
3604
UpdateCloudTrigger(RdbStore & store)3605 static void UpdateCloudTrigger(RdbStore &store)
3606 {
3607 MEDIA_INFO_LOG("start update cloud trigger");
3608 const vector<string> sqls = {
3609 "DROP TRIGGER IF EXISTS photos_delete_trigger",
3610 PhotoColumn::CREATE_PHOTOS_DELETE_TRIGGER,
3611 "DROP TRIGGER IF EXISTS photos_fdirty_trigger",
3612 PhotoColumn::CREATE_PHOTOS_FDIRTY_TRIGGER,
3613 "DROP TRIGGER IF EXISTS photos_mdirty_trigger",
3614 PhotoColumn::CREATE_PHOTOS_MDIRTY_TRIGGER,
3615 "DROP TRIGGER IF EXISTS delete_trigger",
3616 CREATE_FILES_DELETE_TRIGGER,
3617 "DROP TRIGGER IF EXISTS fdirty_trigger",
3618 CREATE_FILES_FDIRTY_TRIGGER,
3619 "DROP TRIGGER IF EXISTS mdirty_trigger",
3620 CREATE_FILES_MDIRTY_TRIGGER,
3621 };
3622 ExecSqls(sqls, store);
3623 }
3624
AddSupportedWatermarkType(RdbStore & store)3625 static void AddSupportedWatermarkType(RdbStore &store)
3626 {
3627 const vector<string> sqls = {
3628 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3629 PhotoColumn::SUPPORTED_WATERMARK_TYPE + " INT "
3630 };
3631 MEDIA_INFO_LOG("start add supported_watermark_type column");
3632 ExecSqls(sqls, store);
3633 }
3634
AddStageVideoTaskStatus(RdbStore & store)3635 static void AddStageVideoTaskStatus(RdbStore &store)
3636 {
3637 MEDIA_INFO_LOG("start add stage_video_task_status column");
3638 const vector<string> sqls = {
3639 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3640 PhotoColumn::STAGE_VIDEO_TASK_STATUS + " INT NOT NULL DEFAULT 0 "
3641 };
3642 ExecSqls(sqls, store);
3643 MEDIA_INFO_LOG("end add stage_video_task_status column");
3644 }
3645
AddHighlightUseSubtitle(RdbStore & store)3646 static void AddHighlightUseSubtitle(RdbStore &store)
3647 {
3648 MEDIA_INFO_LOG("start add use_subtitle column");
3649 const vector<string> sqls = {
3650 "ALTER TABLE " + HIGHLIGHT_ALBUM_TABLE + " ADD COLUMN " +
3651 HIGHLIGHT_USE_SUBTITLE + " INT DEFAULT 0"
3652 };
3653 ExecSqls(sqls, store);
3654 MEDIA_INFO_LOG("start add use_subtitle column");
3655 }
3656
UpdateVisionTriggerForVideoLabel(RdbStore & store)3657 static void UpdateVisionTriggerForVideoLabel(RdbStore &store)
3658 {
3659 static const vector<string> executeSqlStrs = {
3660 DROP_UPDATE_VISION_TRIGGER,
3661 CREATE_VISION_UPDATE_TRIGGER_FOR_ADD_VIDEO_LABEL,
3662 };
3663 MEDIA_INFO_LOG("start update vision trigger for video label");
3664 ExecSqls(executeSqlStrs, store);
3665 }
3666
UpdateIndexForAlbumQuery(RdbStore & store)3667 static void UpdateIndexForAlbumQuery(RdbStore &store)
3668 {
3669 const vector<string> sqls = {
3670 PhotoColumn::DROP_INDEX_SCTHP_ADDTIME,
3671 PhotoColumn::INDEX_SCTHP_ADDTIME,
3672 PhotoColumn::DROP_SCHPT_MEDIA_TYPE_INDEX,
3673 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_INDEX,
3674 };
3675 MEDIA_INFO_LOG("start updating photo index");
3676 ExecSqls(sqls, store);
3677 }
3678
UpdateVideoLabelTableForSubLabelType(RdbStore & store)3679 static void UpdateVideoLabelTableForSubLabelType(RdbStore &store)
3680 {
3681 const vector<string> sqls = {
3682 "DROP TABLE IF EXISTS " + VISION_VIDEO_LABEL_TABLE,
3683 CREATE_TAB_ANALYSIS_VIDEO_LABEL,
3684 UPDATE_VIDEO_LABEL_TOTAL_VALUE,
3685 UPDATE_SEARCH_INDEX_FOR_VIDEO,
3686 };
3687 MEDIA_INFO_LOG("start update video label table for sub_label_type");
3688 ExecSqls(sqls, store);
3689 }
3690
UpdateDataAddedIndexWithFileId(RdbStore & store)3691 static void UpdateDataAddedIndexWithFileId(RdbStore &store)
3692 {
3693 const vector<string> sqls = {
3694 PhotoColumn::DROP_INDEX_SCTHP_ADDTIME,
3695 PhotoColumn::INDEX_SCTHP_ADDTIME,
3696 };
3697 MEDIA_INFO_LOG("start update index of date added with file desc");
3698 ExecSqls(sqls, store);
3699 }
3700
UpdateMultiCropInfo(RdbStore & store)3701 static void UpdateMultiCropInfo(RdbStore &store)
3702 {
3703 static const vector<string> executeSqlStrs = {
3704 "ALTER TABLE " + VISION_RECOMMENDATION_TABLE + " ADD COLUMN " + MOVEMENT_CROP + " TEXT",
3705 "ALTER TABLE " + VISION_RECOMMENDATION_TABLE + " ADD COLUMN " + MOVEMENT_VERSION + " TEXT",
3706 };
3707 MEDIA_INFO_LOG("start update multi crop triggers");
3708 ExecSqls(executeSqlStrs, store);
3709 }
3710
UpdateSearchIndexTrigger(RdbStore & store)3711 static void UpdateSearchIndexTrigger(RdbStore &store)
3712 {
3713 const vector<string> sqls = {
3714 "DROP TRIGGER IF EXISTS update_search_status_trigger",
3715 CREATE_SEARCH_UPDATE_STATUS_TRIGGER,
3716 "DROP TRIGGER IF EXISTS album_map_insert_search_trigger",
3717 "DROP TRIGGER IF EXISTS album_map_delete_search_trigger",
3718 };
3719 MEDIA_INFO_LOG("start update search index");
3720 ExecSqls(sqls, store);
3721 }
3722
AddOriginalSubtype(RdbStore & store)3723 static void AddOriginalSubtype(RdbStore &store)
3724 {
3725 const vector<string> sqls = {
3726 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3727 PhotoColumn::PHOTO_ORIGINAL_SUBTYPE + " INT"
3728 };
3729 MEDIA_INFO_LOG("start add original_subtype column");
3730 ExecSqls(sqls, store);
3731 }
3732
ReportFailInfoAsync(AsyncTaskData * data)3733 static void ReportFailInfoAsync(AsyncTaskData *data)
3734 {
3735 MEDIA_INFO_LOG("Start ReportFailInfoAsync");
3736 const int32_t sleepTimeMs = 1000;
3737 this_thread::sleep_for(chrono::milliseconds(sleepTimeMs));
3738 auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
3739 CHECK_AND_RETURN_LOG(rdbStore != nullptr,
3740 "MediaDataAbility insert functionality rebStore is null.");
3741
3742 string querySql = "SELECT data FROM Photos GROUP BY data HAVING COUNT(*) > 1";
3743 auto result = rdbStore->QuerySql(querySql);
3744 int32_t count = 0;
3745 CHECK_AND_RETURN_LOG(result != nullptr, "result is null");
3746 CHECK_AND_PRINT_LOG(result->GetRowCount(count) == NativeRdb::E_OK, "GetRowCount fail");
3747 result->Close();
3748 int64_t startTime = MediaFileUtils::UTCTimeMilliSeconds();
3749 DfxReporter::ReportStartResult(DfxType::ADD_DATA_UNIQUE_INDEX_FAIL, count, startTime);
3750 bool ret = system::SetParameter("persist.multimedia.medialibrary.data_unique", "1");
3751 CHECK_AND_PRINT_LOG(ret, "Failed to set parameter, ret:%{public}d", ret);
3752 MEDIA_INFO_LOG("HasDirtyData count:%{public}d", count);
3753 }
3754
ReportFailInfo()3755 static void ReportFailInfo()
3756 {
3757 MEDIA_INFO_LOG("Start ReportFailInfo");
3758 auto asyncWorker = MediaLibraryAsyncWorker::GetInstance();
3759 CHECK_AND_RETURN_LOG(asyncWorker != nullptr, "Failed to get async worker instance!");
3760 shared_ptr<MediaLibraryAsyncTask> reportTask =
3761 make_shared<MediaLibraryAsyncTask>(ReportFailInfoAsync, nullptr);
3762 CHECK_AND_RETURN_LOG(reportTask != nullptr, "Failed to create async task for reportTask!");
3763 asyncWorker->AddTask(reportTask, false);
3764 }
3765
UpdateDataUniqueIndex(RdbStore & store)3766 static void UpdateDataUniqueIndex(RdbStore &store)
3767 {
3768 MEDIA_INFO_LOG("Start UpdateDataUniqueIndex");
3769 string sql = PhotoColumn::UPDATA_PHOTOS_DATA_UNIQUE;
3770 auto err = ExecSqlWithRetry([&]() { return store.ExecuteSql(sql); });
3771 if (err != NativeRdb::E_OK) {
3772 MEDIA_ERR_LOG("Failed to exec: %{public}s", sql.c_str());
3773 ReportFailInfo();
3774 }
3775 MEDIA_INFO_LOG("End UpdateDataUniqueIndex");
3776 }
3777
FixPhotoSchptMediaTypeIndex(RdbStore & store)3778 static void FixPhotoSchptMediaTypeIndex(RdbStore &store)
3779 {
3780 static const vector<string> executeSqlStrs = {
3781 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_INDEX,
3782 };
3783 MEDIA_INFO_LOG("Fix idx_schpt_media_type index");
3784 ExecSqls(executeSqlStrs, store);
3785 MEDIA_INFO_LOG("End fix idx_schpt_media_type index.");
3786 }
3787
AddAnalysisAlbumTotalTable(RdbStore & store)3788 static void AddAnalysisAlbumTotalTable(RdbStore &store)
3789 {
3790 static const vector<string> executeSqlStrs = {
3791 CREATE_TAB_ANALYSIS_ALBUM_TOTAL,
3792 INIT_TAB_ANALYSIS_ALBUM_TOTAL,
3793 CREATE_TOTAL_INSERT_TRIGGER_FOR_ADD_ANALYSIS_ALBUM_TOTAL,
3794 CREATE_VISION_UPDATE_TRIGGER_FOR_UPDATE_ANALYSIS_ALBUM_TOTAL_STATUS,
3795 };
3796 MEDIA_INFO_LOG("Start add analysis album total table");
3797 ExecSqls(executeSqlStrs, store);
3798 }
3799
CompatLivePhoto(RdbStore & store,int32_t oldVersion)3800 static void CompatLivePhoto(RdbStore &store, int32_t oldVersion)
3801 {
3802 MEDIA_INFO_LOG("Start configuring param for live photo compatibility");
3803 bool ret = false;
3804 // there is no need to ResetCursor() twice if album fusion is included
3805 if (oldVersion >= VERSION_ADD_OWNER_ALBUM_ID) {
3806 ret = system::SetParameter(REFRESH_CLOUD_LIVE_PHOTO_FLAG, CLOUD_LIVE_PHOTO_NOT_REFRESHED);
3807 MEDIA_INFO_LOG("Set parameter for refreshing cloud live photo, ret: %{public}d", ret);
3808 }
3809
3810 ret = system::SetParameter(COMPAT_LIVE_PHOTO_FILE_ID, "1"); // start compating from file_id: 1
3811 MEDIA_INFO_LOG("Set parameter for compating local live photo, ret: %{public}d", ret);
3812 }
3813
ResetCloudCursorAfterInitFinish()3814 static void ResetCloudCursorAfterInitFinish()
3815 {
3816 MEDIA_INFO_LOG("Try reset cloud cursor after storage reconstruct");
3817 static uint32_t baseUserRange = 200000; // uid base offset
3818 uid_t uid = getuid() / baseUserRange;
3819 const string paramKey = "multimedia.medialibrary.startup." + to_string(uid);
3820 int32_t maxTryTimes = 10;
3821 if (WaitParameter(paramKey.c_str(), "true", maxTryTimes) == E_OK) {
3822 MEDIA_INFO_LOG("medialibrary init finish start reset cloud cursor");
3823 FileManagement::CloudSync::CloudSyncManager::GetInstance().ResetCursor();
3824 MEDIA_INFO_LOG("End reset cloud cursor");
3825 } else {
3826 MEDIA_INFO_LOG("try max time start reset cloud cursor");
3827 FileManagement::CloudSync::CloudSyncManager::GetInstance().ResetCursor();
3828 MEDIA_INFO_LOG("End reset cloud cursor");
3829 }
3830 MEDIA_INFO_LOG("Reset cloud cursor after storage reconstruct end");
3831 }
3832
MatchedDataFusion(CompensateAlbumIdData * compensateData)3833 static int32_t MatchedDataFusion(CompensateAlbumIdData* compensateData)
3834 {
3835 int32_t matchedDataHandleResult = MediaLibraryAlbumFusionUtils::HandleMatchedDataFusion(
3836 compensateData->upgradeStore_);
3837 if (matchedDataHandleResult != E_OK) {
3838 MEDIA_ERR_LOG("Fatal err, handle matched relationship fail by %{public}d", matchedDataHandleResult);
3839 // This should not happen, try again
3840 matchedDataHandleResult = MediaLibraryAlbumFusionUtils::HandleMatchedDataFusion(
3841 compensateData->upgradeStore_);
3842 CHECK_AND_PRINT_LOG(matchedDataHandleResult == E_OK,
3843 "Fatal err, handle matched relationship again by %{public}d", matchedDataHandleResult);
3844 }
3845 return matchedDataHandleResult;
3846 }
3847
ReconstructMediaLibraryStorageFormatExecutor(AsyncTaskData * data)3848 static void ReconstructMediaLibraryStorageFormatExecutor(AsyncTaskData *data)
3849 {
3850 CHECK_AND_RETURN_LOG(data != nullptr, "task data is nullptr");
3851 MediaLibraryAlbumFusionUtils::SetParameterToStopSync();
3852 MediaLibraryAlbumFusionUtils::SetAlbumFuseUpgradeStatus(0); // 0: set upgrade status fail
3853 CompensateAlbumIdData* compensateData = static_cast<CompensateAlbumIdData*>(data);
3854 MEDIA_INFO_LOG("ALBUM_FUSE: Processing old data start");
3855 MEDIA_INFO_LOG("ALBUM_FUSE: Compensating album id for old asset start");
3856 int64_t beginTime = MediaFileUtils::UTCTimeMilliSeconds();
3857 CHECK_AND_PRINT_LOG(MediaLibraryAlbumFusionUtils::RemoveMisAddedHiddenData(compensateData->upgradeStore_) == E_OK,
3858 "Failed to remove misadded hidden data");
3859 int64_t cleanDataBeginTime = MediaFileUtils::UTCTimeMilliSeconds();
3860 MediaLibraryAlbumFusionUtils::ReportAlbumFusionData(cleanDataBeginTime, AlbumFusionState::START,
3861 compensateData->upgradeStore_);
3862 if (MatchedDataFusion(compensateData) != E_OK) {
3863 MediaLibraryAlbumFusionUtils::ReportAlbumFusionData(cleanDataBeginTime, AlbumFusionState::FAILED,
3864 compensateData->upgradeStore_);
3865 return;
3866 }
3867 int32_t notMatchedDataHandleResult = MediaLibraryAlbumFusionUtils::HandleNotMatchedDataFusion(
3868 compensateData->upgradeStore_);
3869 if (notMatchedDataHandleResult != E_OK) {
3870 MEDIA_ERR_LOG("Fatal err, handle not matched relationship fail by %{public}d", notMatchedDataHandleResult);
3871 // This should not happen, and if it does, avoid cleaning up more data.
3872 MediaLibraryAlbumFusionUtils::ReportAlbumFusionData(cleanDataBeginTime, AlbumFusionState::FAILED,
3873 compensateData->upgradeStore_);
3874 return;
3875 }
3876 MEDIA_INFO_LOG("ALBUM_FUSE: End compensate album id for old asset cost %{public}ld",
3877 (long)(MediaFileUtils::UTCTimeMilliSeconds() - cleanDataBeginTime));
3878 MEDIA_INFO_LOG("ALBUM_FUSE: Start rebuild album and update relationship");
3879 int64_t albumCleanBeginTime = MediaFileUtils::UTCTimeMilliSeconds();
3880 int32_t rebuildResult = MediaLibraryAlbumFusionUtils::RebuildAlbumAndFillCloudValue(compensateData->upgradeStore_);
3881 MEDIA_INFO_LOG("ALBUM_FUSE: End rebuild album and update relationship cost %{public}ld",
3882 (long)(MediaFileUtils::UTCTimeMilliSeconds() - albumCleanBeginTime));
3883 // Restore cloud sync
3884 MediaLibraryAlbumFusionUtils::SetParameterToStartSync();
3885 MediaLibraryAlbumFusionUtils::SetAlbumFuseUpgradeStatus(1); // 1: set upgrade status success
3886 ResetCloudCursorAfterInitFinish();
3887 MediaLibraryAlbumFusionUtils::RefreshAllAlbums();
3888 MediaLibraryAlbumFusionUtils::ReportAlbumFusionData(cleanDataBeginTime, AlbumFusionState::SUCCESS,
3889 compensateData->upgradeStore_);
3890 MEDIA_INFO_LOG("ALBUM_FUSE: Processing old data end, cost %{public}ld",
3891 (long)(MediaFileUtils::UTCTimeMilliSeconds() - beginTime));
3892 }
3893
ReconstructMediaLibraryStorageFormatWithLock(AsyncTaskData * data)3894 static void ReconstructMediaLibraryStorageFormatWithLock(AsyncTaskData *data)
3895 {
3896 CHECK_AND_RETURN_LOG(data != nullptr, "task data is nullptr");
3897 CompensateAlbumIdData *compensateData = static_cast<CompensateAlbumIdData *>(data);
3898 CHECK_AND_RETURN_LOG(compensateData != nullptr, "compensateData is nullptr");
3899 std::unique_lock<std::mutex> reconstructLock(compensateData->lock_, std::defer_lock);
3900 if (reconstructLock.try_lock()) {
3901 ReconstructMediaLibraryStorageFormatExecutor(data);
3902 } else {
3903 MEDIA_WARN_LOG("Failed to acquire lock, skipping task Reconstruct.");
3904 }
3905 }
3906
AddOwnerAlbumIdAndRefractorTrigger(RdbStore & store)3907 static void AddOwnerAlbumIdAndRefractorTrigger(RdbStore &store)
3908 {
3909 const vector<string> sqls = {
3910 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3911 PhotoColumn::PHOTO_OWNER_ALBUM_ID + " INT DEFAULT 0",
3912 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3913 PhotoColumn::PHOTO_ORIGINAL_ASSET_CLOUD_ID + " TEXT",
3914 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " +
3915 PhotoColumn::PHOTO_SOURCE_PATH + " TEXT",
3916 "DROP TABLE IF EXISTS album_plugin ",
3917 DROP_PHOTO_ALBUM_CLEAR_MAP_SQL,
3918 DROP_INSERT_PHOTO_INSERT_SOURCE_ALBUM_SQL,
3919 DROP_INSERT_PHOTO_UPDATE_SOURCE_ALBUM_SQL,
3920 DROP_INSERT_SOURCE_PHOTO_CREATE_SOURCE_ALBUM_TRIGGER,
3921 DROP_INSERT_SOURCE_PHOTO_UPDATE_ALBUM_ID_TRIGGER,
3922 "DROP TRIGGER IF EXISTS photos_mdirty_trigger",
3923 PhotoColumn::CREATE_PHOTOS_MDIRTY_TRIGGER,
3924 CREATE_INSERT_SOURCE_PHOTO_CREATE_SOURCE_ALBUM_TRIGGER,
3925 CREATE_INSERT_SOURCE_UPDATE_ALBUM_ID_TRIGGER,
3926
3927 };
3928 MEDIA_INFO_LOG("Add owner_album_id column for Photos");
3929 ExecSqls(sqls, store);
3930 }
3931
AddMergeInfoColumnForAlbum(RdbStore & store)3932 static void AddMergeInfoColumnForAlbum(RdbStore &store)
3933 {
3934 const vector<string> addMergeInfoSql = {
3935 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
3936 PhotoAlbumColumns::ALBUM_DATE_ADDED + " BIGINT DEFAULT 0",
3937 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
3938 PhotoAlbumColumns::ALBUM_PRIORITY + " INT",
3939 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
3940 PhotoAlbumColumns::ALBUM_LPATH + " TEXT",
3941 DROP_INDEX_SOURCE_ALBUM_INDEX,
3942 CREATE_SOURCE_ALBUM_INDEX,
3943 CREATE_DEFALUT_ALBUM_FOR_NO_RELATIONSHIP_ASSET,
3944 };
3945 MEDIA_INFO_LOG("Add merge info for PhotoAlbum");
3946 ExecSqls(addMergeInfoSql, store);
3947 const std::string queryHiddenAlbumId =
3948 "SELECT album_id FROM PhotoAlbum WHERE album_name = '.hiddenAlbum'";
3949 auto resultSet = store.QuerySql(queryHiddenAlbumId);
3950 if (resultSet == nullptr || resultSet->GoToFirstRow() != NativeRdb::E_OK) {
3951 int32_t err = ExecSqlWithRetry([&]() { return store.ExecuteSql(CREATE_HIDDEN_ALBUM_FOR_DUAL_ASSET); });
3952 CHECK_AND_PRINT_LOG(err == NativeRdb::E_OK,
3953 "Failed to exec: %{private}s", CREATE_HIDDEN_ALBUM_FOR_DUAL_ASSET.c_str());
3954 }
3955 }
3956
ReconstructMediaLibraryStorageFormat(const std::shared_ptr<MediaLibraryRdbStore> store)3957 int32_t MediaLibraryRdbStore::ReconstructMediaLibraryStorageFormat(const std::shared_ptr<MediaLibraryRdbStore> store)
3958 {
3959 MEDIA_INFO_LOG("ALBUM_FUSE: Start reconstruct medialibrary storage format task!");
3960 auto asyncWorker = MediaLibraryAsyncWorker::GetInstance();
3961 CHECK_AND_RETURN_RET_LOG(asyncWorker != nullptr, E_FAIL, "Failed to get aysnc worker instance!");
3962
3963 auto *taskData = new (std::nothrow) CompensateAlbumIdData(store, MediaLibraryRdbStore::reconstructLock_);
3964 CHECK_AND_RETURN_RET_LOG(taskData != nullptr, E_NO_MEMORY, "Failed to alloc async data for compensate album id");
3965
3966 auto asyncTask = std::make_shared<MediaLibraryAsyncTask>(ReconstructMediaLibraryStorageFormatWithLock, taskData);
3967 asyncWorker->AddTask(asyncTask, false);
3968 return E_OK;
3969 }
3970
AddHighlightMapTable(RdbStore & store)3971 void AddHighlightMapTable(RdbStore &store)
3972 {
3973 const vector<string> executeSqlStrs = {
3974 CREATE_ANALYSIS_ASSET_SD_MAP_TABLE,
3975 CREATE_ANALYSIS_ALBUM_ASET_MAP_TABLE,
3976 "ALTER TABLE " + HIGHLIGHT_PLAY_INFO_TABLE + " ADD COLUMN " + HIGHLIGHTING_ALGO_VERSION + " TEXT",
3977 "ALTER TABLE " + HIGHLIGHT_PLAY_INFO_TABLE + " ADD COLUMN " + CAMERA_MOVEMENT_ALGO_VERSION + " TEXT",
3978 "ALTER TABLE " + HIGHLIGHT_PLAY_INFO_TABLE + " ADD COLUMN " + TRANSITION_ALGO_VERSION + " TEXT",
3979 };
3980 MEDIA_INFO_LOG("add analysis map table of highlight db");
3981 ExecSqls(executeSqlStrs, store);
3982 }
3983
UpgradeOtherTable(RdbStore & store,int32_t oldVersion)3984 static void UpgradeOtherTable(RdbStore &store, int32_t oldVersion)
3985 {
3986 if (oldVersion < VERSION_ADD_PACKAGE_NAME) {
3987 AddPackageNameColumnOnTables(store);
3988 }
3989
3990 if (oldVersion < VERSION_ADD_CLOUD_ALBUM) {
3991 UpdateCloudAlbum(store);
3992 }
3993
3994 if (oldVersion < VERSION_ADD_CAMERA_SHOT_KEY) {
3995 AddCameraShotKey(store);
3996 }
3997
3998 if (oldVersion < VERSION_REMOVE_ALBUM_COUNT_TRIGGER) {
3999 RemoveAlbumCountTrigger(store);
4000 }
4001
4002 if (oldVersion < VERSION_ADD_ALL_EXIF) {
4003 AddExifAndUserComment(store);
4004 }
4005
4006 if (oldVersion < VERSION_ADD_UPDATE_CLOUD_SYNC_TRIGGER) {
4007 AddUpdateCloudSyncTrigger(store);
4008 }
4009
4010 if (oldVersion < VERSION_ADD_YEAR_MONTH_DAY) {
4011 AddYearMonthDayColumn(store);
4012 }
4013
4014 if (oldVersion < VERSION_UPDATE_YEAR_MONTH_DAY) {
4015 UpdateYearMonthDayData(store);
4016 }
4017
4018 if (oldVersion < VERSION_ADD_PHOTO_EDIT_TIME) {
4019 AddPhotoEditTimeColumn(store);
4020 }
4021
4022 if (oldVersion < VERSION_ADD_SHOOTING_MODE) {
4023 AddShootingModeColumn(store);
4024 }
4025
4026 if (oldVersion < VERSION_FIX_INDEX_ORDER) {
4027 FixIndexOrder(store);
4028 }
4029
4030 if (oldVersion < VERSION_FIX_DOCS_PATH) {
4031 FixDocsPath(store);
4032 }
4033 if (oldVersion < VERSION_ADD_SHOOTING_MODE_TAG) {
4034 AddShootingModeTagColumn(store);
4035 }
4036
4037 if (oldVersion < VERSION_ADD_PORTRAIT_IN_ALBUM) {
4038 AddPortraitInAnalysisAlbum(store);
4039 }
4040
4041 if (oldVersion < VERSION_UPDATE_GEO_TABLE) {
4042 UpdateGeoTables(store);
4043 }
4044
4045 if (oldVersion < VERSION_ADD_MULTISTAGES_CAPTURE) {
4046 AddMultiStagesCaptureColumns(store);
4047 }
4048 // !! Do not add upgrade code here !!
4049 }
4050
UpgradeGalleryFeatureTable(RdbStore & store,int32_t oldVersion)4051 static void UpgradeGalleryFeatureTable(RdbStore &store, int32_t oldVersion)
4052 {
4053 if (oldVersion < VERSION_ADD_HIDDEN_VIEW_COLUMNS) {
4054 AddHiddenViewColumn(store);
4055 }
4056
4057 if (oldVersion < VERSION_ADD_LAST_VISIT_TIME) {
4058 ModifyMdirtyTriggers(store);
4059 AddLastVisitTimeColumn(store);
4060 }
4061
4062 if (oldVersion < VERSION_ADD_HIDDEN_TIME) {
4063 AddHiddenTimeColumn(store);
4064 }
4065
4066 if (oldVersion < VERSION_ADD_LOCATION_TABLE) {
4067 AddLocationTables(store);
4068 }
4069
4070 if (oldVersion < VERSION_ADD_ALBUM_ORDER) {
4071 AddAlbumOrderColumn(store);
4072 }
4073
4074 if (oldVersion < VERSION_ADD_FORM_MAP) {
4075 AddFormMap(store);
4076 }
4077
4078 if (oldVersion < VERSION_UPDATE_LOCATION_TABLE) {
4079 UpdateLocationTables(store);
4080 }
4081
4082 if (oldVersion < VERSION_ADD_IMAGE_VIDEO_COUNT) {
4083 AddImageVideoCount(store);
4084 }
4085
4086 if (oldVersion < VERSION_ADD_SCHPT_HIDDEN_TIME_INDEX) {
4087 AddSCHPTHiddenTimeIndex(store);
4088 }
4089
4090 if (oldVersion < VERSION_UPDATE_PHOTOS_MDIRTY_TRIGGER) {
4091 UpdatePhotosMdirtyTrigger(store);
4092 }
4093
4094 if (oldVersion < VERSION_ALBUM_REFRESH) {
4095 UpdateAlbumRefreshTable(store);
4096 }
4097
4098 if (oldVersion < VERSION_ADD_FAVORITE_INDEX) {
4099 UpdateFavoriteIndex(store);
4100 }
4101
4102 if (oldVersion < VERSION_ADD_OWNER_APPID) {
4103 AddOwnerAppId(store);
4104 }
4105
4106 if (oldVersion < VERSION_ADD_DYNAMIC_RANGE_TYPE) {
4107 AddDynamicRangeType(store);
4108 }
4109 // !! Do not add upgrade code here !!
4110 }
4111
UpgradeVisionTable(RdbStore & store,int32_t oldVersion)4112 static void UpgradeVisionTable(RdbStore &store, int32_t oldVersion)
4113 {
4114 if (oldVersion < VERSION_ADD_VISION_TABLE) {
4115 AddAnalysisTables(store);
4116 }
4117
4118 if (oldVersion < VERSION_ADD_FACE_TABLE) {
4119 AddFaceTables(store);
4120 }
4121
4122 if (oldVersion < VERSION_ADD_SOURCE_ALBUM_TRIGGER) {
4123 AddSourceAlbumTrigger(store);
4124 }
4125
4126 if (oldVersion < VERSION_ADD_VISION_ALBUM) {
4127 AddAnalysisAlbum(store);
4128 }
4129
4130 if (oldVersion < VERSION_ADD_AESTHETIC_COMPOSITION_TABLE) {
4131 AddAestheticCompositionTables(store);
4132 }
4133
4134 if (oldVersion < VERSION_ADD_SEARCH_TABLE) {
4135 AddSearchTable(store);
4136 }
4137
4138 if (oldVersion < VERSION_ADD_SALIENCY_TABLE) {
4139 AddSaliencyTables(store);
4140 }
4141
4142 if (oldVersion < VERSION_UPDATE_SOURCE_ALBUM_TRIGGER) {
4143 AddSourceAlbumTrigger(store);
4144 }
4145
4146 if (oldVersion < VERSION_CLEAR_LABEL_DATA) {
4147 UpdateClassifyDirtyData(store);
4148 }
4149
4150 if (oldVersion < VERSION_REOMOVE_SOURCE_ALBUM_TO_ANALYSIS) {
4151 RemoveSourceAlbumToAnalysis(store);
4152 }
4153
4154 if (oldVersion < VERSION_UPDATE_DATE_TO_MILLISECOND) {
4155 UpdateMillisecondDate(store);
4156 }
4157
4158 if (oldVersion < VERSION_ADD_HAS_ASTC) {
4159 AddHasAstcColumns(store);
4160 }
4161
4162 if (oldVersion < VERSION_ADD_ADDRESS_DESCRIPTION) {
4163 AddAddressDescriptionColumns(store);
4164 }
4165
4166 if (oldVersion < VERSION_UPDATE_SPEC_FOR_ADD_SCREENSHOT) {
4167 UpdateSpecForAddScreenshot(store);
4168 }
4169
4170 if (oldVersion < VERSION_MOVE_SOURCE_ALBUM_TO_PHOTO_ALBUM_AND_ADD_COLUMNS) {
4171 MoveSourceAlbumToPhotoAlbumAndAddColumns(store);
4172 }
4173
4174 if (oldVersion < VERSION_MODIFY_SOURCE_ALBUM_TRIGGERS) {
4175 ModifySourceAlbumTriggers(store);
4176 }
4177 // !! Do not add upgrade code here !!
4178 }
4179
UpgradeExtendedVisionTable(RdbStore & store,int32_t oldVersion)4180 static void UpgradeExtendedVisionTable(RdbStore &store, int32_t oldVersion)
4181 {
4182 if (oldVersion < VERSION_ADD_HEAD_AND_POSE_TABLE) {
4183 AddHeadAndPoseTables(store);
4184 }
4185
4186 if (oldVersion < VERSION_ADD_IS_COVER_SATISFIED_COLUMN) {
4187 AddIsCoverSatisfiedColumn(store);
4188 }
4189
4190 if (oldVersion < VERSION_ADD_VIDEO_LABEL_TABEL) {
4191 AddVideoLabelTable(store);
4192 }
4193
4194 if (oldVersion < VERSION_ADD_SEGMENTATION_COLUMNS) {
4195 AddSegmentationColumns(store);
4196 }
4197 // !! Do not add upgrade code here !!
4198 }
4199
UpgradeAlbumTable(RdbStore & store,int32_t oldVersion)4200 static void UpgradeAlbumTable(RdbStore &store, int32_t oldVersion)
4201 {
4202 if (oldVersion < VERSION_ADD_IS_LOCAL_ALBUM) {
4203 AddIsLocalAlbum(store);
4204 }
4205 // !! Do not add upgrade code here !!
4206 }
4207
UpgradeUriPermissionTable(RdbStore & store,int32_t oldVersion)4208 static void UpgradeUriPermissionTable(RdbStore &store, int32_t oldVersion)
4209 {
4210 if (oldVersion < VERSION_UPDATE_URIPERMISSION_SOURCE_TOKEN_AND_TARGET_TOKEN) {
4211 AddSourceAndTargetTokenForUriPermission(store);
4212 }
4213 }
4214
UpgradeHighlightAlbumChange(RdbStore & store,int32_t oldVersion)4215 static void UpgradeHighlightAlbumChange(RdbStore &store, int32_t oldVersion)
4216 {
4217 if (oldVersion < VERSION_HIGHLIGHT_CHANGE_FUNCTION) {
4218 AddHighlightChangeFunction(store);
4219 }
4220 }
4221
UpgradeHistory(RdbStore & store,int32_t oldVersion)4222 static void UpgradeHistory(RdbStore &store, int32_t oldVersion)
4223 {
4224 if (oldVersion < VERSION_ADD_MISSING_UPDATES) {
4225 AddMissingUpdates(store);
4226 }
4227
4228 if (oldVersion < VERSION_UPDATE_MDIRTY_TRIGGER_FOR_SDIRTY) {
4229 UpdateMdirtyTriggerForSdirty(store);
4230 }
4231
4232 if (oldVersion < VERSION_SHOOTING_MODE_CLOUD) {
4233 AddBussinessRecordAlbum(store);
4234 }
4235 // !! Do not add upgrade code here !!
4236 }
4237
UpdatePhotosSearchUpdateTrigger(RdbStore & store)4238 static void UpdatePhotosSearchUpdateTrigger(RdbStore& store)
4239 {
4240 static const vector<string> executeSqlStrs = {
4241 "DROP TRIGGER IF EXISTS update_search_status_trigger",
4242 CREATE_SEARCH_UPDATE_STATUS_TRIGGER,
4243 };
4244 MEDIA_INFO_LOG("Start update photos search trigger");
4245 ExecSqls(executeSqlStrs, store);
4246 }
4247
AddIsTemp(RdbStore & store)4248 static void AddIsTemp(RdbStore &store)
4249 {
4250 static const vector<string> executeSqlStrs = {
4251 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_IS_TEMP + " INT DEFAULT 0"
4252 };
4253 MEDIA_INFO_LOG("Start add is_temp on Photos in upgrade");
4254 ExecSqls(executeSqlStrs, store);
4255 }
4256
AddIsTempToTrigger(RdbStore & store)4257 static void AddIsTempToTrigger(RdbStore &store)
4258 {
4259 static const vector<string> executeSqlStrs = {
4260 "DROP INDEX IF EXISTS " + PhotoColumn::PHOTO_SCHPT_DAY_INDEX,
4261 "DROP INDEX IF EXISTS " + PhotoColumn::PHOTO_SCHPT_MEDIA_TYPE_INDEX,
4262 "DROP INDEX IF EXISTS " + PhotoColumn::PHOTO_SCHPT_HIDDEN_TIME_INDEX,
4263 "DROP INDEX IF EXISTS " + PhotoColumn::PHOTO_FAVORITE_INDEX,
4264 "DROP INDEX IF EXISTS " + PhotoColumn::PHOTO_SCHPT_ADDED_INDEX,
4265 PhotoColumn::CREATE_SCHPT_DAY_INDEX,
4266 PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_INDEX,
4267 PhotoColumn::CREATE_SCHPT_HIDDEN_TIME_INDEX,
4268 PhotoColumn::CREATE_PHOTO_FAVORITE_INDEX,
4269 PhotoColumn::INDEX_SCTHP_ADDTIME,
4270 };
4271 MEDIA_INFO_LOG("Add is_temp to trigger in upgrade");
4272 ExecSqls(executeSqlStrs, store);
4273 }
4274
AddFrontCameraType(RdbStore & store)4275 static void AddFrontCameraType(RdbStore &store)
4276 {
4277 const vector<string> sqls = {
4278 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_FRONT_CAMERA + " TEXT"
4279 };
4280 MEDIA_INFO_LOG("Start add front column");
4281 ExecSqls(sqls, store);
4282 }
4283
AddDisplayNameIndex(RdbStore & store)4284 static void AddDisplayNameIndex(RdbStore &store)
4285 {
4286 static const vector<string> executeSqlStrs = {
4287 PhotoColumn::CREATE_PHOTO_DISPLAYNAME_INDEX,
4288 };
4289 MEDIA_INFO_LOG("Add displayname index");
4290 ExecSqls(executeSqlStrs, store);
4291 }
4292
AddPortraitCoverSelectionColumn(RdbStore & store)4293 static void AddPortraitCoverSelectionColumn(RdbStore &store)
4294 {
4295 MEDIA_INFO_LOG("Start add portrait cover selection column");
4296
4297 const vector<string> sqls = {
4298 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + BEAUTY_BOUNDER_X + " REAL",
4299 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + BEAUTY_BOUNDER_Y + " REAL",
4300 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + BEAUTY_BOUNDER_WIDTH + " REAL",
4301 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + BEAUTY_BOUNDER_HEIGHT + " REAL",
4302 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + FACE_AESTHETICS_SCORE + " REAL",
4303 };
4304 ExecSqls(sqls, store);
4305 }
4306
UpdatePortraitCoverSelectionColumns(RdbStore & store)4307 static void UpdatePortraitCoverSelectionColumns(RdbStore &store)
4308 {
4309 MEDIA_INFO_LOG("Start update portrait cover selection columns");
4310
4311 const vector<string> sqls = {
4312 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + BEAUTY_BOUNDER_VERSION + " TEXT default '' ",
4313 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + IS_EXCLUDED + " INT default 0 ",
4314 };
4315 ExecSqls(sqls, store);
4316 }
4317
AddAppUriPermissionInfo(RdbStore & store)4318 static void AddAppUriPermissionInfo(RdbStore &store)
4319 {
4320 const std::string SYNC_DATA_FROM_PHOTOS_SQL =
4321 "insert into "+ AppUriPermissionColumn::APP_URI_PERMISSION_TABLE + "(" +
4322 AppUriPermissionColumn::APP_ID + ", " + AppUriPermissionColumn::FILE_ID + ", " +
4323 AppUriPermissionColumn::URI_TYPE + ", " + AppUriPermissionColumn::PERMISSION_TYPE + ", " +
4324 AppUriPermissionColumn::DATE_MODIFIED + ") " +
4325 "select " +
4326 MediaColumn::MEDIA_OWNER_APPID + ", " + MediaColumn::MEDIA_ID + ", " +
4327 std::to_string(AppUriPermissionColumn::URI_PHOTO) + ", " +
4328 std::to_string(AppUriPermissionColumn::PERMISSION_PERSIST_READ_WRITE) + ", " +
4329 MediaColumn::MEDIA_DATE_ADDED +
4330 " from " + PhotoColumn::PHOTOS_TABLE +
4331 " where " + MediaColumn::MEDIA_OWNER_APPID + " is not null";
4332
4333 const std::string SYNC_DATA_FROM_AUDIOS_SQL =
4334 "insert into "+ AppUriPermissionColumn::APP_URI_PERMISSION_TABLE + "(" +
4335 AppUriPermissionColumn::APP_ID + ", " + AppUriPermissionColumn::FILE_ID + ", " +
4336 AppUriPermissionColumn::URI_TYPE + ", " + AppUriPermissionColumn::PERMISSION_TYPE + ", " +
4337 AppUriPermissionColumn::DATE_MODIFIED + ") " +
4338 "select " +
4339 MediaColumn::MEDIA_OWNER_APPID + ", " + MediaColumn::MEDIA_ID + ", " +
4340 std::to_string(AppUriPermissionColumn::URI_AUDIO) + ", " +
4341 std::to_string(AppUriPermissionColumn::PERMISSION_PERSIST_READ_WRITE) + ", " +
4342 MediaColumn::MEDIA_DATE_ADDED +
4343 " from " + AudioColumn::AUDIOS_TABLE +
4344 " where " + MediaColumn::MEDIA_OWNER_APPID + " is not null";
4345 const vector<string> sqls = {
4346 AppUriPermissionColumn::CREATE_APP_URI_PERMISSION_TABLE,
4347 AppUriPermissionColumn::CREATE_URI_URITYPE_APPID_INDEX,
4348 SYNC_DATA_FROM_PHOTOS_SQL,
4349 SYNC_DATA_FROM_AUDIOS_SQL,
4350 TriggerDeletePhotoClearAppUriPermission(),
4351 TriggerDeleteAudioClearAppUriPermission(),
4352 };
4353 MEDIA_INFO_LOG("add uriPermission table info when upgrade phone");
4354 ExecSqls(sqls, store);
4355 }
4356
AddCoverPosition(RdbStore & store)4357 static void AddCoverPosition(RdbStore &store)
4358 {
4359 const vector<string> sqls = {
4360 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_COVER_POSITION +
4361 " BIGINT DEFAULT 0",
4362 };
4363 MEDIA_INFO_LOG("start add cover_position column");
4364 ExecSqls(sqls, store);
4365 }
4366
AddSchptReadyIndex(RdbStore & store)4367 static void AddSchptReadyIndex(RdbStore &store)
4368 {
4369 static const vector<string> executeSqlStrs = {
4370 PhotoColumn::INDEX_SCHPT_READY,
4371 };
4372 MEDIA_INFO_LOG("Add schpt ready index");
4373 ExecSqls(executeSqlStrs, store);
4374 }
4375
UpdateSourceAlbumAndAlbumBundlenameTriggers(RdbStore & store)4376 static void UpdateSourceAlbumAndAlbumBundlenameTriggers(RdbStore &store)
4377 {
4378 static const vector<string> executeSqlStrs = {
4379 DROP_INSERT_PHOTO_INSERT_SOURCE_ALBUM,
4380 DROP_INSERT_PHOTO_UPDATE_SOURCE_ALBUM,
4381 DROP_INSERT_PHOTO_UPDATE_ALBUM_BUNDLENAME,
4382 INSERT_PHOTO_INSERT_SOURCE_ALBUM,
4383 INSERT_PHOTO_UPDATE_SOURCE_ALBUM,
4384 INSERT_PHOTO_UPDATE_ALBUM_BUNDLENAME,
4385 };
4386 MEDIA_INFO_LOG("start update source album and album bundlename triggers");
4387 ExecSqls(executeSqlStrs, store);
4388 }
4389
AddBestFaceBoundingColumnForGroupAlbum(RdbStore & store)4390 static void AddBestFaceBoundingColumnForGroupAlbum(RdbStore &store)
4391 {
4392 MEDIA_INFO_LOG("Start add best face bounding column for group album");
4393
4394 const vector<string> sqls = {
4395 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + JOINT_BEAUTY_BOUNDER_X + " REAL",
4396 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + JOINT_BEAUTY_BOUNDER_Y + " REAL",
4397 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + JOINT_BEAUTY_BOUNDER_WIDTH + " REAL",
4398 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + JOINT_BEAUTY_BOUNDER_HEIGHT + " REAL",
4399 };
4400
4401 ExecSqls(sqls, store);
4402 }
4403
AddGroupVersion(RdbStore & store)4404 static void AddGroupVersion(RdbStore &store)
4405 {
4406 MEDIA_INFO_LOG("Start add group_version column");
4407 const vector<string> sqls = {
4408 "ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + GROUP_VERSION + " TEXT"
4409 };
4410
4411 ExecSqls(sqls, store);
4412 }
4413
AddDetailTimeToPhotos(RdbStore & store)4414 static void AddDetailTimeToPhotos(RdbStore &store)
4415 {
4416 const vector<string> sqls = {
4417 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_DETAIL_TIME + " TEXT"
4418 };
4419 MEDIA_INFO_LOG("Add detail_time column start");
4420 ExecSqls(sqls, store);
4421 }
4422
AddVideoFaceTable(RdbStore & store)4423 static void AddVideoFaceTable(RdbStore &store)
4424 {
4425 const vector<string> sqls = {
4426 CREATE_TAB_VIDEO_FACE,
4427 CREATE_VIDEO_FACE_INDEX,
4428 "ALTER TABLE " + VISION_TOTAL_TABLE + " ADD COLUMN " + GEO + " INT"
4429 };
4430 MEDIA_INFO_LOG("Add video face table start");
4431 ExecSqls(sqls, store);
4432 }
4433
AddGeoDefaultValue(RdbStore & store)4434 static void AddGeoDefaultValue(RdbStore &store)
4435 {
4436 const vector<string> sqls = {
4437 "ALTER TABLE " + VISION_TOTAL_TABLE + " DROP COLUMN " + GEO,
4438 "ALTER TABLE " + VISION_TOTAL_TABLE + " ADD COLUMN " + GEO + " INT DEFAULT 0",
4439 };
4440 MEDIA_INFO_LOG("Add geo deault value start");
4441 ExecSqls(sqls, store);
4442 }
4443
AddOCRCardColumns(RdbStore & store)4444 static void AddOCRCardColumns(RdbStore &store)
4445 {
4446 const vector<string> sqls = {
4447 "ALTER TABLE " + VISION_OCR_TABLE + " ADD COLUMN " + OCR_CARD_TEXT + " TEXT",
4448 "ALTER TABLE " + VISION_OCR_TABLE + " ADD COLUMN " + OCR_CARD_TEXT_MSG + " TEXT",
4449 };
4450 MEDIA_INFO_LOG("Add video face table start");
4451 ExecSqls(sqls, store);
4452 }
4453
DropPhotoAlbumClearMap(RdbStore & store)4454 static void DropPhotoAlbumClearMap(RdbStore& store)
4455 {
4456 const vector<string> sqls = {
4457 DROP_PHOTO_ALBUM_CLEAR_MAP_SQL,
4458 DROP_INSERT_PHOTO_UPDATE_ALBUM_BUNDLENAME,
4459 INSERT_PHOTO_UPDATE_ALBUM_BUNDLENAME,
4460 };
4461 MEDIA_INFO_LOG("Drop photoAlbum clear map start");
4462 ExecSqls(sqls, store);
4463 }
4464
AddThumbnailVisible(RdbStore & store)4465 static void AddThumbnailVisible(RdbStore& store)
4466 {
4467 const vector<string> sqls = {
4468 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_THUMBNAIL_VISIBLE +
4469 " INT DEFAULT 0"
4470 };
4471 MEDIA_INFO_LOG("Add video face table start");
4472 ExecSqls(sqls, store);
4473 }
4474
AlterThumbnailVisible(RdbStore & store)4475 static void AlterThumbnailVisible(RdbStore& store)
4476 {
4477 const vector<string> sqls = {
4478 PhotoColumn::DROP_INDEX_SCHPT_READY,
4479 PhotoColumn::INDEX_SCHPT_READY,
4480 };
4481 MEDIA_INFO_LOG("Add AlterThumbnailVisible");
4482 ExecSqls(sqls, store);
4483 }
4484
AddHighlightVideoCountCanPack(RdbStore & store)4485 static void AddHighlightVideoCountCanPack(RdbStore& store)
4486 {
4487 const vector<string> sqls = {
4488 "ALTER TABLE " + HIGHLIGHT_ALBUM_TABLE + " ADD COLUMN " + HIGHLIGHT_VIDEO_COUNT_CAN_PACK + " INT",
4489 };
4490 MEDIA_INFO_LOG("Add key: hilghlight video count can pack Start");
4491 ExecSqls(sqls, store);
4492 }
4493
FixSourceAlbumUpdateTriggerToUseLPath(RdbStore & store)4494 static void FixSourceAlbumUpdateTriggerToUseLPath(RdbStore& store)
4495 {
4496 const vector<string> sqls = {
4497 DROP_INSERT_SOURCE_PHOTO_UPDATE_ALBUM_ID_TRIGGER,
4498 CREATE_INSERT_SOURCE_UPDATE_ALBUM_ID_TRIGGER
4499 };
4500 MEDIA_INFO_LOG("Fix source album update trigger to use lpath start");
4501 ExecSqls(sqls, store);
4502 }
4503
AddMediaSuffixColumn(RdbStore & store)4504 static void AddMediaSuffixColumn(RdbStore &store)
4505 {
4506 const vector<string> sqls = {
4507 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_MEDIA_SUFFIX + " TEXT",
4508 };
4509 ExecSqls(sqls, store);
4510 }
4511
AddVisitCountColumn(RdbStore & store)4512 static void AddVisitCountColumn(RdbStore &store)
4513 {
4514 const vector<string> sqls = {
4515 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE +
4516 " ADD COLUMN " + PhotoColumn::PHOTO_REAL_LCD_VISIT_TIME + " BIGINT NOT NULL DEFAULT 0",
4517 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE +
4518 " ADD COLUMN " + PhotoColumn::PHOTO_VISIT_COUNT + " INT NOT NULL DEFAULT 0",
4519 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE +
4520 " ADD COLUMN " + PhotoColumn::PHOTO_LCD_VISIT_COUNT + " INT NOT NULL DEFAULT 0"
4521 };
4522 MEDIA_INFO_LOG("add real_lcd_visit_time/visit_count/lcd_visit_count column start");
4523 ExecSqls(sqls, store);
4524 MEDIA_INFO_LOG("add real_lcd_visit_time/visit_count/lcd_visit_count column end");
4525 }
4526
AddIsRecentShow(RdbStore & store)4527 static void AddIsRecentShow(RdbStore &store)
4528 {
4529 const vector<string> sqls = {
4530 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_IS_RECENT_SHOW +
4531 " INT NOT NULL DEFAULT 1",
4532 };
4533 MEDIA_INFO_LOG("add is_recent_show column start");
4534 ExecSqls(sqls, store);
4535 }
4536
AddFrontAnalysisColumn(RdbStore & store)4537 static void AddFrontAnalysisColumn(RdbStore &store)
4538 {
4539 const vector<string> sqls = {
4540 "ALTER TABLE " + USER_PHOTOGRAPHY_INFO_TABLE + " ADD COLUMN " + FRONT_INDEX_LIMIT + " INT DEFAULT 0",
4541 "ALTER TABLE " + USER_PHOTOGRAPHY_INFO_TABLE + " ADD COLUMN " + FRONT_INDEX_MODIFIED + " BIGINT DEFAULT 0",
4542 "ALTER TABLE " + USER_PHOTOGRAPHY_INFO_TABLE + " ADD COLUMN " + FRONT_INDEX_COUNT + " INT DEFAULT 0",
4543 "ALTER TABLE " + USER_PHOTOGRAPHY_INFO_TABLE + " ADD COLUMN " + FRONT_CV_MODIFIED + " BIGINT DEFAULT 0",
4544 "ALTER TABLE " + USER_PHOTOGRAPHY_INFO_TABLE + " ADD COLUMN " + FRONT_CV_COUNT + " INT DEFAULT 0",
4545 CREATE_PHOTO_STATUS_FOR_SEARCH_INDEX,
4546 };
4547 MEDIA_INFO_LOG("Add front analysis column start");
4548 ExecSqls(sqls, store);
4549 }
4550
AddDcAnalysisColumn(RdbStore & store)4551 static void AddDcAnalysisColumn(RdbStore &store)
4552 {
4553 const vector<string> sqls = {
4554 "ALTER TABLE " + USER_PHOTOGRAPHY_INFO_TABLE + " ADD COLUMN " + DC_INDEX_COUNT + " INT DEFAULT 0",
4555 "ALTER TABLE " + USER_PHOTOGRAPHY_INFO_TABLE + " ADD COLUMN " + DC_OCR_COUNT + " INT DEFAULT 0",
4556 "ALTER TABLE " + USER_PHOTOGRAPHY_INFO_TABLE + " ADD COLUMN " + DC_LABEL_COUNT + " INT DEFAULT 0",
4557 "ALTER TABLE " + USER_PHOTOGRAPHY_INFO_TABLE + " ADD COLUMN " + DC_MODIFY_TIME_STAMP + " BIGINT DEFAULT 0",
4558 };
4559 MEDIA_INFO_LOG("Add DC analysis column start");
4560 ExecSqls(sqls, store);
4561 MEDIA_INFO_LOG("Add DC analysis column end");
4562 }
4563
AddEditDataSizeColumn(RdbStore & store)4564 static void AddEditDataSizeColumn(RdbStore &store)
4565 {
4566 const vector<string> sqls = {
4567 "ALTER TABLE " + PhotoExtColumn::PHOTOS_EXT_TABLE + " ADD COLUMN " + PhotoExtColumn::EDITDATA_SIZE +
4568 " BIGINT DEFAULT 0",
4569 };
4570 MEDIA_INFO_LOG("Add editdata size column start");
4571 ExecSqls(sqls, store);
4572 MEDIA_INFO_LOG("Add editdata size column end");
4573 }
4574
AddDcAnalysisIndexUpdateColumn(RdbStore & store)4575 static void AddDcAnalysisIndexUpdateColumn(RdbStore &store)
4576 {
4577 const vector<string> sqls = {
4578 "ALTER TABLE " + USER_PHOTOGRAPHY_INFO_TABLE + " ADD COLUMN " + DC_INDEX_UPDATE_COUNT + " INT DEFAULT 0",
4579 };
4580 MEDIA_INFO_LOG("Add DC analysis index update column start");
4581 ExecSqls(sqls, store);
4582 MEDIA_INFO_LOG("Add DC analysis index update column end");
4583 }
4584
AddCoverColumns(RdbStore & store)4585 static void AddCoverColumns(RdbStore &store)
4586 {
4587 const vector<string> sqls = {
4588 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " + PhotoAlbumColumns::COVER_URI_SOURCE +
4589 " INT NOT NULL DEFAULT 0",
4590 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " + PhotoAlbumColumns::COVER_CLOUD_ID +
4591 " TEXT",
4592 };
4593 MEDIA_INFO_LOG("add cover columns start");
4594 ExecSqls(sqls, store);
4595 MEDIA_INFO_LOG("add cover columns end");
4596 }
4597
FixSourceAlbumCreateTriggersToUseLPath(RdbStore & store)4598 static void FixSourceAlbumCreateTriggersToUseLPath(RdbStore& store)
4599 {
4600 const vector<string> sqls = {
4601 DROP_INSERT_SOURCE_PHOTO_CREATE_SOURCE_ALBUM_TRIGGER,
4602 CREATE_INSERT_SOURCE_PHOTO_CREATE_SOURCE_ALBUM_TRIGGER
4603 };
4604 MEDIA_INFO_LOG("Fix source album other triggers to use lpath start");
4605 ExecSqls(sqls, store);
4606 }
4607
AddAlbumPluginBundleName(RdbStore & store)4608 static void AddAlbumPluginBundleName(RdbStore &store)
4609 {
4610 MEDIA_INFO_LOG("Start updating album plugin");
4611 const vector<string> sqls = {
4612 "DROP TABLE IF EXISTS album_plugin;"
4613 };
4614 ExecSqls(sqls, store);
4615 AlbumPluginTableEventHandler().OnCreate(store);
4616 MEDIA_INFO_LOG("End updating album plugin");
4617 }
4618
FixMdirtyTriggerToUploadDetailTime(RdbStore & store)4619 static void FixMdirtyTriggerToUploadDetailTime(RdbStore &store)
4620 {
4621 MEDIA_INFO_LOG("Start updating mdirty trigger to upload detail_time");
4622 const vector<string> sqls = {
4623 "DROP TRIGGER IF EXISTS photos_mdirty_trigger",
4624 PhotoColumn::CREATE_PHOTOS_MDIRTY_TRIGGER,
4625 };
4626 ExecSqls(sqls, store);
4627 MEDIA_INFO_LOG("End updating mdirty trigger to upload detail_time");
4628 }
4629
ReAddInsertTrigger(RdbStore & store)4630 static void ReAddInsertTrigger(RdbStore &store)
4631 {
4632 MEDIA_INFO_LOG("Start readd insert trigger");
4633 const vector<string> sqls = {
4634 DROP_INSERT_SOURCE_PHOTO_CREATE_SOURCE_ALBUM_TRIGGER,
4635 CREATE_INSERT_SOURCE_PHOTO_CREATE_SOURCE_ALBUM_TRIGGER,
4636 DROP_INSERT_SOURCE_PHOTO_UPDATE_ALBUM_ID_TRIGGER,
4637 CREATE_INSERT_SOURCE_UPDATE_ALBUM_ID_TRIGGER,
4638 DROP_INSERT_PHOTO_UPDATE_ALBUM_BUNDLENAME,
4639 INSERT_PHOTO_UPDATE_ALBUM_BUNDLENAME
4640 };
4641 ExecSqls(sqls, store);
4642 MEDIA_INFO_LOG("End readd insert trigger");
4643 }
4644
UpgradeFromAPI15(RdbStore & store,unordered_map<string,bool> & photoColumnExists)4645 static void UpgradeFromAPI15(RdbStore &store, unordered_map<string, bool> &photoColumnExists)
4646 {
4647 MEDIA_INFO_LOG("Start VERSION_UPDATE_SOURCE_PHOTO_ALBUM_TRIGGER_AGAIN");
4648 UpdateSourcePhotoAlbumTrigger(store);
4649 MEDIA_INFO_LOG("End VERSION_UPDATE_SOURCE_PHOTO_ALBUM_TRIGGER_AGAIN");
4650
4651 MEDIA_INFO_LOG("Start VERSION_ADD_MEDIA_IS_RECENT_SHOW_COLUMN");
4652 if (photoColumnExists.find(PhotoColumn::PHOTO_IS_RECENT_SHOW) == photoColumnExists.end() ||
4653 !photoColumnExists.at(PhotoColumn::PHOTO_IS_RECENT_SHOW)) {
4654 AddIsRecentShow(store);
4655 }
4656 MEDIA_INFO_LOG("End VERSION_ADD_MEDIA_IS_RECENT_SHOW_COLUMN");
4657
4658 MEDIA_INFO_LOG("Start VERSION_FIX_SOURCE_ALBUM_CREATE_TRIGGERS_TO_USE_LPATH");
4659 FixSourceAlbumCreateTriggersToUseLPath(store);
4660 MEDIA_INFO_LOG("End VERSION_FIX_SOURCE_ALBUM_CREATE_TRIGGERS_TO_USE_LPATH");
4661
4662 MEDIA_INFO_LOG("Start VERSION_ADD_IS_AUTO");
4663 if (photoColumnExists.find(PhotoColumn::PHOTO_IS_AUTO) == photoColumnExists.end() ||
4664 !photoColumnExists.at(PhotoColumn::PHOTO_IS_AUTO)) {
4665 AddIsAutoColumns(store);
4666 }
4667 MEDIA_INFO_LOG("End VERSION_ADD_IS_AUTO");
4668
4669 MEDIA_INFO_LOG("Start VERSION_ADD_ALBUM_PLUGIN_BUNDLE_NAME");
4670 AddAlbumPluginBundleName(store);
4671 MEDIA_INFO_LOG("End VERSION_ADD_ALBUM_PLUGIN_BUNDLE_NAME");
4672
4673 MEDIA_INFO_LOG("Start VERSION_ADD_MEDIA_SUFFIX_COLUMN");
4674 if (photoColumnExists.find(PhotoColumn::PHOTO_MEDIA_SUFFIX) == photoColumnExists.end() ||
4675 !photoColumnExists.at(PhotoColumn::PHOTO_MEDIA_SUFFIX)) {
4676 AddMediaSuffixColumn(store);
4677 }
4678 MEDIA_INFO_LOG("End VERSION_ADD_MEDIA_SUFFIX_COLUMN");
4679
4680 MEDIA_INFO_LOG("Start VERSION_HIGHLIGHT_SUBTITLE");
4681 if (!IsColumnExists(store, HIGHLIGHT_ALBUM_TABLE, HIGHLIGHT_USE_SUBTITLE)) {
4682 AddHighlightUseSubtitle(store);
4683 }
4684 MEDIA_INFO_LOG("End VERSION_HIGHLIGHT_SUBTITLE");
4685 }
4686
UpgradeAPI18(RdbStore & store,unordered_map<string,bool> & photoColumnExists)4687 static void UpgradeAPI18(RdbStore &store, unordered_map<string, bool> &photoColumnExists)
4688 {
4689 MEDIA_INFO_LOG("Start VERSION_ADD_METARECOVERY");
4690 if (photoColumnExists.find(PhotoColumn::PHOTO_METADATA_FLAGS) == photoColumnExists.end() ||
4691 !photoColumnExists.at(PhotoColumn::PHOTO_METADATA_FLAGS)) {
4692 AddMetaRecovery(store);
4693 }
4694 MEDIA_INFO_LOG("End VERSION_ADD_METARECOVERY");
4695
4696 MEDIA_INFO_LOG("Start VERSION_ADD_HIGHLIGHT_TRIGGER");
4697 if (!IsColumnExists(store, PhotoColumn::HIGHLIGHT_TABLE, PhotoColumn::MEDIA_DATA_DB_HIGHLIGHT_TRIGGER)) {
4698 AddHighlightTriggerColumn(store);
4699 AddHighlightInsertAndUpdateTrigger(store);
4700 AddHighlightIndex(store);
4701 }
4702 MEDIA_INFO_LOG("End VERSION_ADD_HIGHLIGHT_TRIGGER");
4703
4704 MEDIA_INFO_LOG("Start VERSION_UPDATE_SEARCH_STATUS_TRIGGER_FOR_OWNER_ALBUM_ID");
4705 UpdateSearchStatusTriggerForOwnerAlbumId(store);
4706 MEDIA_INFO_LOG("End VERSION_UPDATE_SEARCH_STATUS_TRIGGER_FOR_OWNER_ALBUM_ID");
4707
4708 MEDIA_INFO_LOG("Start VERSION_HIGHLIGHT_MOVING_PHOTO");
4709 AddMovingPhotoRelatedData(store);
4710 MEDIA_INFO_LOG("End VERSION_HIGHLIGHT_MOVING_PHOTO");
4711
4712 MEDIA_INFO_LOG("Start VERSION_CREATE_TAB_FACARD_PHOTOS");
4713 TabFaCardPhotosTableEventHandler().OnCreate(store);
4714 MEDIA_INFO_LOG("End VERSION_CREATE_TAB_FACARD_PHOTOS");
4715
4716 MEDIA_INFO_LOG("Start VERSION_ADD_FOREGROUND_ANALYSIS");
4717 if (!IsColumnExists(store, USER_PHOTOGRAPHY_INFO_TABLE, FRONT_INDEX_LIMIT)) {
4718 AddFrontAnalysisColumn(store);
4719 }
4720 MEDIA_INFO_LOG("End VERSION_ADD_FOREGROUND_ANALYSIS");
4721 }
4722
AddAssetAlbumOperationTable(RdbStore & store)4723 static void AddAssetAlbumOperationTable(RdbStore &store)
4724 {
4725 const vector<string> executeSqlStrs = {
4726 "DROP TABLE IF EXISTS tab_asset_and_album_operation",
4727 CREATE_TAB_ASSET_ALBUM_OPERATION,
4728 "DROP TABLE IF EXISTS operation_asset_insert_trigger",
4729 CREATE_OPERATION_ASSET_INSERT_TRIGGER,
4730 "DROP TABLE IF EXISTS operation_asset_delete_trigger",
4731 CREATE_OPERATION_ASSET_DELETE_TRIGGER,
4732 "DROP TABLE IF EXISTS operation_asset_update_trigger",
4733 CREATE_OPERATION_ASSET_UPDATE_TRIGGER,
4734 "DROP TABLE IF EXISTS operation_album_insert_trigger",
4735 CREATE_OPERATION_ALBUM_INSERT_TRIGGER,
4736 "DROP TABLE IF EXISTS operation_album_delete_trigger",
4737 CREATE_OPERATION_ALBUM_DELETE_TRIGGER,
4738 "DROP TABLE IF EXISTS operation_album_update_trigger",
4739 CREATE_OPERATION_ALBUM_UPDATE_TRIGGER,
4740 };
4741 ExecSqls(executeSqlStrs, store);
4742 MEDIA_INFO_LOG("create asset and album operation table end");
4743 }
4744
AddAssetAlbumOperationTableForSync(RdbStore & store)4745 static void AddAssetAlbumOperationTableForSync(RdbStore &store)
4746 {
4747 const vector<string> executeSqlStrs = {
4748 CREATE_TAB_ASSET_ALBUM_OPERATION,
4749 "DROP TABLE IF EXISTS operation_asset_insert_trigger",
4750 CREATE_OPERATION_ASSET_INSERT_TRIGGER,
4751 "DROP TABLE IF EXISTS operation_asset_delete_trigger",
4752 CREATE_OPERATION_ASSET_DELETE_TRIGGER,
4753 "DROP TABLE IF EXISTS operation_asset_update_trigger",
4754 CREATE_OPERATION_ASSET_UPDATE_TRIGGER,
4755 "DROP TABLE IF EXISTS operation_album_insert_trigger",
4756 CREATE_OPERATION_ALBUM_INSERT_TRIGGER,
4757 "DROP TABLE IF EXISTS operation_album_delete_trigger",
4758 CREATE_OPERATION_ALBUM_DELETE_TRIGGER,
4759 "DROP TABLE IF EXISTS operation_album_update_trigger",
4760 CREATE_OPERATION_ALBUM_UPDATE_TRIGGER,
4761 };
4762 ExecSqls(executeSqlStrs, store);
4763 MEDIA_INFO_LOG("create asset and album operation table sync end");
4764 }
4765
UpgradeAnalysisUpdateSearchTrigger(RdbStore & store)4766 static void UpgradeAnalysisUpdateSearchTrigger(RdbStore &store)
4767 {
4768 MEDIA_INFO_LOG("start upgrade analysis update search trigger");
4769 const vector<string> sqls = {
4770 "DROP TRIGGER IF EXISTS " + ANALYSIS_UPDATE_SEARCH_TRIGGER,
4771 CREATE_ANALYSIS_UPDATE_SEARCH_TRIGGER,
4772 };
4773 ExecSqls(sqls, store);
4774 MEDIA_INFO_LOG("end upgrade analysis update search trigger");
4775 }
4776
CreateTabCustomRecords(RdbStore & store)4777 static void CreateTabCustomRecords(RdbStore &store)
4778 {
4779 const vector<string> executeSqlStrs = {
4780 CustomRecordsColumns::CREATE_TABLE,
4781 };
4782 ExecSqls(executeSqlStrs, store);
4783 MEDIA_INFO_LOG("create custom and records end");
4784 }
4785
AddIsRectificationCover(RdbStore & store)4786 static int32_t AddIsRectificationCover(RdbStore &store)
4787 {
4788 const vector<string> sqls = {
4789 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_IS_RECTIFICATION_COVER +
4790 " INT NOT NULL DEFAULT 0",
4791 };
4792 MEDIA_INFO_LOG("start add is_rectification_cover column");
4793 int32_t ret = ExecSqls(sqls, store);
4794 MEDIA_INFO_LOG("end add is_rectification_cover column");
4795 return ret;
4796 }
4797
AddPhotoAlbumRefreshColumns(RdbStore & store)4798 void AddPhotoAlbumRefreshColumns(RdbStore &store)
4799 {
4800 const vector<string> exeSqls = {
4801 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
4802 PhotoAlbumColumns::COVER_DATE_TIME + " BIGINT DEFAULT 0",
4803 "ALTER TABLE " + PhotoAlbumColumns::TABLE + " ADD COLUMN " +
4804 PhotoAlbumColumns::HIDDEN_COVER_DATE_TIME + " BIGINT DEFAULT 0",
4805 };
4806
4807 MEDIA_INFO_LOG("start add photo album cover_date_time and hidden_cover_date_time for AccurateRefresh");
4808 ExecSqls(exeSqls, store);
4809 MEDIA_INFO_LOG("end add photo album cover_date_time and hidden_cover_date_time for AccurateRefresh");
4810 }
4811
AddHighlightLocation(RdbStore & store)4812 void AddHighlightLocation(RdbStore &store)
4813 {
4814 const vector<string> sql = {
4815 " ALTER TABLE " + HIGHLIGHT_ALBUM_TABLE + " ADD COLUMN " + HIGHLIGHT_LOCATION + " TEXT ",
4816 };
4817
4818 MEDIA_INFO_LOG("start add highlight location column");
4819 ExecSqls(sql, store);
4820 }
4821
AddIsPrimaryFace(RdbStore & store)4822 void AddIsPrimaryFace(RdbStore &store)
4823 {
4824 const vector<string> sql = {
4825 " ALTER TABLE " + VISION_IMAGE_FACE_TABLE + " ADD COLUMN " + IS_PRIMARY_FACE + " REAL ",
4826 };
4827
4828 MEDIA_INFO_LOG("Adding IS_PRIMARY_FACE column for VISION_IMAGE_FACE_TABLE");
4829 ExecSqls(sql, store);
4830 }
4831
AddTotalPriority(RdbStore & store)4832 void AddTotalPriority(RdbStore &store)
4833 {
4834 const vector<string> sql = {
4835 "ALTER TABLE " + VISION_TOTAL_TABLE + " ADD COLUMN " + PRIORITY + " INT NOT NULL DEFAULT 1",
4836 };
4837
4838 MEDIA_INFO_LOG("Addding priority for VISION_TOTAL_TABLE");
4839 ExecSqls(sql, store);
4840 }
4841
DropInsertSourcePhotoCreateSourceAlbumTrigger(RdbStore & store)4842 static void DropInsertSourcePhotoCreateSourceAlbumTrigger(RdbStore &store)
4843 {
4844 MEDIA_INFO_LOG("drop trigger insert_source_photo_create_source_album_trigger start");
4845 ExecSqls({DROP_INSERT_SOURCE_PHOTO_CREATE_SOURCE_ALBUM_TRIGGER}, store);
4846 MEDIA_INFO_LOG("drop trigger insert_source_photo_create_source_album_trigger end");
4847 }
4848
DropInsertPhotoUpdateAlbumBundleNameTrigger(RdbStore & store)4849 static void DropInsertPhotoUpdateAlbumBundleNameTrigger(RdbStore &store)
4850 {
4851 MEDIA_INFO_LOG("drop trigger insert_photo_update_album_bundlename start");
4852 ExecSqls({DROP_INSERT_PHOTO_UPDATE_ALBUM_BUNDLENAME}, store);
4853 MEDIA_INFO_LOG("drop trigger insert_photo_update_album_bundlename end");
4854 }
4855
DropInsertSourcePhotoUpdateAlbumIdTrigger(RdbStore & store)4856 static void DropInsertSourcePhotoUpdateAlbumIdTrigger(RdbStore &store)
4857 {
4858 MEDIA_INFO_LOG("drop trigger insert_source_photo_update_album_id_trigger start");
4859 ExecSqls({DROP_INSERT_SOURCE_PHOTO_UPDATE_ALBUM_ID_TRIGGER}, store);
4860 MEDIA_INFO_LOG("drop trigger insert_source_photo_update_album_id_trigger end");
4861 }
4862
AddExifRotateColumn(RdbStore & store)4863 static void AddExifRotateColumn(RdbStore& store)
4864 {
4865 const vector<string> sqls = {
4866 "ALTER TABLE " + PhotoColumn::PHOTOS_TABLE + " ADD COLUMN " + PhotoColumn::PHOTO_EXIF_ROTATE +
4867 " INT NOT NULL DEFAULT 0",
4868 };
4869 MEDIA_INFO_LOG("Start add exif_rotate column");
4870 ExecSqls(sqls, store);
4871 MEDIA_INFO_LOG("End add exif_rotate column");
4872 }
4873
DealWithAlbumMapTrigger(RdbStore & store)4874 static void DealWithAlbumMapTrigger(RdbStore &store)
4875 {
4876 const vector<std::string> exeSqls = {
4877 SQL_DROP_NEW_TRIGGER,
4878 SQL_DROP_DELETE_TRIGGER,
4879 SQL_DROP_INSERT_SEARCH_TRIGGER,
4880 SQL_DROP_DELETE_SEARCH_TRIGGER,
4881 };
4882 MEDIA_INFO_LOG("DealWithAlbumMapTrigger start");
4883 ExecSqls(exeSqls, store);
4884 MEDIA_INFO_LOG("DealWithAlbumMapTrigger end");
4885 }
4886
AddUriSensitiveColumns(RdbStore & store)4887 static void AddUriSensitiveColumns(RdbStore &store)
4888 {
4889 const vector<std::string> exeSqls = {
4890 "ALTER TABLE " + AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE + " ADD COLUMN " +
4891 AppUriSensitiveColumn::IS_FORCE_SENSITIVE + " INT DEFAULT 0",
4892 "ALTER TABLE " + AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE + " ADD COLUMN " +
4893 AppUriSensitiveColumn::SOURCE_TOKENID + " BIGINT DEFAULT 0",
4894 "ALTER TABLE " + AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE + " ADD COLUMN " +
4895 AppUriSensitiveColumn::TARGET_TOKENID + " BIGINT DEFAULT 0",
4896 };
4897 MEDIA_INFO_LOG("AddUriSensitiveColumns start");
4898 ExecSqls(exeSqls, store);
4899 MEDIA_INFO_LOG("AddUriSensitiveColumns end");
4900 }
4901
UpgradeFromAllVersionFirstPart(RdbStore & store,unordered_map<string,bool> & photoColumnExists)4902 static void UpgradeFromAllVersionFirstPart(RdbStore &store, unordered_map<string, bool> &photoColumnExists)
4903 {
4904 MEDIA_INFO_LOG("Start VERSION_ADD_DETAIL_TIME");
4905 if (photoColumnExists.find(PhotoColumn::PHOTO_DETAIL_TIME) == photoColumnExists.end() ||
4906 !photoColumnExists.at(PhotoColumn::PHOTO_DETAIL_TIME)) {
4907 AddDetailTimeToPhotos(store);
4908 }
4909 MEDIA_INFO_LOG("End VERSION_ADD_DETAIL_TIME");
4910
4911 MEDIA_INFO_LOG("Start VERSION_ADD_OWNER_ALBUM_ID");
4912 DropPhotoAlbumClearMap(store);
4913 MEDIA_INFO_LOG("End VERSION_ADD_OWNER_ALBUM_ID");
4914
4915 MEDIA_INFO_LOG("Start VERSION_ADD_THUMBNAIL_VISIBLE");
4916 if (photoColumnExists.find(PhotoColumn::PHOTO_THUMBNAIL_VISIBLE) == photoColumnExists.end() ||
4917 !photoColumnExists.at(PhotoColumn::PHOTO_THUMBNAIL_VISIBLE)) {
4918 AddThumbnailVisible(store);
4919 }
4920 MEDIA_INFO_LOG("End VERSION_ADD_THUMBNAIL_VISIBLE");
4921
4922 MEDIA_INFO_LOG("Start VERSION_ADD_VIDEO_FACE_TABLE");
4923 if (!IsColumnExists(store, VISION_TOTAL_TABLE, GEO)) {
4924 AddVideoFaceTable(store);
4925 }
4926 MEDIA_INFO_LOG("End VERSION_ADD_VIDEO_FACE_TABLE");
4927
4928 MEDIA_INFO_LOG("Start VERSION_ADD_HIGHLIGHT_MAP_TABLES");
4929 if (!IsColumnExists(store, HIGHLIGHT_PLAY_INFO_TABLE, HIGHLIGHTING_ALGO_VERSION)) {
4930 AddHighlightMapTable(store);
4931 }
4932 MEDIA_INFO_LOG("End VERSION_ADD_HIGHLIGHT_MAP_TABLES");
4933
4934 MEDIA_INFO_LOG("Start VERSION_ADD_CLOUD_ENHANCEMENT_ALBUM");
4935 AddCloudEnhancementAlbum(store);
4936 MEDIA_INFO_LOG("End VERSION_ADD_CLOUD_ENHANCEMENT_ALBUM");
4937
4938 MEDIA_INFO_LOG("Start VERSION_CREATE_TAB_OLD_PHOTOS");
4939 TabOldPhotosTableEventHandler().OnCreate(store);
4940 MEDIA_INFO_LOG("End VERSION_CREATE_TAB_OLD_PHOTOS");
4941
4942 MEDIA_INFO_LOG("Start VERSION_UPDATE_SEARCH_INDEX_TRIGGER_FOR_CLEAN_FLAG");
4943 UpdateSearchIndexTriggerForCleanFlag(store);
4944 MEDIA_INFO_LOG("End VERSION_UPDATE_SEARCH_INDEX_TRIGGER_FOR_CLEAN_FLAG");
4945
4946 MEDIA_INFO_LOG("Start VERSION_ADD_COVER_PLAY_SERVICE_VERSION");
4947 if (!IsColumnExists(store, HIGHLIGHT_COVER_INFO_TABLE, COVER_SERVICE_VERSION)) {
4948 AddCoverPlayVersionColumns(store);
4949 }
4950 MEDIA_INFO_LOG("End VERSION_ADD_COVER_PLAY_SERVICE_VERSION");
4951
4952 MEDIA_INFO_LOG("Start VERSION_ADD_SUPPORTED_WATERMARK_TYPE");
4953 if (photoColumnExists.find(PhotoColumn::SUPPORTED_WATERMARK_TYPE) == photoColumnExists.end() ||
4954 !photoColumnExists.at(PhotoColumn::SUPPORTED_WATERMARK_TYPE)) {
4955 AddSupportedWatermarkType(store);
4956 }
4957 MEDIA_INFO_LOG("End VERSION_ADD_SUPPORTED_WATERMARK_TYPE");
4958 }
4959
UpgradeFromAllVersionSecondPart(RdbStore & store,unordered_map<string,bool> & photoColumnExists)4960 static void UpgradeFromAllVersionSecondPart(RdbStore &store, unordered_map<string, bool> &photoColumnExists)
4961 {
4962 MEDIA_INFO_LOG("Start VERSION_UDAPTE_AOI");
4963 if (!IsColumnExists(store, GEO_KNOWLEDGE_TABLE, AOI)) {
4964 UpdateAOI(store);
4965 AddGeoDefaultValue(store);
4966 }
4967 MEDIA_INFO_LOG("End VERSION_UDAPTE_AOI");
4968
4969 MEDIA_INFO_LOG("Start VERSION_HDR_AND_CLOUD_ENHANCEMENT_FIX");
4970 AddDynamicRangeColumnsFix(store);
4971 AddCloudEnhanceColumnsFix(store);
4972 MEDIA_INFO_LOG("End VERSION_HDR_AND_CLOUD_ENHANCEMENT_FIX");
4973
4974 MEDIA_INFO_LOG("Start VERSION_THUMBNAIL_READY_FIX");
4975 AddThumbnailReadyColumnsFix(store);
4976 MEDIA_INFO_LOG("End VERSION_THUMBNAIL_READY_FIX");
4977
4978 MEDIA_INFO_LOG("Start VERSION_UPDATE_SOURCE_PHOTO_ALBUM_TRIGGER");
4979 UpdateSourcePhotoAlbumTrigger(store);
4980 MEDIA_INFO_LOG("End VERSION_UPDATE_SOURCE_PHOTO_ALBUM_TRIGGER");
4981
4982 MEDIA_INFO_LOG("Start VERSION_UPDATE_URIPERMISSION_SOURCE_TOKEN_AND_TARGET_TOKEN");
4983 if (!IsColumnExists(store, AppUriPermissionColumn::APP_URI_PERMISSION_TABLE,
4984 AppUriPermissionColumn::SOURCE_TOKENID)) {
4985 AddSourceAndTargetTokenForUriPermission(store);
4986 }
4987 MEDIA_INFO_LOG("End VERSION_UPDATE_URIPERMISSION_SOURCE_TOKEN_AND_TARGET_TOKEN");
4988
4989 MEDIA_INFO_LOG("Start VERSION_HIGHLIGHT_CHANGE_FUNCTION");
4990 if (!IsColumnExists(store, ANALYSIS_PHOTO_MAP_TABLE, ORDER_POSITION)) {
4991 AddHighlightChangeFunction(store);
4992 }
4993 MEDIA_INFO_LOG("End VERSION_HIGHLIGHT_CHANGE_FUNCTION");
4994
4995 MEDIA_INFO_LOG("Start VERSION_ADD_HIGHLIGHT_ANALYSIS_PROGRESS");
4996 if (!IsColumnExists(store, USER_PHOTOGRAPHY_INFO_TABLE, HIGHLIGHT_ANALYSIS_PROGRESS)) {
4997 AddHighlightAnalysisProgress(store);
4998 }
4999 MEDIA_INFO_LOG("End VERSION_ADD_HIGHLIGHT_ANALYSIS_PROGRESS");
5000
5001 MEDIA_INFO_LOG("Start VERSION_ADD_CHECK_FLAG");
5002 if (photoColumnExists.find(PhotoColumn::PHOTO_CHECK_FLAG) == photoColumnExists.end() ||
5003 !photoColumnExists.at(PhotoColumn::PHOTO_CHECK_FLAG)) {
5004 AddCheckFlag(store);
5005 }
5006 MEDIA_INFO_LOG("End VERSION_ADD_CHECK_FLAG");
5007
5008 MEDIA_INFO_LOG("Start VERSION_FIX_SOURCE_PHOTO_ALBUM_DATE_MODIFIED");
5009 UpdateSourcePhotoAlbumTrigger(store);
5010 MEDIA_INFO_LOG("End VERSION_FIX_SOURCE_PHOTO_ALBUM_DATE_MODIFIED");
5011
5012 MEDIA_INFO_LOG("Start VERSION_FIX_SOURCE_ALBUM_UPDATE_TRIGGER_TO_USE_LPATH");
5013 FixSourceAlbumUpdateTriggerToUseLPath(store);
5014 MEDIA_INFO_LOG("End VERSION_FIX_SOURCE_ALBUM_UPDATE_TRIGGER_TO_USE_LPATH");
5015 }
5016
UpgradeFromAllVersionThirdPart(RdbStore & store,unordered_map<string,bool> & photoColumnExists)5017 static void UpgradeFromAllVersionThirdPart(RdbStore &store, unordered_map<string, bool> &photoColumnExists)
5018 {
5019 MEDIA_INFO_LOG("Start VERSION_ADD_REFRESH_ALBUM_STATUS_COLUMN");
5020 if (!IsColumnExists(store, ALBUM_REFRESH_TABLE, ALBUM_REFRESH_STATUS)) {
5021 AddRefreshAlbumStatusColumn(store);
5022 }
5023 MEDIA_INFO_LOG("End VERSION_ADD_REFRESH_ALBUM_STATUS_COLUMN");
5024
5025 MEDIA_INFO_LOG("Start VERSION_UPDATE_CLOUD_TRIGGER");
5026 UpdateCloudTrigger(store);
5027 MEDIA_INFO_LOG("End VERSION_UPDATE_CLOUD_TRIGGER");
5028
5029 MEDIA_INFO_LOG("Start VERSION_ADD_STAGE_VIDEO_TASK_STATUS");
5030 if (photoColumnExists.find(PhotoColumn::STAGE_VIDEO_TASK_STATUS) == photoColumnExists.end() ||
5031 !photoColumnExists.at(PhotoColumn::STAGE_VIDEO_TASK_STATUS)) {
5032 AddStageVideoTaskStatus(store);
5033 }
5034 MEDIA_INFO_LOG("End VERSION_ADD_STAGE_VIDEO_TASK_STATUS");
5035
5036 MEDIA_INFO_LOG("Start VERSION_CREATE_TAB_ASSET_ALBUM_OPERATION_FOR_SYNC");
5037 AddAssetAlbumOperationTableForSync(store);
5038 MEDIA_INFO_LOG("End VERSION_CREATE_TAB_ASSET_ALBUM_OPERATION_FOR_SYNC");
5039
5040 MEDIA_INFO_LOG("Start VERSION_UPGRADE_ANALYSIS_UPDATE_SEARCH_TRIGGER");
5041 UpgradeAnalysisUpdateSearchTrigger(store);
5042 MEDIA_INFO_LOG("End VERSION_UPGRADE_ANALYSIS_UPDATE_SEARCH_TRIGGER");
5043
5044 MEDIA_INFO_LOG("Start VERSION_ADD_DC_ANALYSIS");
5045 if (!IsColumnExists(store, USER_PHOTOGRAPHY_INFO_TABLE, DC_INDEX_COUNT)) {
5046 AddDcAnalysisColumn(store);
5047 }
5048 MEDIA_INFO_LOG("End VERSION_ADD_DC_ANALYSIS");
5049 }
5050
UpgradeFromAllVersionFourthPart(RdbStore & store,unordered_map<string,bool> & photoColumnExists)5051 static void UpgradeFromAllVersionFourthPart(RdbStore &store, unordered_map<string, bool> &photoColumnExists)
5052 {
5053 MEDIA_INFO_LOG("Start VERSION_CLOUD_MEDIA_UPGRADE");
5054 DealWithAlbumMapTrigger(store);
5055 MEDIA_INFO_LOG("End VERSION_CLOUD_MEDIA_UPGRADE");
5056
5057 MEDIA_INFO_LOG("Start VERSION_ADD_DC_ANALYSIS_INDEX_UPDATE");
5058 if (!IsColumnExists(store, USER_PHOTOGRAPHY_INFO_TABLE, DC_INDEX_UPDATE_COUNT)) {
5059 AddDcAnalysisIndexUpdateColumn(store);
5060 }
5061 MEDIA_INFO_LOG("End VERSION_ADD_DC_ANALYSIS_INDEX_UPDATE");
5062
5063 MEDIA_INFO_LOG("Start VERSION_ADD_VISIT_COUNT");
5064 if (photoColumnExists.find(PhotoColumn::PHOTO_REAL_LCD_VISIT_TIME) == photoColumnExists.end() ||
5065 !photoColumnExists.at(PhotoColumn::PHOTO_REAL_LCD_VISIT_TIME)) {
5066 AddVisitCountColumn(store);
5067 }
5068 MEDIA_INFO_LOG("End VERSION_ADD_VISIT_COUNT");
5069
5070 MEDIA_INFO_LOG("Start ADD_URI_SENSITIVE_COLUMNS");
5071 if (!IsColumnExists(store, AppUriSensitiveColumn::APP_URI_SENSITIVE_TABLE,
5072 AppUriSensitiveColumn::IS_FORCE_SENSITIVE)) {
5073 AddUriSensitiveColumns(store);
5074 }
5075 MEDIA_INFO_LOG("End ADD_URI_SENSITIVE_COLUMNS");
5076 }
5077
UpgradeExtensionPart8(RdbStore & store,int32_t oldVersion)5078 static void UpgradeExtensionPart8(RdbStore &store, int32_t oldVersion)
5079 {
5080 if (oldVersion < VERSION_SHOOTING_MODE_ALBUM_SECOND_INTERATION) {
5081 PrepareShootingModeAlbum(store);
5082 }
5083
5084 if (oldVersion < VERSION_FIX_DB_UPGRADE_FROM_API18) {
5085 MEDIA_INFO_LOG("Start VERSION_MDIRTY_TRIGGER_UPLOAD_DETAIL_TIME & VERSION_UPDATE_MDIRTY_TRIGGER_FOR_TDIRTY");
5086 FixMdirtyTriggerToUploadDetailTime(store);
5087 MEDIA_INFO_LOG("End VERSION_MDIRTY_TRIGGER_UPLOAD_DETAIL_TIME & VERSION_UPDATE_MDIRTY_TRIGGER_FOR_TDIRTY");
5088 }
5089
5090 if (oldVersion < VERSION_ADD_BEST_FACE_BOUNDING) {
5091 AddBestFaceBoundingColumnForGroupAlbum(store);
5092 }
5093
5094 if (oldVersion < VERSION_ADD_GROUP_VERSION) {
5095 AddGroupVersion(store);
5096 }
5097
5098 if (oldVersion < VERSION_ADD_EXIF_ROTATE_COLUMN_AND_SET_VALUE) {
5099 AddExifRotateColumn(store);
5100 }
5101
5102 if (oldVersion < VERSION_FIX_DB_UPGRADE_TO_API20) {
5103 unordered_map<string, bool> photoColumnExists = {
5104 { PhotoColumn::PHOTO_DETAIL_TIME, false }, // VERSION_ADD_DETAIL_TIME
5105 { PhotoColumn::PHOTO_THUMBNAIL_VISIBLE, false }, // VERSION_ADD_THUMBNAIL_VISIBLE
5106 { PhotoColumn::SUPPORTED_WATERMARK_TYPE, false }, // VERSION_ADD_SUPPORTED_WATERMARK_TYPE
5107 { PhotoColumn::PHOTO_CHECK_FLAG, false }, // VERSION_ADD_CHECK_FLAG
5108 { PhotoColumn::STAGE_VIDEO_TASK_STATUS, false }, // VERSION_ADD_STAGE_VIDEO_TASK_STATUS
5109 { PhotoColumn::PHOTO_REAL_LCD_VISIT_TIME, false }, // VERSION_ADD_VISIT_COUNT
5110 };
5111 CheckIfPhotoColumnExists(store, photoColumnExists);
5112 UpgradeFromAllVersionFirstPart(store, photoColumnExists);
5113 UpgradeFromAllVersionSecondPart(store, photoColumnExists);
5114 UpgradeFromAllVersionThirdPart(store, photoColumnExists);
5115 UpgradeFromAllVersionFourthPart(store, photoColumnExists);
5116 }
5117
5118 if (oldVersion < VERSION_UPDATE_PHOTO_ALBUM_DATEMODIFIED_TIGGER) {
5119 UpdatePhotoAlbumTigger(store);
5120 }
5121 }
5122
UpgradeExtensionPart7(RdbStore & store,int32_t oldVersion)5123 static void UpgradeExtensionPart7(RdbStore &store, int32_t oldVersion)
5124 {
5125 if (oldVersion < VERSION_ADD_IS_RECTIFICATION_COVER) {
5126 if (AddIsRectificationCover(store) == NativeRdb::E_OK) {
5127 UpdatePhotosMdirtyTrigger(store);
5128 }
5129 }
5130
5131 if (oldVersion < VERSION_ADD_PHOTO_ALBUM_REFRESH_COLUMNS) {
5132 AddPhotoAlbumRefreshColumns(store);
5133 }
5134
5135 TableEventHandler().OnUpgrade(
5136 MediaLibraryUnistoreManager::GetInstance().GetRdbStore(), oldVersion, MEDIA_RDB_VERSION);
5137
5138 if (oldVersion < VERSION_ADD_COVER_URI_SOURCE) {
5139 AddCoverColumns(store);
5140 }
5141
5142 if (oldVersion < VERSION_ADD_EDITDATA_SIZE_COLUMN) {
5143 AddEditDataSizeColumn(store);
5144 }
5145
5146 if (oldVersion < VERSION_ADD_AESTHETICS_SCORE_FIELDS) {
5147 AddAestheticsScoreFileds(store);
5148 }
5149
5150 if (oldVersion < VERSION_ADD_HIGHLIGHT_LOCATION) {
5151 AddHighlightLocation(store);
5152 }
5153
5154 if (oldVersion < VERSION_ADD_IS_PRIMARY_FACE) {
5155 AddIsPrimaryFace(store);
5156 }
5157
5158 if (oldVersion < VERSION_ADD_PRIORITY_COLUMN) {
5159 AddTotalPriority(store);
5160 }
5161
5162 if (oldVersion < VERSION_ADD_ALBUMS_ORDER_KEYS_COLUMNS) {
5163 AddAlbumsOrderKeysColumn(store);
5164 }
5165
5166 if (oldVersion < VERSION_DROP_PHOTO_INSERT_SOURCE_PHOTO_TRIGGER) {
5167 DropInsertSourcePhotoCreateSourceAlbumTrigger(store);
5168 DropInsertPhotoUpdateAlbumBundleNameTrigger(store);
5169 DropInsertSourcePhotoUpdateAlbumIdTrigger(store);
5170 }
5171
5172 UpgradeExtensionPart8(store, oldVersion);
5173 }
5174
UpgradeExtensionPart6(RdbStore & store,int32_t oldVersion)5175 static void UpgradeExtensionPart6(RdbStore &store, int32_t oldVersion)
5176 {
5177 if (oldVersion < VERSION_FIX_DB_UPGRADE_FROM_API15) {
5178 unordered_map<string, bool> photoColumnExists = {
5179 { PhotoColumn::PHOTO_IS_RECENT_SHOW, false },
5180 { PhotoColumn::PHOTO_IS_AUTO, false },
5181 { PhotoColumn::PHOTO_MEDIA_SUFFIX, false },
5182 { PhotoColumn::PHOTO_METADATA_FLAGS, false },
5183 };
5184 CheckIfPhotoColumnExists(store, photoColumnExists);
5185 UpgradeFromAPI15(store, photoColumnExists);
5186 UpgradeAPI18(store, photoColumnExists);
5187 }
5188
5189 if (oldVersion < VERSION_CREATE_TAB_ASSET_ALBUM_OPERATION_FOR_SYNC) {
5190 AddAssetAlbumOperationTableForSync(store);
5191 }
5192
5193 if (oldVersion < VERSION_CREATE_TAB_FACARD_PHOTOS_RETRY) {
5194 TabFaCardPhotosTableEventHandler().OnCreate(store);
5195 }
5196
5197 if (oldVersion < VERSION_UPDATE_SEARCH_STATUS_TRIGGER_FOR_IS_FAVORITE) {
5198 UpdateSearchStatusTriggerForIsFavorite(store);
5199 }
5200
5201 if (oldVersion < VERSION_UPGRADE_ANALYSIS_UPDATE_SEARCH_TRIGGER) {
5202 UpgradeAnalysisUpdateSearchTrigger(store);
5203 }
5204
5205 if (oldVersion < VERSION_ADD_DC_ANALYSIS) {
5206 AddDcAnalysisColumn(store);
5207 }
5208
5209 if (oldVersion < VERSION_ADD_VISIT_COUNT) {
5210 AddVisitCountColumn(store);
5211 }
5212
5213 if (oldVersion < VERSION_CREATE_TAB_CUSTOM_RECORDS) {
5214 CreateTabCustomRecords(store);
5215 }
5216
5217 if (oldVersion < VERSION_ADD_DC_ANALYSIS_INDEX_UPDATE) {
5218 AddDcAnalysisIndexUpdateColumn(store);
5219 }
5220
5221 UpgradeExtensionPart7(store, oldVersion);
5222 }
5223
UpgradeExtensionPart5(RdbStore & store,int32_t oldVersion)5224 static void UpgradeExtensionPart5(RdbStore &store, int32_t oldVersion)
5225 {
5226 if (oldVersion < VERSION_ADD_STAGE_VIDEO_TASK_STATUS) {
5227 AddStageVideoTaskStatus(store);
5228 }
5229
5230 if (oldVersion < VERSION_HIGHLIGHT_SUBTITLE) {
5231 AddHighlightUseSubtitle(store);
5232 }
5233
5234 if (oldVersion < VERSION_ADD_IS_AUTO) {
5235 AddIsAutoColumns(store);
5236 }
5237
5238 if (oldVersion < VERSION_ADD_MEDIA_SUFFIX_COLUMN) {
5239 AddMediaSuffixColumn(store);
5240 }
5241
5242 if (oldVersion < VERSION_UPDATE_SOURCE_PHOTO_ALBUM_TRIGGER_AGAIN) {
5243 UpdateSourcePhotoAlbumTrigger(store);
5244 }
5245
5246 if (oldVersion < VERSION_ADD_MEDIA_IS_RECENT_SHOW_COLUMN) {
5247 AddIsRecentShow(store);
5248 }
5249
5250 if (oldVersion < VERSION_CREATE_TAB_FACARD_PHOTOS) {
5251 TabFaCardPhotosTableEventHandler().OnCreate(store);
5252 }
5253
5254 if (oldVersion < VERSION_FIX_SOURCE_ALBUM_CREATE_TRIGGERS_TO_USE_LPATH) {
5255 FixSourceAlbumCreateTriggersToUseLPath(store);
5256 }
5257 if (oldVersion < VERSION_ADD_ALBUM_PLUGIN_BUNDLE_NAME) {
5258 AddAlbumPluginBundleName(store);
5259 }
5260
5261 if (oldVersion < VERSION_ADD_FOREGROUND_ANALYSIS) {
5262 AddFrontAnalysisColumn(store);
5263 }
5264
5265 if (oldVersion < VERSION_HIGHLIGHT_MOVING_PHOTO) {
5266 AddMovingPhotoRelatedData(store);
5267 }
5268
5269 if (oldVersion < VERSION_CREATE_TAB_ASSET_ALBUM_OPERATION) {
5270 AddAssetAlbumOperationTable(store);
5271 }
5272
5273 if (oldVersion < VERSION_MDIRTY_TRIGGER_UPLOAD_DETAIL_TIME) {
5274 FixMdirtyTriggerToUploadDetailTime(store);
5275 }
5276
5277 UpgradeExtensionPart6(store, oldVersion);
5278 }
5279
UpgradeExtensionPart4(RdbStore & store,int32_t oldVersion)5280 static void UpgradeExtensionPart4(RdbStore &store, int32_t oldVersion)
5281 {
5282 if (oldVersion < VERSION_CREATE_TAB_OLD_PHOTOS) {
5283 TabOldPhotosTableEventHandler().OnCreate(store);
5284 }
5285
5286 if (oldVersion < VERSION_ADD_HIGHLIGHT_TRIGGER) {
5287 AddHighlightTriggerColumn(store);
5288 AddHighlightInsertAndUpdateTrigger(store);
5289 AddHighlightIndex(store);
5290 }
5291
5292 if (oldVersion < VERSION_ALTER_THUMBNAIL_VISIBLE) {
5293 AlterThumbnailVisible(store);
5294 }
5295
5296 if (oldVersion < VERSION_ADD_HIGHLIGHT_VIDEO_COUNT_CAN_PACK) {
5297 AddHighlightVideoCountCanPack(store);
5298 }
5299
5300 if (oldVersion < VERSION_ADD_GEO_DEFAULT_VALUE) {
5301 AddGeoDefaultValue(store);
5302 }
5303
5304 if (oldVersion < VERSION_HDR_AND_CLOUD_ENHANCEMENT_FIX) {
5305 AddDynamicRangeColumnsFix(store);
5306 AddCloudEnhanceColumnsFix(store);
5307 }
5308
5309 if (oldVersion < VERSION_THUMBNAIL_READY_FIX) {
5310 AddThumbnailReadyColumnsFix(store);
5311 }
5312
5313 if (oldVersion < VERSION_UPDATE_SOURCE_PHOTO_ALBUM_TRIGGER) {
5314 UpdateSourcePhotoAlbumTrigger(store);
5315 }
5316
5317 if (oldVersion < VERSION_UPDATE_SEARCH_STATUS_TRIGGER_FOR_OWNER_ALBUM_ID) {
5318 UpdateSearchStatusTriggerForOwnerAlbumId(store);
5319 }
5320
5321 if (oldVersion < VERSION_ADD_CHECK_FLAG) {
5322 AddCheckFlag(store);
5323 }
5324
5325 if (oldVersion < VERSION_ADD_HIGHLIGHT_ANALYSIS_PROGRESS) {
5326 AddHighlightAnalysisProgress(store);
5327 }
5328
5329 if (oldVersion < VERSION_FIX_SOURCE_PHOTO_ALBUM_DATE_MODIFIED) {
5330 UpdateSourcePhotoAlbumTrigger(store);
5331 }
5332
5333 if (oldVersion < VERSION_ADD_REFRESH_ALBUM_STATUS_COLUMN) {
5334 AddRefreshAlbumStatusColumn(store);
5335 }
5336
5337 if (oldVersion < VERSION_FIX_SOURCE_ALBUM_UPDATE_TRIGGER_TO_USE_LPATH) {
5338 FixSourceAlbumUpdateTriggerToUseLPath(store);
5339 }
5340
5341 UpgradeExtensionPart5(store, oldVersion);
5342 }
5343
UpgradeExtensionPart3(RdbStore & store,int32_t oldVersion)5344 static void UpgradeExtensionPart3(RdbStore &store, int32_t oldVersion)
5345 {
5346 if (oldVersion < VERSION_CLOUD_ENAHCNEMENT) {
5347 AddCloudEnhancementColumns(store);
5348 }
5349
5350 if (oldVersion < VERSION_UPDATE_MDIRTY_TRIGGER_FOR_UPLOADING_MOVING_PHOTO) {
5351 UpdatePhotosMdirtyTrigger(store);
5352 }
5353
5354 if (oldVersion < VERSION_ADD_INDEX_FOR_FILEID) {
5355 AddIndexForFileId(store);
5356 }
5357
5358 if (oldVersion < VERSION_ADD_OCR_CARD_COLUMNS) {
5359 AddOCRCardColumns(store);
5360 }
5361
5362 if (oldVersion < VERSION_UPDATE_AOI) {
5363 UpdateAOI(store);
5364 }
5365
5366 if (oldVersion < VERSION_UPDATE_VIDEO_FACE_TABLE) {
5367 UpdateVideoFaceTable(store);
5368 }
5369
5370 if (oldVersion < VERSION_ADD_SUPPORTED_WATERMARK_TYPE) {
5371 AddSupportedWatermarkType(store);
5372 }
5373
5374 if (oldVersion < VERSION_FIX_PHOTO_SCHPT_MEDIA_TYPE_INDEX) {
5375 FixPhotoSchptMediaTypeIndex(store);
5376 }
5377
5378 if (oldVersion < VERSION_ADD_ANALYSIS_ALBUM_TOTAL_TABLE) {
5379 AddAnalysisAlbumTotalTable(store);
5380 }
5381
5382 if (oldVersion < VERSION_ADD_THUMBNAIL_VISIBLE) {
5383 AddThumbnailVisible(store);
5384 }
5385
5386 if (oldVersion < VERSION_ADD_METARECOVERY) {
5387 AddMetaRecovery(store);
5388 }
5389 if (oldVersion < VERSION_UPDATE_SEARCH_INDEX_TRIGGER_FOR_CLEAN_FLAG) {
5390 UpdateSearchIndexTriggerForCleanFlag(store);
5391 }
5392 if (oldVersion < VERSION_ADD_COVER_PLAY_SERVICE_VERSION) {
5393 AddCoverPlayVersionColumns(store);
5394 }
5395 if (oldVersion < VERSION_ADD_HIGHLIGHT_MAP_TABLES) {
5396 AddHighlightMapTable(store);
5397 }
5398
5399 if (oldVersion < VERSION_COMPAT_LIVE_PHOTO) {
5400 CompatLivePhoto(store, oldVersion);
5401 }
5402
5403 UpgradeExtensionPart4(store, oldVersion);
5404 }
5405
UpgradeExtensionPart2(RdbStore & store,int32_t oldVersion)5406 static void UpgradeExtensionPart2(RdbStore &store, int32_t oldVersion)
5407 {
5408 if (oldVersion < VERSION_UPDATE_PHOTO_INDEX_FOR_ALBUM_COUNT_COVER) {
5409 UpdateIndexForAlbumQuery(store);
5410 }
5411
5412 if (oldVersion < VERSION_UPDATE_VIDEO_LABEL_TABLE_FOR_SUB_LABEL_TYPE) {
5413 UpdateVideoLabelTableForSubLabelType(store);
5414 }
5415
5416 // VERSION_UPGRADE_THUMBNAIL move to HandleUpgradeRdbAsync()
5417
5418 if (oldVersion < VISION_UPDATE_DATA_ADDED_INDEX) {
5419 UpdateDataAddedIndexWithFileId(store);
5420 }
5421
5422 if (oldVersion < VISION_UPDATE_SEARCH_INDEX_TRIGGER) {
5423 UpdateSearchIndexTrigger(store);
5424 }
5425
5426 if (oldVersion < VISION_UPDATE_MULTI_CROP_INFO) {
5427 UpdateMultiCropInfo(store);
5428 }
5429
5430 if (oldVersion < VISION_ADD_ORIGINAL_SUBTYPE) {
5431 AddOriginalSubtype(store);
5432 }
5433
5434 // VERSION_UPDATE_BURST_DIRTY = 106 move to UpgradeRdbStoreAsync(), avoid to cost for long time.
5435
5436 if (oldVersion < VERSION_UDAPTE_DATA_UNIQUE) {
5437 UpdateDataUniqueIndex(store);
5438 }
5439
5440 if (oldVersion < VERSION_ADD_DETAIL_TIME) {
5441 AddDetailTimeToPhotos(store);
5442 }
5443
5444 if (oldVersion < VERSION_ADD_VIDEO_FACE_TABLE) {
5445 AddVideoFaceTable(store);
5446 }
5447
5448 if (oldVersion < VERSION_ADD_OWNER_ALBUM_ID) {
5449 AddOwnerAlbumIdAndRefractorTrigger(store);
5450 AlbumPluginTableEventHandler albumPluginTableEventHandler;
5451 albumPluginTableEventHandler.OnUpgrade(store, oldVersion, oldVersion);
5452 AddMergeInfoColumnForAlbum(store);
5453 MEDIA_INFO_LOG("ALBUM_FUSE: set album fuse upgrade status");
5454 MediaLibraryAlbumFusionUtils::SetAlbumFuseUpgradeStatus(0);
5455 }
5456
5457 UpgradeExtensionPart3(store, oldVersion);
5458 // !! Do not add upgrade code here !!
5459 }
5460
UpgradeExtensionPart1(RdbStore & store,int32_t oldVersion)5461 static void UpgradeExtensionPart1(RdbStore &store, int32_t oldVersion)
5462 {
5463 if (oldVersion < VERSION_ADD_OWNER_APPID_TO_FILES_TABLE) {
5464 AddOwnerAppIdToFiles(store);
5465 }
5466
5467 if (oldVersion < VERSION_ADD_IS_TEMP_TO_TRIGGER) {
5468 AddIsTempToTrigger(store);
5469 }
5470
5471 if (oldVersion < VERSION_UPDATE_ANALYSIS_TABLES) {
5472 UpdateAnalysisTables(store);
5473 }
5474
5475 if (oldVersion < VERSION_UPDATE_PHOTO_THUMBNAIL_READY) {
5476 UpdateThumbnailReadyColumn(store);
5477 }
5478
5479 if (oldVersion < VERSION_ADD_FRONT_CAMERA_TYPE) {
5480 AddFrontCameraType(store);
5481 }
5482
5483 if (oldVersion < PHOTOS_CREATE_DISPLAYNAME_INDEX) {
5484 AddDisplayNameIndex(store);
5485 }
5486
5487 if (oldVersion < VERSION_PORTRAIT_COVER_SELECTION_ADD_COLUMNS) {
5488 AddPortraitCoverSelectionColumn(store);
5489 }
5490
5491 if (oldVersion < VERSION_ADD_BURST_COVER_LEVEL_AND_BURST_KEY) {
5492 AddBurstCoverLevelAndBurstKey(store);
5493 }
5494
5495 if (oldVersion < VERSION_ADD_COVER_POSITION) {
5496 AddCoverPosition(store);
5497 }
5498
5499 if (oldVersion < VERSION_ADD_SCHPT_READY_INEDX) {
5500 AddSchptReadyIndex(store);
5501 }
5502
5503 if (oldVersion < VERSION_UPDATE_PORTRAIT_COVER_SELECTION_COLUMNS) {
5504 UpdatePortraitCoverSelectionColumns(store);
5505 }
5506
5507 if (oldVersion < VERSION_ADD_APP_URI_PERMISSION_INFO) {
5508 AddAppUriPermissionInfo(store);
5509 }
5510
5511 if (oldVersion < VERSION_UPDATE_SOURCE_ALBUM_AND_ALBUM_BUNDLENAME_TRIGGERS) {
5512 UpdateSourceAlbumAndAlbumBundlenameTriggers(store);
5513 }
5514
5515 // VERSION_CREATE_BURSTKEY_INDEX = 98 move to UpgradeRdbStoreAsync(), avoid to cost for long time.
5516
5517 UpgradeExtensionPart2(store, oldVersion);
5518 // !! Do not add upgrade code here !!
5519 }
5520
CreatePhotosExtTable(RdbStore & store)5521 static void CreatePhotosExtTable(RdbStore &store)
5522 {
5523 static const vector<string> executeSqlStrs = {
5524 PhotoExtColumn::CREATE_PHOTO_EXT_TABLE
5525 };
5526 MEDIA_INFO_LOG("Start create photo ext table in update");
5527 ExecSqls(executeSqlStrs, store);
5528 }
5529
UpgradeExtension(RdbStore & store,int32_t oldVersion)5530 static void UpgradeExtension(RdbStore &store, int32_t oldVersion)
5531 {
5532 if (oldVersion < VERSION_ADD_STOYR_TABLE) {
5533 AddStoryTables(store);
5534 }
5535
5536 if (oldVersion < VERSION_UPDATE_HIGHLIGHT_TABLE) {
5537 UpdateHighlightTables(store);
5538 }
5539
5540 if (oldVersion < VERSION_UPDATE_SEARCH_INDEX) {
5541 UpdatePhotosSearchUpdateTrigger(store);
5542 }
5543
5544 if (oldVersion < VERSION_UPDATE_HIGHLIGHT_COVER_TABLE) {
5545 UpdateHighlightCoverTables(store);
5546 }
5547
5548 if (oldVersion < VERSION_CREATE_PHOTOS_EXT_TABLE) {
5549 CreatePhotosExtTable(store);
5550 }
5551
5552 if (oldVersion < VERSION_UPDATE_VIDEO_LABEL_TABEL) {
5553 UpdateVideoLabelTable(store);
5554 }
5555
5556 if (oldVersion < VERSION_ADD_FACE_OCCLUSION_AND_POSE_TYPE_COLUMN) {
5557 AddFaceOcclusionAndPoseTypeColumn(store);
5558 }
5559
5560 if (oldVersion < VERSION_UPDATE_PHOTO_ALBUM_BUNDLENAME) {
5561 UpdateInsertPhotoUpdateAlbumTrigger(store);
5562 }
5563
5564 if (oldVersion < VERSION_UPDATE_PHOTO_ALBUM_TIGGER) {
5565 UpdatePhotoAlbumTigger(store);
5566 }
5567
5568 if (oldVersion < VERSION_ADD_THUMB_LCD_SIZE_COLUMN) {
5569 AddLcdAndThumbSizeColumns(store);
5570 }
5571
5572 if (oldVersion < VERSION_UPDATE_HIGHLIGHT_TABLE_PRIMARY_KEY) {
5573 UpdateHighlightTablePrimaryKey(store);
5574 }
5575
5576 if (oldVersion < VERSION_ADD_MOVING_PHOTO_EFFECT_MODE) {
5577 AddMovingPhotoEffectMode(store);
5578 }
5579
5580 if (oldVersion < VERSION_UPDATE_VISION_TRIGGER_FOR_VIDEO_LABEL) {
5581 UpdateVisionTriggerForVideoLabel(store);
5582 }
5583
5584 if (oldVersion < VERSION_ADD_IS_TEMP) {
5585 AddIsTemp(store);
5586 }
5587
5588 UpgradeExtensionPart1(store, oldVersion);
5589 // !! Do not add upgrade code here !!
5590 }
5591
AddVisionColumnSearchTag(RdbStore & store,int32_t oldVersion)5592 static void AddVisionColumnSearchTag(RdbStore &store, int32_t oldVersion)
5593 {
5594 if (oldVersion < VERSION_ADD_SEARCH_TAG) {
5595 vector<string> upgradeSqls = {
5596 BaseColumn::AlterTableAddTextColumn(VISION_LABEL_TABLE, SEARCH_TAG_TYPE),
5597 BaseColumn::AlterTableAddBlobColumn(VISION_LABEL_TABLE, SEARCH_TAG_TYPE),
5598 };
5599 ExecSqls(upgradeSqls, store);
5600 }
5601 }
5602
OnUpgrade(RdbStore & store,int32_t oldVersion,int32_t newVersion)5603 int32_t MediaLibraryDataCallBack::OnUpgrade(RdbStore &store, int32_t oldVersion, int32_t newVersion)
5604 {
5605 MediaLibraryTracer tracer;
5606 tracer.Start("MediaLibraryDataCallBack::OnUpgrade");
5607 if (MediaLibraryRdbStore::GetOldVersion() == -1) {
5608 MediaLibraryRdbStore::SetOldVersion(oldVersion);
5609 }
5610 MEDIA_INFO_LOG("OnUpgrade old:%{public}d, new:%{public}d", oldVersion, newVersion);
5611 g_upgradeErr = false;
5612 if (oldVersion < VERSION_ADD_CLOUD) {
5613 VersionAddCloud(store);
5614 }
5615
5616 if (oldVersion < VERSION_ADD_META_MODIFED) {
5617 AddMetaModifiedColumn(store);
5618 }
5619
5620 if (oldVersion < VERSION_MODIFY_SYNC_STATUS) {
5621 ModifySyncStatus(store);
5622 }
5623
5624 if (oldVersion < VERSION_ADD_API10_TABLE) {
5625 API10TableCreate(store);
5626 }
5627
5628 if (oldVersion < VERSION_MODIFY_DELETE_TRIGGER) {
5629 ModifyDeleteTrigger(store);
5630 }
5631
5632 if (oldVersion < VERSION_ADD_CLOUD_VERSION) {
5633 AddCloudVersion(store);
5634 }
5635
5636 if (oldVersion < VERSION_UPDATE_CLOUD_PATH) {
5637 UpdateCloudPath(store);
5638 }
5639
5640 if (oldVersion < VERSION_UPDATE_API10_TABLE) {
5641 UpdateAPI10Table(store);
5642 }
5643
5644 if (oldVersion < VERSION_ADD_TABLE_TYPE) {
5645 AddTableType(store);
5646 }
5647
5648 if (oldVersion < VERSION_ADD_PHOTO_CLEAN_FLAG_AND_THUMB_STATUS) {
5649 AddCleanFlagAndThumbStatus(store);
5650 }
5651
5652 if (oldVersion < VERSION_ADD_CLOUD_ID_INDEX) {
5653 AddCloudIndex(store);
5654 }
5655
5656 UpgradeOtherTable(store, oldVersion);
5657 UpgradeGalleryFeatureTable(store, oldVersion);
5658 UpgradeVisionTable(store, oldVersion);
5659 UpgradeExtendedVisionTable(store, oldVersion);
5660 UpgradeAlbumTable(store, oldVersion);
5661 UpgradeHistory(store, oldVersion);
5662 UpgradeExtension(store, oldVersion);
5663 UpgradeUriPermissionTable(store, oldVersion);
5664 UpgradeHighlightAlbumChange(store, oldVersion);
5665 AddVisionColumnSearchTag(store, oldVersion);
5666
5667 if (!g_upgradeErr) {
5668 VariantMap map = {{KEY_PRE_VERSION, oldVersion}, {KEY_AFTER_VERSION, newVersion}};
5669 PostEventUtils::GetInstance().PostStatProcess(StatType::DB_UPGRADE_STAT, map);
5670 }
5671 return NativeRdb::E_OK;
5672 }
5673
SetOldVersion(int32_t oldVersion)5674 void MediaLibraryRdbStore::SetOldVersion(int32_t oldVersion)
5675 {
5676 int32_t errCode;
5677 shared_ptr<NativePreferences::Preferences> prefs =
5678 NativePreferences::PreferencesHelper::GetPreferences(RDB_CONFIG, errCode);
5679 CHECK_AND_RETURN_LOG(prefs, "get preferences error: %{public}d", errCode);
5680 prefs->PutInt(RDB_OLD_VERSION, oldVersion);
5681 prefs->FlushSync();
5682 }
5683
GetOldVersion()5684 int32_t MediaLibraryRdbStore::GetOldVersion()
5685 {
5686 int32_t errCode;
5687 shared_ptr<NativePreferences::Preferences> prefs =
5688 NativePreferences::PreferencesHelper::GetPreferences(RDB_CONFIG, errCode);
5689 CHECK_AND_RETURN_RET_LOG(prefs, oldVersion_, "get preferences error: %{public}d", errCode);
5690 return prefs->GetInt(RDB_OLD_VERSION, oldVersion_);
5691 }
5692
HasColumnInTable(RdbStore & store,const string & columnName,const string & tableName)5693 bool MediaLibraryRdbStore::HasColumnInTable(RdbStore &store, const string &columnName, const string &tableName)
5694 {
5695 string querySql = "SELECT " + MEDIA_COLUMN_COUNT_1 + " FROM pragma_table_info('" + tableName + "') WHERE name = '" +
5696 columnName + "'";
5697 auto resultSet = store.QuerySql(querySql);
5698 bool cond = (resultSet == nullptr || resultSet->GoToFirstRow() != NativeRdb::E_OK);
5699 CHECK_AND_RETURN_RET_LOG(!cond, false, "Get column count failed");
5700
5701 int32_t count = GetInt32Val(MEDIA_COLUMN_COUNT_1, resultSet);
5702 MEDIA_DEBUG_LOG("%{private}s in %{private}s: %{public}d", columnName.c_str(), tableName.c_str(), count);
5703 return count > 0;
5704 }
5705
AddColumnIfNotExists(RdbStore & store,const string & columnName,const string & columnType,const string & tableName)5706 void MediaLibraryRdbStore::AddColumnIfNotExists(
5707 RdbStore &store, const string &columnName, const string &columnType, const string &tableName)
5708 {
5709 if (!HasColumnInTable(store, columnName, tableName)) {
5710 string sql = "ALTER TABLE " + tableName + " ADD COLUMN " + columnName + " " + columnType;
5711 ExecSqlWithRetry([&]() { return store.ExecuteSql(sql); });
5712 }
5713 }
5714
Update(int & changedRows,const std::string & table,const ValuesBucket & row,const std::string & whereClause,const std::vector<std::string> & args)5715 int MediaLibraryRdbStore::Update(int &changedRows, const std::string &table, const ValuesBucket &row,
5716 const std::string &whereClause, const std::vector<std::string> &args)
5717 {
5718 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
5719 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5720 return ExecSqlWithRetry(
5721 [&]() { return MediaLibraryRdbStore::GetRaw()->Update(changedRows, table, row, whereClause, args); });
5722 }
5723
ObtainDistributedTableName(const std::string & device,const std::string & table,int & errCode)5724 std::string MediaLibraryRdbStore::ObtainDistributedTableName(const std::string &device, const std::string &table,
5725 int &errCode)
5726 {
5727 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), "",
5728 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5729 return MediaLibraryRdbStore::GetRaw()->ObtainDistributedTableName(device, table, errCode);
5730 }
5731
Backup(const std::string & databasePath,const std::vector<uint8_t> & encryptKey)5732 int MediaLibraryRdbStore::Backup(const std::string &databasePath, const std::vector<uint8_t> &encryptKey)
5733 {
5734 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
5735 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5736 return ExecSqlWithRetry([&]() { return MediaLibraryRdbStore::GetRaw()->Backup(databasePath, encryptKey); });
5737 }
5738
Backup(const std::string & databasePath,bool integrityCheck,const std::vector<uint8_t> & encryptKey)5739 int MediaLibraryRdbStore::Backup(const std::string &databasePath, bool integrityCheck,
5740 const std::vector<uint8_t> &encryptKey)
5741 {
5742 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
5743 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5744 return ExecSqlWithRetry([&]() {
5745 return MediaLibraryRdbStore::GetRaw()->Backup(databasePath, encryptKey, integrityCheck);
5746 });
5747 }
5748
Sync(const DistributedRdb::SyncOption & option,const AbsRdbPredicates & predicate,const DistributedRdb::AsyncBrief & async)5749 int MediaLibraryRdbStore::Sync(const DistributedRdb::SyncOption &option, const AbsRdbPredicates &predicate,
5750 const DistributedRdb::AsyncBrief &async)
5751 {
5752 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
5753 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5754 return ExecSqlWithRetry([&]() { return MediaLibraryRdbStore::GetRaw()->Sync(option, predicate, async); });
5755 }
5756
QueryByStep(const std::string & sql,const std::vector<ValueObject> & args)5757 std::shared_ptr<NativeRdb::ResultSet> MediaLibraryRdbStore::QueryByStep(const std::string &sql,
5758 const std::vector<ValueObject> &args)
5759 {
5760 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), nullptr,
5761 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5762 return MediaLibraryRdbStore::GetRaw()->QueryByStep(sql, args);
5763 }
5764
QueryByStep(const AbsRdbPredicates & predicates,const std::vector<std::string> & columns)5765 std::shared_ptr<NativeRdb::ResultSet> MediaLibraryRdbStore::QueryByStep(const AbsRdbPredicates &predicates,
5766 const std::vector<std::string> &columns)
5767 {
5768 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), nullptr,
5769 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5770 return MediaLibraryRdbStore::GetRaw()->QueryByStep(predicates, columns);
5771 }
5772
Update(int & changedRows,const ValuesBucket & row,const AbsRdbPredicates & predicates)5773 int MediaLibraryRdbStore::Update(int &changedRows, const ValuesBucket &row, const AbsRdbPredicates &predicates)
5774 {
5775 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
5776 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5777 return ExecSqlWithRetry([&]() { return MediaLibraryRdbStore::GetRaw()->Update(changedRows, row, predicates); });
5778 }
5779
Insert(int64_t & outRowId,const std::string & table,ValuesBucket & row)5780 int MediaLibraryRdbStore::Insert(int64_t &outRowId, const std::string &table, ValuesBucket &row)
5781 {
5782 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
5783 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5784 if (table == PhotoColumn::PHOTOS_TABLE) {
5785 AddDefaultPhotoValues(row);
5786 }
5787 return ExecSqlWithRetry([&]() { return MediaLibraryRdbStore::GetRaw()->Insert(outRowId, table, row); });
5788 }
5789
Delete(int & deletedRows,const std::string & table,const std::string & whereClause,const std::vector<std::string> & args)5790 int MediaLibraryRdbStore::Delete(int &deletedRows, const std::string &table, const std::string &whereClause,
5791 const std::vector<std::string> &args)
5792 {
5793 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
5794 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5795 return ExecSqlWithRetry(
5796 [&]() { return MediaLibraryRdbStore::GetRaw()->Delete(deletedRows, table, whereClause, args); });
5797 }
5798
Delete(int & deletedRows,const AbsRdbPredicates & predicates)5799 int MediaLibraryRdbStore::Delete(int &deletedRows, const AbsRdbPredicates &predicates)
5800 {
5801 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
5802 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5803 return ExecSqlWithRetry([&]() { return MediaLibraryRdbStore::GetRaw()->Delete(deletedRows, predicates); });
5804 }
5805
BatchInsert(const string & table,vector<ValuesBucket> & values,const string & returningField)5806 pair<int32_t, NativeRdb::Results> MediaLibraryRdbStore::BatchInsert(const string &table,
5807 vector<ValuesBucket> &values, const string &returningField)
5808 {
5809 DfxTimer dfxTimer(DfxType::RDB_BATCHINSERT, INVALID_DFX, RDB_TIME_OUT, false);
5810 MediaLibraryTracer tracer;
5811 tracer.Start("MediaLibraryRdbStore::BatchInsert");
5812 if (!MediaLibraryRdbStore::CheckRdbStore()) {
5813 MEDIA_ERR_LOG("Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5814 return {E_HAS_DB_ERROR, -1};
5815 }
5816 if (table == PhotoColumn::PHOTOS_TABLE) {
5817 for (auto& value : values) {
5818 AddDefaultPhotoValues(value);
5819 }
5820 }
5821
5822 ValuesBuckets refRows;
5823 for (auto &value : values) {
5824 refRows.Put(value);
5825 }
5826
5827 pair<int32_t, NativeRdb::Results> retWithResults = {E_HAS_DB_ERROR, -1};
5828 int32_t ret = ExecSqlWithRetry([&]() {
5829 retWithResults = MediaLibraryRdbStore::GetRaw()->BatchInsert(table, values, { returningField });
5830 return retWithResults.first;
5831 });
5832 if (ret != NativeRdb::E_OK) {
5833 MEDIA_ERR_LOG("rdbStore_->BatchInsert failed, ret = %{public}d", ret);
5834 MediaLibraryRestore::GetInstance().CheckRestore(ret);
5835 return {E_HAS_DB_ERROR, -1};
5836 }
5837
5838 MEDIA_DEBUG_LOG("rdbStore_->BatchInsert end, ret = %{public}d", ret);
5839 return retWithResults;
5840 }
5841
Execute(const std::string & sql,const std::vector<NativeRdb::ValueObject> & args,const std::string & returningField)5842 pair<int32_t, NativeRdb::Results> MediaLibraryRdbStore::Execute(const std::string &sql,
5843 const std::vector<NativeRdb::ValueObject> &args, const std::string &returningField)
5844 {
5845 pair<int32_t, NativeRdb::Results> retWithResults = {E_HAS_DB_ERROR, -1};
5846 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), retWithResults,
5847 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5848 DfxTimer dfxTimer(RDB_EXECUTE_SQL, INVALID_DFX, RDB_TIME_OUT, false);
5849 MediaLibraryTracer tracer;
5850 tracer.Start("RdbStore->ExecuteSql");
5851
5852 string execSql = sql;
5853 execSql.append(" returning ").append(returningField);
5854 MEDIA_INFO_LOG("AccurateRefresh, sql:%{public}s", execSql.c_str());
5855 int32_t ret = ExecSqlWithRetry([&]() {
5856 retWithResults = MediaLibraryRdbStore::GetRaw()->ExecuteExt(execSql, args);
5857 return retWithResults.first;
5858 });
5859 if (ret != NativeRdb::E_OK) {
5860 MEDIA_ERR_LOG("rdbStore_->ExecuteSql failed, ret = %{public}d", ret);
5861 MediaLibraryRestore::GetInstance().CheckRestore(ret);
5862 return {E_HAS_DB_ERROR, -1};
5863 }
5864 return retWithResults;
5865 }
5866
Update(const ValuesBucket & row,const AbsRdbPredicates & predicates,const string & returningField)5867 pair<int32_t, NativeRdb::Results> MediaLibraryRdbStore::Update(const ValuesBucket &row,
5868 const AbsRdbPredicates &predicates, const string &returningField)
5869 {
5870 pair<int32_t, NativeRdb::Results> retWithResults = {E_HAS_DB_ERROR, -1};
5871 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), retWithResults,
5872 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5873
5874 ExecSqlWithRetry([&]() {
5875 retWithResults = MediaLibraryRdbStore::GetRaw()->Update(row, predicates, { returningField });
5876 return retWithResults.first;
5877 });
5878
5879 return retWithResults;
5880 }
5881
Delete(const AbsRdbPredicates & predicates,const string & returningField)5882 pair<int32_t, NativeRdb::Results> MediaLibraryRdbStore::Delete(const AbsRdbPredicates &predicates,
5883 const string &returningField)
5884 {
5885 pair<int32_t, NativeRdb::Results> retWithResults = {E_HAS_DB_ERROR, -1};
5886 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), retWithResults,
5887 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5888
5889 ExecSqlWithRetry([&]() {
5890 retWithResults = MediaLibraryRdbStore::GetRaw()->Delete(predicates, { returningField });
5891 return retWithResults.first;
5892 });
5893 return retWithResults;
5894 }
5895
Query(const NativeRdb::AbsRdbPredicates & predicates,const std::vector<std::string> & columns)5896 std::shared_ptr<NativeRdb::ResultSet> MediaLibraryRdbStore::Query(const NativeRdb::AbsRdbPredicates &predicates,
5897 const std::vector<std::string> &columns)
5898 {
5899 MediaLibraryTracer tracer;
5900 tracer.Start("MediaLibraryRdbStore::Query");
5901 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), nullptr,
5902 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5903 return MediaLibraryRdbStore::GetRaw()->Query(predicates, columns);
5904 }
5905
QuerySql(const std::string & sql,const std::vector<ValueObject> & args)5906 std::shared_ptr<AbsSharedResultSet> MediaLibraryRdbStore::QuerySql(const std::string &sql,
5907 const std::vector<ValueObject> &args)
5908 {
5909 MediaLibraryTracer tracer;
5910 tracer.Start("MediaLibraryRdbStore::QuerySql");
5911 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), nullptr,
5912 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5913 return MediaLibraryRdbStore::GetRaw()->QuerySql(sql, args);
5914 }
5915
InterruptBackup()5916 int MediaLibraryRdbStore::InterruptBackup()
5917 {
5918 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
5919 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5920 return ExecSqlWithRetry([&]() { return MediaLibraryRdbStore::GetRaw()->InterruptBackup(); });
5921 }
5922
IsSlaveDiffFromMaster() const5923 bool MediaLibraryRdbStore::IsSlaveDiffFromMaster() const
5924 {
5925 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), false,
5926 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5927 return MediaLibraryRdbStore::GetRaw()->IsSlaveDiffFromMaster();
5928 }
5929
Restore(const std::string & backupPath,const std::vector<uint8_t> & newKey)5930 int MediaLibraryRdbStore::Restore(const std::string &backupPath, const std::vector<uint8_t> &newKey)
5931 {
5932 CHECK_AND_RETURN_RET_LOG(MediaLibraryRdbStore::CheckRdbStore(), E_HAS_DB_ERROR,
5933 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5934 return ExecSqlWithRetry([&]() { return MediaLibraryRdbStore::GetRaw()->Restore(backupPath, newKey); });
5935 }
5936
DataCallBackOnCreate()5937 int32_t MediaLibraryRdbStore::DataCallBackOnCreate()
5938 {
5939 MediaLibraryDataCallBack callback;
5940 int32_t ret = callback.OnCreate(*GetRaw());
5941 CHECK_AND_PRINT_LOG(ret == NativeRdb::E_OK,
5942 "MediaLibraryDataCallBack OnCreate error, ret: %{public}d", ret);
5943 return ret;
5944 }
5945
WalCheckPoint()5946 void MediaLibraryRdbStore::WalCheckPoint()
5947 {
5948 std::unique_lock<std::mutex> lock(walCheckPointMutex_, std::defer_lock);
5949 if (!lock.try_lock()) {
5950 MEDIA_WARN_LOG("wal_checkpoint in progress, skip this operation");
5951 return;
5952 }
5953
5954 struct stat fileStat;
5955 const std::string walFile = MEDIA_DB_DIR + "/rdb/media_library.db-wal";
5956 if (stat(walFile.c_str(), &fileStat) < 0) {
5957 CHECK_AND_PRINT_LOG(errno == ENOENT, "wal_checkpoint stat failed, errno: %{public}d", errno);
5958 return;
5959 }
5960 ssize_t size = fileStat.st_size;
5961 CHECK_AND_RETURN_LOG(size >= 0, "Invalid size for wal_checkpoint, size: %{public}zd", size);
5962 CHECK_AND_RETURN(size > RDB_CHECK_WAL_SIZE);
5963
5964 auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
5965 CHECK_AND_RETURN_LOG(rdbStore != nullptr, "wal_checkpoint rdbStore is nullptr!");
5966
5967 auto errCode = rdbStore->ExecuteSql("PRAGMA wal_checkpoint(TRUNCATE)");
5968 CHECK_AND_PRINT_LOG(errCode == NativeRdb::E_OK, "wal_checkpoint ExecuteSql failed, errCode: %{public}d", errCode);
5969 }
5970
ExecuteForChangedRowCount(int64_t & outValue,const std::string & sql,const std::vector<NativeRdb::ValueObject> & args)5971 int MediaLibraryRdbStore::ExecuteForChangedRowCount(int64_t &outValue, const std::string &sql,
5972 const std::vector<NativeRdb::ValueObject> &args)
5973 {
5974 CHECK_AND_RETURN_RET_LOG(CheckRdbStore(), E_HAS_DB_ERROR,
5975 "Pointer rdbStore_ is nullptr. Maybe it didn't init successfully.");
5976 return ExecSqlWithRetry([&]() { return GetRaw()->ExecuteForChangedRowCount(outValue, sql, args); });
5977 }
5978 } // namespace OHOS::Media
5979