• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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 
16 #include "media_column.h"
17 
18 #include <string>
19 #include <vector>
20 
21 #include "base_column.h"
22 #include "medialibrary_db_const.h"
23 #include "media_log.h"
24 #include "userfile_manager_types.h"
25 
26 namespace OHOS {
27 namespace Media {
28 using namespace std;
29 
30 const std::string MediaColumn::MEDIA_ID = "file_id";
31 const std::string MediaColumn::MEDIA_FILE_PATH = "data";
32 const std::string MediaColumn::MEDIA_SIZE = "size";
33 const std::string MediaColumn::MEDIA_TITLE = "title";
34 const std::string MediaColumn::MEDIA_NAME = "display_name";
35 const std::string MediaColumn::MEDIA_TYPE = "media_type";
36 const std::string MediaColumn::MEDIA_MIME_TYPE = "mime_type";
37 const std::string MediaColumn::MEDIA_OWNER_PACKAGE = "owner_package";
38 const std::string MediaColumn::MEDIA_OWNER_APPID = "owner_appid";
39 const std::string MediaColumn::MEDIA_PACKAGE_NAME = "package_name";
40 const std::string MediaColumn::MEDIA_DEVICE_NAME = "device_name";
41 const std::string MediaColumn::MEDIA_DATE_MODIFIED = "date_modified";
42 const std::string MediaColumn::MEDIA_DATE_ADDED = "date_added";
43 const std::string MediaColumn::MEDIA_DATE_TAKEN = "date_taken";
44 const std::string MediaColumn::MEDIA_DURATION = "duration";
45 const std::string MediaColumn::MEDIA_TIME_PENDING = "time_pending";
46 const std::string MediaColumn::MEDIA_IS_FAV = "is_favorite";
47 const std::string MediaColumn::MEDIA_DATE_TRASHED = "date_trashed";
48 const std::string MediaColumn::MEDIA_DATE_DELETED = "date_deleted";
49 const std::string MediaColumn::MEDIA_HIDDEN = "hidden";
50 const std::string MediaColumn::MEDIA_PARENT_ID = "parent";
51 const std::string MediaColumn::MEDIA_RELATIVE_PATH = "relative_path";
52 const std::string MediaColumn::MEDIA_VIRTURL_PATH = "virtual_path";
53 const std::set<std::string> MediaColumn::MEDIA_COLUMNS = {
54     MEDIA_ID, MEDIA_FILE_PATH, MEDIA_SIZE, MEDIA_TITLE, MEDIA_NAME, MEDIA_TYPE, MEDIA_MIME_TYPE,
55     MEDIA_OWNER_PACKAGE, MEDIA_OWNER_APPID, MEDIA_PACKAGE_NAME, MEDIA_DEVICE_NAME, MEDIA_DATE_MODIFIED,
56     MEDIA_DATE_ADDED, MEDIA_DATE_TAKEN, MEDIA_DURATION, MEDIA_TIME_PENDING, MEDIA_IS_FAV, MEDIA_DATE_TRASHED,
57     MEDIA_DATE_DELETED, MEDIA_HIDDEN, MEDIA_PARENT_ID, MEDIA_RELATIVE_PATH, MEDIA_VIRTURL_PATH
58 };
59 const std::set<std::string> MediaColumn::DEFAULT_FETCH_COLUMNS = {
60     MEDIA_ID, MEDIA_FILE_PATH, MEDIA_NAME, MEDIA_TYPE
61 };
62 
63 const std::string PhotoColumn::PHOTO_DIRTY = "dirty";
64 const std::string PhotoColumn::PHOTO_CLOUD_ID = "cloud_id";
65 const std::string PhotoColumn::PHOTO_META_DATE_MODIFIED = "meta_date_modified";
66 const std::string PhotoColumn::PHOTO_SYNC_STATUS = "sync_status";
67 const std::string PhotoColumn::PHOTO_CLOUD_VERSION = "cloud_version";
68 const std::string PhotoColumn::PHOTO_ORIENTATION = "orientation";
69 const std::string PhotoColumn::PHOTO_LATITUDE = "latitude";
70 const std::string PhotoColumn::PHOTO_LONGITUDE = "longitude";
71 const std::string PhotoColumn::PHOTO_HEIGHT = "height";
72 const std::string PhotoColumn::PHOTO_WIDTH = "width";
73 const std::string PhotoColumn::PHOTO_LCD_VISIT_TIME = "lcd_visit_time";
74 const std::string PhotoColumn::PHOTO_EDIT_TIME = "edit_time";
75 const std::string PhotoColumn::PHOTO_POSITION = "position";
76 const std::string PhotoColumn::PHOTO_SUBTYPE = "subtype";
77 const std::string PhotoColumn::CAMERA_SHOT_KEY = "camera_shot_key";
78 const std::string PhotoColumn::PHOTO_USER_COMMENT = "user_comment";
79 const std::string PhotoColumn::PHOTO_SHOOTING_MODE = "shooting_mode";
80 const std::string PhotoColumn::PHOTO_SHOOTING_MODE_TAG = "shooting_mode_tag";
81 const std::string PhotoColumn::PHOTO_ALL_EXIF = "all_exif";
82 const std::string PhotoColumn::PHOTO_DATE_YEAR = "date_year";
83 const std::string PhotoColumn::PHOTO_DATE_MONTH = "date_month";
84 const std::string PhotoColumn::PHOTO_DATE_DAY = "date_day";
85 const std::string PhotoColumn::PHOTO_LAST_VISIT_TIME = "last_visit_time";
86 const std::string PhotoColumn::PHOTO_HIDDEN_TIME = "hidden_time";
87 const std::string PhotoColumn::PHOTO_THUMB_STATUS = "thumb_status";
88 const std::string PhotoColumn::PHOTO_CLEAN_FLAG = "clean_flag";
89 const std::string PhotoColumn::PHOTO_ID = "photo_id";
90 const std::string PhotoColumn::PHOTO_QUALITY = "photo_quality";
91 const std::string PhotoColumn::PHOTO_FIRST_VISIT_TIME = "first_visit_time";
92 const std::string PhotoColumn::PHOTO_DEFERRED_PROC_TYPE = "deferred_proc_type";
93 const std::string PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE = "dynamic_range_type";
94 const std::string PhotoColumn::MOVING_PHOTO_EFFECT_MODE = "moving_photo_effect_mode";
95 const std::string PhotoColumn::PHOTO_LCD_SIZE = "lcd_size";
96 const std::string PhotoColumn::PHOTO_THUMB_SIZE = "thumb_size";
97 const std::string PhotoColumn::PHOTO_HAS_ASTC = "has_astc"; // This attribute has been replaced by "thumbnail_ready"
98 const std::string PhotoColumn::PHOTO_IS_TEMP = "is_temp";
99 const std::string PhotoColumn::PHOTO_THUMBNAIL_READY = "thumbnail_ready";
100 const std::string PhotoColumn::PHOTO_THUMBNAIL_VISIBLE = "thumbnail_visible";
101 const std::string PhotoColumn::PHOTO_FRONT_CAMERA = "front_camera";
102 const std::string PhotoColumn::PHOTO_BURST_COVER_LEVEL = "burst_cover_level";
103 const std::string PhotoColumn::PHOTO_BURST_KEY = "burst_key";
104 const std::string PhotoColumn::PHOTO_COVER_POSITION = "cover_position";
105 const std::string PhotoColumn::PHOTO_ORIGINAL_SUBTYPE = "original_subtype";
106 const std::string PhotoColumn::PHOTO_DETAIL_TIME = "detail_time";
107 const std::string PhotoColumn::PHOTO_OWNER_ALBUM_ID = "owner_album_id";
108 const std::string PhotoColumn::PHOTO_ORIGINAL_ASSET_CLOUD_ID = "original_asset_cloud_id";
109 const std::string PhotoColumn::PHOTO_SOURCE_PATH = "source_path";
110 const std::string PhotoColumn::PHOTO_CE_AVAILABLE = "ce_available";
111 const std::string PhotoColumn::PHOTO_CE_STATUS_CODE = "ce_status_code";
112 const std::string PhotoColumn::PHOTO_STRONG_ASSOCIATION = "strong_association";
113 const std::string PhotoColumn::PHOTO_ASSOCIATE_FILE_ID = "associate_file_id";
114 const std::string PhotoColumn::PHOTO_HAS_CLOUD_WATERMARK = "has_cloud_watermark";
115 const std::string PhotoColumn::SUPPORTED_WATERMARK_TYPE = "supported_watermark_type";
116 const std::string PhotoColumn::PHOTO_METADATA_FLAGS = "metadata_flags";
117 const std::string PhotoColumn::PHOTO_CHECK_FLAG = "check_flag";
118 const std::string PhotoColumn::STAGE_VIDEO_TASK_STATUS = "stage_video_task_status";
119 const std::string PhotoColumn::PHOTO_IS_AUTO = "is_auto";
120 const std::string PhotoColumn::PHOTO_MEDIA_SUFFIX = "media_suffix";
121 const std::string PhotoColumn::PHOTO_IS_RECENT_SHOW = "is_recent_show";
122 
123 const std::string PhotoColumn::PHOTO_CLOUD_ID_INDEX = "cloud_id_index";
124 const std::string PhotoColumn::PHOTO_DATE_YEAR_INDEX = "date_year_index";
125 const std::string PhotoColumn::PHOTO_DATE_MONTH_INDEX = "date_month_index";
126 const std::string PhotoColumn::PHOTO_DATE_DAY_INDEX = "date_day_index";
127 const std::string PhotoColumn::PHOTO_SCHPT_ADDED_INDEX = "idx_schpt_date_added";
128 // index of date_added for photo table
129 const std::string PhotoColumn::PHOTO_SCHPT_PHOTO_DATEADDED_INDEX = "idx_schpt_date_added_new";
130 const std::string PhotoColumn::PHOTO_SCHPT_ADDED_ALBUM_INDEX = "idx_schpt_date_added_album";
131 const std::string PhotoColumn::PHOTO_SCHPT_ALBUM_GENERAL_INDEX = "idx_schpt_album_general";
132 const std::string PhotoColumn::PHOTO_SCHPT_ALBUM_INDEX = "idx_schpt_album";
133 const std::string PhotoColumn::PHOTO_SCHPT_MEDIA_TYPE_INDEX = "idx_schpt_media_type";
134 const std::string PhotoColumn::PHOTO_SCHPT_DAY_INDEX = "idx_schpt_date_day";
135 const std::string PhotoColumn::PHOTO_HIDDEN_TIME_INDEX = "hidden_time_index";
136 const std::string PhotoColumn::PHOTO_SCHPT_HIDDEN_TIME_INDEX = "idx_schpt_hidden_time";
137 const std::string PhotoColumn::PHOTO_FAVORITE_INDEX = "idx_photo_is_favorite";
138 const std::string PhotoColumn::PHOTO_DISPLAYNAME_INDEX = "idx_display_name";
139 const std::string PhotoColumn::PHOTO_SCHPT_READY_INDEX = "idx_schpt_thumbnail_ready";
140 const std::string PhotoColumn::PHOTO_BURSTKEY_INDEX = "idx_burstkey";
141 const std::string PhotoColumn::PHOTO_SCHPT_MEDIA_TYPE_COUNT_READY_INDEX = "idx_schpt_media_type_ready";
142 const std::string PhotoColumn::PHOTO_SCHPT_DATE_YEAR_COUNT_READY_INDEX = "idx_schpt_date_year_ready";
143 const std::string PhotoColumn::PHOTO_SCHPT_DATE_MONTH_COUNT_READY_INDEX = "idx_schpt_date_month_ready";
144 const std::string PhotoColumn::PHOTO_SCHPT_CLOUD_ENHANCEMENT_ALBUM_INDEX = "idx_schpt_cloud_enhancement_album_index";
145 const std::string PhotoColumn::LATITUDE_INDEX = "idx_latitude";
146 const std::string PhotoColumn::LONGITUDE_INDEX = "idx_longtitude";
147 
148 const std::string PhotoColumn::PHOTO_DATE_YEAR_FORMAT = "%Y";
149 const std::string PhotoColumn::PHOTO_DATE_MONTH_FORMAT = "%Y%m";
150 const std::string PhotoColumn::PHOTO_DATE_DAY_FORMAT = "%Y%m%d";
151 const std::string PhotoColumn::PHOTO_DETAIL_TIME_FORMAT = "%Y:%m:%d %H:%M:%S";
152 
153 const std::string PhotoColumn::PHOTOS_TABLE = "Photos";
154 const std::string PhotoColumn::TAB_OLD_PHOTOS_TABLE = "tab_old_photos";
155 
156 const std::string PhotoColumn::FILES_CLOUD_DIR = "/storage/cloud/files/";
157 const std::string PhotoColumn::FILES_LOCAL_DIR = "/storage/media/local/files/";
158 
159 const std::string PhotoColumn::HIGHLIGHT_TABLE = "tab_analysis_video_label";
160 const std::string PhotoColumn::MEDIA_DATA_DB_HIGHLIGHT_TRIGGER = "trigger_generate_thumbnail";
161 
162 const std::string PhotoColumn::PHOTO_URI_PREFIX = "file://media/Photo/";
163 const std::string PhotoColumn::DEFAULT_PHOTO_URI = "file://media/Photo";
164 const std::string PhotoColumn::PHOTO_CACHE_URI_PREFIX = "file://media/Photo/cache/";
165 const std::string PhotoColumn::PHOTO_TYPE_URI = "/Photo";
166 const std::string PhotoColumn::HIGHTLIGHT_COVER_URI = "/highlight";
167 const std::string PhotoColumn::HIGHTLIGHT_URI = "/highlight/video";
168 
169 const std::string PhotoColumn::PHOTO_CLOUD_URI_PREFIX = "file://cloudsync/Photo/";
170 const std::string PhotoColumn::PHOTO_CLOUD_TRIGGER_PREFIX = "file://cloudsync/triggerGeneration/";
171 const std::string PhotoColumn::PHOTO_GALLERY_CLOUD_URI_PREFIX = "file://cloudsync/gallery/Photo/";
172 
173 const std::string PhotoColumn::PHOTO_HEIGHT_ERROR_URI_PREFIX = "file://cloudsync/Photo/HeightError/";
174 const std::string PhotoColumn::PHOTO_DOWNLOAD_SUCCEED_URI_PREFIX = "file://cloudsync/Photo/DownloadSucceed/";
175 
176 const std::string PhotoColumn::PHOTO_CLOUD_GALLERY_REBUILD_URI_PREFIX = "file:://cloudsync/gallery/rebuild/";
177 
178 const std::string PhotoColumn::PHOTO_REQUEST_PICTURE = "file://media/Photo/picture/";
179 const std::string PhotoColumn::PHOTO_REQUEST_PICTURE_BUFFER = "file://media/Photo/pictureBuffer/";
180 
181 const std::set<std::string> PhotoColumn::DEFAULT_FETCH_COLUMNS = {
182     PHOTO_SUBTYPE, PHOTO_BURST_KEY,
183 };
184 
185 const std::string PhotoColumn::CREATE_PHOTO_TABLE = "CREATE TABLE IF NOT EXISTS " +
186     PHOTOS_TABLE + " (" +
187     MEDIA_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
188     MEDIA_FILE_PATH + " TEXT, " +
189     MEDIA_SIZE + " BIGINT, " +
190     MEDIA_TITLE + " TEXT, " +
191     MEDIA_NAME + " TEXT, " +
192     MEDIA_TYPE + " INT, " +
193     MEDIA_MIME_TYPE + " TEXT, " +
194     MEDIA_OWNER_PACKAGE + " TEXT, " +
195     MEDIA_OWNER_APPID + " TEXT, " +
196     MEDIA_PACKAGE_NAME + " TEXT, " +
197     MEDIA_DEVICE_NAME + " TEXT, " +
198     MEDIA_DATE_ADDED + " BIGINT, " +
199     MEDIA_DATE_MODIFIED + " BIGINT, " +
200     MEDIA_DATE_TAKEN + " BIGINT DEFAULT 0, " +
201     MEDIA_DURATION + " INT, " +
202     MEDIA_TIME_PENDING + " BIGINT DEFAULT 0, " +
203     MEDIA_IS_FAV + " INT DEFAULT 0, " +
204     MEDIA_DATE_TRASHED + " BIGINT DEFAULT 0, " +
205     MEDIA_DATE_DELETED + " BIGINT DEFAULT 0, " +
206     MEDIA_HIDDEN + " INT DEFAULT 0, " +
207     MEDIA_PARENT_ID + " INT DEFAULT 0, " +
208     MEDIA_RELATIVE_PATH + " TEXT, " +
209     MEDIA_VIRTURL_PATH + " TEXT UNIQUE, " +
210     PHOTO_DIRTY + " INT DEFAULT 1, " +
211     PHOTO_CLOUD_ID + " TEXT, " +
212     PHOTO_META_DATE_MODIFIED + "  BIGINT DEFAULT 0, " +
213     PHOTO_SYNC_STATUS + "  INT DEFAULT 0, " +
214     PHOTO_CLOUD_VERSION + " BIGINT DEFAULT 0, " +
215     PHOTO_ORIENTATION + " INT DEFAULT 0, " +
216     PHOTO_LATITUDE + " DOUBLE DEFAULT 0, " +
217     PHOTO_LONGITUDE + " DOUBLE DEFAULT 0, " +
218     PHOTO_HEIGHT + " INT, " +
219     PHOTO_WIDTH + " INT, " +
220     PHOTO_EDIT_TIME + " BIGINT DEFAULT 0, " +
221     PHOTO_LCD_VISIT_TIME + " BIGINT DEFAULT 0, " +
222     PHOTO_POSITION + " INT DEFAULT 1, " +
223     PHOTO_SUBTYPE + " INT DEFAULT 0, " +
224     PHOTO_ORIGINAL_SUBTYPE + " INT," +
225     CAMERA_SHOT_KEY + " TEXT, " +
226     PHOTO_USER_COMMENT + " TEXT, " +
227     PHOTO_ALL_EXIF  + " TEXT, " +
228     PHOTO_DATE_YEAR + " TEXT, " +
229     PHOTO_DATE_MONTH + " TEXT, " +
230     PHOTO_DATE_DAY + " TEXT, " +
231     PHOTO_SHOOTING_MODE + " TEXT, " +
232     PHOTO_SHOOTING_MODE_TAG + " TEXT, " +
233     PHOTO_LAST_VISIT_TIME + " BIGINT DEFAULT 0, " +
234     PHOTO_HIDDEN_TIME + " BIGINT DEFAULT 0, " +
235     PHOTO_THUMB_STATUS + " INT DEFAULT 0, " +
236     PHOTO_CLEAN_FLAG + " INT DEFAULT 0, " +
237     PHOTO_ID + " TEXT, " +
238     PHOTO_QUALITY + " INT, " +
239     PHOTO_FIRST_VISIT_TIME + " BIGINT DEFAULT 0, " +
240     PHOTO_DEFERRED_PROC_TYPE + " INT DEFAULT 0, " +
241     PHOTO_DYNAMIC_RANGE_TYPE + " INT DEFAULT 0, " +
242     MOVING_PHOTO_EFFECT_MODE + " INT DEFAULT 0, " +
243     PHOTO_COVER_POSITION + " BIGINT DEFAULT 0, " +
244     PHOTO_THUMBNAIL_READY + " BIGINT DEFAULT 0, " +
245     PHOTO_LCD_SIZE + " TEXT, " +
246     PHOTO_THUMB_SIZE + " TEXT," +
247     PHOTO_FRONT_CAMERA + " TEXT, " +
248     PHOTO_IS_TEMP + " INT DEFAULT 0," +
249     PHOTO_BURST_COVER_LEVEL + " INT DEFAULT 1, " +
250     PHOTO_BURST_KEY + " TEXT, " +
251     PHOTO_DETAIL_TIME + " TEXT, " +
252     PHOTO_OWNER_ALBUM_ID + " INT DEFAULT 0, " +
253     PHOTO_ORIGINAL_ASSET_CLOUD_ID + " TEXT, " +
254     PHOTO_SOURCE_PATH + " TEXT, " +
255     PHOTO_CE_AVAILABLE + " INT DEFAULT 0, " +
256     PHOTO_CE_STATUS_CODE + " INT, " +
257     PHOTO_STRONG_ASSOCIATION + " INT DEFAULT 0, " +
258     PHOTO_ASSOCIATE_FILE_ID + " INT DEFAULT 0, " +
259     PHOTO_HAS_CLOUD_WATERMARK + " INT DEFAULT 0, " +
260     PHOTO_THUMBNAIL_VISIBLE + " INT DEFAULT 0, " +
261     SUPPORTED_WATERMARK_TYPE + " INT, " +
262     PHOTO_METADATA_FLAGS + " INT DEFAULT 0, " +
263     PHOTO_CHECK_FLAG + " INT DEFAULT 0, " +
264     STAGE_VIDEO_TASK_STATUS + " INT NOT NULL DEFAULT 0, " +
265     PHOTO_IS_AUTO + " INT NOT NULL DEFAULT 0, " +
266     PHOTO_MEDIA_SUFFIX + " TEXT, " +
267     PHOTO_IS_RECENT_SHOW + " INT NOT NULL DEFAULT 1) ";
268 
269 const std::string PhotoColumn::CREATE_CLOUD_ID_INDEX = BaseColumn::CreateIndex() +
270     PHOTO_CLOUD_ID_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_CLOUD_ID + " DESC)";
271 
272 const std::string PhotoColumn::CREATE_YEAR_INDEX = BaseColumn::CreateIndex() +
273     PHOTO_DATE_YEAR_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_DATE_YEAR + " DESC)";
274 
275 const std::string PhotoColumn::CREATE_MONTH_INDEX = BaseColumn::CreateIndex() +
276     PHOTO_DATE_MONTH_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_DATE_MONTH + " DESC)";
277 
278 const std::string PhotoColumn::CREATE_DAY_INDEX = BaseColumn::CreateIndex() +
279     PHOTO_DATE_DAY_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_DATE_DAY + " DESC)";
280 
281 const std::string PhotoColumn::CREATE_SCHPT_DAY_INDEX = BaseColumn::CreateIndex() + PHOTO_SCHPT_DAY_INDEX + " ON " +
282     PHOTOS_TABLE + " (" + PHOTO_SYNC_STATUS + "," + PHOTO_CLEAN_FLAG + "," + MEDIA_DATE_TRASHED + "," +
283     MEDIA_TIME_PENDING + "," + MEDIA_HIDDEN + "," + PHOTO_IS_TEMP + "," + PHOTO_BURST_COVER_LEVEL + "," +
284     PHOTO_DATE_DAY + " DESC, " + PHOTO_THUMBNAIL_VISIBLE + ");";
285 
286 const std::string PhotoColumn::DROP_SCHPT_DAY_INDEX = BaseColumn::DropIndex() + PHOTO_SCHPT_DAY_INDEX;
287 
288 const std::string PhotoColumn::DROP_SCHPT_MEDIA_TYPE_INDEX = "DROP INDEX IF EXISTS " + PHOTO_SCHPT_MEDIA_TYPE_INDEX;
289 
290 const std::string PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_INDEX = BaseColumn::CreateIndex() +
291     PHOTO_SCHPT_MEDIA_TYPE_INDEX + " ON " + PHOTOS_TABLE +
292     " (" + PHOTO_SYNC_STATUS + "," + PHOTO_CLEAN_FLAG + "," + MEDIA_DATE_TRASHED + "," + MEDIA_HIDDEN +
293     "," + MEDIA_TIME_PENDING + ", " + PHOTO_IS_TEMP + "," + MEDIA_TYPE + "," + PHOTO_BURST_COVER_LEVEL +
294     "," + MEDIA_DATE_ADDED + " DESC);";
295 
296 const std::string PhotoColumn::CREATE_SCHPT_YEAR_COUNT_READY_INDEX = BaseColumn::CreateIndex() +
297     PHOTO_SCHPT_DATE_YEAR_COUNT_READY_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_SYNC_STATUS + "," +
298     PHOTO_CLEAN_FLAG + "," + MEDIA_DATE_TRASHED + "," + MEDIA_TIME_PENDING + "," + MEDIA_HIDDEN + "," + PHOTO_IS_TEMP +
299     "," + PHOTO_BURST_COVER_LEVEL + "," + PHOTO_DATE_YEAR + " DESC, " + PHOTO_THUMBNAIL_VISIBLE + ");";
300 
301 const std::string PhotoColumn::CREATE_SCHPT_MONTH_COUNT_READY_INDEX = BaseColumn::CreateIndex() +
302     PHOTO_SCHPT_DATE_MONTH_COUNT_READY_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_SYNC_STATUS + "," +
303     PHOTO_CLEAN_FLAG + "," + MEDIA_DATE_TRASHED + "," + MEDIA_TIME_PENDING + "," + MEDIA_HIDDEN + "," + PHOTO_IS_TEMP +
304     "," + PHOTO_BURST_COVER_LEVEL + "," + PHOTO_DATE_MONTH + " DESC, " + PHOTO_THUMBNAIL_VISIBLE + ");";
305 
306 const std::string PhotoColumn::CREATE_SCHPT_MEDIA_TYPE_COUNT_READY_INDEX = BaseColumn::CreateIndex() +
307     PHOTO_SCHPT_MEDIA_TYPE_COUNT_READY_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_SYNC_STATUS + "," +
308     PHOTO_CLEAN_FLAG + "," + MEDIA_DATE_TRASHED + "," + MEDIA_TIME_PENDING + "," + MEDIA_HIDDEN + ", " + PHOTO_IS_TEMP +
309     "," + PHOTO_BURST_COVER_LEVEL + "," + MEDIA_TYPE + "," + PHOTO_THUMBNAIL_VISIBLE + ");";
310 
311 const std::string PhotoColumn::CREATE_SCHPT_CLOUD_ENHANCEMENT_ALBUM_INDEX =
312     BaseColumn::CreateIndex() + PHOTO_SCHPT_CLOUD_ENHANCEMENT_ALBUM_INDEX + " ON " + PHOTOS_TABLE +
313     " (" + PHOTO_SYNC_STATUS + "," + PHOTO_CLEAN_FLAG + "," + MEDIA_HIDDEN + "," + MEDIA_TIME_PENDING +
314     "," + MEDIA_DATE_TRASHED + "," + PHOTO_IS_TEMP + "," + PHOTO_STRONG_ASSOCIATION + "," + PHOTO_BURST_COVER_LEVEL +
315     "," + MEDIA_DATE_TAKEN + " DESC);";
316 
317 const std::string PhotoColumn::DROP_SCHPT_YEAR_COUNT_READY_INDEX = "DROP INDEX IF EXISTS " +
318     PHOTO_SCHPT_DATE_YEAR_COUNT_READY_INDEX;
319 
320 const std::string PhotoColumn::DROP_SCHPT_MONTH_COUNT_READY_INDEX = "DROP INDEX IF EXISTS " +
321     PHOTO_SCHPT_DATE_MONTH_COUNT_READY_INDEX;
322 
323 const std::string PhotoColumn::DROP_SCHPT_MEDIA_TYPE_COUNT_READY_INDEX = "DROP INDEX IF EXISTS " +
324     PHOTO_SCHPT_MEDIA_TYPE_COUNT_READY_INDEX;
325 
326 const std::string PhotoColumn::CREATE_HIDDEN_TIME_INDEX = BaseColumn::CreateIndex() +
327     PHOTO_HIDDEN_TIME_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_HIDDEN_TIME + " DESC)";
328 
329 const std::string PhotoColumn::CREATE_SCHPT_HIDDEN_TIME_INDEX =
330     BaseColumn::CreateIndex() + PHOTO_SCHPT_HIDDEN_TIME_INDEX + " ON " + PHOTOS_TABLE +
331     " (" + PHOTO_SYNC_STATUS + "," + PHOTO_CLEAN_FLAG + "," + MEDIA_HIDDEN + "," + MEDIA_TIME_PENDING +
332     "," + MEDIA_DATE_TRASHED + "," + PHOTO_IS_TEMP + "," + PHOTO_BURST_COVER_LEVEL +
333     "," + PHOTO_HIDDEN_TIME + " DESC);";
334 
335 const std::string PhotoColumn::DROP_SCHPT_HIDDEN_TIME_INDEX = BaseColumn::DropIndex() + PHOTO_SCHPT_HIDDEN_TIME_INDEX;
336 
337 const std::string PhotoColumn::CREATE_PHOTO_FAVORITE_INDEX =
338     BaseColumn::CreateIndex() + PHOTO_FAVORITE_INDEX + " ON " + PHOTOS_TABLE +
339     " (" + PHOTO_SYNC_STATUS + "," + PHOTO_CLEAN_FLAG + "," + MEDIA_HIDDEN + "," + MEDIA_TIME_PENDING +
340     "," + MEDIA_DATE_TRASHED + "," + PHOTO_IS_TEMP + "," + MEDIA_IS_FAV + "," + PHOTO_BURST_COVER_LEVEL +
341     "," + MEDIA_DATE_TAKEN + " DESC);";
342 
343 const std::string PhotoColumn::DROP_PHOTO_FAVORITE_INDEX = BaseColumn::DropIndex() + PHOTO_FAVORITE_INDEX;
344 
345 const std::string PhotoColumn::CREATE_PHOTO_DISPLAYNAME_INDEX = BaseColumn::CreateIndex() +
346     PHOTO_DISPLAYNAME_INDEX + " ON " + PHOTOS_TABLE + " (" + MediaColumn::MEDIA_NAME + ")";
347 
348 const std::string PhotoColumn::CREATE_PHOTO_BURSTKEY_INDEX = BaseColumn::CreateIndex() + PHOTO_BURSTKEY_INDEX +
349     " ON " + PHOTOS_TABLE + " (" + PHOTO_BURST_KEY + "," + MEDIA_TIME_PENDING  + "," + MEDIA_NAME + " ASC);";
350 
351 const std::string PhotoColumn::QUERY_MEDIA_VOLUME = "SELECT sum(" + MediaColumn::MEDIA_SIZE + ") AS " +
352     MediaColumn::MEDIA_SIZE + "," +
353     MediaColumn::MEDIA_TYPE + " FROM " +
354     PhotoColumn::PHOTOS_TABLE + " WHERE " +
355     "(" + MediaColumn::MEDIA_TYPE + " = " + std::to_string(MEDIA_TYPE_IMAGE) + " OR " +
356     MediaColumn::MEDIA_TYPE + " = " + std::to_string(MEDIA_TYPE_VIDEO) + ") AND " +
357     PhotoColumn::PHOTO_POSITION + " != 2" + " GROUP BY " +
358     MediaColumn::MEDIA_TYPE;
359 
360 // Create indexes
361 const std::string PhotoColumn::INDEX_SCTHP_ADDTIME =
362     BaseColumn::CreateIndex() + PHOTO_SCHPT_ADDED_INDEX + " ON " + PHOTOS_TABLE +
363     " (" + PHOTO_SYNC_STATUS + "," + PHOTO_CLEAN_FLAG + "," + MEDIA_DATE_TRASHED + "," + MEDIA_HIDDEN + "," +
364     MEDIA_TIME_PENDING + "," + PHOTO_IS_TEMP + "," + PHOTO_BURST_COVER_LEVEL + "," + MEDIA_DATE_TAKEN + " DESC, " +
365     MEDIA_ID + " DESC);";
366 
367 const std::string PhotoColumn::INDEX_SCHPT_ALBUM_GENERAL =
368     BaseColumn::CreateIndex() + PHOTO_SCHPT_ALBUM_GENERAL_INDEX + " ON " + PHOTOS_TABLE +
369     " (" + PHOTO_SYNC_STATUS + "," + PHOTO_CLEAN_FLAG + "," + MEDIA_DATE_TRASHED + "," +
370     MEDIA_HIDDEN + "," + MEDIA_TIME_PENDING + "," + PHOTO_IS_TEMP + "," + PHOTO_BURST_COVER_LEVEL +
371     "," + PHOTO_OWNER_ALBUM_ID + ");";
372 
373 const std::string PhotoColumn::INDEX_SCHPT_ALBUM =
374     BaseColumn::CreateIndex() + PHOTO_SCHPT_ALBUM_INDEX + " ON " + PHOTOS_TABLE +
375     " (" + PHOTO_SYNC_STATUS + "," + PHOTO_CLEAN_FLAG + "," + MEDIA_DATE_TRASHED + "," + MEDIA_HIDDEN + "," +
376     MEDIA_TIME_PENDING + "," + PHOTO_IS_TEMP + "," + PHOTO_BURST_COVER_LEVEL + "," + PHOTO_OWNER_ALBUM_ID + "," +
377     MEDIA_DATE_TAKEN + " DESC, " + MEDIA_ID + " DESC);";
378 
379 // Create dateadded index
380 const std::string PhotoColumn::INDEX_SCTHP_PHOTO_DATEADDED =
381     BaseColumn::CreateIndex() + PHOTO_SCHPT_PHOTO_DATEADDED_INDEX + " ON " + PHOTOS_TABLE +
382     " (" + PHOTO_SYNC_STATUS + "," + PHOTO_CLEAN_FLAG + "," + MEDIA_DATE_TRASHED + "," + MEDIA_HIDDEN + "," +
383     MEDIA_TIME_PENDING + "," + PHOTO_IS_TEMP + "," + PHOTO_BURST_COVER_LEVEL + "," + MEDIA_DATE_ADDED + " DESC);";
384 
385 const std::string PhotoColumn::INDEX_LATITUDE =
386     BaseColumn::CreateIndex() + LATITUDE_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_LATITUDE + ");";
387 
388 const std::string PhotoColumn::INDEX_LONGITUDE =
389     BaseColumn::CreateIndex() + LONGITUDE_INDEX + " ON " + PHOTOS_TABLE + " (" + PHOTO_LONGITUDE + ");";
390 
391 const std::string PhotoColumn::UPDATE_LATITUDE_AND_LONGITUDE_DEFAULT_NULL =
392     " UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET " + PhotoColumn::PHOTO_LATITUDE +
393     " = NULL, " + PhotoColumn::PHOTO_LONGITUDE + " = NULL " + " WHERE " +
394     PhotoColumn::PHOTO_LATITUDE + " = 0 AND " + PhotoColumn::PHOTO_LONGITUDE + " = 0;";
395 
396 const std::string PhotoColumn::UPDATE_PHOTO_QUALITY_OF_NULL_PHOTO_ID =
397     " UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET " + PhotoColumn::PHOTO_QUALITY + " = 0 WHERE " +
398     PhotoColumn::PHOTO_QUALITY + " = 1 AND " + PhotoColumn::PHOTO_ID + " IS NULL;";
399 
400 const std::string PhotoColumn::DROP_INDEX_SCTHP_ADDTIME = BaseColumn::DropIndex() + PHOTO_SCHPT_ADDED_INDEX;
401 
402 const std::string PhotoColumn::DROP_INDEX_SCHPT_ADDTIME_ALBUM = BaseColumn::DropIndex() + PHOTO_SCHPT_ADDED_ALBUM_INDEX;
403 
404 const std::string PhotoColumn::INDEX_CAMERA_SHOT_KEY =
405     BaseColumn::CreateIndex() + "idx_camera_shot_key" + " ON " + PHOTOS_TABLE +
406     " (" + CAMERA_SHOT_KEY + ");";
407 
408 const std::string PhotoColumn::INDEX_SCHPT_READY = BaseColumn::CreateIndex() + PHOTO_SCHPT_READY_INDEX + " ON " +
409     PHOTOS_TABLE + " (" + PHOTO_SYNC_STATUS + "," + PHOTO_CLEAN_FLAG + "," + MEDIA_DATE_TRASHED + "," +
410     MEDIA_TIME_PENDING + ", " + MEDIA_HIDDEN + "," + PHOTO_IS_TEMP + "," + PHOTO_BURST_COVER_LEVEL + "," +
411     MEDIA_DATE_TAKEN + " DESC, " + MEDIA_ID + " DESC, " + PHOTO_THUMBNAIL_VISIBLE + ");";
412 
413 const std::string PhotoColumn::DROP_INDEX_SCHPT_READY = BaseColumn::DropIndex() + PHOTO_SCHPT_READY_INDEX;
414 
415 const std::string PhotoColumn::CREATE_PHOTOS_DELETE_TRIGGER =
416                         "CREATE TRIGGER IF NOT EXISTS photos_delete_trigger AFTER UPDATE ON " +
417                         PhotoColumn::PHOTOS_TABLE + " FOR EACH ROW WHEN new." + PhotoColumn::PHOTO_DIRTY +
418                         " = " + std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_DELETED)) +
419                         " AND OLD." + PhotoColumn::PHOTO_POSITION + " = 1 AND is_caller_self_func() = 'true'" +
420                         " BEGIN DELETE FROM " + PhotoColumn::PHOTOS_TABLE +
421                         " WHERE " + PhotoColumn::MEDIA_ID + " = old." + PhotoColumn::MEDIA_ID + "; END;";
422 
423 const std::string PhotoColumn::CREATE_PHOTOS_FDIRTY_TRIGGER =
424                         "CREATE TRIGGER IF NOT EXISTS photos_fdirty_trigger AFTER UPDATE ON " +
425                         PhotoColumn::PHOTOS_TABLE + " FOR EACH ROW WHEN OLD.position <> 1 AND" +
426                         " new.date_modified <> old.date_modified " +
427                         " AND new.dirty = old.dirty AND is_caller_self_func() = 'true'" +
428                         " BEGIN " +
429                         " UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET dirty = " +
430                         std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_FDIRTY)) +
431                         " WHERE file_id = old.file_id;" +
432                         " SELECT cloud_sync_func(); " +
433                         " END;";
434 
435 const std::string PhotoColumn::CREATE_PHOTOS_MDIRTY_TRIGGER =
436                         "CREATE TRIGGER IF NOT EXISTS photos_mdirty_trigger AFTER UPDATE ON " +
437                         PhotoColumn::PHOTOS_TABLE + " FOR EACH ROW WHEN OLD.position <> 1" +
438                         " AND new.date_modified = old.date_modified AND ( old.dirty = " +
439                         std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_SYNCED)) + " OR old.dirty =" +
440                         std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_SDIRTY)) +
441                         ") AND new.dirty = old.dirty AND is_caller_self_func() = 'true'" +
442                         " AND " + PhotoColumn::CheckUploadPhotoColumns() +
443                         " BEGIN " +
444                         " UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET dirty = " +
445                         std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_MDIRTY)) +
446                         " WHERE file_id = old.file_id;" +
447                         " SELECT cloud_sync_func(); " +
448                         " END;";
449 
450 const std::string PhotoColumn::INSERT_GENERATE_HIGHLIGHT_THUMBNAIL =
451                         "CREATE TRIGGER IF NOT EXISTS insert_generate_highlight_thumbnail_trigger AFTER INSERT ON " +
452                         PhotoColumn::HIGHLIGHT_TABLE + " BEGIN SELECT begin_generate_highlight_thumbnail " +
453                         "(NEW." + MEDIA_DATA_DB_ID + ", NEW." + MEDIA_DATA_DB_VIDEO_TRACKS +
454                         ", NEW." + MEDIA_DATA_DB_HIGHLIGHT_TRIGGER + ", '" + MEDIA_DATA_DB_INSERT_TYPE + "'); END;";
455 
456 const std::string PhotoColumn::UPDATE_GENERATE_HIGHLIGHT_THUMBNAIL =
457                         "CREATE TRIGGER IF NOT EXISTS update_generate_highlight_thumbnail_trigger AFTER UPDATE ON " +
458                         PhotoColumn::HIGHLIGHT_TABLE + " FOR EACH ROW " + " WHEN OLD." +
459                         MEDIA_DATA_DB_HIGHLIGHT_TRIGGER + "= 1 " + "AND NEW." + MEDIA_DATA_DB_HIGHLIGHT_TRIGGER +
460                         "= 0 BEGIN SELECT begin_generate_highlight_thumbnail " +
461                         "(NEW." + MEDIA_DATA_DB_ID + ", NEW." + MEDIA_DATA_DB_VIDEO_TRACKS +
462                         ", NEW." + MEDIA_DATA_DB_HIGHLIGHT_TRIGGER + ", '" + MEDIA_DATA_DB_UPDATE_TYPE + "'); END;";
463 
464 const std::string PhotoColumn::INDEX_HIGHLIGHT_FILEID =
465                         BaseColumn::CreateIndex() + MEDIA_DATA_DB_HIGHLIGHT_INDEX + " ON " +
466                         HIGHLIGHT_TABLE + " (" + MEDIA_ID + ");";
467 
468 const std::string  PhotoColumn::CREATE_PHOTOS_INSERT_CLOUD_SYNC =
469                         " CREATE TRIGGER IF NOT EXISTS photo_insert_cloud_sync_trigger AFTER INSERT ON " +
470                         PhotoColumn::PHOTOS_TABLE + " BEGIN SELECT cloud_sync_func(); END;";
471 
472 const std::string PhotoColumn::CREATE_PHOTOS_UPDATE_CLOUD_SYNC =
473                         " CREATE TRIGGER IF NOT EXISTS photo_update_cloud_sync_trigger AFTER UPDATE ON " +
474                         PhotoColumn::PHOTOS_TABLE + " FOR EACH ROW WHEN OLD.dirty IN (1,2,3,5) AND new.dirty != " +
475                         std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_SYNCED)) +
476                         " BEGIN SELECT cloud_sync_func(); END;";
477 
478 const std::string PhotoColumn::UPDATE_READY_ON_THUMBNAIL_UPGRADE =
479                         " UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET " + PhotoColumn::PHOTO_THUMBNAIL_READY +
480                         " = 6 " + " WHERE " + PhotoColumn::PHOTO_THUMBNAIL_READY + " != 0; END;";
481 
482 const std::string PhotoColumn::CREATE_PHOTOS_METADATA_DIRTY_TRIGGER =
483                         "CREATE TRIGGER IF NOT EXISTS photos_metadata_dirty_trigger AFTER UPDATE ON " +
484                         PhotoColumn::PHOTOS_TABLE + " FOR EACH ROW WHEN old." + PhotoColumn::PHOTO_POSITION + " != 2" +
485                         " AND old.metadata_flags = " +
486                         std::to_string(static_cast<int32_t>(MetadataFlags::TYPE_UPTODATE)) +
487                         " AND new.metadata_flags = old.metadata_flags" +
488                         " AND " + PhotoColumn::CheckMetaRecoveryPhotoColumns() +
489                         " BEGIN " +
490                         " UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET metadata_flags = " +
491                         std::to_string(static_cast<int32_t>(MetadataFlags::TYPE_DIRTY)) +
492                         " WHERE file_id = old.file_id;" +
493                         " END;";
494 
495 const std::string PhotoColumn::UPDATA_PHOTOS_DATA_UNIQUE = "CREATE UNIQUE INDEX IF NOT EXISTS photo_data_index ON " +
496     PhotoColumn::PHOTOS_TABLE + " (" + MEDIA_FILE_PATH + ");";
497 
498 const std::string PhotoColumn::UPDATE_LCD_STATUS_NOT_UPLOADED =
499                         " UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET " + PhotoColumn::PHOTO_LCD_VISIT_TIME +
500                         " = 0 " + " WHERE " + PhotoColumn::PHOTO_DIRTY + " = 1; END;";
501 
502 const std::set<std::string> PhotoColumn::PHOTO_COLUMNS = {
503     PhotoColumn::PHOTO_ORIENTATION, PhotoColumn::PHOTO_LATITUDE, PhotoColumn::PHOTO_LONGITUDE,
504     PhotoColumn::PHOTO_HEIGHT, PhotoColumn::PHOTO_WIDTH, PhotoColumn::PHOTO_LCD_VISIT_TIME, PhotoColumn::PHOTO_POSITION,
505     PhotoColumn::PHOTO_DIRTY, PhotoColumn::PHOTO_CLOUD_ID, PhotoColumn::CAMERA_SHOT_KEY, PhotoColumn::PHOTO_ALL_EXIF,
506     PhotoColumn::PHOTO_USER_COMMENT, PhotoColumn::PHOTO_DATE_YEAR, PhotoColumn::PHOTO_DATE_MONTH,
507     PhotoColumn::PHOTO_DATE_DAY, PhotoColumn::PHOTO_EDIT_TIME, PhotoColumn::PHOTO_CLEAN_FLAG,
508     PhotoColumn::PHOTO_SHOOTING_MODE, PhotoColumn::PHOTO_SHOOTING_MODE_TAG, PhotoColumn::PHOTO_THUMB_STATUS,
509     PhotoColumn::PHOTO_SUBTYPE, PhotoColumn::PHOTO_DYNAMIC_RANGE_TYPE, PhotoColumn::PHOTO_LCD_SIZE,
510     PhotoColumn::PHOTO_THUMB_SIZE, PhotoColumn::MOVING_PHOTO_EFFECT_MODE, PhotoColumn::PHOTO_FRONT_CAMERA,
511     PhotoColumn::PHOTO_BURST_COVER_LEVEL, PhotoColumn::PHOTO_BURST_KEY, PhotoColumn::PHOTO_COVER_POSITION,
512     PhotoColumn::PHOTO_THUMBNAIL_READY, PhotoColumn::PHOTO_ORIGINAL_SUBTYPE, PhotoColumn::PHOTO_DETAIL_TIME,
513     PhotoColumn::PHOTO_CE_AVAILABLE, PhotoColumn::PHOTO_OWNER_ALBUM_ID, PhotoColumn::SUPPORTED_WATERMARK_TYPE,
514     PhotoColumn::PHOTO_THUMBNAIL_VISIBLE, PhotoColumn::PHOTO_QUALITY, PhotoColumn::PHOTO_IS_AUTO,
515     PhotoColumn::PHOTO_MEDIA_SUFFIX, PhotoColumn::PHOTO_IS_RECENT_SHOW,
516 };
517 
IsPhotoColumn(const std::string & columnName)518 bool PhotoColumn::IsPhotoColumn(const std::string &columnName)
519 {
520     if (columnName == "count(*)") {
521         return true;
522     }
523     return (PHOTO_COLUMNS.find(columnName) != PHOTO_COLUMNS.end()) ||
524         (MEDIA_COLUMNS.find(columnName) != MEDIA_COLUMNS.end());
525 }
526 
CheckUploadPhotoColumns()527 std::string PhotoColumn::CheckUploadPhotoColumns()
528 {
529     // Since date_modified has been checked in mdirty and fdirty, omit it here.
530     const std::vector<std::string> uploadPhotoColumns = {
531         MEDIA_FILE_PATH,
532         MEDIA_SIZE,
533         MEDIA_NAME,
534         MEDIA_TYPE,
535         MEDIA_MIME_TYPE,
536         MEDIA_OWNER_PACKAGE,
537         MEDIA_OWNER_APPID,
538         MEDIA_DEVICE_NAME,
539         MEDIA_DATE_ADDED,
540         MEDIA_DATE_TAKEN,
541         MEDIA_DURATION,
542         MEDIA_IS_FAV,
543         MEDIA_DATE_TRASHED,
544         MEDIA_DATE_DELETED,
545         MEDIA_HIDDEN,
546         PHOTO_META_DATE_MODIFIED,
547         PHOTO_ORIENTATION,
548         PHOTO_LATITUDE,
549         PHOTO_LONGITUDE,
550         PHOTO_HEIGHT,
551         PHOTO_WIDTH,
552         PHOTO_SUBTYPE,
553         PHOTO_USER_COMMENT,
554         PHOTO_DATE_YEAR,
555         PHOTO_DATE_MONTH,
556         PHOTO_DATE_DAY,
557         PHOTO_SHOOTING_MODE,
558         PHOTO_SHOOTING_MODE_TAG,
559         PHOTO_OWNER_ALBUM_ID,
560         PHOTO_SOURCE_PATH,
561         MOVING_PHOTO_EFFECT_MODE,
562         PHOTO_COVER_POSITION,
563         PHOTO_ORIGINAL_SUBTYPE,
564     };
565 
566     std::string result = "(";
567     size_t size = uploadPhotoColumns.size();
568     for (size_t i = 0; i < size; i++) {
569         std::string column = uploadPhotoColumns[i];
570         if (i != size - 1) {
571             result += "new." + column + " <> old." + column + " OR ";
572         } else {
573             result += "new." + column + " <> old." + column + ")";
574         }
575     }
576     return result;
577 }
578 
CheckMetaRecoveryPhotoColumns()579 std::string PhotoColumn::CheckMetaRecoveryPhotoColumns()
580 {
581     const std::vector<std::string> metaDirtyPhotoColumns = {
582         MEDIA_DATE_MODIFIED, MEDIA_FILE_PATH, MEDIA_SIZE, MEDIA_TYPE, MEDIA_MIME_TYPE, MEDIA_OWNER_PACKAGE,
583         MEDIA_OWNER_APPID, MEDIA_DEVICE_NAME, MEDIA_DATE_ADDED, MEDIA_DATE_TAKEN, MEDIA_DURATION, MEDIA_IS_FAV,
584         MEDIA_DATE_TRASHED, MEDIA_DATE_DELETED, MEDIA_HIDDEN, PHOTO_META_DATE_MODIFIED, PHOTO_ORIENTATION,
585         PHOTO_LATITUDE, PHOTO_LONGITUDE, PHOTO_HEIGHT, PHOTO_WIDTH, PHOTO_SUBTYPE, PHOTO_USER_COMMENT,
586         PHOTO_DATE_YEAR, PHOTO_DATE_MONTH, PHOTO_DATE_DAY, PHOTO_SHOOTING_MODE, PHOTO_SHOOTING_MODE_TAG,
587         PHOTO_OWNER_ALBUM_ID, PHOTO_SOURCE_PATH, MOVING_PHOTO_EFFECT_MODE, PHOTO_COVER_POSITION, PHOTO_ORIGINAL_SUBTYPE,
588         PHOTO_CLOUD_ID, PHOTO_POSITION, PHOTO_DIRTY, PHOTO_SYNC_STATUS, PHOTO_CLOUD_VERSION, PHOTO_CLEAN_FLAG,
589     };
590 
591     std::string result = "(";
592     size_t size = metaDirtyPhotoColumns.size();
593     for (size_t i = 0; i < size; i++) {
594         std::string column = metaDirtyPhotoColumns[i];
595         if (i != size - 1) {
596             result += "new." + column + " <> old." + column + " OR ";
597         } else {
598             result += "new." + column + " <> old." + column + ")";
599         }
600     }
601     return result;
602 }
603 
604 const std::string AudioColumn::AUDIO_ALBUM = "audio_album";
605 const std::string AudioColumn::AUDIO_ARTIST = "artist";
606 
607 const std::string AudioColumn::AUDIOS_TABLE = "Audios";
608 
609 const std::string AudioColumn::AUDIO_URI_PREFIX = "file://media/Audio/";
610 const std::string AudioColumn::DEFAULT_AUDIO_URI = "file://media/Audio";
611 const std::string AudioColumn::AUDIO_TYPE_URI = "/Audio";
612 
613 const std::string AudioColumn::CREATE_AUDIO_TABLE = "CREATE TABLE IF NOT EXISTS " +
614     AUDIOS_TABLE + " (" +
615     MEDIA_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
616     MEDIA_FILE_PATH + " TEXT, " +
617     MEDIA_SIZE + " BIGINT, " +
618     MEDIA_TITLE + " TEXT, " +
619     MEDIA_NAME + " TEXT, " +
620     MEDIA_TYPE + " INT, " +
621     MEDIA_MIME_TYPE + " TEXT, " +
622     MEDIA_OWNER_PACKAGE + " TEXT, " +
623     MEDIA_OWNER_APPID + " TEXT, " +
624     MEDIA_PACKAGE_NAME + " TEXT, " +
625     MEDIA_DEVICE_NAME + " TEXT, " +
626     AUDIO_ARTIST + " TEXT, " +
627     MEDIA_DATE_ADDED + " BIGINT, " +
628     MEDIA_DATE_MODIFIED + " BIGINT, " +
629     MEDIA_DATE_TAKEN + " BIGINT DEFAULT 0, " +
630     MEDIA_DURATION + " INT, " +
631     MEDIA_TIME_PENDING + " BIGINT DEFAULT 0, " +
632     MEDIA_IS_FAV + " INT DEFAULT 0, " +
633     MEDIA_DATE_TRASHED + " BIGINT DEFAULT 0, " +
634     MEDIA_DATE_DELETED + " BIGINT DEFAULT 0, " +
635     MEDIA_PARENT_ID + " INT DEFAULT 0, " +
636     MEDIA_RELATIVE_PATH + " TEXT, " +
637     MEDIA_VIRTURL_PATH + " TEXT UNIQUE, " +
638     AUDIO_ALBUM + " TEXT)";
639 
640 const std::string AudioColumn::QUERY_MEDIA_VOLUME = "SELECT sum(" + MediaColumn::MEDIA_SIZE + ") AS " +
641     MediaColumn::MEDIA_SIZE + "," +
642     MediaColumn::MEDIA_TYPE + " FROM " +
643     AudioColumn::AUDIOS_TABLE + " WHERE " +
644     MediaColumn::MEDIA_TYPE + " = " + std::to_string(MEDIA_TYPE_AUDIO) + " GROUP BY " +
645     MediaColumn::MEDIA_TYPE;
646 
647 const std::set<std::string> AudioColumn::AUDIO_COLUMNS = {
648     AudioColumn::AUDIO_ALBUM, AudioColumn::AUDIO_ARTIST
649 };
650 
IsAudioColumn(const std::string & columnName)651 bool AudioColumn::IsAudioColumn(const std::string &columnName)
652 {
653     return (AUDIO_COLUMNS.find(columnName) != AUDIO_COLUMNS.end()) ||
654         (MEDIA_COLUMNS.find(columnName) != MEDIA_COLUMNS.end());
655 }
656 
657 const std::string MediaColumn::ASSETS_QUERY_FILTER =
658     PhotoColumn::PHOTO_SYNC_STATUS + " = 0" + " AND " +
659     MediaColumn::MEDIA_DATE_TRASHED + " = 0" + " AND " +
660     MediaColumn::MEDIA_HIDDEN + " = 0" + " AND " +
661     MediaColumn::MEDIA_TIME_PENDING + " = 0 ";
662 
663 const std::string PhotoExtColumn::PHOTOS_EXT_TABLE = "tab_photos_ext";
664 
665 const std::string PhotoExtColumn::PHOTO_ID = "photo_id";
666 const std::string PhotoExtColumn::THUMBNAIL_SIZE = "thumbnail_size";
667 
668 const std::string PhotoExtColumn::CREATE_PHOTO_EXT_TABLE =
669     "CREATE TABLE IF NOT EXISTS " +
670     PHOTOS_EXT_TABLE + " (" +
671     PHOTO_ID + " INTEGER PRIMARY KEY, " +
672     THUMBNAIL_SIZE + " BIGINT DEFAULT 0)";
673 
674 // For Photos table query filter
675 const std::string PhotoColumn::PHOTOS_QUERY_FILTER =
676     MediaColumn::MEDIA_DATE_TRASHED + " = 0" + " AND " +
677     MediaColumn::MEDIA_HIDDEN + " = 0" + " AND " +
678     MediaColumn::MEDIA_TIME_PENDING + " = 0" + " AND " +
679     PhotoColumn::PHOTO_IS_TEMP + " = 0" + " AND " +
680     PhotoColumn::PHOTO_BURST_COVER_LEVEL + " = 1 ";
681 
682 }  // namespace Media
683 }  // namespace OHOS
684