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