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