• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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