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 "photo_album_column.h"
17
18 #include "media_column.h"
19 #include "media_log.h"
20 #include "medialibrary_type_const.h"
21 #include "photo_map_column.h"
22 #include <string>
23
24 namespace OHOS::Media {
25 using namespace std;
26 using namespace NativeRdb;
27
28 // PhotoAlbum table
29 const string PhotoAlbumColumns::TABLE = "PhotoAlbum";
30 const string PhotoAlbumColumns::ALBUM_ID = "album_id";
31 const string PhotoAlbumColumns::ALBUM_TYPE = "album_type";
32 const string PhotoAlbumColumns::ALBUM_SUBTYPE = "album_subtype";
33 const string PhotoAlbumColumns::ALBUM_NAME = "album_name";
34 const string PhotoAlbumColumns::ALBUM_COVER_URI = "cover_uri";
35 const string PhotoAlbumColumns::ALBUM_COUNT = "count";
36 const string PhotoAlbumColumns::ALBUM_DATE_MODIFIED = "date_modified";
37 const string PhotoAlbumColumns::ALBUM_DIRTY = "dirty";
38 const string PhotoAlbumColumns::ALBUM_CLOUD_ID = "cloud_id";
39 // For api9 compatibility
40 const string PhotoAlbumColumns::ALBUM_RELATIVE_PATH = "relative_path";
41 // default fetch columns
42 const set<string> PhotoAlbumColumns::DEFAULT_FETCH_COLUMNS = {
43 ALBUM_ID, ALBUM_TYPE, ALBUM_SUBTYPE, ALBUM_NAME, ALBUM_COVER_URI, ALBUM_COUNT, ALBUM_DATE_MODIFIED
44 };
45
46 const string PhotoAlbumColumns::ALBUM_URI_PREFIX = "file://media/PhotoAlbum/";
47 const string PhotoAlbumColumns::DEFAULT_PHOTO_ALBUM_URI = "file://media/PhotoAlbum";
48
49 // Create tables
50 const string PhotoAlbumColumns::CREATE_TABLE = CreateTable() +
51 TABLE + " (" +
52 ALBUM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
53 ALBUM_TYPE + " INT, " +
54 ALBUM_SUBTYPE + " INT, " +
55 ALBUM_NAME + " TEXT COLLATE NOCASE, " +
56 ALBUM_COVER_URI + " TEXT, " +
57 ALBUM_COUNT + " INT DEFAULT 0, " +
58 ALBUM_DATE_MODIFIED + " BIGINT DEFAULT 0, " +
59 ALBUM_DIRTY + " INT DEFAULT " + std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_NEW)) + ", " +
60 ALBUM_CLOUD_ID + " TEXT, " +
61 ALBUM_RELATIVE_PATH + " TEXT)";
62
63 // Create indexes
64 const string PhotoAlbumColumns::INDEX_ALBUM_TYPES = CreateIndex() + "photo_album_types" + " ON " + TABLE +
65 " (" + ALBUM_TYPE + "," + ALBUM_SUBTYPE + ");";
66
67 // Create triggers
68 const std::string PhotoAlbumColumns::CREATE_ALBUM_INSERT_TRIGGER =
69 " CREATE TRIGGER album_insert_cloud_sync_trigger AFTER INSERT ON " + TABLE +
70 " BEGIN SELECT cloud_sync_func(); END;";
71
72 const std::string PhotoAlbumColumns::CREATE_ALBUM_DELETE_TRIGGER =
73 "CREATE TRIGGER album_delete_trigger AFTER UPDATE ON " + TABLE +
74 " FOR EACH ROW WHEN new." + ALBUM_DIRTY + " = " +
75 std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_DELETED)) +
76 " AND old." + ALBUM_DIRTY + " = " + std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_NEW)) +
77 " AND is_caller_self_func() = 'true' BEGIN DELETE FROM " + TABLE +
78 " WHERE " + ALBUM_ID + " = old." + ALBUM_ID + "; SELECT cloud_sync_func(); END;";
79
80 const std::string PhotoAlbumColumns::CREATE_ALBUM_MDIRTY_TRIGGER =
81 "CREATE TRIGGER album_modify_trigger AFTER UPDATE ON " + TABLE +
82 " FOR EACH ROW WHEN old." + ALBUM_DIRTY + " = " +
83 std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_SYNCED)) +
84 " AND old." + ALBUM_DIRTY + " = " + "new." + ALBUM_DIRTY +
85 " AND is_caller_self_func() = 'true'" +
86 " BEGIN UPDATE " + TABLE + " SET dirty = " +
87 std::to_string(static_cast<int32_t>(DirtyTypes::TYPE_MDIRTY)) +
88 " WHERE " + ALBUM_ID + " = old." + ALBUM_ID + "; SELECT cloud_sync_func(); END;";
89
IsPhotoAlbumColumn(const string & columnName)90 bool PhotoAlbumColumns::IsPhotoAlbumColumn(const string &columnName)
91 {
92 static const set<string> PHOTO_ALBUM_COLUMNS = {
93 PhotoAlbumColumns::ALBUM_ID, PhotoAlbumColumns::ALBUM_TYPE, PhotoAlbumColumns::ALBUM_SUBTYPE,
94 PhotoAlbumColumns::ALBUM_NAME, PhotoAlbumColumns::ALBUM_COVER_URI, PhotoAlbumColumns::ALBUM_COUNT,
95 PhotoAlbumColumns::ALBUM_RELATIVE_PATH
96 };
97 return PHOTO_ALBUM_COLUMNS.find(columnName) != PHOTO_ALBUM_COLUMNS.end();
98 }
99
GetUserAlbumPredicates(const int32_t albumId,RdbPredicates & predicates)100 void PhotoAlbumColumns::GetUserAlbumPredicates(const int32_t albumId, RdbPredicates &predicates)
101 {
102 string onClause = MediaColumn::MEDIA_ID + " = " + PhotoMap::ASSET_ID;
103 predicates.InnerJoin(PhotoMap::TABLE)->On({ onClause });
104 predicates.EqualTo(PhotoMap::ALBUM_ID, to_string(albumId));
105 predicates.EqualTo(PhotoColumn::PHOTO_SYNC_STATUS, to_string(static_cast<int32_t>(SyncStatusType::TYPE_VISIBLE)));
106 predicates.EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0));
107 predicates.EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(0));
108 predicates.EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0));
109 }
110
GetFavoritePredicates(RdbPredicates & predicates)111 static void GetFavoritePredicates(RdbPredicates &predicates)
112 {
113 predicates.BeginWrap();
114 constexpr int32_t isFavorite = 1;
115 predicates.EqualTo(MediaColumn::MEDIA_IS_FAV, to_string(isFavorite));
116 predicates.EqualTo(PhotoColumn::PHOTO_SYNC_STATUS, to_string(static_cast<int32_t>(SyncStatusType::TYPE_VISIBLE)));
117 predicates.And()->EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0));
118 predicates.And()->EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(0));
119 predicates.EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0));
120 predicates.EndWrap();
121 }
122
GetVideoPredicates(RdbPredicates & predicates)123 static void GetVideoPredicates(RdbPredicates &predicates)
124 {
125 predicates.BeginWrap();
126 predicates.EqualTo(MediaColumn::MEDIA_TYPE, to_string(MEDIA_TYPE_VIDEO));
127 predicates.EqualTo(PhotoColumn::PHOTO_SYNC_STATUS, to_string(static_cast<int32_t>(SyncStatusType::TYPE_VISIBLE)));
128 predicates.And()->EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0));
129 predicates.And()->EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(0));
130 predicates.EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0));
131 predicates.EndWrap();
132 }
133
GetHiddenPredicates(RdbPredicates & predicates)134 static void GetHiddenPredicates(RdbPredicates &predicates)
135 {
136 predicates.BeginWrap();
137 constexpr int32_t isHidden = 1;
138 predicates.EqualTo(PhotoColumn::PHOTO_SYNC_STATUS, to_string(static_cast<int32_t>(SyncStatusType::TYPE_VISIBLE)));
139 predicates.And()->EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0));
140 predicates.EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(isHidden));
141 predicates.EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0));
142 predicates.EndWrap();
143 }
144
GetTrashPredicates(RdbPredicates & predicates)145 static void GetTrashPredicates(RdbPredicates &predicates)
146 {
147 predicates.BeginWrap();
148 predicates.EqualTo(PhotoColumn::PHOTO_SYNC_STATUS, to_string(static_cast<int32_t>(SyncStatusType::TYPE_VISIBLE)));
149 predicates.GreaterThan(MediaColumn::MEDIA_DATE_TRASHED, to_string(0));
150 predicates.EndWrap();
151 }
152
GetScreenshotPredicates(RdbPredicates & predicates)153 static void GetScreenshotPredicates(RdbPredicates &predicates)
154 {
155 predicates.BeginWrap();
156 predicates.EqualTo(PhotoColumn::PHOTO_SUBTYPE, to_string(static_cast<int32_t>(PhotoSubType::SCREENSHOT)));
157 predicates.EqualTo(PhotoColumn::PHOTO_SYNC_STATUS, to_string(static_cast<int32_t>(SyncStatusType::TYPE_VISIBLE)));
158 predicates.And()->EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0));
159 predicates.And()->EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(0));
160 predicates.EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0));
161 predicates.EndWrap();
162 }
163
GetCameraPredicates(RdbPredicates & predicates)164 static void GetCameraPredicates(RdbPredicates &predicates)
165 {
166 predicates.BeginWrap();
167 predicates.EqualTo(PhotoColumn::PHOTO_SUBTYPE, to_string(static_cast<int32_t>(PhotoSubType::CAMERA)));
168 predicates.EqualTo(PhotoColumn::PHOTO_SYNC_STATUS, to_string(static_cast<int32_t>(SyncStatusType::TYPE_VISIBLE)));
169 predicates.And()->EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0));
170 predicates.And()->EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(0));
171 predicates.EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0));
172 predicates.EndWrap();
173 }
174
GetAllImagesPredicates(RdbPredicates & predicates)175 static void GetAllImagesPredicates(RdbPredicates &predicates)
176 {
177 predicates.BeginWrap();
178 predicates.EqualTo(MediaColumn::MEDIA_TYPE, to_string(MEDIA_TYPE_IMAGE));
179 predicates.EqualTo(PhotoColumn::PHOTO_SYNC_STATUS, to_string(static_cast<int32_t>(SyncStatusType::TYPE_VISIBLE)));
180 predicates.And()->EqualTo(MediaColumn::MEDIA_DATE_TRASHED, to_string(0));
181 predicates.And()->EqualTo(MediaColumn::MEDIA_HIDDEN, to_string(0));
182 predicates.EqualTo(MediaColumn::MEDIA_TIME_PENDING, to_string(0));
183 predicates.EndWrap();
184 }
185
GetSystemAlbumPredicates(const PhotoAlbumSubType subtype,RdbPredicates & predicates)186 void PhotoAlbumColumns::GetSystemAlbumPredicates(const PhotoAlbumSubType subtype, RdbPredicates &predicates)
187 {
188 switch (subtype) {
189 case PhotoAlbumSubType::FAVORITE: {
190 return GetFavoritePredicates(predicates);
191 }
192 case PhotoAlbumSubType::VIDEO: {
193 return GetVideoPredicates(predicates);
194 }
195 case PhotoAlbumSubType::HIDDEN: {
196 return GetHiddenPredicates(predicates);
197 }
198 case PhotoAlbumSubType::TRASH: {
199 return GetTrashPredicates(predicates);
200 }
201 case PhotoAlbumSubType::SCREENSHOT: {
202 return GetScreenshotPredicates(predicates);
203 }
204 case PhotoAlbumSubType::CAMERA: {
205 return GetCameraPredicates(predicates);
206 }
207 case PhotoAlbumSubType::IMAGES: {
208 return GetAllImagesPredicates(predicates);
209 }
210 default: {
211 predicates.EqualTo(PhotoColumn::MEDIA_ID, to_string(0));
212 MEDIA_WARN_LOG("Unsupported system album subtype: %{public}d", subtype);
213 return;
214 }
215 }
216 }
217 } // namespace OHOS::Media
218