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 #include "custom_event_param_dao.h"
16
17 #include "app_event_cache_common.h"
18 #include "app_event_store.h"
19 #include "hiappevent_base.h"
20 #include "hilog/log.h"
21 #include "rdb_helper.h"
22 #include "sql_util.h"
23
24 #undef LOG_DOMAIN
25 #define LOG_DOMAIN 0xD002D07
26
27 #undef LOG_TAG
28 #define LOG_TAG "CustomEventParamDao"
29
30 namespace OHOS {
31 namespace HiviewDFX {
32 using namespace AppEventCacheCommon;
33 using namespace AppEventCacheCommon::CustomEventParams;
34
CustomEventParamDao(std::shared_ptr<NativeRdb::RdbStore> dbStore)35 CustomEventParamDao::CustomEventParamDao(std::shared_ptr<NativeRdb::RdbStore> dbStore) : dbStore_(dbStore)
36 {
37 if (Create() != DB_SUCC) {
38 HILOG_ERROR(LOG_CORE, "failed to create table=%{public}s", TABLE.c_str());
39 }
40 }
41
Create()42 int CustomEventParamDao::Create()
43 {
44 if (dbStore_ == nullptr) {
45 return DB_FAILED;
46 }
47 /**
48 * table: custom_event_params
49 *
50 * |-------|------------|--------|------|-----------|-------------|------------|
51 * | seq | running_id | domain | name | param_key | param_value | param_type |
52 * |-------|----------- |--------|------|-----------|-------------|------------|
53 * | INT64 | TEXT | TEXT | TEXT | TEXT | TEXT | INT |
54 * |-------|------------|--------|------|-----------|-------------|------------|
55 */
56 const std::vector<std::pair<std::string, std::string>> fields = {
57 {FIELD_RUNNING_ID, SqlUtil::SQL_TEXT_TYPE},
58 {FIELD_DOMAIN, SqlUtil::SQL_TEXT_TYPE},
59 {FIELD_NAME, SqlUtil::SQL_TEXT_TYPE},
60 {FIELD_PARAM_KEY, SqlUtil::SQL_TEXT_TYPE},
61 {FIELD_PARAM_VALUE, SqlUtil::SQL_TEXT_TYPE},
62 {FIELD_PARAM_TYPE, SqlUtil::SQL_INT_TYPE},
63 };
64 std::string sql = SqlUtil::CreateTable(TABLE, fields);
65 if (dbStore_->ExecuteSql(sql) != NativeRdb::E_OK) {
66 return DB_FAILED;
67 }
68 return DB_SUCC;
69 }
70
Insert(const CustomEventParam & param,const std::string & runningId,const std::string & domain,const std::string & name)71 int64_t CustomEventParamDao::Insert(const CustomEventParam& param,
72 const std::string& runningId, const std::string& domain, const std::string& name)
73 {
74 if (dbStore_ == nullptr) {
75 return DB_FAILED;
76 }
77 NativeRdb::ValuesBucket bucket;
78 bucket.PutString(FIELD_RUNNING_ID, runningId);
79 bucket.PutString(FIELD_DOMAIN, domain);
80 bucket.PutString(FIELD_NAME, name);
81 bucket.PutString(FIELD_PARAM_KEY, param.key);
82 bucket.PutString(FIELD_PARAM_VALUE, param.value);
83 bucket.PutInt(FIELD_PARAM_TYPE, param.type);
84 int64_t seq = 0;
85 if (dbStore_->Insert(seq, TABLE, bucket) != NativeRdb::E_OK) {
86 return DB_FAILED;
87 }
88 return seq;
89 }
90
Update(const CustomEventParam & param,const std::string & runningId,const std::string & domain,const std::string & name)91 int64_t CustomEventParamDao::Update(const CustomEventParam& param,
92 const std::string& runningId, const std::string& domain, const std::string& name)
93 {
94 if (dbStore_ == nullptr) {
95 return DB_FAILED;
96 }
97
98 NativeRdb::ValuesBucket bucket;
99 bucket.PutString(FIELD_PARAM_VALUE, param.value);
100 bucket.PutInt(FIELD_PARAM_TYPE, param.type);
101
102 int changedRows = 0;
103 NativeRdb::AbsRdbPredicates predicates(TABLE);
104 predicates.EqualTo(FIELD_RUNNING_ID, runningId);
105 predicates.EqualTo(FIELD_DOMAIN, domain);
106 predicates.EqualTo(FIELD_NAME, name);
107 predicates.EqualTo(FIELD_PARAM_KEY, param.key);
108 if (dbStore_->Update(changedRows, bucket, predicates) != NativeRdb::E_OK) {
109 return DB_FAILED;
110 }
111 return changedRows;
112 }
113
Delete()114 int CustomEventParamDao::Delete()
115 {
116 if (dbStore_ == nullptr) {
117 return DB_FAILED;
118 }
119 NativeRdb::AbsRdbPredicates predicates(TABLE);
120 int deleteRows = 0;
121 if (dbStore_->Delete(deleteRows, predicates) != NativeRdb::E_OK) {
122 return DB_FAILED;
123 }
124 HILOG_INFO(LOG_CORE, "delete %{public}d records", deleteRows);
125 return deleteRows;
126 }
127
QueryParamkeys(std::unordered_set<std::string> & out,const std::string & runningId,const std::string & domain,const std::string & name)128 int CustomEventParamDao::QueryParamkeys(std::unordered_set<std::string>& out,
129 const std::string& runningId, const std::string& domain, const std::string& name)
130 {
131 if (dbStore_ == nullptr) {
132 return DB_FAILED;
133 }
134 NativeRdb::AbsRdbPredicates predicates(TABLE);
135 predicates.EqualTo(FIELD_RUNNING_ID, runningId);
136 predicates.EqualTo(FIELD_DOMAIN, domain);
137 predicates.EqualTo(FIELD_NAME, name);
138 auto resultSet = dbStore_->Query(predicates, {FIELD_PARAM_KEY});
139 if (resultSet == nullptr) {
140 HILOG_ERROR(LOG_CORE, "failed to query table");
141 return DB_FAILED;
142 }
143 while (resultSet->GoToNextRow() == NativeRdb::E_OK) {
144 std::string paramKey;
145 if (resultSet->GetString(0, paramKey) != NativeRdb::E_OK) {
146 HILOG_ERROR(LOG_CORE, "failed to get value, runningId=%{public}s, domain=%{public}s, name=%{public}s",
147 runningId.c_str(), domain.c_str(), name.c_str());
148 continue;
149 }
150 out.insert(paramKey);
151 }
152 resultSet->Close();
153 return DB_SUCC;
154 }
155
Query(std::unordered_map<std::string,std::string> & params,const std::string & runningId,const std::string & domain,const std::string & name)156 int CustomEventParamDao::Query(std::unordered_map<std::string, std::string>& params,
157 const std::string& runningId, const std::string& domain, const std::string& name)
158 {
159 if (dbStore_ == nullptr) {
160 return DB_FAILED;
161 }
162 NativeRdb::AbsRdbPredicates predicates(TABLE);
163 predicates.EqualTo(FIELD_RUNNING_ID, runningId);
164 predicates.EqualTo(FIELD_DOMAIN, domain);
165 predicates.EqualTo(FIELD_NAME, name);
166 auto resultSet = dbStore_->Query(predicates, {FIELD_PARAM_KEY, FIELD_PARAM_VALUE});
167 if (resultSet == nullptr) {
168 HILOG_ERROR(LOG_CORE, "failed to query table");
169 return DB_FAILED;
170 }
171 while (resultSet->GoToNextRow() == NativeRdb::E_OK) {
172 std::string paramKey;
173 std::string paramValue;
174 if (resultSet->GetString(0, paramKey) != NativeRdb::E_OK
175 || resultSet->GetString(1, paramValue) != NativeRdb::E_OK) {
176 HILOG_ERROR(LOG_CORE, "failed to get value, runningId=%{public}s, domain=%{public}s, name=%{public}s",
177 runningId.c_str(), domain.c_str(), name.c_str());
178 continue;
179 }
180 params[paramKey] = paramValue;
181 }
182 resultSet->Close();
183 return DB_SUCC;
184 }
185 } // namespace HiviewDFX
186 } // namespace OHOS
187