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