• 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 "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 &params)
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