• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 #define MLOG_TAG "AccurateRefresh::AccurateRefreshBase"
16 
17 #include <sstream>
18 
19 #include "media_file_utils.h"
20 #include "accurate_refresh_base.h"
21 #include "medialibrary_unistore_manager.h"
22 #include "accurate_debug_log.h"
23 #include "result_set_utils.h"
24 #include "dfx_timer.h"
25 #include "dfx_const.h"
26 #include "medialibrary_tracer.h"
27 #include "dfx_refresh_manager.h"
28 #include "photo_album_column.h"
29 #include "dfx_refresh_hander.h"
30 #include "album_accurate_refresh_manager.h"
31 
32 using namespace std;
33 using namespace OHOS::NativeRdb;
34 
35 namespace OHOS {
36 namespace Media::AccurateRefresh {
37 
~AccurateRefreshBase()38 AccurateRefreshBase::~AccurateRefreshBase()
39 {
40     if (isReport_) {
41         DfxRefreshHander::DfxRefreshReportHander(dfxRefreshManager_);
42     }
43 }
44 
Insert(MediaLibraryCommand & cmd,int64_t & outRowId)45 int32_t AccurateRefreshBase::Insert(MediaLibraryCommand &cmd, int64_t &outRowId)
46 {
47     if (!IsValidTable(cmd.GetTableName())) {
48         return ACCURATE_REFRESH_RDB_INVALITD_TABLE;
49     }
50     PendingInfo pendingInfo(AlbumAccurateRefreshManager::GetInstance().GetCurrentRefreshTag());
51     MediaLibraryTracer tracer;
52     tracer.Start("AccurateRefreshBase::Insert cmd");
53     DfxRefreshHander::SetOperationStartTimeHander(dfxRefreshManager_);
54     vector<int32_t> keys;
55     #ifdef MEDIA_REFRESH_TEST
56         pair<int32_t, Results> retWithResults = {E_HAS_DB_ERROR, -1};
57         vector<ValuesBucket> values = { cmd.GetValueBucket() };
58         if (trans_) {
59             retWithResults = trans_->BatchInsert(cmd.GetTableName(), values, GetReturningKeyName());
60             CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR,
61                 "rdb trans BatchInsert error.");
62         } else {
63             auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
64             CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, ACCURATE_REFRESH_RDB_NULL, "rdbStore null.");
65             retWithResults = rdbStore->BatchInsert(cmd.GetTableName(), values, GetReturningKeyName());
66             CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR,
67                 "rdb BatchInsert error.");
68         }
69         keys = GetReturningKeys(retWithResults);
70         outRowId = keys[0];
71     #else
72         if (trans_) {
73             auto ret = trans_->Insert(cmd, outRowId);
74             CHECK_AND_RETURN_RET_LOG(ret == NativeRdb::E_OK, E_HAS_DB_ERROR,
75                 "rdb transaction insert error.");
76         } else {
77             auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
78             CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, ACCURATE_REFRESH_RDB_NULL, "rdbStore null.");
79             auto ret = rdbStore->Insert(cmd, outRowId);
80             CHECK_AND_RETURN_RET_LOG(ret == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR, "rdb insert error.");
81         }
82         keys.push_back(static_cast<int32_t> (outRowId));
83         ACCURATE_DEBUG("Insert key: %{public}" PRId64, outRowId);
84     #endif
85     UpdateModifiedDatasInner(keys, RDB_OPERATION_ADD, pendingInfo);
86     DfxRefreshHander::SetOptEndTimeHander(cmd, dfxRefreshManager_);
87     return ACCURATE_REFRESH_RET_OK;
88 }
89 
Insert(int64_t & outRowId,const string & table,ValuesBucket & value)90 int32_t AccurateRefreshBase::Insert(int64_t &outRowId, const string &table, ValuesBucket &value)
91 {
92     if (!IsValidTable(table)) {
93         return ACCURATE_REFRESH_RDB_INVALITD_TABLE;
94     }
95     PendingInfo pendingInfo(AlbumAccurateRefreshManager::GetInstance().GetCurrentRefreshTag());
96     MediaLibraryTracer tracer;
97     tracer.Start("AccurateRefreshBase::Insert talbe");
98     DfxRefreshHander::SetOperationStartTimeHander(dfxRefreshManager_);
99     vector<int32_t> keys;
100     #ifdef MEDIA_REFRESH_TEST
101         pair<int32_t, Results> retWithResults = {E_HAS_DB_ERROR, -1};
102         vector<ValuesBucket> values = { value };
103         if (trans_) {
104             retWithResults = trans_->BatchInsert(table, values, GetReturningKeyName());
105             CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR,
106                 "rdb trans BatchInsert error.");
107         } else {
108             auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
109             CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, ACCURATE_REFRESH_RDB_NULL, "rdbStore null.");
110             retWithResults = rdbStore->BatchInsert(table, values, GetReturningKeyName());
111             CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR,
112                 "rdb BatchInsert error.");
113         }
114         keys = GetReturningKeys(retWithResults);
115         outRowId = keys[0];
116     #else
117         if (trans_) {
118             auto ret = trans_->Insert(outRowId, table, value);
119             CHECK_AND_RETURN_RET_LOG(ret == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR, "rdb trans insert error.");
120         } else {
121             auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
122             CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, ACCURATE_REFRESH_RDB_NULL, "rdbStore null.");
123             auto ret = rdbStore->Insert(outRowId, table, value);
124             CHECK_AND_RETURN_RET_LOG(ret == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR, "rdb insert error.");
125         }
126 
127         keys.push_back(static_cast<int32_t> (outRowId));
128         ACCURATE_DEBUG("Insert key: %{public}" PRId64, outRowId);
129     #endif
130     UpdateModifiedDatasInner(keys, RDB_OPERATION_ADD, pendingInfo);
131     DfxRefreshHander::SetOptEndTimeHander(table, dfxRefreshManager_);
132     return ACCURATE_REFRESH_RET_OK;
133 }
134 
BatchInsert(MediaLibraryCommand & cmd,int64_t & changedRows,vector<ValuesBucket> & values)135 int32_t AccurateRefreshBase::BatchInsert(MediaLibraryCommand &cmd, int64_t& changedRows, vector<ValuesBucket>& values)
136 {
137     DfxRefreshHander::SetOperationStartTimeHander(dfxRefreshManager_);
138     if (!IsValidTable(cmd.GetTableName())) {
139         return ACCURATE_REFRESH_RDB_INVALITD_TABLE;
140     }
141     int32_t ret = BatchInsert(changedRows, cmd.GetTableName(), values);
142     DfxRefreshHander::SetOptEndTimeHander(cmd, dfxRefreshManager_);
143     return ret;
144 }
145 
BatchInsert(int64_t & changedRows,const string & table,vector<ValuesBucket> & values)146 int32_t AccurateRefreshBase::BatchInsert(int64_t &changedRows, const string &table,
147     vector<ValuesBucket> &values)
148 {
149     if (!IsValidTable(table)) {
150         return ACCURATE_REFRESH_RDB_INVALITD_TABLE;
151     }
152     PendingInfo pendingInfo(AlbumAccurateRefreshManager::GetInstance().GetCurrentRefreshTag());
153     MediaLibraryTracer tracer;
154     tracer.Start("AccurateRefreshBase::BatchInsert");
155     pair<int32_t, Results> retWithResults = {E_HAS_DB_ERROR, -1};
156     if (trans_) {
157         retWithResults = trans_->BatchInsert(table, values, GetReturningKeyName());
158         CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR,
159             "rdb trans BatchInsert error.");
160     } else {
161         auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
162         CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, ACCURATE_REFRESH_RDB_NULL, "rdbStore null.");
163         retWithResults = rdbStore->BatchInsert(table, values, GetReturningKeyName());
164         CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR,
165             "rdb BatchInsert error.");
166     }
167     changedRows = retWithResults.second.changed;
168     vector<int32_t> keys = GetReturningKeys(retWithResults);
169     UpdateModifiedDatasInner(keys, RDB_OPERATION_ADD, pendingInfo);
170     return ACCURATE_REFRESH_RET_OK;
171 }
Update(MediaLibraryCommand & cmd,int32_t & changedRows)172 int32_t AccurateRefreshBase::Update(MediaLibraryCommand &cmd, int32_t &changedRows)
173 {
174     DfxRefreshHander::SetOperationStartTimeHander(dfxRefreshManager_);
175     // 保持和 medialibrary_rdbstore.cpp medialibrary_rdb_transaction.cpp 处理一致
176     if (cmd.GetTableName() == PhotoColumn::PHOTOS_TABLE) {
177         cmd.GetValueBucket().PutLong(PhotoColumn::PHOTO_META_DATE_MODIFIED,
178             MediaFileUtils::UTCTimeMilliSeconds());
179         cmd.GetValueBucket().PutLong(PhotoColumn::PHOTO_LAST_VISIT_TIME,
180             MediaFileUtils::UTCTimeMilliSeconds());
181     }
182 
183     DfxTimer dfxTimer(DfxType::RDB_UPDATE_BY_CMD, INVALID_DFX, RDB_TIME_OUT, false);
184     int32_t ret = UpdateWithNoDateTime(changedRows, cmd.GetValueBucket(), *(cmd.GetAbsRdbPredicates()));
185     DfxRefreshHander::SetOptEndTimeHander(cmd, dfxRefreshManager_);
186     return ret;
187 }
188 
Update(int32_t & changedRows,const string & table,const ValuesBucket & value,const string & whereClause,const vector<string> & args)189 int32_t AccurateRefreshBase::Update(int32_t &changedRows, const string &table, const ValuesBucket &value,
190     const string &whereClause, const vector<string> &args)
191 {
192     DfxRefreshHander::SetOperationStartTimeHander(dfxRefreshManager_);
193     AbsRdbPredicates predicates(table);
194     predicates.SetWhereClause(whereClause);
195     predicates.SetWhereArgs(args);
196     int32_t ret = UpdateWithNoDateTime(changedRows, value, predicates);
197     DfxRefreshHander::SetOptEndTimeHander(predicates, dfxRefreshManager_);
198     return ret;
199 }
200 
Update(int32_t & changedRows,const ValuesBucket & value,const AbsRdbPredicates & predicates,RdbOperation operation)201 int32_t AccurateRefreshBase::Update(int32_t &changedRows, const ValuesBucket &value, const AbsRdbPredicates &predicates,
202     RdbOperation operation)
203 {
204     DfxRefreshHander::SetOperationStartTimeHander(dfxRefreshManager_);
205     // medialibrary_rdb_transaction.cpp 处理一致
206     ValuesBucket checkValue = value;
207     if (trans_) {
208         if (predicates.GetTableName() == PhotoColumn::PHOTOS_TABLE) {
209             checkValue.PutLong(PhotoColumn::PHOTO_META_DATE_MODIFIED, MediaFileUtils::UTCTimeMilliSeconds());
210             checkValue.PutLong(PhotoColumn::PHOTO_LAST_VISIT_TIME, MediaFileUtils::UTCTimeMilliSeconds());
211         }
212     }
213     int32_t ret = UpdateWithNoDateTime(changedRows, checkValue, predicates, operation);
214     DfxRefreshHander::SetOptEndTimeHander(predicates, dfxRefreshManager_);
215     return ret;
216 }
217 
UpdateWithNoDateTime(int32_t & changedRows,const ValuesBucket & value,const AbsRdbPredicates & predicates,RdbOperation operation)218 int32_t AccurateRefreshBase::UpdateWithNoDateTime(int32_t &changedRows, const ValuesBucket &value,
219     const AbsRdbPredicates &predicates, RdbOperation operation)
220 {
221     if (!IsValidTable(predicates.GetTableName())) {
222         return ACCURATE_REFRESH_RDB_INVALITD_TABLE;
223     }
224     MediaLibraryTracer tracer;
225     tracer.Start("AccurateRefreshBase::UpdateWithNoDateTime");
226     // 初始化Init数据
227     auto ret = Init(predicates);
228     if (ret != ACCURATE_REFRESH_RET_OK) {
229         MEDIA_WARN_LOG("no Init.");
230     }
231 
232     pair<int32_t, Results> retWithResults = {E_HAS_DB_ERROR, -1};
233     if (trans_) {
234         retWithResults = trans_->Update(value, predicates, GetReturningKeyName());
235         CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR,
236             "rdb trans Update error.");
237     } else {
238         auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
239         CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, ACCURATE_REFRESH_RDB_NULL, "rdbStore null.");
240         retWithResults = rdbStore->Update(value, predicates, GetReturningKeyName());
241         CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR,
242             "rdb Update error.");
243     }
244 
245     vector<int32_t> keys = GetReturningKeys(retWithResults);
246     changedRows = retWithResults.second.changed;
247     UpdateModifiedDatasInner(keys, operation);
248     return ACCURATE_REFRESH_RET_OK;
249 }
250 
251 // Files表和Photos表,执行Update;PhotosAlbum表,执行Update;PhotoTable,执行Update;其它执行Delete
252 // 媒体库设置标识,触发端云同步,同步完成后才会真正的删除放到对应的子类进行处理
LogicalDeleteReplaceByUpdate(MediaLibraryCommand & cmd,int32_t & deletedRows)253 int32_t AccurateRefreshBase::LogicalDeleteReplaceByUpdate(MediaLibraryCommand &cmd, int32_t &deletedRows)
254 {
255     return ACCURATE_REFRESH_RET_OK;
256 }
257 
258 // 同上
LogicalDeleteReplaceByUpdate(const AbsRdbPredicates & predicates,int32_t & deletedRows)259 int32_t AccurateRefreshBase::LogicalDeleteReplaceByUpdate(const AbsRdbPredicates &predicates, int32_t &deletedRows)
260 {
261     return ACCURATE_REFRESH_RET_OK;
262 }
263 
264 // Delete处理,彻底删除
Delete(int32_t & deletedRows,const string & table,const string & whereClause,const vector<string> & args)265 int32_t AccurateRefreshBase::Delete(int32_t &deletedRows, const string &table, const string &whereClause,
266     const vector<string> &args)
267 {
268     // 初始化Init数据
269     AbsRdbPredicates predicates(table);
270     predicates.SetWhereClause(whereClause);
271     predicates.SetWhereArgs(args);
272     return Delete(deletedRows, predicates);
273 }
274 
275 // Delete处理
Delete(int32_t & deletedRows,const AbsRdbPredicates & predicates)276 int32_t AccurateRefreshBase::Delete(int32_t &deletedRows, const AbsRdbPredicates &predicates)
277 {
278     if (!IsValidTable(predicates.GetTableName())) {
279         return ACCURATE_REFRESH_RDB_INVALITD_TABLE;
280     }
281     MediaLibraryTracer tracer;
282     tracer.Start("AccurateRefreshBase::Delete");
283     DfxRefreshHander::SetOperationStartTimeHander(dfxRefreshManager_);
284     auto ret = Init(predicates);
285     if (ret != ACCURATE_REFRESH_RET_OK) {
286         MEDIA_WARN_LOG("no Init.");
287     }
288     pair<int32_t, Results> retWithResults = {E_HAS_DB_ERROR, -1};
289     if (trans_) {
290         retWithResults = trans_->Delete(predicates, GetReturningKeyName());
291         CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, retWithResults.first,
292             "rdb Delete error.");
293     } else {
294         auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
295         CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, ACCURATE_REFRESH_RDB_NULL, "rdbStore null.");
296         retWithResults = rdbStore->Delete(predicates, GetReturningKeyName());
297         CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, retWithResults.first,
298             "rdb Delete error.");
299     }
300 
301     vector<int32_t> keys = GetReturningKeys(retWithResults);
302     deletedRows = retWithResults.second.changed;
303     ACCURATE_DEBUG("deletedRows: %{public}d", deletedRows);
304     UpdateModifiedDatasInner(keys, RDB_OPERATION_REMOVE);
305     DfxRefreshHander::SetOptEndTimeHander(predicates, dfxRefreshManager_);
306     return ACCURATE_REFRESH_RET_OK;
307 }
308 
GetReturningKeys(const pair<int32_t,Results> & retWithResults)309 vector<int32_t> AccurateRefreshBase::GetReturningKeys(const pair<int32_t, Results> &retWithResults)
310 {
311     stringstream ss;
312     vector<int32_t> keys;
313     auto resultSet = retWithResults.second.results;
314     if (retWithResults.first != ACCURATE_REFRESH_RET_OK) {
315         MEDIA_ERR_LOG("ret err: %{publid}d", retWithResults.first);
316         return keys;
317     }
318 
319     if (static_cast<std::size_t>(retWithResults.second.changed) >= MAX_DATA_LENGTH) {
320         MEDIA_WARN_LOG("returning total length: %{publid}d, exceed data size", retWithResults.second.changed);
321         return vector<int32_t>(MAX_DATA_LENGTH);
322     }
323 
324     int32_t count = 0;
325     auto ret = resultSet->GetRowCount(count);
326     if (ret != NativeRdb::E_OK || count <= 0) {
327         MEDIA_ERR_LOG("Failed to get resultset row count, ret[%{public}d], count[%{public}d]", ret, count);
328         return keys;
329     }
330 
331     do {
332         int32_t key = get<int32_t>(ResultSetUtils::GetValFromColumn(GetReturningKeyName(), resultSet, TYPE_INT32));
333         keys.push_back(key);
334         ss << " " << key;
335     } while (resultSet->GoToNextRow() == NativeRdb::E_OK);
336     ACCURATE_DEBUG("returning total length: %{public}d, new rows: %{public}s, ret: %{public}d",
337         retWithResults.second.changed, ss.str().c_str(), retWithResults.first);
338     return keys;
339 }
340 
ExecuteSql(const string & sql,RdbOperation operation)341 int32_t AccurateRefreshBase::ExecuteSql(const string &sql, RdbOperation operation)
342 {
343     DfxRefreshHander::SetOperationStartTimeHander(dfxRefreshManager_);
344     int32_t ret = ExecuteSql(sql, vector<ValueObject>(), operation);
345     DfxRefreshHander::SetOptEndTimeHander(PhotoAlbumColumns::TABLE, dfxRefreshManager_);
346     return ret;
347 }
348 
ExecuteForLastInsertedRowId(const string & sql,const vector<ValueObject> & bindArgs,RdbOperation operation)349 int32_t AccurateRefreshBase::ExecuteForLastInsertedRowId(const string &sql, const vector<ValueObject> &bindArgs,
350     RdbOperation operation)
351 {
352     MediaLibraryTracer tracer;
353     tracer.Start("AccurateRefreshBase::ExecuteForLastInsertedRowId");
354     DfxRefreshHander::SetOperationStartTimeHander(dfxRefreshManager_);
355     pair<int32_t, Results> retWithResults = {E_HAS_DB_ERROR, -1};
356     if (trans_) {
357         retWithResults = trans_->Execute(sql, bindArgs, GetReturningKeyName());
358     } else {
359         auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
360         CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, E_HAS_DB_ERROR, "rdbStore null.");
361         retWithResults = rdbStore->Execute(sql, bindArgs, GetReturningKeyName());
362     }
363 
364     ACCURATE_DEBUG("sql:%{public}s", sql.c_str());
365 
366     CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR,
367         "rdb ExecuteForLastInsertedRowId error.");
368     vector<int32_t> keys = GetReturningKeys(retWithResults);
369     UpdateModifiedDatasInner(keys, operation);
370     auto rowId = -1; // 兼容老接口
371     if (!keys.empty()) {
372         rowId = keys.back();
373     }
374     ACCURATE_DEBUG("ExecuteForLastInsertedRowId: %{public}d", rowId);
375     DfxRefreshHander::SetOptEndTimeHander(PhotoAlbumColumns::TABLE, dfxRefreshManager_);
376     return rowId;
377 }
378 
ExecuteSql(const string & sql,const vector<ValueObject> & bindArgs,RdbOperation operation)379 int32_t AccurateRefreshBase::ExecuteSql(const string &sql, const vector<ValueObject> &bindArgs, RdbOperation operation)
380 {
381     MediaLibraryTracer tracer;
382     tracer.Start("AccurateRefreshBase::ExecuteSql");
383     DfxRefreshHander::SetOperationStartTimeHander(dfxRefreshManager_);
384     pair<int32_t, Results> retWithResults = {E_HAS_DB_ERROR, -1};
385     if (trans_) {
386         retWithResults = trans_->Execute(sql, bindArgs, GetReturningKeyName());
387     } else {
388         auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
389         CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, ACCURATE_REFRESH_RDB_NULL, "rdbStore null.");
390         retWithResults = rdbStore->Execute(sql, bindArgs, GetReturningKeyName());
391     }
392     CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR, "rdb ExecuteSql error.");
393 
394     vector<int32_t> keys = GetReturningKeys(retWithResults);
395     ACCURATE_DEBUG("ExecuteSql: %{public}d", retWithResults.second.changed);
396     UpdateModifiedDatasInner(keys, operation);
397     DfxRefreshHander::SetOptEndTimeHander(PhotoAlbumColumns::TABLE, dfxRefreshManager_);
398     return ACCURATE_REFRESH_RET_OK;
399 }
400 
ExecuteForChangedRowCount(int64_t & outValue,const string & sql,const vector<ValueObject> & bindArgs,RdbOperation operation)401 int32_t AccurateRefreshBase::ExecuteForChangedRowCount(int64_t &outValue, const string &sql,
402     const vector<ValueObject> &bindArgs, RdbOperation operation)
403 {
404     MediaLibraryTracer tracer;
405     tracer.Start("AccurateRefreshBase::ExecuteForChangedRowCount");
406     pair<int32_t, Results> retWithResults = {E_HAS_DB_ERROR, -1};
407     if (trans_) {
408         retWithResults = trans_->Execute(sql, bindArgs, GetReturningKeyName());
409     } else {
410         auto rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
411         CHECK_AND_RETURN_RET_LOG(rdbStore != nullptr, ACCURATE_REFRESH_RDB_NULL, "rdbStore null.");
412         retWithResults = rdbStore->Execute(sql, bindArgs, GetReturningKeyName());
413     }
414 
415     CHECK_AND_RETURN_RET_LOG(retWithResults.first == ACCURATE_REFRESH_RET_OK, E_HAS_DB_ERROR,
416         "rdb ExecuteForChangedRowCount error.");
417     outValue = retWithResults.second.changed;
418     vector<int32_t> keys = GetReturningKeys(retWithResults);
419     ACCURATE_DEBUG("ExecuteForChangedRowCount: %{public}" PRId64, outValue);
420     UpdateModifiedDatasInner(keys, operation);
421     return ACCURATE_REFRESH_RET_OK;
422 }
423 
UpdateWithDateTime(ValuesBucket & values,const AbsRdbPredicates & predicates)424 int32_t AccurateRefreshBase::UpdateWithDateTime(ValuesBucket &values, const AbsRdbPredicates &predicates)
425 {
426     if (predicates.GetTableName() == PhotoColumn::PHOTOS_TABLE) {
427         values.PutLong(PhotoColumn::PHOTO_META_DATE_MODIFIED, MediaFileUtils::UTCTimeMilliSeconds());
428         values.PutLong(PhotoColumn::PHOTO_LAST_VISIT_TIME, MediaFileUtils::UTCTimeMilliSeconds());
429     }
430     int32_t changedRows = -1;
431     auto ret = Update(changedRows, values, predicates);
432     if (ret != ACCURATE_REFRESH_RET_OK) {
433         ACCURATE_ERR("ret: 0x%{public}x", ret);
434     }
435     return changedRows;
436 }
437 
GetDfxRefreshManager()438 std::shared_ptr<DfxRefreshManager> AccurateRefreshBase::GetDfxRefreshManager()
439 {
440     return dfxRefreshManager_;
441 }
442 
CloseDfxReport()443 void AccurateRefreshBase::CloseDfxReport()
444 {
445     isReport_ = false;
446 }
447 
448 } // namespace Media
449 } // namespace OHOS