• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 "FileOperation"
16 
17 #include "medialibrary_file_operations.h"
18 
19 #include "datashare_predicates.h"
20 #include "datashare_values_bucket.h"
21 #include "file_asset.h"
22 #include "hitrace_meter.h"
23 #ifdef MEDIALIBRARY_COMPATIBILITY
24 #include "media_file_asset_columns.h"
25 #endif
26 #include "media_file_utils.h"
27 #include "media_log.h"
28 #include "medialibrary_db_const.h"
29 #include "medialibrary_errno.h"
30 #include "medialibrary_notify.h"
31 #include "medialibrary_object_utils.h"
32 #include "medialibrary_smartalbum_map_operations.h"
33 #include "medialibrary_tracer.h"
34 #include "medialibrary_unistore_manager.h"
35 #include "native_album_asset.h"
36 #include "rdb_utils.h"
37 #include "userfilemgr_uri.h"
38 
39 using namespace std;
40 using namespace OHOS::NativeRdb;
41 using namespace OHOS::DataShare;
42 using namespace OHOS::RdbDataShareAdapter;
43 
44 namespace OHOS {
45 namespace Media {
46 using ChangeType = AAFwk::ChangeInfo::ChangeType;
47 
HandleFileOperation(MediaLibraryCommand & cmd)48 int32_t MediaLibraryFileOperations::HandleFileOperation(MediaLibraryCommand &cmd)
49 {
50     int32_t errCode = E_FAIL;
51     auto values = cmd.GetValueBucket();
52     string actualUri;
53 
54     ValueObject valueObject;
55     if (values.GetObject(MEDIA_DATA_DB_URI, valueObject)) {
56         valueObject.GetString(actualUri);
57     }
58 
59     // only support CloseAsset when networkId is not empty
60     string networkId = MediaFileUtils::GetNetworkIdFromUri(actualUri);
61     if (!networkId.empty() && cmd.GetOprnType() != OperationType::CLOSE) {
62         return E_PERMISSION_DENIED;
63     }
64 
65     switch (cmd.GetOprnType()) {
66         case OperationType::CREATE:
67             errCode = CreateFileOperation(cmd);
68             break;
69         case OperationType::CLOSE:
70             errCode = CloseFileOperation(cmd);
71             break;
72         case OperationType::GETCAPACITY:
73             errCode = GetAlbumCapacityOperation(cmd);
74             break;
75         case OperationType::COPY:
76             errCode = CopyFileOperation(cmd);
77             break;
78         default:
79             MEDIA_ERR_LOG("unknown operation type %{public}d", cmd.GetOprnType());
80             break;
81     }
82     return errCode;
83 }
84 
CreateFileOperation(MediaLibraryCommand & cmd)85 int32_t MediaLibraryFileOperations::CreateFileOperation(MediaLibraryCommand &cmd)
86 {
87     return MediaLibraryObjectUtils::CreateFileObj(cmd);
88 }
89 
CloseFileOperation(MediaLibraryCommand & cmd)90 int32_t MediaLibraryFileOperations::CloseFileOperation(MediaLibraryCommand &cmd)
91 {
92     return MediaLibraryObjectUtils::CloseFile(cmd);
93 }
94 
QueryFavFiles(MediaLibraryCommand & cmd)95 shared_ptr<NativeRdb::ResultSet> MediaLibraryFileOperations::QueryFavFiles(MediaLibraryCommand &cmd)
96 {
97     cmd.GetAbsRdbPredicates()->EqualTo(MEDIA_DATA_DB_IS_FAV, "1");
98     cmd.GetAbsRdbPredicates()->And()->NotEqualTo(MEDIA_DATA_DB_MEDIA_TYPE, std::to_string(MEDIA_TYPE_ALBUM));
99 
100     return MediaLibraryObjectUtils::QueryWithCondition(cmd, {});
101 }
102 
QueryTrashFiles(MediaLibraryCommand & cmd)103 shared_ptr<NativeRdb::ResultSet> MediaLibraryFileOperations::QueryTrashFiles(MediaLibraryCommand &cmd)
104 {
105     cmd.GetAbsRdbPredicates()
106         ->GreaterThan(MEDIA_DATA_DB_DATE_TRASHED, std::to_string(NOT_TRASHED))
107         ->And()
108         ->NotEqualTo(MEDIA_DATA_DB_MEDIA_TYPE, std::to_string(MEDIA_TYPE_ALBUM));
109 
110     return MediaLibraryObjectUtils::QueryWithCondition(cmd, {});
111 }
112 
GetAlbumCapacityOperation(MediaLibraryCommand & cmd)113 int32_t MediaLibraryFileOperations::GetAlbumCapacityOperation(MediaLibraryCommand &cmd)
114 {
115     int32_t errorCode = E_FAIL;
116     shared_ptr<NativeRdb::ResultSet> resultSet = nullptr;
117 
118     auto values = cmd.GetValueBucket();
119     ValueObject valueObject;
120     int32_t isFavourite = 0;
121     bool isTrash = false;
122     if (values.GetObject(MEDIA_DATA_DB_IS_FAV, valueObject)) {
123         valueObject.GetInt(isFavourite);
124     }
125     if (values.GetObject(MEDIA_DATA_DB_IS_TRASH, valueObject)) {
126         valueObject.GetBool(isTrash);
127     }
128 
129     if (isFavourite != 0) {
130         resultSet = QueryFavFiles(cmd);
131     } else if (isTrash) {
132         resultSet = QueryTrashFiles(cmd);
133     }
134 
135     if (resultSet != nullptr) {
136         resultSet->GetRowCount(errorCode);
137         MEDIA_INFO_LOG("GetRowCount %{private}d", errorCode);
138     }
139 
140     return errorCode;
141 }
142 
ModifyFileOperation(MediaLibraryCommand & cmd)143 int32_t MediaLibraryFileOperations::ModifyFileOperation(MediaLibraryCommand &cmd)
144 {
145     string strFileId = cmd.GetOprnFileId();
146     if (strFileId.empty()) {
147         MEDIA_ERR_LOG("MediaLibraryFileOperations::ModifyFileOperation Get id from uri or valuesBucket failed!");
148         return E_INVALID_FILEID;
149     }
150 
151     string srcPath = MediaLibraryObjectUtils::GetPathByIdFromDb(strFileId);
152     if (srcPath.empty()) {
153         MEDIA_ERR_LOG("MediaLibraryFileOperations::ModifyFileOperation Get path of id %{private}s from database file!",
154             strFileId.c_str());
155         return E_INVALID_FILEID;
156     }
157 
158     string dstFileName;
159     string dstReFilePath;
160     auto values = cmd.GetValueBucket();
161     ValueObject valueObject;
162     if (values.GetObject(MEDIA_DATA_DB_NAME, valueObject)) {
163         valueObject.GetString(dstFileName);
164     }
165     if (values.GetObject(MEDIA_DATA_DB_RELATIVE_PATH, valueObject)) {
166         valueObject.GetString(dstReFilePath);
167     }
168     string dstFilePath = ROOT_MEDIA_DIR + dstReFilePath + dstFileName;
169 
170     if (srcPath.compare(dstFilePath) == 0) {
171         return E_SAME_PATH;
172     }
173     return MediaLibraryObjectUtils::RenameFileObj(cmd, srcPath, dstFilePath);
174 }
175 
176 constexpr bool START_PENDING = false;
SolvePendingInQuery(AbsRdbPredicates * predicates)177 static void SolvePendingInQuery(AbsRdbPredicates* predicates)
178 {
179     string whereClause = predicates->GetWhereClause();
180     size_t groupByPoint = whereClause.rfind("GROUP BY");
181     string groupBy;
182     if (groupByPoint != string::npos) {
183         groupBy = whereClause.substr(groupByPoint);
184         whereClause = whereClause.substr(0, groupByPoint);
185     }
186 
187     predicates->SetWhereClause(whereClause);
188     predicates->EqualTo(MEDIA_DATA_DB_TIME_PENDING, "0");
189     if (!groupBy.empty()) {
190         predicates->SetWhereClause(predicates->GetWhereClause() + groupBy);
191     }
192 }
193 
194 #ifdef MEDIALIBRARY_COMPATIBILITY
195 const std::string EMPTY_COLUMN_AS = "'' AS ";
196 const std::string DEFAULT_INT_COLUMN_AS = "0 AS ";
197 const std::string COMPAT_COLUMN_ARTIST = EMPTY_COLUMN_AS + MEDIA_DATA_DB_ARTIST;
198 const std::string COMPAT_COLUMN_AUDIO_ALBUM = EMPTY_COLUMN_AS + MEDIA_DATA_DB_AUDIO_ALBUM;
199 const std::string COMPAT_COLUMN_ORIENTATION = DEFAULT_INT_COLUMN_AS + MEDIA_DATA_DB_ORIENTATION;
200 const std::string COMPAT_COLUMN_BUCKET_ID = DEFAULT_INT_COLUMN_AS + MEDIA_DATA_DB_BUCKET_ID;
201 const std::string COMPAT_COLUMN_BUCKET_NAME = EMPTY_COLUMN_AS + MEDIA_DATA_DB_BUCKET_NAME;
202 const std::string COMPAT_COLUMN_IS_TRASH = MEDIA_DATA_DB_DATE_TRASHED + " AS " + MEDIA_DATA_DB_IS_TRASH;
203 const std::string COMPAT_COLUMN_WIDTH = DEFAULT_INT_COLUMN_AS + MEDIA_DATA_DB_WIDTH;
204 const std::string COMPAT_COLUMN_HEIGHT = DEFAULT_INT_COLUMN_AS + MEDIA_DATA_DB_HEIGHT;
205 const std::string COMPAT_COLUMN_URI = EMPTY_COLUMN_AS + MEDIA_DATA_DB_URI;
206 
PhotosCompatColumns()207 static const vector<string> &PhotosCompatColumns()
208 {
209     /*
210      * Caution: Columns MUST KEEP SAME ORDER for sqlite UNION operation in:
211      *     o PHOTOS_COMPAT_COLUMNS
212      *     o AUDIOS_COMPAT_COLUMNS
213      *     o FILES_COMPAT_COLUMNS
214      */
215     static const vector<string> PHOTOS_COMPAT_COLUMNS = {
216         MEDIA_DATA_DB_ID,
217         MEDIA_DATA_DB_FILE_PATH,
218         COMPAT_COLUMN_URI,
219         MEDIA_DATA_DB_MIME_TYPE,
220         MEDIA_DATA_DB_MEDIA_TYPE,
221         MEDIA_DATA_DB_NAME,
222         MEDIA_DATA_DB_TITLE,
223         MEDIA_DATA_DB_RELATIVE_PATH,
224         MEDIA_DATA_DB_PARENT_ID,
225         MEDIA_DATA_DB_SIZE,
226         MEDIA_DATA_DB_DATE_ADDED,
227         MEDIA_DATA_DB_DATE_MODIFIED,
228         MEDIA_DATA_DB_DATE_ADDED_TO_SECOND,
229         MEDIA_DATA_DB_DATE_MODIFIED_TO_SECOND,
230         MEDIA_DATA_DB_DATE_TAKEN,
231         MEDIA_DATA_DB_DATE_TAKEN_TO_SECOND,
232         COMPAT_COLUMN_ARTIST,
233         COMPAT_COLUMN_AUDIO_ALBUM,
234         MEDIA_DATA_DB_WIDTH,
235         MEDIA_DATA_DB_HEIGHT,
236         MEDIA_DATA_DB_ORIENTATION,
237         MEDIA_DATA_DB_DURATION,
238         COMPAT_COLUMN_BUCKET_ID,
239         COMPAT_COLUMN_BUCKET_NAME,
240         COMPAT_COLUMN_IS_TRASH,
241         MEDIA_DATA_DB_IS_FAV,
242         MEDIA_DATA_DB_DATE_TRASHED,
243         MEDIA_DATA_DB_DATE_TRASHED_TO_SECOND,
244 
245         MediaColumn::MEDIA_HIDDEN,
246         PhotoColumn::PHOTO_SYNC_STATUS,
247         PhotoColumn::PHOTO_SUBTYPE,
248     };
249     return PHOTOS_COMPAT_COLUMNS;
250 }
251 
AudiosCompatColumns()252 static const vector<string> &AudiosCompatColumns()
253 {
254     /*
255      * Caution: Columns MUST KEEP SAME ORDER for sqlite UNION operation in:
256      *     o PHOTOS_COMPAT_COLUMNS
257      *     o AUDIOS_COMPAT_COLUMNS
258      *     o FILES_COMPAT_COLUMNS
259      */
260     static const vector<string> AUDIOS_COMPAT_COLUMNS = {
261         MEDIA_DATA_DB_ID,
262         MEDIA_DATA_DB_FILE_PATH,
263         COMPAT_COLUMN_URI,
264         MEDIA_DATA_DB_MIME_TYPE,
265         MEDIA_DATA_DB_MEDIA_TYPE,
266         MEDIA_DATA_DB_NAME,
267         MEDIA_DATA_DB_TITLE,
268         MEDIA_DATA_DB_RELATIVE_PATH,
269         MEDIA_DATA_DB_PARENT_ID,
270         MEDIA_DATA_DB_SIZE,
271         MEDIA_DATA_DB_DATE_ADDED,
272         MEDIA_DATA_DB_DATE_MODIFIED,
273         MEDIA_DATA_DB_DATE_ADDED_TO_SECOND,
274         MEDIA_DATA_DB_DATE_MODIFIED_TO_SECOND,
275         MEDIA_DATA_DB_DATE_TAKEN,
276         MEDIA_DATA_DB_DATE_TAKEN_TO_SECOND,
277         MEDIA_DATA_DB_ARTIST,
278         MEDIA_DATA_DB_AUDIO_ALBUM,
279         COMPAT_COLUMN_WIDTH,
280         COMPAT_COLUMN_HEIGHT,
281         COMPAT_COLUMN_ORIENTATION,
282         MEDIA_DATA_DB_DURATION,
283         COMPAT_COLUMN_BUCKET_ID,
284         COMPAT_COLUMN_BUCKET_NAME,
285         COMPAT_COLUMN_IS_TRASH,
286         MEDIA_DATA_DB_IS_FAV,
287         MEDIA_DATA_DB_DATE_TRASHED,
288         MEDIA_DATA_DB_DATE_TRASHED_TO_SECOND,
289 
290         DEFAULT_INT_COLUMN_AS + MediaColumn::MEDIA_HIDDEN,
291         DEFAULT_INT_COLUMN_AS + PhotoColumn::PHOTO_SYNC_STATUS,
292         DEFAULT_INT_COLUMN_AS + PhotoColumn::PHOTO_SUBTYPE,
293     };
294     return AUDIOS_COMPAT_COLUMNS;
295 }
296 
FilesCompatColumns()297 static const vector<string> &FilesCompatColumns()
298 {
299     /*
300      * Caution: KEEP SAME ORDER for sqlite UNION operation in columns below:
301      *     o PHOTOS_COMPAT_COLUMNS
302      *     o AUDIOS_COMPAT_COLUMNS
303      *     o FILES_COMPAT_COLUMNS
304      */
305     static const vector<string> FILES_COMPAT_COLUMNS = {
306         MEDIA_DATA_DB_ID,
307         MEDIA_DATA_DB_FILE_PATH,
308         MEDIA_DATA_DB_URI,
309         MEDIA_DATA_DB_MIME_TYPE,
310         MEDIA_DATA_DB_MEDIA_TYPE,
311         MEDIA_DATA_DB_NAME,
312         MEDIA_DATA_DB_TITLE,
313         MEDIA_DATA_DB_RELATIVE_PATH,
314         MEDIA_DATA_DB_PARENT_ID,
315         MEDIA_DATA_DB_SIZE,
316         MEDIA_DATA_DB_DATE_ADDED,
317         MEDIA_DATA_DB_DATE_MODIFIED,
318         MEDIA_DATA_DB_DATE_TAKEN,
319         MEDIA_DATA_DB_DATE_ADDED_TO_SECOND,
320         MEDIA_DATA_DB_DATE_MODIFIED_TO_SECOND,
321         MEDIA_DATA_DB_DATE_TAKEN_TO_SECOND,
322         MEDIA_DATA_DB_ARTIST,
323         COMPAT_COLUMN_AUDIO_ALBUM,
324         MEDIA_DATA_DB_WIDTH,
325         MEDIA_DATA_DB_HEIGHT,
326         MEDIA_DATA_DB_ORIENTATION,
327         MEDIA_DATA_DB_DURATION,
328         MEDIA_DATA_DB_BUCKET_ID,
329         MEDIA_DATA_DB_BUCKET_NAME,
330         MEDIA_DATA_DB_IS_TRASH,
331         MEDIA_DATA_DB_IS_FAV,
332         MEDIA_DATA_DB_DATE_TRASHED,
333         MEDIA_DATA_DB_DATE_TRASHED_TO_SECOND,
334 
335         DEFAULT_INT_COLUMN_AS + MediaColumn::MEDIA_HIDDEN,
336         PhotoColumn::PHOTO_SYNC_STATUS,
337         DEFAULT_INT_COLUMN_AS + PhotoColumn::PHOTO_SUBTYPE,
338     };
339 
340     return FILES_COMPAT_COLUMNS;
341 }
342 
BuildQueryColumns(const vector<string> & columns,string & sql)343 static void BuildQueryColumns(const vector<string> &columns, string &sql)
344 {
345     for (const auto &col : columns) {
346         sql += col + ',';
347     }
348     sql.pop_back();         // Remove last ','
349 }
350 
ReplaceAlbumName(const string & arg,string & argInstead)351 static void ReplaceAlbumName(const string &arg, string &argInstead)
352 {
353     if (arg == CAMERA_ALBUM_NAME) {
354         argInstead = to_string(static_cast<int32_t>(PhotoSubType::CAMERA));
355     } else if (arg == SCREEN_SHOT_ALBUM_NAME || arg == SCREEN_RECORD_ALBUM_NAME) {
356         argInstead = to_string(static_cast<int32_t>(PhotoSubType::SCREENSHOT));
357     } else {
358         argInstead = arg;
359     }
360 }
361 
ReplaceId(const string & fileId,string & idInstead,const string & tableName)362 static void ReplaceId(const string &fileId, string &idInstead, const string &tableName)
363 {
364     if (!all_of(fileId.begin(), fileId.end(), ::isdigit)) {
365         return;
366     }
367     int32_t id;
368     if (!StrToInt(fileId, id)) {
369         MEDIA_ERR_LOG("invalid fileuri %{private}s", fileId.c_str());
370         return;
371     }
372     idInstead = to_string(MediaFileUtils::GetRealIdByTable(id, tableName));
373 }
374 
ReplaceSelectionAndArgsInQuery(string & selection,vector<string> & selectionArgs,const string & tableName,const string & key,const string & keyInstead="")375 static void ReplaceSelectionAndArgsInQuery(string &selection, vector<string> &selectionArgs,
376     const string &tableName, const string &key, const string &keyInstead = "")
377 {
378     if (selection.empty()) {
379         return;
380     }
381 
382     for (size_t pos = 0; pos != string::npos;) {
383         pos = selection.find(key, pos);
384         if (pos == string::npos) {
385             break;
386         }
387         if (!keyInstead.empty()) {
388             selection.replace(pos, key.length(), keyInstead);
389         }
390         size_t argPos = selection.find('?', pos);
391         if (argPos == string::npos) {
392             break;
393         }
394         size_t argIndex = 0;
395         for (size_t i = 0; i < argPos; i++) {
396             if (selection[i] == '?') {
397                 argIndex++;
398             }
399         }
400         if (argIndex > selectionArgs.size() - 1) {
401             MEDIA_INFO_LOG("SelectionArgs size is not valid, selection format maybe incorrect: %{private}s",
402                 selection.c_str());
403             break;
404         }
405         const string &arg = selectionArgs[argIndex];
406         string argInstead = arg;
407         if (key == MEDIA_DATA_DB_BUCKET_NAME) {
408             ReplaceAlbumName(arg, argInstead);
409         } else if (key == MEDIA_DATA_DB_ID) {
410             ReplaceId(arg, argInstead, tableName);
411         }
412         selectionArgs[argIndex] = argInstead;
413         pos = argPos + 1;
414     }
415 }
416 
BuildCompatQuerySql(MediaLibraryCommand & cmd,const string table,const vector<string> & columns,vector<string> & selectionArgs,string & sql)417 static void BuildCompatQuerySql(MediaLibraryCommand &cmd, const string table, const vector<string> &columns,
418     vector<string> &selectionArgs, string &sql)
419 {
420     sql += "SELECT ";
421     BuildQueryColumns(columns, sql);
422     sql += " FROM " + table;
423 
424     string whereClause = cmd.GetAbsRdbPredicates()->GetWhereClause();
425     vector<string> whereArgs = cmd.GetAbsRdbPredicates()->GetWhereArgs();
426     if (table == PhotoColumn::PHOTOS_TABLE) {
427         ReplaceSelectionAndArgsInQuery(whereClause, whereArgs, table, MEDIA_DATA_DB_BUCKET_NAME,
428             PhotoColumn::PHOTO_SUBTYPE);
429     }
430     ReplaceSelectionAndArgsInQuery(whereClause, whereArgs, table, MEDIA_DATA_DB_ID);
431 
432     if (!whereClause.empty()) {
433         sql += " WHERE " + whereClause;
434     }
435 
436     if (!whereArgs.empty()) {
437         selectionArgs.insert(selectionArgs.end(), whereArgs.begin(), whereArgs.end());
438     }
439 }
440 
RemoveWhereSuffix(MediaLibraryCommand & cmd,const string & key)441 static string RemoveWhereSuffix(MediaLibraryCommand &cmd, const string &key)
442 {
443     string suffix;
444     string whereClause = cmd.GetAbsRdbPredicates()->GetWhereClause();
445     size_t keyPos = MediaFileUtils::FindIgnoreCase(whereClause, key);
446     if (keyPos != string::npos) {
447         suffix = whereClause.substr(keyPos);
448         whereClause = whereClause.substr(0, keyPos);
449     }
450     cmd.GetAbsRdbPredicates()->SetWhereClause(whereClause);
451     return suffix;
452 }
453 
BuildQueryFileSql(MediaLibraryCommand & cmd,vector<string> & selectionArgs,string & sql)454 static void BuildQueryFileSql(MediaLibraryCommand &cmd, vector<string> &selectionArgs, string &sql)
455 {
456     string groupBy = RemoveWhereSuffix(cmd, " GROUP BY ");
457     string having = RemoveWhereSuffix(cmd, " HAVING ");
458     string orderBy = RemoveWhereSuffix(cmd, " ORDER BY ");
459     string limit = RemoveWhereSuffix(cmd, " LIMIT ");
460 
461     sql = "SELECT ";
462     if (!groupBy.empty()) {
463         sql += "count(*),";
464     }
465     BuildQueryColumns(FILE_ASSET_COLUMNS, sql);
466 
467     sql += " FROM (";
468     BuildCompatQuerySql(cmd, PhotoColumn::PHOTOS_TABLE, PhotosCompatColumns(), selectionArgs, sql);
469     sql += " UNION ";
470     BuildCompatQuerySql(cmd, AudioColumn::AUDIOS_TABLE, AudiosCompatColumns(), selectionArgs, sql);
471     sql += " UNION ";
472     BuildCompatQuerySql(cmd, MEDIALIBRARY_TABLE, FilesCompatColumns(), selectionArgs, sql);
473     sql += ") ";
474 
475     if (!groupBy.empty()) {
476         sql += groupBy;
477     }
478     if (!having.empty()) {
479         sql += having;
480     }
481 
482     const string &order = cmd.GetAbsRdbPredicates()->GetOrder();
483     if ((!order.empty()) && (!orderBy.empty())) {
484         MEDIA_WARN_LOG("ORDER BY found both in whereClause and predicates, use the predicates one");
485         sql += " ORDER BY " + order;
486     } else if (!order.empty()) {
487         sql += " ORDER BY " + order;
488     } else if (!orderBy.empty()) {
489         sql += orderBy;
490     }
491 
492     if (!limit.empty()) {
493         sql += limit;
494     }
495 }
496 
CampatQueryDebug(const string & sql,const vector<string> & selectionArgs,const shared_ptr<MediaLibraryRdbStore> store)497 static void CampatQueryDebug(const string &sql, const vector<string> &selectionArgs,
498     const shared_ptr<MediaLibraryRdbStore> store)
499 {
500     constexpr int32_t printMax = 512;
501     for (size_t pos = 0; pos < sql.size(); pos += printMax) {
502         MEDIA_DEBUG_LOG("Quering file sql: %{private}s", sql.substr(pos, printMax).c_str());
503     }
504     for (const auto &arg : selectionArgs) {
505         MEDIA_DEBUG_LOG("Quering file, arg: %{private}s", arg.c_str());
506     }
507     auto resultSet = store->QuerySql(sql, selectionArgs);
508     if (resultSet == nullptr) {
509         MEDIA_ERR_LOG("Failed to query file!");
510         return;
511     }
512     int32_t count = -1;
513     int32_t err = resultSet->GetRowCount(count);
514     if (err != E_OK) {
515         MEDIA_ERR_LOG("Failed to get count, err: %{public}d", err);
516         return;
517     }
518     MEDIA_DEBUG_LOG("Quering file, count: %{public}d", count);
519 }
520 #endif
521 
QueryFileOperation(MediaLibraryCommand & cmd,const vector<string> & columns)522 shared_ptr<NativeRdb::ResultSet> MediaLibraryFileOperations::QueryFileOperation(
523     MediaLibraryCommand &cmd, const vector<string> &columns)
524 {
525     auto uniStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
526     if (uniStore == nullptr) {
527         MEDIA_ERR_LOG("uniStore is nullptr");
528         return nullptr;
529     }
530 
531     string fileId = cmd.GetOprnFileId();
532     if (cmd.GetAbsRdbPredicates()->GetWhereClause().empty() && !fileId.empty()) {
533         cmd.GetAbsRdbPredicates()->EqualTo(MEDIA_DATA_DB_ID, fileId);
534     }
535 
536     if (START_PENDING) {
537         SolvePendingInQuery(cmd.GetAbsRdbPredicates());
538     }
539     string networkId = cmd.GetOprnDevice();
540     if (!networkId.empty()) {
541         std::vector<string> devices;
542         devices.push_back(networkId);
543         cmd.GetAbsRdbPredicates()->InDevices(devices);
544     }
545     MediaLibraryTracer tracer;
546     tracer.Start("QueryFile RdbStore->Query");
547 
548 #ifdef MEDIALIBRARY_COMPATIBILITY
549     string sql;
550     vector<string> selectionArgs;
551     BuildQueryFileSql(cmd, selectionArgs, sql);
552     CampatQueryDebug(sql, selectionArgs, uniStore);
553     return uniStore->QuerySql(sql, selectionArgs);
554 #else
555     return uniStore->Query(cmd, columns);
556 #endif
557 }
558 
CopyFileOperation(MediaLibraryCommand & cmd)559 int32_t MediaLibraryFileOperations::CopyFileOperation(MediaLibraryCommand &cmd)
560 {
561     auto values = cmd.GetValueBucket();
562     auto assetId = cmd.GetOprnFileId();
563     ValueObject valueObject;
564     string relativePath;
565     if (values.GetObject(MEDIA_DATA_DB_RELATIVE_PATH, valueObject)) {
566         valueObject.GetString(relativePath);
567     }
568     Uri srcUri(MEDIALIBRARY_DATA_URI + "/" + assetId);
569     string srcUriString = srcUri.ToString();
570     shared_ptr<FileAsset> srcFileAsset = MediaLibraryObjectUtils::GetFileAssetFromUri(srcUriString);
571     if (srcFileAsset == nullptr) {
572         return E_INVALID_URI;
573     }
574     if (srcFileAsset->GetMediaType() == MEDIA_TYPE_ALBUM) {
575         return MediaLibraryObjectUtils::CopyDir(srcFileAsset, relativePath);
576     } else {
577         return MediaLibraryObjectUtils::CopyAsset(srcFileAsset, relativePath);
578     }
579 }
580 } // namespace Media
581 } // namespace OHOS
582