• 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 
20 #include "base_column.h"
21 #include "userfile_manager_types.h"
22 
23 namespace OHOS {
24 namespace Media {
25 const std::string MediaColumn::MEDIA_ID = "file_id";
26 const std::string MediaColumn::MEDIA_FILE_PATH = "data";
27 const std::string MediaColumn::MEDIA_SIZE = "size";
28 const std::string MediaColumn::MEDIA_TITLE = "title";
29 const std::string MediaColumn::MEDIA_NAME = "display_name";
30 const std::string MediaColumn::MEDIA_TYPE = "media_type";
31 const std::string MediaColumn::MEDIA_MIME_TYPE = "mime_type";
32 const std::string MediaColumn::MEDIA_OWNER_PACKAGE = "owner_package";
33 const std::string MediaColumn::MEDIA_PACKAGE_NAME = "package_name";
34 const std::string MediaColumn::MEDIA_DEVICE_NAME = "device_name";
35 const std::string MediaColumn::MEDIA_DATE_MODIFIED = "date_modified";
36 const std::string MediaColumn::MEDIA_DATE_ADDED = "date_added";
37 const std::string MediaColumn::MEDIA_DATE_TAKEN = "date_taken";
38 const std::string MediaColumn::MEDIA_TIME_VISIT = "time_visit";
39 const std::string MediaColumn::MEDIA_DURATION = "duration";
40 const std::string MediaColumn::MEDIA_TIME_PENDING = "time_pending";
41 const std::string MediaColumn::MEDIA_IS_FAV = "is_favorite";
42 const std::string MediaColumn::MEDIA_DATE_TRASHED = "date_trashed";
43 const std::string MediaColumn::MEDIA_DATE_DELETED = "date_deleted";
44 const std::string MediaColumn::MEDIA_HIDDEN = "hidden";
45 const std::string MediaColumn::MEDIA_PARENT_ID = "parent";
46 const std::string MediaColumn::MEDIA_RELATIVE_PATH = "relative_path";
47 const std::string MediaColumn::MEDIA_VIRTURL_PATH = "virtual_path";
48 const std::set<std::string> MediaColumn::MEDIA_COLUMNS = {
49     MEDIA_ID, MEDIA_FILE_PATH, MEDIA_SIZE, MEDIA_TITLE, MEDIA_NAME, MEDIA_TYPE, MEDIA_MIME_TYPE,
50     MEDIA_OWNER_PACKAGE, MEDIA_PACKAGE_NAME, MEDIA_DEVICE_NAME, MEDIA_DATE_MODIFIED, MEDIA_DATE_ADDED,
51     MEDIA_DATE_TAKEN, MEDIA_TIME_VISIT, MEDIA_DURATION, MEDIA_TIME_PENDING, MEDIA_IS_FAV, MEDIA_DATE_TRASHED,
52     MEDIA_DATE_DELETED, MEDIA_HIDDEN, MEDIA_PARENT_ID, MEDIA_RELATIVE_PATH, MEDIA_VIRTURL_PATH
53 };
54 const std::set<std::string> MediaColumn::DEFAULT_FETCH_COLUMNS = {
55     MEDIA_ID, MEDIA_FILE_PATH, MEDIA_NAME, MEDIA_TYPE
56 };
57 
58 const std::string PhotoColumn::PHOTO_DIRTY = "dirty";
59 const std::string PhotoColumn::PHOTO_CLOUD_ID = "cloud_id";
60 const std::string PhotoColumn::PHOTO_META_DATE_MODIFIED = "meta_date_modified";
61 const std::string PhotoColumn::PHOTO_SYNC_STATUS = "sync_status";
62 const std::string PhotoColumn::PHOTO_CLOUD_VERSION = "cloud_version";
63 const std::string PhotoColumn::PHOTO_ORIENTATION = "orientation";
64 const std::string PhotoColumn::PHOTO_LATITUDE = "latitude";
65 const std::string PhotoColumn::PHOTO_LONGITUDE = "longitude";
66 const std::string PhotoColumn::PHOTO_HEIGHT = "height";
67 const std::string PhotoColumn::PHOTO_WIDTH = "width";
68 const std::string PhotoColumn::PHOTO_LCD_VISIT_TIME = "lcd_visit_time";
69 const std::string PhotoColumn::PHOTO_POSITION = "position";
70 const std::string PhotoColumn::PHOTO_SUBTYPE = "subtype";
71 const std::string PhotoColumn::CAMERA_SHOT_KEY = "camera_shot_key";
72 const std::string PhotoColumn::PHOTO_USER_COMMENT = "user_comment";
73 const std::string PhotoColumn::PHOTO_ALL_EXIF = "all_exif";
74 
75 const std::string PhotoColumn::PHOTOS_TABLE = "Photos";
76 
77 const std::string PhotoColumn::PHOTO_URI_PREFIX = "file://media/Photo/";
78 const std::string PhotoColumn::DEFAULT_PHOTO_URI = "file://media/Photo";
79 const std::string PhotoColumn::PHOTO_TYPE_URI = "/Photo";
80 
81 const std::string PhotoColumn::CREATE_PHOTO_TABLE = "CREATE TABLE IF NOT EXISTS " +
82     PHOTOS_TABLE + " (" +
83     MEDIA_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
84     MEDIA_FILE_PATH + " TEXT, " +
85     MEDIA_SIZE + " BIGINT, " +
86     MEDIA_TITLE + " TEXT, " +
87     MEDIA_NAME + " TEXT, " +
88     MEDIA_TYPE + " INT, " +
89     MEDIA_MIME_TYPE + " TEXT, " +
90     MEDIA_OWNER_PACKAGE + " TEXT, " +
91     MEDIA_PACKAGE_NAME + " TEXT, " +
92     MEDIA_DEVICE_NAME + " TEXT, " +
93     MEDIA_DATE_ADDED + " BIGINT, " +
94     MEDIA_DATE_MODIFIED + " BIGINT, " +
95     MEDIA_DATE_TAKEN + " BIGINT DEFAULT 0, " +
96     MEDIA_TIME_VISIT + " BIGINT DEFAULT 0, " +
97     MEDIA_DURATION + " INT, " +
98     MEDIA_TIME_PENDING + " BIGINT DEFAULT 0, " +
99     MEDIA_IS_FAV + " INT DEFAULT 0, " +
100     MEDIA_DATE_TRASHED + " BIGINT DEFAULT 0, " +
101     MEDIA_DATE_DELETED + " BIGINT DEFAULT 0, " +
102     MEDIA_HIDDEN + " INT DEFAULT 0, " +
103     MEDIA_PARENT_ID + " INT DEFAULT 0, " +
104     MEDIA_RELATIVE_PATH + " TEXT, " +
105     MEDIA_VIRTURL_PATH + " TEXT UNIQUE, " +
106     PHOTO_DIRTY + " INT DEFAULT 1, " +
107     PHOTO_CLOUD_ID + " TEXT, " +
108     PHOTO_META_DATE_MODIFIED + "  BIGINT DEFAULT 0, " +
109     PHOTO_SYNC_STATUS + "  INT DEFAULT 0, " +
110     PHOTO_CLOUD_VERSION + " BIGINT DEFAULT 0, " +
111     PHOTO_ORIENTATION + " INT DEFAULT 0, " +
112     PHOTO_LATITUDE + " DOUBLE DEFAULT 0, " +
113     PHOTO_LONGITUDE + " DOUBLE DEFAULT 0, " +
114     PHOTO_HEIGHT + " INT, " +
115     PHOTO_WIDTH + " INT, " +
116     PHOTO_LCD_VISIT_TIME + " BIGINT DEFAULT 0, " +
117     PHOTO_POSITION + " INT DEFAULT 1, " +
118     PHOTO_SUBTYPE + " INT DEFAULT 0, " +
119     CAMERA_SHOT_KEY + " TEXT, " +
120     PHOTO_USER_COMMENT + " TEXT, " +
121     PHOTO_ALL_EXIF  + " TEXT)";
122 
123 const std::string PhotoColumn::QUERY_MEDIA_VOLUME = "SELECT sum(" + MediaColumn::MEDIA_SIZE + ") AS " +
124     MediaColumn::MEDIA_SIZE + "," +
125     MediaColumn::MEDIA_TYPE + " FROM " +
126     PhotoColumn::PHOTOS_TABLE + " WHERE " +
127     MediaColumn::MEDIA_TYPE + " = " + std::to_string(MEDIA_TYPE_IMAGE) + " OR " +
128     MediaColumn::MEDIA_TYPE + " = " + std::to_string(MEDIA_TYPE_VIDEO) + " GROUP BY " +
129     MediaColumn::MEDIA_TYPE;
130 
131 // Create indexes
132 const std::string PhotoColumn::INDEX_STHP_ADDTIME =
133     BaseColumn::CreateIndex() + "idx_sthp_dateadded" + " ON " + PHOTOS_TABLE +
134     " (" + PHOTO_SYNC_STATUS + "," + MEDIA_DATE_TRASHED + "," + MEDIA_HIDDEN +
135     "," + MEDIA_TIME_PENDING + "," + MEDIA_DATE_ADDED + ");";
136 
137 const std::string PhotoColumn::INDEX_CAMERA_SHOT_KEY =
138     BaseColumn::CreateIndex() + "idx_camera_shot_key" + " ON " + PHOTOS_TABLE +
139     " (" + CAMERA_SHOT_KEY + ");";
140 
141 const std::string PhotoColumn::CREATE_PHOTOS_DELETE_TRIGGER =
142                         "CREATE TRIGGER photos_delete_trigger AFTER UPDATE ON " +
143                         PhotoColumn::PHOTOS_TABLE + " FOR EACH ROW WHEN new." + PhotoColumn::PHOTO_DIRTY +
144                         " = " + std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_DELETED)) +
145                         " AND OLD." + PhotoColumn::PHOTO_CLOUD_ID + " is NULL AND is_caller_self_func() = 'true'" +
146                         " BEGIN DELETE FROM " + PhotoColumn::PHOTOS_TABLE +
147                         " WHERE " + PhotoColumn::MEDIA_ID + " = old." + PhotoColumn::MEDIA_ID + "; END;";
148 
149 const std::string PhotoColumn::CREATE_PHOTOS_FDIRTY_TRIGGER =
150                         "CREATE TRIGGER photos_fdirty_trigger AFTER UPDATE ON " +
151                         PhotoColumn::PHOTOS_TABLE + " FOR EACH ROW WHEN OLD.cloud_id IS NOT NULL AND" +
152                         " new.date_modified <> old.date_modified " +
153                         " AND new.dirty = old.dirty AND is_caller_self_func() = 'true'" +
154                         " BEGIN " +
155                         " UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET dirty = " +
156                         std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_FDIRTY)) +
157                         " WHERE file_id = old.file_id;" +
158                         " SELECT cloud_sync_func(); " +
159                         " END;";
160 
161 const std::string PhotoColumn::CREATE_PHOTOS_MDIRTY_TRIGGER =
162                         "CREATE TRIGGER photos_mdirty_trigger AFTER UPDATE ON " +
163                         PhotoColumn::PHOTOS_TABLE + " FOR EACH ROW WHEN OLD.cloud_id IS NOT NULL" +
164                         " AND new.date_modified = old.date_modified AND old.dirty = " +
165                         std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_SYNCED)) +
166                         " AND new.time_visit = old.time_visit " +
167                         " AND new.dirty = old.dirty AND is_caller_self_func() = 'true'" +
168                         " BEGIN " +
169                         " UPDATE " + PhotoColumn::PHOTOS_TABLE + " SET dirty = " +
170                         std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_MDIRTY)) +
171                         " WHERE file_id = old.file_id;" +
172                         " SELECT cloud_sync_func(); " +
173                         " END;";
174 
175 const std::string  PhotoColumn::CREATE_PHOTOS_INSERT_CLOUD_SYNC =
176                         " CREATE TRIGGER photo_insert_cloud_sync_trigger AFTER INSERT ON " + PhotoColumn::PHOTOS_TABLE +
177                         " BEGIN SELECT cloud_sync_func(); END;";
178 
179 const std::set<std::string> PhotoColumn::PHOTO_COLUMNS = {
180     PhotoColumn::PHOTO_ORIENTATION, PhotoColumn::PHOTO_LATITUDE, PhotoColumn::PHOTO_LONGITUDE,
181     PhotoColumn::PHOTO_HEIGHT, PhotoColumn::PHOTO_WIDTH, PhotoColumn::PHOTO_LCD_VISIT_TIME, PhotoColumn::PHOTO_POSITION,
182     PhotoColumn::PHOTO_DIRTY, PhotoColumn::PHOTO_CLOUD_ID, PhotoColumn::CAMERA_SHOT_KEY, PhotoColumn::PHOTO_ALL_EXIF,
183     PhotoColumn::PHOTO_USER_COMMENT
184 };
185 
IsPhotoColumn(const std::string & columnName)186 bool PhotoColumn::IsPhotoColumn(const std::string &columnName)
187 {
188     if (columnName == "count(*)") {
189         return true;
190     }
191     return (PHOTO_COLUMNS.find(columnName) != PHOTO_COLUMNS.end()) ||
192         (MEDIA_COLUMNS.find(columnName) != MEDIA_COLUMNS.end());
193 }
194 
195 const std::string AudioColumn::AUDIO_ALBUM = "audio_album";
196 const std::string AudioColumn::AUDIO_ARTIST = "artist";
197 
198 const std::string AudioColumn::AUDIOS_TABLE = "Audios";
199 
200 const std::string AudioColumn::AUDIO_URI_PREFIX = "file://media/Audio/";
201 const std::string AudioColumn::DEFAULT_AUDIO_URI = "file://media/Audio";
202 const std::string AudioColumn::AUDIO_TYPE_URI = "/Audio";
203 
204 const std::string AudioColumn::CREATE_AUDIO_TABLE = "CREATE TABLE IF NOT EXISTS " +
205     AUDIOS_TABLE + " (" +
206     MEDIA_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
207     MEDIA_FILE_PATH + " TEXT, " +
208     MEDIA_SIZE + " BIGINT, " +
209     MEDIA_TITLE + " TEXT, " +
210     MEDIA_NAME + " TEXT, " +
211     MEDIA_TYPE + " INT, " +
212     MEDIA_MIME_TYPE + " TEXT, " +
213     MEDIA_OWNER_PACKAGE + " TEXT, " +
214     MEDIA_PACKAGE_NAME + " TEXT, " +
215     MEDIA_DEVICE_NAME + " TEXT, " +
216     AUDIO_ARTIST + " TEXT, " +
217     MEDIA_DATE_ADDED + " BIGINT, " +
218     MEDIA_DATE_MODIFIED + " BIGINT, " +
219     MEDIA_DATE_TAKEN + " BIGINT DEFAULT 0, " +
220     MEDIA_TIME_VISIT + " BIGINT DEFAULT 0, " +
221     MEDIA_DURATION + " INT, " +
222     MEDIA_TIME_PENDING + " BIGINT DEFAULT 0, " +
223     MEDIA_IS_FAV + " INT DEFAULT 0, " +
224     MEDIA_DATE_TRASHED + " BIGINT DEFAULT 0, " +
225     MEDIA_DATE_DELETED + " BIGINT DEFAULT 0, " +
226     MEDIA_PARENT_ID + " INT DEFAULT 0, " +
227     MEDIA_RELATIVE_PATH + " TEXT, " +
228     MEDIA_VIRTURL_PATH + " TEXT UNIQUE, " +
229     AUDIO_ALBUM + " TEXT)";
230 
231 const std::string AudioColumn::QUERY_MEDIA_VOLUME = "SELECT sum(" + MediaColumn::MEDIA_SIZE + ") AS " +
232     MediaColumn::MEDIA_SIZE + "," +
233     MediaColumn::MEDIA_TYPE + " FROM " +
234     AudioColumn::AUDIOS_TABLE + " WHERE " +
235     MediaColumn::MEDIA_TYPE + " = " + std::to_string(MEDIA_TYPE_AUDIO) + " GROUP BY " +
236     MediaColumn::MEDIA_TYPE;
237 
238 const std::set<std::string> AudioColumn::AUDIO_COLUMNS = {
239     AudioColumn::AUDIO_ALBUM, AudioColumn::AUDIO_ARTIST
240 };
241 
IsAudioColumn(const std::string & columnName)242 bool AudioColumn::IsAudioColumn(const std::string &columnName)
243 {
244     return (AUDIO_COLUMNS.find(columnName) != AUDIO_COLUMNS.end()) ||
245         (MEDIA_COLUMNS.find(columnName) != MEDIA_COLUMNS.end());
246 }
247 
248 const std::string MediaColumn::ASSETS_QUERY_FILTER =
249     PhotoColumn::PHOTO_SYNC_STATUS + " = 0" + " AND " +
250     MediaColumn::MEDIA_DATE_TRASHED + " = 0" + " AND " +
251     MediaColumn::MEDIA_HIDDEN + " = 0" + " AND " +
252     MediaColumn::MEDIA_TIME_PENDING + " = 0";
253 }  // namespace Media
254 }  // namespace OHOS
255