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
16 #include "app_event_task_storage.h"
17
18 #include "hiview_logger.h"
19 #include "sql_util.h"
20
21 namespace OHOS::HiviewDFX {
22 DEFINE_LOG_TAG("AppEventTaskStorage");
23 namespace {
24 constexpr char TABLE_NAME_TASK[] = "unified_collection_task";
25 constexpr char COLUMN_ID[] = "id";
26 constexpr char COLUMN_TASK_DATE[] = "task_date";
27 constexpr char COLUMN_TASK_TYPE[] = "task_type";
28 constexpr char COLUMN_UID[] = "uid";
29 constexpr char COLUMN_PID[] = "pid";
30 constexpr char COLUMN_BUNDLE_NAME[] = "bundle_name";
31 constexpr char COLUMN_BUNDLE_VERSION[] = "bundle_version";
32 constexpr char COLUMN_START_TIME[] = "start_time";
33 constexpr char COLUMN_FINISH_TIME[] = "finish_time";
34 constexpr char COLUMN_RESOURCE_PATH[] = "resource_path";
35 constexpr char COLUMN_RESOURCE_SIZE[] = "resource_size";
36 constexpr char COLUMN_COST_CPU[] = "cost_cpu";
37 constexpr char COLUMN_STATE[] = "state";
38
InnerGetAppTaskCondition(int32_t uid,int32_t eventDate,NativeRdb::AbsRdbPredicates & predicates)39 void InnerGetAppTaskCondition(int32_t uid, int32_t eventDate, NativeRdb::AbsRdbPredicates &predicates)
40 {
41 predicates.EqualTo(COLUMN_UID, uid);
42 predicates.EqualTo(COLUMN_TASK_DATE, eventDate);
43 }
44
InnerGetAppTask(std::shared_ptr<NativeRdb::AbsSharedResultSet> resultSet,AppEventTask & appEventTask)45 bool InnerGetAppTask(std::shared_ptr<NativeRdb::AbsSharedResultSet> resultSet, AppEventTask &appEventTask)
46 {
47 while (resultSet->GoToNextRow() == NativeRdb::E_OK) {
48 if (resultSet->GetLong(0, appEventTask.id_) != NativeRdb::E_OK) {
49 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_ID);
50 }
51 if (resultSet->GetLong(1, appEventTask.taskDate_) != NativeRdb::E_OK) { // 1: task date
52 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_TASK_DATE);
53 }
54 if (resultSet->GetInt(2, appEventTask.taskType_) != NativeRdb::E_OK) { // 2: task type
55 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_TASK_TYPE);
56 }
57 if (resultSet->GetInt(3, appEventTask.uid_) != NativeRdb::E_OK) { // 3: uid
58 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_UID);
59 }
60 if (resultSet->GetInt(4, appEventTask.pid_) != NativeRdb::E_OK) { // 4: pid
61 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_PID);
62 }
63 if (resultSet->GetString(5, appEventTask.bundleName_) != NativeRdb::E_OK) { // 5: bundle name
64 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_BUNDLE_NAME);
65 }
66 if (resultSet->GetString(6, appEventTask.bundleVersion_) != NativeRdb::E_OK) { // 6: bundle version
67 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_BUNDLE_VERSION);
68 }
69 if (resultSet->GetLong(7, appEventTask.startTime_) != NativeRdb::E_OK) { // 7: start time
70 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_START_TIME);
71 }
72 if (resultSet->GetLong(8, appEventTask.finishTime_) != NativeRdb::E_OK) { // 8: finish time
73 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_FINISH_TIME);
74 }
75 if (resultSet->GetString(9, appEventTask.resourePath_) != NativeRdb::E_OK) { // 9: resource path
76 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_RESOURCE_PATH);
77 }
78 if (resultSet->GetInt(10, appEventTask.resourceSize_) != NativeRdb::E_OK) { // 10: resource size
79 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_RESOURCE_SIZE);
80 }
81 if (resultSet->GetDouble(11, appEventTask.costCpu_) != NativeRdb::E_OK) { // 11: cost cpu
82 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_COST_CPU);
83 }
84 if (resultSet->GetInt(12, appEventTask.state_) != NativeRdb::E_OK) { // 12: state of cpature trace
85 HIVIEW_LOGI("failed to get %{public}s from resultSet", COLUMN_STATE);
86 }
87 break;
88 }
89 return true;
90 }
91
InnerQueryAppTask(std::shared_ptr<NativeRdb::RdbStore> dbStore,NativeRdb::AbsRdbPredicates & predicates,AppEventTask & appEventTask)92 bool InnerQueryAppTask(std::shared_ptr<NativeRdb::RdbStore> dbStore, NativeRdb::AbsRdbPredicates &predicates,
93 AppEventTask &appEventTask)
94 {
95 appEventTask.id_ = 0;
96 std::shared_ptr<NativeRdb::AbsSharedResultSet> resultSet = dbStore->Query(predicates,
97 {
98 COLUMN_ID, COLUMN_TASK_DATE, COLUMN_TASK_TYPE, COLUMN_UID, COLUMN_PID,
99 COLUMN_BUNDLE_NAME, COLUMN_BUNDLE_VERSION, COLUMN_START_TIME, COLUMN_FINISH_TIME,
100 COLUMN_RESOURCE_PATH, COLUMN_RESOURCE_SIZE, COLUMN_COST_CPU, COLUMN_STATE
101 });
102 if (resultSet == nullptr) {
103 HIVIEW_LOGI("failed to query app task table=%{public}s", TABLE_NAME_TASK);
104 return false;
105 }
106 bool result = InnerGetAppTask(resultSet, appEventTask);
107 resultSet->Close();
108 return result;
109 }
110 }
111
AppEventTaskStorage(std::shared_ptr<NativeRdb::RdbStore> dbStore)112 AppEventTaskStorage::AppEventTaskStorage(std::shared_ptr<NativeRdb::RdbStore> dbStore) : dbStore_(dbStore) {}
113
GetAppEventTask(int32_t uid,int32_t eventDate,AppEventTask & appEventTask)114 bool AppEventTaskStorage::GetAppEventTask(int32_t uid, int32_t eventDate, AppEventTask &appEventTask)
115 {
116 if (dbStore_ == nullptr) {
117 HIVIEW_LOGE("db store is null,");
118 return false;
119 }
120 NativeRdb::AbsRdbPredicates predicates(TABLE_NAME_TASK);
121 InnerGetAppTaskCondition(uid, eventDate, predicates);
122 return InnerQueryAppTask(dbStore_, predicates, appEventTask);
123 }
124
InsertAppEventTask(AppEventTask & appEventTask)125 bool AppEventTaskStorage::InsertAppEventTask(AppEventTask &appEventTask)
126 {
127 if (dbStore_ == nullptr) {
128 HIVIEW_LOGE("db store is null,");
129 return false;
130 }
131 NativeRdb::ValuesBucket bucket;
132 bucket.PutLong(COLUMN_TASK_DATE, appEventTask.taskDate_);
133 bucket.PutInt(COLUMN_TASK_TYPE, appEventTask.taskType_);
134 bucket.PutInt(COLUMN_UID, appEventTask.uid_);
135 bucket.PutInt(COLUMN_PID, appEventTask.pid_);
136 bucket.PutString(COLUMN_BUNDLE_NAME, appEventTask.bundleName_);
137 bucket.PutString(COLUMN_BUNDLE_VERSION, appEventTask.bundleVersion_);
138 bucket.PutLong(COLUMN_START_TIME, appEventTask.startTime_);
139 bucket.PutLong(COLUMN_FINISH_TIME, appEventTask.finishTime_);
140 bucket.PutString(COLUMN_RESOURCE_PATH, appEventTask.resourePath_);
141 bucket.PutInt(COLUMN_RESOURCE_SIZE, appEventTask.resourceSize_);
142 bucket.PutDouble(COLUMN_COST_CPU, appEventTask.costCpu_);
143 bucket.PutInt(COLUMN_STATE, appEventTask.state_);
144 int ret = dbStore_->Insert(appEventTask.id_, TABLE_NAME_TASK, bucket);
145 if (ret != NativeRdb::E_OK) {
146 HIVIEW_LOGE("failed to insert app event task, ret=%{public}d, uid=%{public}d", ret, appEventTask.uid_);
147 return false;
148 }
149 return true;
150 }
151
RemoveAppEventTask(int32_t eventDate)152 void AppEventTaskStorage::RemoveAppEventTask(int32_t eventDate)
153 {
154 if (dbStore_ == nullptr) {
155 HIVIEW_LOGE("db store is null,");
156 return;
157 }
158 NativeRdb::AbsRdbPredicates predicates(TABLE_NAME_TASK);
159 predicates.LessThan(COLUMN_TASK_DATE, eventDate);
160 int32_t deleteRows = 0;
161 int ret = dbStore_->Delete(deleteRows, predicates);
162 if (ret != NativeRdb::E_OK) {
163 HIVIEW_LOGE("failed to insert app event task, ret=%{public}d", ret);
164 }
165 }
166 } // namespace OHOS
167