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