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 #define LOG_TAG "ExtensionCloudDbImpl"
17 #include "cloud_db_impl.h"
18 #include "error/general_error.h"
19 #include "extension_util.h"
20 #include "cloud_cursor_impl.h"
21 #include "cloud_ext_types.h"
22 #include "basic_rust_types.h"
23 #include "log_print.h"
24 namespace OHOS::CloudData {
CloudDbImpl(OhCloudExtCloudDatabase * database)25 CloudDbImpl::CloudDbImpl(OhCloudExtCloudDatabase *database) : database_(database)
26 {
27 }
28
~CloudDbImpl()29 CloudDbImpl::~CloudDbImpl()
30 {
31 if (database_ != nullptr) {
32 OhCloudExtCloudDbFree(database_);
33 database_ = nullptr;
34 }
35 }
36
Execute(const std::string & table,const std::string & sql,const DBVBucket & extend)37 int32_t CloudDbImpl::Execute(const std::string &table, const std::string &sql, const DBVBucket &extend)
38 {
39 OhCloudExtSql sqlInfo {
40 .table = reinterpret_cast<const unsigned char *>(table.c_str()),
41 .tableLen = table.size(),
42 .sql = reinterpret_cast<const unsigned char *>(sql.c_str()),
43 .sqlLen = sql.size()
44 };
45 auto data = ExtensionUtil::Convert(extend);
46 if (data.first == nullptr) {
47 return DBErr::E_ERROR;
48 }
49 auto status = OhCloudExtCloudDbExecuteSql(database_, &sqlInfo, data.first);
50 OhCloudExtHashMapFree(data.first);
51 return ExtensionUtil::ConvertStatus(status);
52 }
53
BatchInsert(const std::string & table,DBVBuckets && values,DBVBuckets & extends)54 int32_t CloudDbImpl::BatchInsert(const std::string &table, DBVBuckets &&values, DBVBuckets &extends)
55 {
56 DBVBuckets inValues = values;
57 auto valIn = ExtensionUtil::Convert(std::move(inValues));
58 auto exdIn = ExtensionUtil::Convert(std::move(extends));
59 if (valIn.first == nullptr || exdIn.first == nullptr) {
60 OhCloudExtVectorFree(valIn.first);
61 OhCloudExtVectorFree(exdIn.first);
62 return DBErr::E_ERROR;
63 }
64 auto status = OhCloudExtCloudDbBatchInsert(database_, reinterpret_cast<const unsigned char *>(table.c_str()),
65 table.size(), valIn.first, exdIn.first);
66 if (status == ERRNO_SUCCESS) {
67 extends = ExtensionUtil::ConvertBuckets(exdIn.first);
68 }
69 OhCloudExtVectorFree(valIn.first);
70 OhCloudExtVectorFree(exdIn.first);
71 return ExtensionUtil::ConvertStatus(status);
72 }
73
BatchUpdate(const std::string & table,DBVBuckets && values,DBVBuckets & extends)74 int32_t CloudDbImpl::BatchUpdate(const std::string &table, DBVBuckets &&values, DBVBuckets &extends)
75 {
76 auto exdIn = ExtensionUtil::Convert(std::move(extends));
77 auto valIn = ExtensionUtil::Convert(std::move(values));
78 if (valIn.first == nullptr || exdIn.first == nullptr) {
79 OhCloudExtVectorFree(valIn.first);
80 OhCloudExtVectorFree(exdIn.first);
81 return DBErr::E_ERROR;
82 }
83 auto status = OhCloudExtCloudDbBatchUpdate(database_, reinterpret_cast<const unsigned char *>(table.c_str()),
84 table.size(), valIn.first, exdIn.first);
85 if (status == ERRNO_SUCCESS && exdIn.first != nullptr) {
86 extends = ExtensionUtil::ConvertBuckets(exdIn.first);
87 }
88 OhCloudExtVectorFree(exdIn.first);
89 OhCloudExtVectorFree(valIn.first);
90 return ExtensionUtil::ConvertStatus(status);
91 }
92
BatchUpdate(const std::string & table,DBVBuckets && values,const DBVBuckets & extends)93 int32_t CloudDbImpl::BatchUpdate(const std::string &table, DBVBuckets &&values, const DBVBuckets &extends)
94 {
95 auto exdIn = ExtensionUtil::Convert(std::move(const_cast<DBVBuckets &>(extends)));
96 auto valIn = ExtensionUtil::Convert(std::move(values));
97 if (valIn.first == nullptr || exdIn.first == nullptr) {
98 OhCloudExtVectorFree(valIn.first);
99 OhCloudExtVectorFree(exdIn.first);
100 return DBErr::E_ERROR;
101 }
102 auto status = OhCloudExtCloudDbBatchUpdate(database_, reinterpret_cast<const unsigned char *>(table.c_str()),
103 table.size(), valIn.first, exdIn.first);
104 OhCloudExtVectorFree(exdIn.first);
105 OhCloudExtVectorFree(valIn.first);
106 return ExtensionUtil::ConvertStatus(status);
107 }
108
BatchDelete(const std::string & table,DBVBuckets & extends)109 int32_t CloudDbImpl::BatchDelete(const std::string &table, DBVBuckets &extends)
110 {
111 auto data = ExtensionUtil::Convert(std::move(extends));
112 if (data.first == nullptr) {
113 return DBErr::E_ERROR;
114 }
115 auto status = OhCloudExtCloudDbBatchDelete(database_, reinterpret_cast<const unsigned char *>(table.c_str()),
116 table.size(), data.first);
117 extends = ExtensionUtil::ConvertBuckets(data.first);
118 OhCloudExtVectorFree(data.first);
119 return ExtensionUtil::ConvertStatus(status);
120 }
121
Query(const std::string & table,const DBVBucket & extend)122 std::shared_ptr<DBCursor> CloudDbImpl::Query(const std::string &table, const DBVBucket &extend)
123 {
124 std::string cursor;
125 auto it = extend.find(DistributedData::SchemaMeta::CURSOR_FIELD);
126 if (it != extend.end()) {
127 cursor = std::get<std::string>(it->second);
128 }
129 OhCloudExtQueryInfo info {
130 .table = reinterpret_cast<const unsigned char *>(table.c_str()),
131 .tableLen = table.size(),
132 .cursor = reinterpret_cast<const unsigned char *>(cursor.c_str()),
133 .cursorLen = cursor.size()
134 };
135 OhCloudExtCloudDbData *cloudData = nullptr;
136 auto status = OhCloudExtCloudDbBatchQuery(database_, &info, &cloudData);
137 return (status == ERRNO_SUCCESS && cloudData != nullptr) ? std::make_shared<CloudCursorImpl>(cloudData) : nullptr;
138 }
139
Lock()140 int32_t CloudDbImpl::Lock()
141 {
142 int expire = 0;
143 auto status = OhCloudExtCloudDbLock(database_, &expire);
144 interval_ = expire;
145 return ExtensionUtil::ConvertStatus(status);
146 }
147
Heartbeat()148 int32_t CloudDbImpl::Heartbeat()
149 {
150 return ExtensionUtil::ConvertStatus(OhCloudExtCloudDbHeartbeat(database_));
151 }
152
Unlock()153 int32_t CloudDbImpl::Unlock()
154 {
155 auto status = OhCloudExtCloudDbUnlock(database_);
156 return ExtensionUtil::ConvertStatus(status);
157 }
158
AliveTime()159 int64_t CloudDbImpl::AliveTime()
160 {
161 return interval_;
162 }
163
Close()164 int32_t CloudDbImpl::Close()
165 {
166 if (database_ != nullptr) {
167 OhCloudExtCloudDbFree(database_);
168 database_ = nullptr;
169 }
170 return DBErr::E_OK;
171 }
172 } // namespace OHOS::CloudData