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