• 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 "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