• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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