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 
16 #ifndef MEDIA_SCANNER_DB_H
17 #define MEDIA_SCANNER_DB_H
18 
19 #include <list>
20 #include <set>
21 #include <string>
22 #include <unordered_map>
23 #include <vector>
24 
25 #include "medialibrary_command.h"
26 #include "medialibrary_db_const.h"
27 #include "medialibrary_type_const.h"
28 #include "metadata.h"
29 #include "datashare_values_bucket.h"
30 #include "rdb_errno.h"
31 #include "result_set.h"
32 #include "uri.h"
33 #include "userfile_manager_types.h"
34 #include "values_bucket.h"
35 #include "want.h"
36 #include "datashare_result_set.h"
37 
38 namespace OHOS {
39 namespace Media {
40 #define EXPORT __attribute__ ((visibility ("default")))
41 class MediaScannerDb {
42 public:
43     EXPORT MediaScannerDb();
44     EXPORT MediaScannerDb(MediaScannerDb &other) = delete;
45     EXPORT void operator=(const MediaScannerDb &) = delete;
46     EXPORT ~MediaScannerDb() = default;
47 
48     EXPORT static std::unique_ptr<MediaScannerDb> GetDatabaseInstance();
49     EXPORT bool DeleteMetadata(const std::vector<std::string> &idList, const std::string &tableName);
50     EXPORT void NotifyDatabaseChange(const MediaType mediaType);
51     EXPORT void SetRdbHelper(void);
52 
53     EXPORT std::string InsertMetadata(const Metadata &metadata, std::string &tableName,
54         MediaLibraryApi api = MediaLibraryApi::API_OLD);
55     EXPORT std::string UpdateMetadata(const Metadata &metadata, std::string &tableName,
56         MediaLibraryApi api = MediaLibraryApi::API_OLD, bool skipPhoto = true);
57     EXPORT std::string GetFileDBUriFromPath(const std::string &path);
58     EXPORT int32_t InsertAlbum(const Metadata &metadata);
59     EXPORT int32_t UpdateAlbum(const Metadata &metadata);
60     EXPORT int32_t ReadAlbums(const std::string &path, std::unordered_map<std::string, Metadata> &albumMap);
61     EXPORT std::unordered_map<int32_t, MediaType> GetIdsFromFilePath(const std::string &path,
62         const std::string &tableName, const std::string &whitePath = "");
63 
64     EXPORT int32_t GetIdFromPath(const std::string &path);
65     EXPORT int32_t GetFileBasicInfo(const std::string &path, std::unique_ptr<Metadata> &ptr,
66         MediaLibraryApi api = MediaLibraryApi::API_OLD, int32_t fileId = 0);
67 
68     EXPORT int32_t RecordError(const std::string &err);
69     EXPORT std::set<std::string> ReadError();
70     EXPORT int32_t DeleteError(const std::string &err);
71     static void UpdateAlbumInfo(const std::vector<std::string> &subtypes = {},
72         const std::vector<std::string> &userAlbumIds = {}, const std::vector<std::string> &sourceAlbumIds = {});
73     static void UpdateAlbumInfoByMetaData(const Metadata &metadata);
74 
75 private:
76     int32_t FillMetadata(const std::shared_ptr<NativeRdb::ResultSet> &resultSet,
77         std::unique_ptr<Metadata> &ptr);
78     int32_t GetFileSet(MediaLibraryCommand &cmd, const vector<string> &columns,
79         std::shared_ptr<NativeRdb::ResultSet> &resultSet);
80     void ExtractMetaFromColumn(const std::shared_ptr<NativeRdb::ResultSet> &resultSet,
81         std::unique_ptr<Metadata> &metadata, const std::string &col);
82     bool InsertData(const NativeRdb::ValuesBucket values, const std::string &tableName, int64_t &rowNum);
83     std::string MakeFileUri(const std::string &mediaTypeUri, const Metadata &metadata);
84 };
85 } // namespace Media
86 } // namespace OHOS
87 #endif // MEDIA_SCANNER_DB_H
88