1 /*
2 * Copyright (c) 2021-2022 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 "data_ability_operation_builder.h"
17 #include "data_ability_predicates.h"
18 #include "hilog_wrapper.h"
19 #include "values_bucket.h"
20
21 namespace OHOS {
22 namespace AppExecFwk {
DataAbilityOperationBuilder(const int type,const std::shared_ptr<Uri> & uri)23 DataAbilityOperationBuilder::DataAbilityOperationBuilder(const int type, const std::shared_ptr<Uri> &uri)
24 {
25 type_ = type;
26 uri_ = uri;
27 expectedCount_ = 0;
28 interrupted_ = false;
29 valuesBucket_ = nullptr;
30 dataAbilityPredicates_ = nullptr;
31 valuesBucketReferences_ = nullptr;
32 dataAbilityPredicatesBackReferences_.clear();
33 }
~DataAbilityOperationBuilder()34 DataAbilityOperationBuilder::~DataAbilityOperationBuilder()
35 {
36 dataAbilityPredicatesBackReferences_.clear();
37 }
38
Build()39 std::shared_ptr<DataAbilityOperation> DataAbilityOperationBuilder::Build()
40 {
41 HILOG_DEBUG("DataAbilityOperationBuilder::Build start");
42 if (type_ != DataAbilityOperation::TYPE_UPDATE || (valuesBucket_ != nullptr && !valuesBucket_->IsEmpty())) {
43 std::shared_ptr<DataAbilityOperation> operation = std::make_shared<DataAbilityOperation>(shared_from_this());
44 HILOG_DEBUG("DataAbilityOperationBuilder::Build end");
45 return operation;
46 }
47 HILOG_ERROR("DataAbilityOperationBuilder::Build return nullptr");
48 return nullptr;
49 }
WithValuesBucket(std::shared_ptr<NativeRdb::ValuesBucket> & values)50 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperationBuilder::WithValuesBucket(
51 std::shared_ptr<NativeRdb::ValuesBucket> &values)
52 {
53 HILOG_DEBUG("DataAbilityOperationBuilder::WithValuesBucket start");
54 if (type_ != DataAbilityOperation::TYPE_INSERT && type_ != DataAbilityOperation::TYPE_UPDATE &&
55 type_ != DataAbilityOperation::TYPE_ASSERT) {
56 HILOG_ERROR("DataAbilityOperationBuilder::WithValuesBucket only inserts, updates and assert can have values,"
57 " type=%{public}d", type_);
58 return nullptr;
59 }
60
61 std::map<std::string, NativeRdb::ValueObject> valuesMap;
62 values->GetAll(valuesMap);
63
64 valuesBucket_.reset(new (std::nothrow) NativeRdb::ValuesBucket(valuesMap));
65 HILOG_DEBUG("DataAbilityOperationBuilder::WithValuesBucket end");
66 return shared_from_this();
67 }
68
WithPredicates(std::shared_ptr<NativeRdb::DataAbilityPredicates> & predicates)69 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperationBuilder::WithPredicates(
70 std::shared_ptr<NativeRdb::DataAbilityPredicates> &predicates)
71 {
72 HILOG_DEBUG("DataAbilityOperationBuilder::WithPredicates start");
73 if (type_ != DataAbilityOperation::TYPE_DELETE && type_ != DataAbilityOperation::TYPE_UPDATE &&
74 type_ != DataAbilityOperation::TYPE_ASSERT) {
75 HILOG_ERROR(
76 "DataAbilityOperationBuilder::withPredicates only deletes, updates and assert can have selections,"
77 " type=%{public}d", type_);
78 return nullptr;
79 }
80 dataAbilityPredicates_ = predicates;
81 HILOG_DEBUG("DataAbilityOperationBuilder::WithPredicates end");
82 return shared_from_this();
83 }
WithExpectedCount(int count)84 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperationBuilder::WithExpectedCount(int count)
85 {
86 HILOG_DEBUG("DataAbilityOperationBuilder::WithExpectedCount start");
87 HILOG_INFO("DataAbilityOperationBuilder::WithExpectedCount expectedCount:%{public}d", count);
88 if (type_ != DataAbilityOperation::TYPE_UPDATE && type_ != DataAbilityOperation::TYPE_DELETE &&
89 type_ != DataAbilityOperation::TYPE_ASSERT) {
90 HILOG_ERROR("DataAbilityOperationBuilder::withExpectedCount only updates, deletes and assert "
91 "can have expected counts, "
92 "type=%{public}d", type_);
93 return nullptr;
94 }
95 expectedCount_ = count;
96 HILOG_DEBUG("DataAbilityOperationBuilder::WithExpectedCount end");
97 return shared_from_this();
98 }
WithPredicatesBackReference(int requestArgIndex,int previousResult)99 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperationBuilder::WithPredicatesBackReference(
100 int requestArgIndex, int previousResult)
101 {
102 HILOG_DEBUG("DataAbilityOperationBuilder::WithPredicatesBackReference start");
103 HILOG_INFO("DataAbilityOperationBuilder::WithPredicatesBackReference requestArgIndex:%{public}d, "
104 "previousResult:%{public}d", requestArgIndex, previousResult);
105 if (type_ != DataAbilityOperation::TYPE_UPDATE && type_ != DataAbilityOperation::TYPE_DELETE &&
106 type_ != DataAbilityOperation::TYPE_ASSERT) {
107 HILOG_ERROR("DataAbilityOperationBuilder::withPredicatesBackReference only updates, deletes, "
108 "and asserts can have select back-references, type=%{public}d", type_);
109 return nullptr;
110 }
111 dataAbilityPredicatesBackReferences_.insert(std::make_pair(requestArgIndex, previousResult));
112 HILOG_DEBUG("DataAbilityOperationBuilder::WithPredicatesBackReference end");
113 return shared_from_this();
114 }
WithValueBackReferences(std::shared_ptr<NativeRdb::ValuesBucket> & backReferences)115 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperationBuilder::WithValueBackReferences(
116 std::shared_ptr<NativeRdb::ValuesBucket> &backReferences)
117 {
118 HILOG_DEBUG("DataAbilityOperationBuilder::WithValueBackReferences start");
119 if (type_ != DataAbilityOperation::TYPE_INSERT && type_ != DataAbilityOperation::TYPE_UPDATE &&
120 type_ != DataAbilityOperation::TYPE_ASSERT) {
121 HILOG_ERROR("DataAbilityOperationBuilder::withValueBackReferences only inserts, updates, and asserts can have "
122 "value back-references, type=%{public}d", type_);
123 return nullptr;
124 }
125 valuesBucketReferences_ = backReferences;
126 HILOG_DEBUG("DataAbilityOperationBuilder::WithValueBackReferences end");
127 return shared_from_this();
128 }
WithInterruptionAllowed(bool interrupted)129 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperationBuilder::WithInterruptionAllowed(bool interrupted)
130 {
131 HILOG_DEBUG("DataAbilityOperationBuilder::WithInterruptionAllowed start");
132 HILOG_INFO("DataAbilityOperationBuilder::WithInterruptionAllowed interrupted=%{public}d", interrupted);
133 if (type_ != DataAbilityOperation::TYPE_INSERT && type_ != DataAbilityOperation::TYPE_UPDATE &&
134 type_ != DataAbilityOperation::TYPE_ASSERT && type_ != DataAbilityOperation::TYPE_DELETE) {
135 HILOG_ERROR("DataAbilityOperationBuilder::withInterruptionAllowed only inserts, updates, delete, "
136 "and asserts can have value back-references, type=%{public}d", type_);
137 return nullptr;
138 }
139 interrupted_ = interrupted;
140 HILOG_DEBUG("DataAbilityOperationBuilder::WithInterruptionAllowed end");
141 return shared_from_this();
142 }
143 } // namespace AppExecFwk
144 } // namespace OHOS
145