1 /*
2 * Copyright (c) 2021-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 "data_ability_operation_builder.h"
17 #include "data_ability_predicates.h"
18 #include "hilog_tag_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 TAG_LOGD(AAFwkTag::DATA_ABILITY, "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 TAG_LOGD(AAFwkTag::DATA_ABILITY, "end");
45 return operation;
46 }
47 TAG_LOGE(AAFwkTag::DATA_ABILITY, "return null");
48 return nullptr;
49 }
50
WithValuesBucket(std::shared_ptr<NativeRdb::ValuesBucket> & values)51 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperationBuilder::WithValuesBucket(
52 std::shared_ptr<NativeRdb::ValuesBucket> &values)
53 {
54 TAG_LOGD(AAFwkTag::DATA_ABILITY, "start");
55 if (type_ != DataAbilityOperation::TYPE_INSERT && type_ != DataAbilityOperation::TYPE_UPDATE &&
56 type_ != DataAbilityOperation::TYPE_ASSERT) {
57 TAG_LOGE(AAFwkTag::DATA_ABILITY, "only inserts, updates and assert can have values,"
58 " type:%{public}d", type_);
59 return nullptr;
60 }
61
62 valuesBucket_ = std::make_shared<NativeRdb::ValuesBucket>(*values);
63 TAG_LOGD(AAFwkTag::DATA_ABILITY, "end");
64 return shared_from_this();
65 }
66
WithPredicates(std::shared_ptr<NativeRdb::DataAbilityPredicates> & predicates)67 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperationBuilder::WithPredicates(
68 std::shared_ptr<NativeRdb::DataAbilityPredicates> &predicates)
69 {
70 TAG_LOGD(AAFwkTag::DATA_ABILITY, "start");
71 if (type_ != DataAbilityOperation::TYPE_DELETE && type_ != DataAbilityOperation::TYPE_UPDATE &&
72 type_ != DataAbilityOperation::TYPE_ASSERT) {
73 TAG_LOGE(AAFwkTag::DATA_ABILITY, "only deletes, updates and assert can have selections,"
74 " type=%{public}d", type_);
75 return nullptr;
76 }
77 dataAbilityPredicates_ = predicates;
78 TAG_LOGD(AAFwkTag::DATA_ABILITY, "end");
79 return shared_from_this();
80 }
WithExpectedCount(int count)81 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperationBuilder::WithExpectedCount(int count)
82 {
83 TAG_LOGD(AAFwkTag::DATA_ABILITY, "start");
84 TAG_LOGI(AAFwkTag::DATA_ABILITY, "expectedCount:%{public}d", count);
85 if (type_ != DataAbilityOperation::TYPE_UPDATE && type_ != DataAbilityOperation::TYPE_DELETE &&
86 type_ != DataAbilityOperation::TYPE_ASSERT) {
87 TAG_LOGE(AAFwkTag::DATA_ABILITY,
88 "only updates, deletes and assert can have expected counts, "
89 "type=%{public}d", type_);
90 return nullptr;
91 }
92 expectedCount_ = count;
93 TAG_LOGD(AAFwkTag::DATA_ABILITY, "end");
94 return shared_from_this();
95 }
WithPredicatesBackReference(int requestArgIndex,int previousResult)96 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperationBuilder::WithPredicatesBackReference(
97 int requestArgIndex, int previousResult)
98 {
99 TAG_LOGD(AAFwkTag::DATA_ABILITY, "start");
100 TAG_LOGI(AAFwkTag::DATA_ABILITY, "requestArgIndex:%{public}d, previousResult:%{public}d",
101 requestArgIndex, previousResult);
102 if (type_ != DataAbilityOperation::TYPE_UPDATE && type_ != DataAbilityOperation::TYPE_DELETE &&
103 type_ != DataAbilityOperation::TYPE_ASSERT) {
104 TAG_LOGE(AAFwkTag::DATA_ABILITY, "only updates, deletes, "
105 "and asserts can have select back-references, type=%{public}d", type_);
106 return nullptr;
107 }
108 dataAbilityPredicatesBackReferences_.insert(std::make_pair(requestArgIndex, previousResult));
109 TAG_LOGD(AAFwkTag::DATA_ABILITY, "end");
110 return shared_from_this();
111 }
WithValueBackReferences(std::shared_ptr<NativeRdb::ValuesBucket> & backReferences)112 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperationBuilder::WithValueBackReferences(
113 std::shared_ptr<NativeRdb::ValuesBucket> &backReferences)
114 {
115 TAG_LOGD(AAFwkTag::DATA_ABILITY, "start");
116 if (type_ != DataAbilityOperation::TYPE_INSERT && type_ != DataAbilityOperation::TYPE_UPDATE &&
117 type_ != DataAbilityOperation::TYPE_ASSERT) {
118 TAG_LOGE(AAFwkTag::DATA_ABILITY, "only inserts, updates, and asserts can have "
119 "value back-references, type=%{public}d", type_);
120 return nullptr;
121 }
122 valuesBucketReferences_ = backReferences;
123 TAG_LOGD(AAFwkTag::DATA_ABILITY, "end");
124 return shared_from_this();
125 }
WithInterruptionAllowed(bool interrupted)126 std::shared_ptr<DataAbilityOperationBuilder> DataAbilityOperationBuilder::WithInterruptionAllowed(bool interrupted)
127 {
128 TAG_LOGD(AAFwkTag::DATA_ABILITY, "start");
129 TAG_LOGI(AAFwkTag::DATA_ABILITY, "interrupted=%{public}d", interrupted);
130 if (type_ != DataAbilityOperation::TYPE_INSERT && type_ != DataAbilityOperation::TYPE_UPDATE &&
131 type_ != DataAbilityOperation::TYPE_ASSERT && type_ != DataAbilityOperation::TYPE_DELETE) {
132 TAG_LOGE(AAFwkTag::DATA_ABILITY, "only inserts, updates, delete, "
133 "and asserts can have value back-references, type=%{public}d", type_);
134 return nullptr;
135 }
136 interrupted_ = interrupted;
137 TAG_LOGD(AAFwkTag::DATA_ABILITY, "end");
138 return shared_from_this();
139 }
140 } // namespace AppExecFwk
141 } // namespace OHOS
142