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 "album_data_handler.h"
17
18 #include "medialibrary_db_const.h"
19 #include "medialibrary_type_const.h"
20 #include "data_sync_const.h"
21 #include "data_sync_notifier.h"
22 #include "dfs_error.h"
23 #include "gallery_album_const.h"
24 #include "utils_log.h"
25 #include <algorithm>
26
27 namespace OHOS {
28 namespace FileManagement {
29 namespace CloudSync {
30 using namespace std;
31 using namespace NativeRdb;
32 using namespace DriveKit;
33 using namespace Media;
34 using PAC = Media::PhotoAlbumColumns;
35 using PM = Media::PhotoMap;
36 using ChangeType = OHOS::AAFwk::ChangeInfo::ChangeType;
37
AlbumDataHandler(int32_t userId,const std::string & bundleName,std::shared_ptr<RdbStore> rdb,shared_ptr<bool> stopFlag)38 AlbumDataHandler::AlbumDataHandler(int32_t userId, const std::string &bundleName,
39 std::shared_ptr<RdbStore> rdb, shared_ptr<bool> stopFlag)
40 : RdbDataHandler(userId, bundleName, PAC::TABLE, rdb, stopFlag)
41 {
42 }
43
GetFetchCondition(FetchCondition & cond)44 void AlbumDataHandler::GetFetchCondition(FetchCondition &cond)
45 {
46 cond.limitRes = LIMIT_SIZE;
47 cond.recordType = recordType_;
48 cond.desiredKeys = desiredKeys_;
49 cond.fullKeys = desiredKeys_;
50 }
51
GetRecordFieMapFromRecord(const DriveKit::DKRecord & record,DKRecordFieldMap & map)52 static inline int32_t GetRecordFieMapFromRecord(const DriveKit::DKRecord &record, DKRecordFieldMap &map)
53 {
54 DKRecordData data;
55 DriveKit::DKRecordFieldMap properties;
56 record.GetRecordData(data);
57 if (data.find(ALBUM_PROPERTIES) == data.end()) {
58 LOGE("get ALBUM_PROPERTIES fail");
59 return E_INVAL_ARG;
60 }
61 data[ALBUM_PROPERTIES].GetRecordMap(map);
62 return E_OK;
63 }
64
QueryLocalMatch(const std::string & recordId)65 tuple<shared_ptr<ResultSet>, int> AlbumDataHandler::QueryLocalMatch(const std::string &recordId)
66 {
67 NativeRdb::AbsRdbPredicates predicates = NativeRdb::AbsRdbPredicates(PAC::TABLE);
68 predicates.EqualTo(PAC::ALBUM_CLOUD_ID, recordId);
69 auto resultSet = Query(predicates, ALBUM_LOCAL_QUERY_COLUMNS);
70 if (resultSet == nullptr) {
71 LOGE("get nullptr query result");
72 return {nullptr, 0};
73 }
74 int rowCount = 0;
75 int ret = resultSet->GetRowCount(rowCount);
76 if (ret != 0) {
77 LOGE("result set get row count err %{public}d", ret);
78 return {nullptr, 0};
79 }
80 return { move(resultSet), rowCount };
81 }
82
QueryConflict(DriveKit::DKRecord & record,std::shared_ptr<NativeRdb::ResultSet> & resultSet)83 int32_t AlbumDataHandler::QueryConflict(DriveKit::DKRecord &record, std::shared_ptr<NativeRdb::ResultSet> &resultSet)
84 {
85 /* get record album name */
86 DKRecordData data;
87 record.GetRecordData(data);
88 if (data.find(ALBUM_NAME) == data.end()) {
89 LOGE("no album name in record");
90 return false;
91 }
92 string albumName;
93 if (data[ALBUM_NAME].GetString(albumName) != DKLocalErrorCode::NO_ERROR) {
94 LOGE("get album name err");
95 return E_INVAL_ARG;
96 }
97 /* query local */
98 NativeRdb::AbsRdbPredicates predicates = NativeRdb::AbsRdbPredicates(PAC::TABLE);
99 string albumType = to_string(static_cast<int32_t>(AlbumType::NORMAL));
100 DKRecordFieldMap properties;
101 string bundleName = "";
102 if (GetRecordFieMapFromRecord(record, properties) == E_OK && properties.find(PAC::ALBUM_TYPE) != data.end() &&
103 properties[PAC::ALBUM_TYPE].GetString(albumType) == DKLocalErrorCode::NO_ERROR &&
104 albumType == to_string(static_cast<int32_t>(AlbumType::SOURCE)) &&
105 properties[TMP_ALBUM_BUNDLE_NAME].GetString(bundleName) == DKLocalErrorCode::NO_ERROR) {
106 int rowCount = 0;
107 NativeRdb::AbsRdbPredicates sourcePredicates = NativeRdb::AbsRdbPredicates(PAC::TABLE);
108 sourcePredicates.EqualTo(TMP_ALBUM_BUNDLE_NAME, bundleName);
109 resultSet = Query(sourcePredicates, QUERY_SOURCE_ALBUM_COLUMNS);
110 if (resultSet == nullptr || resultSet->GetRowCount(rowCount) != E_OK) {
111 LOGE("query fail");
112 return E_RDB;
113 }
114 if (rowCount >= 0) {
115 return E_OK;
116 }
117 LOGW("conflict but no colmns");
118 predicates.EqualTo(PAC::ALBUM_TYPE, albumType);
119 }
120 predicates.EqualTo(PAC::ALBUM_NAME, albumName);
121 resultSet = Query(predicates, ALBUM_LOCAL_QUERY_COLUMNS);
122 if (resultSet == nullptr) {
123 LOGE("get nullptr query result");
124 return E_RDB;
125 }
126 return E_OK;
127 }
128
IsConflict(DriveKit::DKRecord & record,int32_t & albumId)129 bool AlbumDataHandler::IsConflict(DriveKit::DKRecord &record, int32_t &albumId)
130 {
131 int32_t rowCount = -1;
132 std::shared_ptr<NativeRdb::ResultSet> resultSet = nullptr;
133 int32_t ret = QueryConflict(record, resultSet);
134 if (ret != E_OK) {
135 LOGE("query fail ret is %{public}d", ret);
136 return false;
137 }
138 ret = resultSet->GetRowCount(rowCount);
139 if (ret != 0) {
140 LOGE("result set get row count err %{public}d", ret);
141 return false;
142 }
143 if (rowCount > 0) {
144 ret = resultSet->GoToNextRow();
145 if (ret != NativeRdb::E_OK) {
146 return false;
147 }
148 ret = createConvertor_.GetInt(PAC::ALBUM_ID, albumId, *resultSet);
149 if (ret != E_OK) {
150 return false;
151 }
152 return true;
153 }
154 return false;
155 }
156
MergeAlbumOnConflict(DriveKit::DKRecord & record,int32_t albumId)157 int32_t AlbumDataHandler::MergeAlbumOnConflict(DriveKit::DKRecord &record, int32_t albumId)
158 {
159 ValuesBucket values;
160 values.PutInt(PAC::ALBUM_DIRTY, static_cast<int32_t>(Media::DirtyType::TYPE_MDIRTY));
161 values.PutString(PAC::ALBUM_CLOUD_ID, record.GetRecordId());
162 int32_t changedRows;
163 int32_t ret = Update(changedRows, values, PAC::ALBUM_ID + " = ?", { to_string(albumId) });
164 if (ret != E_OK) {
165 LOGE("rdb update failed, err = %{public}d", ret);
166 return E_RDB;
167 }
168 return E_OK;
169 }
170
InsertCloudAlbum(DKRecord & record)171 int32_t AlbumDataHandler::InsertCloudAlbum(DKRecord &record)
172 {
173 RETURN_ON_ERR(IsStop());
174 LOGI("insert of record %s", record.GetRecordId().c_str());
175 /* merge if same album name */
176 int32_t albumId;
177 if (IsConflict(record, albumId)) {
178 int32_t ret = MergeAlbumOnConflict(record, albumId);
179 if (ret != E_OK) {
180 LOGE("merge album err %{public}d", ret);
181 }
182 return ret;
183 }
184 ValuesBucket values;
185 int32_t ret = createConvertor_.RecordToValueBucket(record, values);
186 if (ret != E_OK) {
187 LOGE("record to value bucket failed, ret = %{public}d", ret);
188 return ret;
189 }
190 string albumType = "";
191 DriveKit::DKRecordData data;
192 record.GetRecordData(data);
193 DKRecordFieldMap properties;
194 if (GetRecordFieMapFromRecord(record, properties) == E_OK &&
195 properties.find(PAC::ALBUM_TYPE) != data.end() &&
196 properties[PAC::ALBUM_TYPE].GetString(albumType) == DKLocalErrorCode::NO_ERROR) {
197 if (albumType == to_string(static_cast<int32_t>(AlbumType::SOURCE))) {
198 createConvertor_.ExtractBundleName(properties, values);
199 createConvertor_.ExtractLocalLanguage(properties, values);
200 }
201 }
202 values.PutInt(PAC::ALBUM_DIRTY, static_cast<int32_t>(Media::DirtyType::TYPE_SYNCED));
203 values.PutString(PAC::ALBUM_CLOUD_ID, record.GetRecordId());
204 /* update if a album with the same name exists? */
205 int64_t rowId;
206 ret = Insert(rowId, values);
207 if (ret != E_OK) {
208 LOGE("Insert pull record failed, rdb ret = %{public}d", ret);
209 return E_RDB;
210 }
211 return E_OK;
212 }
213
DeleteCloudAlbum(DKRecord & record)214 int32_t AlbumDataHandler::DeleteCloudAlbum(DKRecord &record)
215 {
216 int32_t deletedRows;
217 int ret = Delete(deletedRows, PAC::ALBUM_CLOUD_ID + " = ?", { record.GetRecordId() });
218 if (ret != E_OK) {
219 LOGE("delete in rdb failed, ret: %{public}d", ret);
220 return E_INVAL_ARG;
221 }
222 return E_OK;
223 }
224
UpdateCloudAlbum(DKRecord & record)225 int32_t AlbumDataHandler::UpdateCloudAlbum(DKRecord &record)
226 {
227 RETURN_ON_ERR(IsStop());
228 int32_t changedRows;
229 ValuesBucket values;
230 int32_t ret = createConvertor_.RecordToValueBucket(record, values);
231 if (ret != E_OK) {
232 LOGE("record to value bucket failed, ret = %{public}d", ret);
233 return ret;
234 }
235 DriveKit::DKRecordData data;
236 DKRecordFieldMap properties;
237 record.GetRecordData(data);
238 string albumType = to_string(static_cast<int32_t>(AlbumType::NORMAL));
239 if (GetRecordFieMapFromRecord(record, properties) == E_OK &&
240 properties.find(PAC::ALBUM_TYPE) != data.end() &&
241 properties[PAC::ALBUM_TYPE].GetString(albumType) == DKLocalErrorCode::NO_ERROR) {
242 if (albumType == to_string(static_cast<int32_t>(AlbumType::SOURCE))) {
243 values.Delete(PAC::ALBUM_NAME);
244 }
245 }
246
247 values.PutInt(PAC::ALBUM_DIRTY, static_cast<int32_t>(Media::DirtyType::TYPE_SYNCED));
248 ret = Update(changedRows, values, PAC::ALBUM_CLOUD_ID + " = ?", {record.GetRecordId()});
249 if (ret != E_OK) {
250 LOGE("rdb update failed, err = %{public}d", ret);
251 return E_RDB;
252 }
253 return E_OK;
254 }
255
GetLocalMatchDirty(NativeRdb::ResultSet & resultSet)256 static int32_t GetLocalMatchDirty(NativeRdb::ResultSet &resultSet)
257 {
258 int32_t dirty;
259 int32_t ret = DataConvertor::GetInt(PAC::ALBUM_DIRTY, dirty, resultSet);
260 if (ret != E_OK) {
261 LOGE("fail to get album dirty value");
262 /* assume dirty so that no follow-up actions */
263 return static_cast<int32_t>(Media::DirtyType::TYPE_MDIRTY);
264 }
265 return dirty;
266 }
267
HandleLocalDirty(int32_t dirty,const DriveKit::DKRecord & record)268 int32_t AlbumDataHandler::HandleLocalDirty(int32_t dirty, const DriveKit::DKRecord &record)
269 {
270 /* new -> dirty: keep local info and update cloud's */
271 if (dirty == static_cast<int32_t>(Media::DirtyType::TYPE_NEW)) {
272 int32_t changedRows;
273 ValuesBucket values;
274 values.PutInt(PAC::ALBUM_DIRTY, static_cast<int32_t>(Media::DirtyType::TYPE_MDIRTY));
275 int32_t ret = Update(changedRows, values, PAC::ALBUM_CLOUD_ID + " = ?", {record.GetRecordId()});
276 if (ret != E_OK) {
277 LOGE("rdb update failed, err = %{public}d", ret);
278 return E_RDB;
279 }
280 return E_OK;
281 }
282 return E_OK;
283 }
284
UpdateDownloadAlbumStat(uint64_t success,uint64_t rdbFail,uint64_t dataFail)285 void AlbumDataHandler::UpdateDownloadAlbumStat(uint64_t success, uint64_t rdbFail, uint64_t dataFail)
286 {
287 UpdateAlbumStat(INDEX_DL_ALBUM_SUCCESS, success);
288 UpdateAlbumStat(INDEX_DL_ALBUM_ERROR_RDB, rdbFail);
289 UpdateAlbumStat(INDEX_DL_ALBUM_ERROR_DATA, dataFail);
290 }
291
OnFetchRecords(shared_ptr<vector<DKRecord>> & records,OnFetchParams & params)292 int32_t AlbumDataHandler::OnFetchRecords(shared_ptr<vector<DKRecord>> &records,
293 OnFetchParams ¶ms)
294 {
295 LOGI("on fetch %{public}zu records", records->size());
296 int32_t ret = E_OK;
297 uint64_t success = 0;
298 uint64_t rdbFail = 0;
299 uint64_t dataFail = 0;
300
301 for (auto &record : *records) {
302 auto [resultSet, rowCount] = QueryLocalMatch(record.GetRecordId());
303 if (resultSet == nullptr) {
304 LOGE("get nullptr query result");
305 continue;
306 }
307 /* need to handle album cover uri */
308 if (rowCount == 0) {
309 if (!record.GetIsDelete()) {
310 /* insert */
311 ret = InsertCloudAlbum(record);
312 }
313 } else if (rowCount == 1) {
314 resultSet->GoToNextRow();
315 int32_t dirty = GetLocalMatchDirty(*resultSet);
316 if (dirty != static_cast<int32_t>(Media::DirtyType::TYPE_SYNCED)) {
317 /* local dirty */
318 ret = HandleLocalDirty(dirty, record);
319 } else if (record.GetIsDelete()) {
320 /* delete */
321 ret = DeleteCloudAlbum(record);
322 } else {
323 /* update */
324 ret = UpdateCloudAlbum(record);
325 }
326 } else {
327 /* invalid cases */
328 LOGE("recordId %s rowCount %{public}d", record.GetRecordId().c_str(), rowCount);
329 ret = E_DATA;
330 }
331
332 /* check ret */
333 if (ret != E_OK) {
334 LOGE("recordId %s error %{public}d", record.GetRecordId().c_str(), ret);
335 /* might need specific error type */
336 ret == E_RDB ? rdbFail++ : dataFail++;
337 if (ret == E_STOP) {
338 UpdateDownloadAlbumStat(success, rdbFail, dataFail);
339 (void)DataSyncNotifier::GetInstance().FinalNotify();
340 return E_STOP;
341 }
342 continue;
343 } else {
344 /* notify */
345 success++;
346 (void)DataSyncNotifier::GetInstance().TryNotify(ALBUM_URI_PREFIX,
347 ChangeType::UPDATE, INVALID_ASSET_ID);
348 }
349 }
350 (void)DataSyncNotifier::GetInstance().FinalNotify();
351
352 UpdateDownloadAlbumStat(success, rdbFail, dataFail);
353
354 return E_OK;
355 }
356
GetRetryRecords(std::vector<DriveKit::DKRecordId> & records)357 int32_t AlbumDataHandler::GetRetryRecords(std::vector<DriveKit::DKRecordId> &records)
358 {
359 return E_OK;
360 }
361
Clean(const int action)362 int32_t AlbumDataHandler::Clean(const int action)
363 {
364 /* update album */
365 string albumSql = "UPDATE " + PAC::TABLE + " SET " + PAC::ALBUM_CLOUD_ID + " = NULL, " +
366 PAC::ALBUM_DIRTY + " = " + to_string(static_cast<int32_t>(Media::DirtyType::TYPE_NEW));
367 int32_t ret = ExecuteSql(albumSql);
368 if (ret != NativeRdb::E_OK) {
369 LOGE("update all albums err %{public}d", ret);
370 return ret;
371 }
372 /* update album map */
373 string mapSql = "UPDATE " + PM::TABLE + " SET " + PM::DIRTY + " = " + to_string(static_cast<int32_t>(
374 Media::DirtyType::TYPE_NEW)) + " WHERE " + PM::DIRTY + " = " + to_string(static_cast<int32_t>(
375 Media::DirtyType::TYPE_SYNCED));
376 ret = ExecuteSql(mapSql);
377 if (ret != NativeRdb::E_OK) {
378 LOGE("update album maps err %{public}d", ret);
379 return ret;
380 }
381 mapSql = "DELETE FROM " + PM::TABLE + " WHERE " + PM::DIRTY + " = " + to_string(static_cast<int32_t>(
382 Media::DirtyType::TYPE_DELETED));
383 ret = ExecuteSql(mapSql);
384 if (ret != NativeRdb::E_OK) {
385 LOGE("delete album maps err %{public}d", ret);
386 return ret;
387 }
388 /* notify */
389 (void)DataSyncNotifier::GetInstance().TryNotify(ALBUM_URI_PREFIX,
390 ChangeType::DELETE, INVALID_ASSET_ID);
391 (void)DataSyncNotifier::GetInstance().FinalNotify();
392 return E_OK;
393 }
394
QueryUserAlbum(vector<DKRecord> & records,Media::DirtyType dirty,const vector<string> & failSet,AlbumDataConvertor & convertor)395 int32_t AlbumDataHandler::QueryUserAlbum(vector<DKRecord> &records, Media::DirtyType dirty,
396 const vector<string> &failSet, AlbumDataConvertor &convertor)
397 {
398 vector<DKRecord> userRecords = {};
399 /* build predicates */
400 auto createPredicates = NativeRdb::AbsRdbPredicates(PAC::TABLE);
401 createPredicates.EqualTo(PAC::ALBUM_DIRTY, to_string(static_cast<int32_t>(dirty)));
402 /* skip system albums */
403 createPredicates.And()->EqualTo(PAC::ALBUM_SUBTYPE, to_string(Media::PhotoAlbumSubType::USER_GENERIC));
404 if (!failSet.empty()) {
405 createPredicates.And()->NotIn(PAC::ALBUM_CLOUD_ID, failSet);
406 }
407 createPredicates.Limit(LIMIT_SIZE);
408
409 /* query */
410 auto results = Query(createPredicates, QUERY_USER_ALBUM_COLUMNS);
411 if (results == nullptr) {
412 LOGE("get nullptr created result");
413 return E_RDB;
414 }
415 /* results to records */
416 convertor.ResultSetToRecords(move(results), userRecords);
417 for (auto &record : userRecords) {
418 records.emplace_back(move(record));
419 }
420 return E_OK;
421 }
422
QuerySourceAlbum(vector<DKRecord> & records,Media::DirtyType dirty,const vector<string> & failSet,AlbumDataConvertor & convertor)423 int32_t AlbumDataHandler::QuerySourceAlbum(vector<DKRecord> &records, Media::DirtyType dirty,
424 const vector<string> &failSet, AlbumDataConvertor &convertor)
425 {
426 vector<DKRecord> suourcRecords = {};
427 /* build predicates */
428 auto createPredicates = NativeRdb::AbsRdbPredicates(PAC::TABLE);
429 createPredicates.EqualTo(PAC::ALBUM_DIRTY, to_string(static_cast<int32_t>(dirty)));
430 /* skip system albums */
431 createPredicates.And()->EqualTo(PAC::ALBUM_SUBTYPE, to_string(SURCE_GENERIC));
432 if (!failSet.empty()) {
433 createPredicates.And()->NotIn(PAC::ALBUM_CLOUD_ID, failSet);
434 }
435 createPredicates.Limit(LIMIT_SIZE);
436
437 /* query */
438 auto results = Query(createPredicates, QUERY_SOURCE_ALBUM_COLUMNS);
439 if (results == nullptr) {
440 LOGE("get nullptr created result");
441 return E_RDB;
442 }
443 /* results to records */
444 convertor.ResultSetToRecords(move(results), suourcRecords);
445 for (auto &record : suourcRecords) {
446 records.emplace_back(move(record));
447 }
448 return E_OK;
449 }
450
GetCreatedRecords(vector<DKRecord> & records)451 int32_t AlbumDataHandler::GetCreatedRecords(vector<DKRecord> &records)
452 {
453 RETURN_ON_ERR(QueryUserAlbum(records, Media::DirtyType::TYPE_NEW, createFailSet_, createConvertor_));
454 RETURN_ON_ERR(QuerySourceAlbum(records, Media::DirtyType::TYPE_NEW, createFailSet_, createConvertor_));
455 int32_t changedRows = -1;
456 DKRecordData data;
457 string albumId = "";
458 for (auto &record : records) {
459 ValuesBucket values;
460 values.Put(PAC::ALBUM_CLOUD_ID, record.GetRecordId());
461 record.GetRecordData(data);
462 data[ALBUM_ID].GetString(albumId);
463 data[ALBUM_ID] = DKRecordField(record.GetRecordId());
464 record.SetRecordData(data);
465 Update(changedRows, values, PAC::ALBUM_ID + " = ?", {albumId});
466 }
467 return E_OK;
468 }
469
GetDeletedRecords(vector<DKRecord> & records)470 int32_t AlbumDataHandler::GetDeletedRecords(vector<DKRecord> &records)
471 {
472 RETURN_ON_ERR(QueryUserAlbum(records, Media::DirtyType::TYPE_DELETED, modifyFailSet_, deleteConvertor_));
473 RETURN_ON_ERR(QuerySourceAlbum(records, Media::DirtyType::TYPE_DELETED, modifyFailSet_, deleteConvertor_));
474 return E_OK;
475 }
476
GetMetaModifiedRecords(vector<DKRecord> & records)477 int32_t AlbumDataHandler::GetMetaModifiedRecords(vector<DKRecord> &records)
478 {
479 RETURN_ON_ERR(QueryUserAlbum(records, Media::DirtyType::TYPE_MDIRTY, modifyFailSet_, modifyConvertor_));
480 RETURN_ON_ERR(QuerySourceAlbum(records, Media::DirtyType::TYPE_MDIRTY, modifyFailSet_, modifyConvertor_));
481 return E_OK;
482 }
483
OnCreateRecords(const map<DKRecordId,DKRecordOperResult> & map)484 int32_t AlbumDataHandler::OnCreateRecords(const map<DKRecordId, DKRecordOperResult> &map)
485 {
486 int32_t ret = E_OK;
487 uint64_t success = 0;
488 uint64_t failure = 0;
489
490 for (auto &entry : map) {
491 int32_t err;
492 const DKRecordOperResult &result = entry.second;
493 if (result.IsSuccess()) {
494 err = OnCreateSuccess(entry);
495 } else {
496 err = OnRecordFailed(entry);
497 OnCreateFail(entry);
498 failure++;
499 }
500 if (err == E_OK) {
501 success++;
502 }
503 GetReturn(err, ret);
504 }
505
506 UpdateAlbumStat(INDEX_UL_ALBUM_SUCCESS, success);
507 UpdateAlbumStat(INDEX_UL_ALBUM_ERROR_SDK, failure);
508
509 return ret;
510 }
511
OnDeleteRecords(const map<DKRecordId,DKRecordOperResult> & map)512 int32_t AlbumDataHandler::OnDeleteRecords(const map<DKRecordId, DKRecordOperResult> &map)
513 {
514 int32_t ret = E_OK;
515 uint64_t success = 0;
516 uint64_t failure = 0;
517
518 for (auto &entry : map) {
519 int32_t err;
520 const DKRecordOperResult &result = entry.second;
521 if (result.IsSuccess()) {
522 err = OnDeleteSuccess(entry);
523 } else {
524 err = OnRecordFailed(entry);
525 OnDeleteFail(entry);
526 failure++;
527 }
528 if (err == E_OK) {
529 success++;
530 }
531 GetReturn(err, ret);
532 }
533
534 UpdateAlbumStat(INDEX_UL_ALBUM_SUCCESS, success);
535 UpdateAlbumStat(INDEX_UL_ALBUM_ERROR_SDK, failure);
536
537 return ret;
538 }
539
OnModifyMdirtyRecords(const map<DKRecordId,DKRecordOperResult> & map)540 int32_t AlbumDataHandler::OnModifyMdirtyRecords(const map<DKRecordId, DKRecordOperResult> &map)
541 {
542 int32_t ret = E_OK;
543 uint64_t success = 0;
544 uint64_t failure = 0;
545
546 for (auto &entry : map) {
547 int32_t err;
548 const DKRecordOperResult &result = entry.second;
549 if (result.IsSuccess()) {
550 err = OnUploadSuccess(entry);
551 } else {
552 err = OnRecordFailed(entry);
553 OnModifyFail(entry);
554 failure++;
555 }
556 if (err == E_OK) {
557 success++;
558 }
559 GetReturn(err, ret);
560 }
561 return ret;
562 }
563
OnCreateSuccess(const pair<DriveKit::DKRecordId,DriveKit::DKRecordOperResult> & entry)564 int32_t AlbumDataHandler::OnCreateSuccess(const pair<DriveKit::DKRecordId,
565 DriveKit::DKRecordOperResult> &entry)
566 {
567 return OnUploadSuccess(entry);
568 }
569
OnUploadSuccess(const pair<DriveKit::DKRecordId,DriveKit::DKRecordOperResult> & entry)570 int32_t AlbumDataHandler::OnUploadSuccess(const pair<DriveKit::DKRecordId,
571 DriveKit::DKRecordOperResult> &entry)
572 {
573 int32_t changedRows;
574 ValuesBucket valuesBucket;
575 string whereClause = PAC::ALBUM_CLOUD_ID + " = ?";
576 vector<string> whereArgs = { entry.first };
577 valuesBucket.PutInt(PAC::ALBUM_DIRTY, static_cast<int32_t>(Media::DirtyType::TYPE_SYNCED));
578 int32_t ret = Update(changedRows, valuesBucket, whereClause, whereArgs);
579 if (ret != 0) {
580 LOGE("update local records err %{public}d", ret);
581 UpdateAlbumStat(INDEX_UL_ALBUM_ERROR_RDB, 1);
582 return ret;
583 }
584 return E_OK;
585 }
586
OnDeleteSuccess(const pair<DriveKit::DKRecordId,DriveKit::DKRecordOperResult> & entry)587 int32_t AlbumDataHandler::OnDeleteSuccess(const pair<DriveKit::DKRecordId,
588 DriveKit::DKRecordOperResult> &entry)
589 {
590 int32_t deletedRows;
591 string whereClause = PAC::ALBUM_CLOUD_ID + " = ?";
592 vector<string> whereArgs = { entry.first };
593 int32_t ret = Delete(deletedRows, whereClause, whereArgs);
594 if (ret != 0) {
595 LOGE("delete local records err %{public}d", ret);
596 UpdateAlbumStat(INDEX_UL_ALBUM_ERROR_RDB, 1);
597 return ret;
598 }
599 return E_OK;
600 }
601
OnCreateFail(const pair<DriveKit::DKRecordId,DriveKit::DKRecordOperResult> & entry)602 int32_t AlbumDataHandler::OnCreateFail(const pair<DriveKit::DKRecordId,
603 DriveKit::DKRecordOperResult> &entry)
604 {
605 createFailSet_.push_back(entry.first);
606 return E_OK;
607 }
608
OnDeleteFail(const pair<DriveKit::DKRecordId,DriveKit::DKRecordOperResult> & entry)609 int32_t AlbumDataHandler::OnDeleteFail(const pair<DriveKit::DKRecordId,
610 DriveKit::DKRecordOperResult> &entry)
611 {
612 modifyFailSet_.push_back(entry.first);
613 return E_OK;
614 }
615
OnModifyFail(const pair<DriveKit::DKRecordId,DriveKit::DKRecordOperResult> & entry)616 int32_t AlbumDataHandler::OnModifyFail(const pair<DriveKit::DKRecordId,
617 DriveKit::DKRecordOperResult> &entry)
618 {
619 modifyFailSet_.push_back(entry.first);
620 return E_OK;
621 }
622
Reset()623 void AlbumDataHandler::Reset()
624 {
625 modifyFailSet_.clear();
626 createFailSet_.clear();
627 }
628
SetChecking()629 void AlbumDataHandler::SetChecking()
630 {
631 ClearCursor();
632 }
633 } // namespace CloudSync
634 } // namespace FileManagement
635 } // namespace OHOS
636