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