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