1 /*
2 * Copyright (c) 2023 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 "rdb_cursor.h"
17
18 #include "result_set.h"
19 #include "store_types.h"
20 #include "value_proxy.h"
21 namespace OHOS::DistributedRdb {
22 using namespace OHOS::DistributedData;
23 using namespace DistributedDB;
RdbCursor(std::shared_ptr<DistributedDB::ResultSet> resultSet)24 RdbCursor::RdbCursor(std::shared_ptr<DistributedDB::ResultSet> resultSet) : resultSet_(std::move(resultSet)) {}
25
~RdbCursor()26 RdbCursor::~RdbCursor()
27 {
28 if (resultSet_) {
29 resultSet_->Close();
30 }
31 resultSet_ = nullptr;
32 }
33
GetColumnNames(std::vector<std::string> &names) const34 int32_t RdbCursor::GetColumnNames(std::vector<std::string> &names) const
35 {
36 resultSet_->GetColumnNames(names);
37 return GeneralError::E_OK;
38 }
39
GetColumnName(int32_t col, std::string &name) const40 int32_t RdbCursor::GetColumnName(int32_t col, std::string &name) const
41 {
42 return resultSet_->GetColumnName(col, name) == DBStatus::OK ? GeneralError::E_OK : GeneralError::E_ERROR;
43 }
44
GetColumnType(int32_t col) const45 int32_t RdbCursor::GetColumnType(int32_t col) const
46 {
47 ResultSet::ColumnType dbColumnType = ResultSet::ColumnType::INVALID_TYPE;
48 auto status = resultSet_->GetColumnType(col, dbColumnType);
49 if (status != DBStatus::OK) {
50 dbColumnType = ResultSet::ColumnType::INVALID_TYPE;
51 }
52 return Convert(dbColumnType);
53 }
54
GetCount() const55 int32_t RdbCursor::GetCount() const
56 {
57 return resultSet_->GetCount();
58 }
59
MoveToFirst()60 int32_t RdbCursor::MoveToFirst()
61 {
62 return resultSet_->MoveToFirst() ? GeneralError::E_OK : GeneralError::E_ERROR;
63 }
64
MoveToNext()65 int32_t RdbCursor::MoveToNext()
66 {
67 return resultSet_->MoveToNext() ? GeneralError::E_OK : GeneralError::E_ERROR;
68 }
69
MoveToPrev()70 int32_t RdbCursor::MoveToPrev()
71 {
72 return resultSet_->MoveToPrevious() ? GeneralError::E_OK : GeneralError::E_ERROR;
73 }
74
GetEntry(VBucket &entry)75 int32_t RdbCursor::GetEntry(VBucket &entry)
76 {
77 return GetRow(entry);
78 }
79
GetRow(VBucket &data)80 int32_t RdbCursor::GetRow(VBucket &data)
81 {
82 std::map<std::string, VariantData> bucket;
83 auto ret = resultSet_->GetRow(bucket);
84 data = ValueProxy::Convert(std::move(bucket));
85 return ret == DBStatus::OK ? GeneralError::E_OK : GeneralError::E_ERROR;
86 }
87
Get(int32_t col, DistributedData::Value &value)88 int32_t RdbCursor::Get(int32_t col, DistributedData::Value &value)
89 {
90 std::string name;
91 auto status = resultSet_->GetColumnName(col, name);
92 if (status != DBStatus::OK) {
93 return GeneralError::E_ERROR;
94 }
95 VBucket bucket;
96 if (GetRow(bucket) != GeneralError::E_OK) {
97 return GeneralError::E_ERROR;
98 }
99 value = bucket[name];
100 return GeneralError::E_OK;
101 }
102
Get(const std::string &col, DistributedData::Value &value)103 int32_t RdbCursor::Get(const std::string &col, DistributedData::Value &value)
104 {
105 int32_t index = -1;
106 auto ret = resultSet_->GetColumnIndex(col, index);
107 if (ret != DBStatus::OK) {
108 return GeneralError::E_ERROR;
109 }
110 return Get(index, value);
111 }
112
Close()113 int32_t RdbCursor::Close()
114 {
115 resultSet_->Close();
116 return GeneralError::E_OK;
117 }
118
IsEnd()119 bool RdbCursor::IsEnd()
120 {
121 return resultSet_->IsAfterLast();
122 }
123
Convert(ResultSet::ColumnType columnType)124 int32_t RdbCursor::Convert(ResultSet::ColumnType columnType)
125 {
126 switch (columnType) {
127 case ResultSet::ColumnType::INT64:
128 return TYPE_INDEX<int64_t>;
129 case ResultSet::ColumnType::STRING:
130 return TYPE_INDEX<std::string>;
131 case ResultSet::ColumnType::BLOB:
132 return TYPE_INDEX<std::vector<uint8_t>>;
133 case ResultSet::ColumnType::DOUBLE:
134 return TYPE_INDEX<double>;
135 case ResultSet::ColumnType::NULL_VALUE:
136 return TYPE_INDEX<std::monostate>;
137 case ResultSet::ColumnType::INVALID_TYPE:
138 return TYPE_INDEX<std::monostate>;
139 default:
140 return TYPE_INDEX<std::monostate>;
141 }
142 }
143 } // namespace OHOS::DistributedRdb
144