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