1 /*
2 * Copyright (C) 2024 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 "Scanner"
16
17 #include "ringtone_scanner_db.h"
18
19 #include "result_set_utils.h"
20 #include "rdb_errno.h"
21 #include "rdb_utils.h"
22 #include "ringtone_errno.h"
23 #include "ringtone_file_utils.h"
24 #include "ringtone_log.h"
25 #include "ringtone_rdbstore.h"
26
27 namespace OHOS {
28 namespace Media {
29 using namespace std;
30 using namespace OHOS::NativeRdb;
31 using namespace OHOS::DataShare;
GetFileBasicInfo(const string & path,unique_ptr<RingtoneMetadata> & ptr)32 int32_t RingtoneScannerDb::GetFileBasicInfo(const string &path, unique_ptr<RingtoneMetadata> &ptr)
33 {
34 vector<string> columns = {};
35 string whereClause = RINGTONE_COLUMN_DATA + " = ?";
36 vector<string> args = { path };
37
38 Uri uri("");
39 RingtoneDataCommand cmd(uri, RINGTONE_TABLE, RingtoneOperationType::QUERY);
40 cmd.GetAbsRdbPredicates()->SetWhereClause(whereClause);
41 cmd.GetAbsRdbPredicates()->SetWhereArgs(args);
42
43 shared_ptr<NativeRdb::ResultSet> resultSet;
44 int32_t ret = GetFileSet(cmd, columns, resultSet);
45 if (ret != E_OK) {
46 RINGTONE_ERR_LOG("Update operation failed. ret=%{public}d", ret);
47 return E_DB_FAIL;
48 }
49
50 return FillMetadata(resultSet, ptr);
51 }
52
GetVibrateFileBasicInfo(const string & path,unique_ptr<VibrateMetadata> & ptr)53 int32_t RingtoneScannerDb::GetVibrateFileBasicInfo(const string &path, unique_ptr<VibrateMetadata> &ptr)
54 {
55 vector<string> columns = {
56 VIBRATE_COLUMN_VIBRATE_ID, VIBRATE_COLUMN_SIZE, VIBRATE_COLUMN_DATE_MODIFIED, VIBRATE_COLUMN_TITLE,
57 VIBRATE_COLUMN_DATE_ADDED
58 };
59 string whereClause = VIBRATE_COLUMN_DATA + " = ?";
60 vector<string> args = { path };
61
62 Uri uri("");
63 RingtoneDataCommand cmd(uri, VIBRATE_TABLE, RingtoneOperationType::QUERY);
64 cmd.GetAbsRdbPredicates()->SetWhereClause(whereClause);
65 cmd.GetAbsRdbPredicates()->SetWhereArgs(args);
66
67 shared_ptr<NativeRdb::ResultSet> resultSet;
68 int32_t ret = GetFileSet(cmd, columns, resultSet);
69 if (ret != E_OK) {
70 RINGTONE_ERR_LOG("Update operation failed. ret=%{public}d", ret);
71 return E_DB_FAIL;
72 }
73
74 return FillVibrateMetadata(resultSet, ptr);
75 }
76
QueryRingtoneRdb(const string & whereClause,vector<string> & whereArgs,const vector<string> & columns,shared_ptr<NativeRdb::ResultSet> & resultSet,const string & tableName)77 int32_t RingtoneScannerDb::QueryRingtoneRdb(const string &whereClause, vector<string> &whereArgs,
78 const vector<string> &columns, shared_ptr<NativeRdb::ResultSet> &resultSet, const string &tableName)
79 {
80 auto rdbStore = RingtoneRdbStore::GetInstance();
81 if (rdbStore == nullptr) {
82 RINGTONE_ERR_LOG("failed to get rdb store");
83 return E_RDB;
84 }
85 auto rawRdb = rdbStore->GetRaw();
86 if (rawRdb == nullptr) {
87 RINGTONE_ERR_LOG("get raw rdb failed");
88 return E_RDB;
89 }
90
91 AbsRdbPredicates absRdbPredicates(tableName);
92 absRdbPredicates.SetWhereClause(whereClause);
93 absRdbPredicates.SetWhereArgs(whereArgs);
94 resultSet = rawRdb->Query(absRdbPredicates, columns);
95 if (resultSet == nullptr) {
96 RINGTONE_ERR_LOG("return nullptr when query rdb");
97 return E_RDB;
98 }
99
100 return E_OK;
101 }
102
UpdateRingtoneRdb(ValuesBucket & values,const string & whereClause,vector<string> & whereArgs,const string & tableName)103 int32_t RingtoneScannerDb::UpdateRingtoneRdb(ValuesBucket &values, const string &whereClause,
104 vector<string> &whereArgs, const string &tableName)
105 {
106 auto rdbStore = RingtoneRdbStore::GetInstance();
107 if (rdbStore == nullptr) {
108 RINGTONE_ERR_LOG("failed to get rdb");
109 return E_RDB;
110 }
111 auto rawRdb = rdbStore->GetRaw();
112 if (rawRdb == nullptr) {
113 RINGTONE_ERR_LOG("get raw rdb failed");
114 return E_RDB;
115 }
116 int32_t updateCount = 0;
117 int32_t result = rawRdb->Update(updateCount, tableName, values, whereClause, whereArgs);
118 if (result != NativeRdb::E_OK) {
119 RINGTONE_ERR_LOG("Update operation failed. Result %{public}d. Updated %{public}d", result, updateCount);
120 return E_DB_FAIL;
121 }
122 return updateCount;
123 }
124
FillMetadata(const shared_ptr<NativeRdb::ResultSet> & resultSet,unique_ptr<RingtoneMetadata> & ptr)125 int32_t RingtoneScannerDb::FillMetadata(const shared_ptr<NativeRdb::ResultSet> &resultSet,
126 unique_ptr<RingtoneMetadata> &ptr)
127 {
128 std::vector<std::string> columnNames;
129 int32_t err = resultSet->GetAllColumnNames(columnNames);
130 if (err != NativeRdb::E_OK) {
131 RINGTONE_ERR_LOG("failed to get all column names");
132 return E_RDB;
133 }
134
135 for (const auto &col : columnNames) {
136 ExtractMetaFromColumn(resultSet, ptr, col);
137 }
138
139 return E_OK;
140 }
141
FillVibrateMetadata(const shared_ptr<NativeRdb::ResultSet> & resultSet,unique_ptr<VibrateMetadata> & ptr)142 int32_t RingtoneScannerDb::FillVibrateMetadata(const shared_ptr<NativeRdb::ResultSet> &resultSet,
143 unique_ptr<VibrateMetadata> &ptr)
144 {
145 std::vector<std::string> columnNames;
146 int32_t err = resultSet->GetAllColumnNames(columnNames);
147 if (err != NativeRdb::E_OK) {
148 RINGTONE_ERR_LOG("failed to get all column names");
149 return E_RDB;
150 }
151
152 for (const auto &col : columnNames) {
153 ExtractVibrateMetaFromColumn(resultSet, ptr, col);
154 }
155
156 return E_OK;
157 }
158
ExtractMetaFromColumn(const shared_ptr<NativeRdb::ResultSet> & resultSet,unique_ptr<RingtoneMetadata> & metadata,const std::string & col)159 void RingtoneScannerDb::ExtractMetaFromColumn(const shared_ptr<NativeRdb::ResultSet> &resultSet,
160 unique_ptr<RingtoneMetadata> &metadata, const std::string &col)
161 {
162 RingtoneResultSetDataType dataType = RingtoneResultSetDataType::DATA_TYPE_NULL;
163 RingtoneMetadata::RingtoneMetadataFnPtr requestFunc = nullptr;
164 auto itr = metadata->memberFuncMap_.find(col);
165 if (itr != metadata->memberFuncMap_.end()) {
166 dataType = itr->second.first;
167 requestFunc = itr->second.second;
168 } else {
169 RINGTONE_DEBUG_LOG("invalid column name %{public}s", col.c_str());
170 return;
171 }
172
173 std::variant<int32_t, std::string, int64_t, double> data =
174 ResultSetUtils::GetValFromColumn<const shared_ptr<NativeRdb::ResultSet>>(col, resultSet, dataType);
175
176 // Use the function pointer from map and pass data to fn ptr
177 if (requestFunc != nullptr) {
178 (metadata.get()->*requestFunc)(data);
179 }
180 }
181
ExtractVibrateMetaFromColumn(const shared_ptr<NativeRdb::ResultSet> & resultSet,unique_ptr<VibrateMetadata> & metadata,const std::string & col)182 void RingtoneScannerDb::ExtractVibrateMetaFromColumn(const shared_ptr<NativeRdb::ResultSet> &resultSet,
183 unique_ptr<VibrateMetadata> &metadata, const std::string &col)
184 {
185 RingtoneResultSetDataType dataType = RingtoneResultSetDataType::DATA_TYPE_NULL;
186 VibrateMetadata::VibrateMetadataFnPtr requestFunc = nullptr;
187 auto itr = metadata->memberFuncMap_.find(col);
188 if (itr != metadata->memberFuncMap_.end()) {
189 dataType = itr->second.first;
190 requestFunc = itr->second.second;
191 } else {
192 RINGTONE_DEBUG_LOG("invalid column name %{public}s", col.c_str());
193 return;
194 }
195
196 std::variant<int32_t, std::string, int64_t, double> data =
197 ResultSetUtils::GetValFromColumn<const shared_ptr<NativeRdb::ResultSet>>(col, resultSet, dataType);
198
199 // Use the function pointer from map and pass data to fn ptr
200 if (requestFunc != nullptr) {
201 (metadata.get()->*requestFunc)(data);
202 }
203 }
204
GetFileSet(RingtoneDataCommand & cmd,const vector<string> & columns,shared_ptr<NativeRdb::ResultSet> & resultSet)205 int32_t RingtoneScannerDb::GetFileSet(RingtoneDataCommand &cmd, const vector<string> &columns,
206 shared_ptr<NativeRdb::ResultSet> &resultSet)
207 {
208 auto rdbStore = RingtoneRdbStore::GetInstance();
209 if (rdbStore == nullptr) {
210 RINGTONE_ERR_LOG("failed to get rdb");
211 return E_RDB;
212 }
213 auto rawRdb = rdbStore->GetRaw();
214 if (rawRdb == nullptr) {
215 RINGTONE_ERR_LOG("get raw rdb failed");
216 return E_RDB;
217 }
218 resultSet = rawRdb->Query(*cmd.GetAbsRdbPredicates(), columns);
219 if (resultSet == nullptr) {
220 RINGTONE_ERR_LOG("return nullptr when query rdb");
221 return E_RDB;
222 }
223
224 int32_t rowCount = 0;
225 int32_t ret = resultSet->GetRowCount(rowCount);
226 if (ret != NativeRdb::E_OK) {
227 RINGTONE_ERR_LOG("failed to get row count");
228 return E_RDB;
229 }
230 if (rowCount == 0) {
231 return E_OK;
232 }
233
234 ret = resultSet->GoToFirstRow();
235 if (ret != NativeRdb::E_OK) {
236 RINGTONE_ERR_LOG("failed to go to first row");
237 return E_RDB;
238 }
239 return E_OK;
240 }
241
InsertDateAdded(const RingtoneMetadata & metadata,ValuesBucket & outValues)242 static void InsertDateAdded(const RingtoneMetadata &metadata, ValuesBucket &outValues)
243 {
244 int64_t dateAdded = metadata.GetDateAdded();
245 if (dateAdded == 0) {
246 int64_t dateTaken = metadata.GetDateTaken();
247 if (dateTaken == 0) {
248 int64_t dateModified = metadata.GetDateModified();
249 if (dateModified == 0) {
250 dateAdded = RingtoneFileUtils::UTCTimeMilliSeconds();
251 RINGTONE_WARN_LOG("Invalid dateAdded time, use current time instead: %{public}" PRId64, dateAdded);
252 } else {
253 dateAdded = dateModified;
254 RINGTONE_WARN_LOG("Invalid dateAdded time, use dateModified instead: %{public}" PRId64, dateAdded);
255 }
256 } else {
257 dateAdded = dateTaken * MSEC_TO_SEC;
258 RINGTONE_WARN_LOG("Invalid dateAdded time, use dateTaken instead: %{public}" PRId64, dateAdded);
259 }
260 }
261 outValues.PutLong(RINGTONE_COLUMN_DATE_ADDED, dateAdded);
262 }
263
InsertVibrateDateAdded(const VibrateMetadata & metadata,ValuesBucket & outValues)264 static void InsertVibrateDateAdded(const VibrateMetadata &metadata, ValuesBucket &outValues)
265 {
266 int64_t dateAdded = metadata.GetDateAdded();
267 if (dateAdded == 0) {
268 int64_t dateTaken = metadata.GetDateTaken();
269 if (dateTaken == 0) {
270 int64_t dateModified = metadata.GetDateModified();
271 if (dateModified == 0) {
272 dateAdded = RingtoneFileUtils::UTCTimeMilliSeconds();
273 RINGTONE_WARN_LOG("Invalid dateAdded time, use current time instead: %{public}" PRId64, dateAdded);
274 } else {
275 dateAdded = dateModified;
276 RINGTONE_WARN_LOG("Invalid dateAdded time, use dateModified instead: %{public}" PRId64, dateAdded);
277 }
278 } else {
279 dateAdded = dateTaken * MSEC_TO_SEC;
280 RINGTONE_WARN_LOG("Invalid dateAdded time, use dateTaken instead: %{public}" PRId64, dateAdded);
281 }
282 }
283 outValues.PutLong(VIBRATE_COLUMN_DATE_ADDED, dateAdded);
284 }
285
SetValuesFromMetaData(const RingtoneMetadata & metadata,ValuesBucket & values,bool isInsert)286 static void SetValuesFromMetaData(const RingtoneMetadata &metadata, ValuesBucket &values, bool isInsert)
287 {
288 values.PutString(RINGTONE_COLUMN_DATA, metadata.GetData());
289 values.PutLong(RINGTONE_COLUMN_SIZE, metadata.GetSize());
290 values.PutString(RINGTONE_COLUMN_DISPLAY_NAME, metadata.GetDisplayName());
291 values.PutString(RINGTONE_COLUMN_TITLE, metadata.GetTitle());
292 values.PutInt(RINGTONE_COLUMN_MEDIA_TYPE, metadata.GetMediaType());
293 values.PutInt(RINGTONE_COLUMN_TONE_TYPE, metadata.GetToneType());
294 values.PutString(RINGTONE_COLUMN_MIME_TYPE, metadata.GetMimeType());
295 values.PutInt(RINGTONE_COLUMN_SOURCE_TYPE, metadata.GetSourceType());
296 values.PutLong(RINGTONE_COLUMN_DATE_MODIFIED, metadata.GetDateModified());
297 values.PutLong(RINGTONE_COLUMN_DATE_TAKEN, metadata.GetDateTaken());
298 values.PutInt(RINGTONE_COLUMN_DURATION, metadata.GetDuration());
299 values.PutInt(RINGTONE_COLUMN_SHOT_TONE_TYPE, metadata.GetShotToneType());
300 values.PutInt(RINGTONE_COLUMN_SHOT_TONE_SOURCE_TYPE, metadata.GetShotToneSourceType());
301 values.PutInt(RINGTONE_COLUMN_NOTIFICATION_TONE_TYPE, metadata.GetNotificationToneType());
302 values.PutInt(RINGTONE_COLUMN_NOTIFICATION_TONE_SOURCE_TYPE, metadata.GetNotificationToneSourceType());
303 values.PutInt(RINGTONE_COLUMN_RING_TONE_TYPE, metadata.GetRingToneType());
304 values.PutInt(RINGTONE_COLUMN_RING_TONE_SOURCE_TYPE, metadata.GetRingToneSourceType());
305 values.PutInt(RINGTONE_COLUMN_ALARM_TONE_TYPE, metadata.GetAlarmToneType());
306 values.PutInt(RINGTONE_COLUMN_ALARM_TONE_SOURCE_TYPE, metadata.GetAlarmToneSourceType());
307 values.PutInt(RINGTONE_COLUMN_SCANNER_FLAG, 1);
308
309 if (isInsert) {
310 InsertDateAdded(metadata, values);
311 return;
312 }
313 }
314
SetValuesFromVibrateMetaData(const VibrateMetadata & metadata,ValuesBucket & values,bool isInsert)315 static void SetValuesFromVibrateMetaData(const VibrateMetadata &metadata, ValuesBucket &values, bool isInsert)
316 {
317 values.PutString(VIBRATE_COLUMN_DATA, metadata.GetData());
318 values.PutLong(VIBRATE_COLUMN_SIZE, metadata.GetSize());
319 values.PutString(VIBRATE_COLUMN_DISPLAY_NAME, metadata.GetDisplayName());
320 values.PutString(VIBRATE_COLUMN_TITLE, metadata.GetTitle());
321 values.PutString(VIBRATE_COLUMN_DISPLAY_LANGUAGE, metadata.GetDisplayLanguage());
322 values.PutInt(VIBRATE_COLUMN_VIBRATE_TYPE, metadata.GetVibrateType());
323 values.PutInt(VIBRATE_COLUMN_SOURCE_TYPE, metadata.GetSourceType());
324 values.PutLong(VIBRATE_COLUMN_DATE_MODIFIED, metadata.GetDateModified());
325 values.PutLong(VIBRATE_COLUMN_DATE_TAKEN, metadata.GetDateTaken());
326 values.PutInt(VIBRATE_COLUMN_PLAY_MODE, metadata.GetPlayMode());
327 values.PutInt(VIBRATE_COLUMN_SCANNER_FLAG, 1);
328
329 if (isInsert) {
330 InsertVibrateDateAdded(metadata, values);
331 }
332 }
333
UpdateMetadata(const RingtoneMetadata & metadata,string & tableName)334 int32_t RingtoneScannerDb::UpdateMetadata(const RingtoneMetadata &metadata, string &tableName)
335 {
336 int32_t updateCount = 0;
337 ValuesBucket values;
338 string whereClause = RINGTONE_COLUMN_TONE_ID + " = ?";
339 vector<string> whereArgs = { to_string(metadata.GetToneId()) };
340
341 SetValuesFromMetaData(metadata, values, false);
342
343 tableName = RINGTONE_TABLE;
344 auto rdbStore = RingtoneRdbStore::GetInstance();
345 if (rdbStore == nullptr) {
346 RINGTONE_ERR_LOG("failed to get rdb");
347 return E_RDB;
348 }
349 auto rawRdb = rdbStore->GetRaw();
350 if (rawRdb == nullptr) {
351 RINGTONE_ERR_LOG("get raw rdb failed");
352 return E_RDB;
353 }
354 int32_t result = rawRdb->Update(updateCount, tableName, values, whereClause, whereArgs);
355 if (result != NativeRdb::E_OK || updateCount <= 0) {
356 RINGTONE_ERR_LOG("Update operation failed. Result %{public}d. Updated %{public}d", result, updateCount);
357 return E_DB_FAIL;
358 }
359 return updateCount;
360 }
361
UpdateVibrateMetadata(const VibrateMetadata & metadata,string & tableName)362 int32_t RingtoneScannerDb::UpdateVibrateMetadata(const VibrateMetadata &metadata, string &tableName)
363 {
364 int32_t updateCount = 0;
365 ValuesBucket values;
366 string whereClause = VIBRATE_COLUMN_VIBRATE_ID + " = ?";
367 vector<string> whereArgs = { to_string(metadata.GetVibrateId()) };
368
369 SetValuesFromVibrateMetaData(metadata, values, false);
370
371 tableName = VIBRATE_TABLE;
372 auto rdbStore = RingtoneRdbStore::GetInstance();
373 if (rdbStore == nullptr) {
374 RINGTONE_ERR_LOG("failed to get rdb");
375 return E_RDB;
376 }
377 auto rawRdb = rdbStore->GetRaw();
378 if (rawRdb == nullptr) {
379 RINGTONE_ERR_LOG("get raw rdb failed");
380 return E_RDB;
381 }
382 int32_t result = rawRdb->Update(updateCount, tableName, values, whereClause, whereArgs);
383 if (result != NativeRdb::E_OK || updateCount <= 0) {
384 RINGTONE_ERR_LOG("Update operation failed. Result %{public}d. Updated %{public}d", result, updateCount);
385 return E_DB_FAIL;
386 }
387 return updateCount;
388 }
389
InsertMetadata(const RingtoneMetadata & metadata,string & tableName)390 int32_t RingtoneScannerDb::InsertMetadata(const RingtoneMetadata &metadata, string &tableName)
391 {
392 ValuesBucket values;
393 int32_t rowNum = 0;
394 tableName = RINGTONE_TABLE;
395
396 SetValuesFromMetaData(metadata, values, true);
397 if (!InsertData(values, tableName, rowNum)) {
398 return E_DB_FAIL;
399 }
400
401 return rowNum;
402 }
403
InsertVibrateMetadata(const VibrateMetadata & metadata,string & tableName)404 int32_t RingtoneScannerDb::InsertVibrateMetadata(const VibrateMetadata &metadata, string &tableName)
405 {
406 ValuesBucket values;
407 int32_t rowNum = 0;
408 tableName = VIBRATE_TABLE;
409
410 SetValuesFromVibrateMetaData(metadata, values, true);
411 if (!InsertData(values, tableName, rowNum)) {
412 return E_DB_FAIL;
413 }
414
415 return rowNum;
416 }
417
InsertData(const ValuesBucket values,const string & tableName,int32_t & rowNum)418 bool RingtoneScannerDb::InsertData(const ValuesBucket values, const string &tableName, int32_t &rowNum)
419 {
420 auto rdbStore = RingtoneRdbStore::GetInstance();
421 if (rdbStore == nullptr) {
422 RINGTONE_ERR_LOG("failed to get rdb");
423 return false;
424 }
425 auto rawRdb = rdbStore->GetRaw();
426 if (rawRdb == nullptr) {
427 RINGTONE_ERR_LOG("get raw rdb failed");
428 return false;
429 }
430
431 int64_t nRow = static_cast<int64_t>(rowNum);
432 int32_t result = rawRdb->Insert(nRow, tableName, values);
433 if (nRow <= 0) {
434 RINGTONE_ERR_LOG("Ringtone library Insert functionality is failed, rowNum %{public}ld", (long) nRow);
435 return false;
436 }
437
438 if (result != NativeRdb::E_OK) {
439 RINGTONE_ERR_LOG("Ringtone library Insert functionality is failed, return %{public}d", result);
440 return false;
441 }
442
443 if (nRow < std::numeric_limits<int32_t>::min() || nRow > std::numeric_limits<int32_t>::max()) {
444 return false;
445 }
446 rowNum = static_cast<int32_t>(nRow);
447
448 return true;
449 }
450
UpdateScannerFlag()451 bool RingtoneScannerDb::UpdateScannerFlag()
452 {
453 int32_t updateCount = 0;
454 auto rdbStore = RingtoneRdbStore::GetInstance();
455 if (rdbStore == nullptr) {
456 RINGTONE_ERR_LOG("failed to get rdb");
457 return false;
458 }
459 auto rawRdb = rdbStore->GetRaw();
460 if (rawRdb == nullptr) {
461 RINGTONE_ERR_LOG("get raw rdb failed");
462 return false;
463 }
464
465 ValuesBucket ringtoneValues;
466 DataShare::DataSharePredicates ringtonePredicates;
467 int32_t result;
468 NativeRdb::RdbPredicates ringtoneRdbPredicate = RdbDataShareAdapter::RdbUtils::ToPredicates(ringtonePredicates,
469 RINGTONE_TABLE);
470 ringtoneValues.PutInt(RINGTONE_COLUMN_SCANNER_FLAG, 0);
471 result = rawRdb->Update(updateCount, ringtoneValues, ringtoneRdbPredicate);
472 RINGTONE_INFO_LOG("Ringtone update operation end. Updated %{public}d", updateCount);
473 if (result != NativeRdb::E_OK || updateCount < 0) {
474 RINGTONE_ERR_LOG("Ringtone update operation failed. Result %{public}d. Updated %{public}d",
475 result, updateCount);
476 return false;
477 }
478
479 ValuesBucket vibrateValues;
480 DataShare::DataSharePredicates vibratePredicates;
481 NativeRdb::RdbPredicates vibrateRdbPredicate = RdbDataShareAdapter::RdbUtils::ToPredicates(vibratePredicates,
482 VIBRATE_TABLE);
483 vibrateValues.PutInt(VIBRATE_COLUMN_SCANNER_FLAG, 0);
484 result = rawRdb->Update(updateCount, vibrateValues, vibrateRdbPredicate);
485 RINGTONE_INFO_LOG("Vibrate update operation end. Updated %{public}d", updateCount);
486 if (result != NativeRdb::E_OK || updateCount < 0) {
487 RINGTONE_ERR_LOG("Vibrate update operation failed. Result %{public}d. Updated %{public}d", result, updateCount);
488 return false;
489 }
490 return true;
491 }
492
DeleteNotExist()493 bool RingtoneScannerDb::DeleteNotExist()
494 {
495 int32_t deleteCount = 0;
496 auto rdbStore = RingtoneRdbStore::GetInstance();
497 if (rdbStore == nullptr) {
498 RINGTONE_ERR_LOG("failed to get rdb");
499 return false;
500 }
501 auto rawRdb = rdbStore->GetRaw();
502 if (rawRdb == nullptr) {
503 RINGTONE_ERR_LOG("get raw rdb failed");
504 return false;
505 }
506
507 DataShare::DataSharePredicates ringtonePredicates;
508 int32_t result;
509 NativeRdb::RdbPredicates ringtoneRdbPredicate = RdbDataShareAdapter::RdbUtils::ToPredicates(ringtonePredicates,
510 RINGTONE_TABLE);
511 ringtoneRdbPredicate.EqualTo(RINGTONE_COLUMN_SCANNER_FLAG, "0");
512 ringtoneRdbPredicate.And();
513 ringtoneRdbPredicate.EqualTo(RINGTONE_COLUMN_SOURCE_TYPE, "1");
514 result = rawRdb->Delete(deleteCount, ringtoneRdbPredicate);
515 RINGTONE_INFO_LOG("Ringtone delete operation end. Deleted %{public}d", deleteCount);
516 if (result != NativeRdb::E_OK || deleteCount < 0) {
517 RINGTONE_ERR_LOG("Ringtone delete operation failed. Result %{public}d. Deleted %{public}d",
518 result, deleteCount);
519 return false;
520 }
521
522 DataShare::DataSharePredicates vibratePredicates;
523 NativeRdb::RdbPredicates vibrateRdbPredicate = RdbDataShareAdapter::RdbUtils::ToPredicates(vibratePredicates,
524 VIBRATE_TABLE);
525 vibrateRdbPredicate.EqualTo(VIBRATE_COLUMN_SCANNER_FLAG, "0");
526 vibrateRdbPredicate.And();
527 vibrateRdbPredicate.EqualTo(VIBRATE_COLUMN_SOURCE_TYPE, "1");
528 result = rawRdb->Delete(deleteCount, vibrateRdbPredicate);
529 RINGTONE_INFO_LOG("Vibrate update operation end. Deleted %{public}d", deleteCount);
530 if (result != NativeRdb::E_OK || deleteCount < 0) {
531 RINGTONE_ERR_LOG("Vibrate update operation failed. Result %{public}d. Deleted %{public}d", result, deleteCount);
532 return false;
533 }
534 return true;
535 }
536 } // namespace Media
537 } // namespace OHOS
538