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 #ifndef RESULT_SET_UTILS_H
16 #define RESULT_SET_UTILS_H
17 
18 #include "ringtone_log.h"
19 #include "ringtone_type.h"
20 
21 namespace OHOS {
22 namespace Media {
23 #define EXPORT __attribute__ ((visibility ("default")))
24 class ResultSetUtils {
25 public:
26     template<typename T>
GetValFromColumn(const std::string & columnName,T & resultSet,RingtoneResultSetDataType type)27     static std::variant<int32_t, std::string, int64_t, double> GetValFromColumn(const std::string &columnName,
28         T &resultSet, RingtoneResultSetDataType type)
29     {
30         if (resultSet == nullptr) {
31             RINGTONE_ERR_LOG("resultSet is nullptr");
32             return DefaultVariantVal(type);
33         }
34 
35         int32_t err;
36         int32_t index = 0;
37         err = resultSet->GetColumnIndex(columnName, index);
38         if (err) {
39             RINGTONE_ERR_LOG("get column index err %{public}d", err);
40             return DefaultVariantVal(type);
41         }
42 
43         std::variant<int32_t, std::string, int64_t, double> data;
44         switch (type) {
45             case RingtoneResultSetDataType::DATA_TYPE_STRING: {
46                 data = GetStringValFromColumn(index, resultSet);
47                 break;
48             }
49             case RingtoneResultSetDataType::DATA_TYPE_INT32: {
50                 data = GetIntValFromColumn(index, resultSet);
51                 break;
52             }
53             case RingtoneResultSetDataType::DATA_TYPE_INT64: {
54                 data = GetLongValFromColumn(index, resultSet);
55                 break;
56             }
57             case RingtoneResultSetDataType::DATA_TYPE_DOUBLE: {
58                 data = GetDoubleValFromColumn(index, resultSet);
59                 break;
60             }
61             default: {
62                 break;
63             }
64         }
65 
66         return data;
67     }
68 
69     template<typename T>
GetStringValFromColumn(int index,T & resultSet)70     static inline std::string GetStringValFromColumn(int index, T &resultSet)
71     {
72         std::string stringVal;
73         if (resultSet->GetString(index, stringVal)) {
74             return "";
75         }
76         return stringVal;
77     }
78 
79     template<typename T>
GetIntValFromColumn(int index,T & resultSet)80     static inline int32_t GetIntValFromColumn(int index, T &resultSet)
81     {
82         int32_t integerVal;
83         if (resultSet->GetInt(index, integerVal)) {
84             return 0;
85         }
86         return integerVal;
87     }
88 
89     template<typename T>
GetLongValFromColumn(int index,T & resultSet)90     static inline int64_t GetLongValFromColumn(int index, T &resultSet)
91     {
92         int64_t integer64Val;
93         if (resultSet->GetLong(index, integer64Val)) {
94             return 0;
95         }
96         return integer64Val;
97     }
98 
99     template<typename T>
GetDoubleValFromColumn(int index,T & resultSet)100     static inline double GetDoubleValFromColumn(int index, T &resultSet)
101     {
102         double doubleVal;
103         if (resultSet->GetDouble(index, doubleVal)) {
104             return 0;
105         }
106         return doubleVal;
107     }
108 
109 private:
DefaultVariantVal(RingtoneResultSetDataType type)110     static std::variant<int32_t, std::string, int64_t, double> DefaultVariantVal(RingtoneResultSetDataType type)
111     {
112         switch (type) {
113             case RingtoneResultSetDataType::DATA_TYPE_STRING:
114                 return std::string();
115             case RingtoneResultSetDataType::DATA_TYPE_INT32:
116                 return 0;
117             case RingtoneResultSetDataType::DATA_TYPE_INT64:
118                 return static_cast<int64_t>(0);
119             case RingtoneResultSetDataType::DATA_TYPE_DOUBLE:
120                 return static_cast<double>(0);
121             default:
122                 RINGTONE_ERR_LOG("invalid data type %{public}d", type);
123         }
124 
125         return 0;
126     }
127 };
128 
129 template<typename ResultSet>
GetStringVal(const std::string & field,const ResultSet & result)130 static inline std::string GetStringVal(const std::string &field, const ResultSet &result)
131 {
132     return std::get<std::string>(ResultSetUtils::GetValFromColumn(field, result, DATA_TYPE_STRING));
133 }
134 template<typename ResultSet>
GetInt32Val(const std::string & field,const ResultSet & result)135 static inline int32_t GetInt32Val(const std::string &field, const ResultSet &result)
136 {
137     return std::get<int32_t>(ResultSetUtils::GetValFromColumn(field, result, DATA_TYPE_INT32));
138 }
139 template<typename ResultSet>
GetInt64Val(const std::string & field,const ResultSet & result)140 static inline int64_t GetInt64Val(const std::string &field, const ResultSet &result)
141 {
142     return std::get<int64_t>(ResultSetUtils::GetValFromColumn(field, result, DATA_TYPE_INT64));
143 }
144 } // namespace Media
145 } // namespace  OHOS
146 #endif // RESULT_SET_UTILS_H
147