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 return DBErr::E_ERROR;
61 }
62 auto status = OhCloudExtCloudDbBatchInsert(database_, reinterpret_cast<const unsigned char *>(table.c_str()),
63 table.size(), valIn.first, exdIn.first);
64 if (status == ERRNO_SUCCESS) {
65 extends = ExtensionUtil::ConvertBuckets(exdIn.first);
66 }
67 OhCloudExtVectorFree(valIn.first);
68 OhCloudExtVectorFree(exdIn.first);
69 return ExtensionUtil::ConvertStatus(status);
70 }
71
BatchUpdate(const std::string & table,DBVBuckets && values,DBVBuckets & extends)72 int32_t CloudDbImpl::BatchUpdate(const std::string &table, DBVBuckets &&values, DBVBuckets &extends)
73 {
74 auto exdIn = ExtensionUtil::Convert(std::move(extends));
75 auto valIn = ExtensionUtil::Convert(std::move(values));
76 if (valIn.first == nullptr || exdIn.first == nullptr) {
77 return DBErr::E_ERROR;
78 }
79 auto status = OhCloudExtCloudDbBatchUpdate(database_, reinterpret_cast<const unsigned char *>(table.c_str()),
80 table.size(), valIn.first, exdIn.first);
81 if (status == ERRNO_SUCCESS && exdIn.first != nullptr) {
82 extends = ExtensionUtil::ConvertBuckets(exdIn.first);
83 }
84 OhCloudExtVectorFree(exdIn.first);
85 OhCloudExtVectorFree(valIn.first);
86 return ExtensionUtil::ConvertStatus(status);
87 }
88
BatchUpdate(const std::string & table,DBVBuckets && values,const DBVBuckets & extends)89 int32_t CloudDbImpl::BatchUpdate(const std::string &table, DBVBuckets &&values, const DBVBuckets &extends)
90 {
91 auto exdIn = ExtensionUtil::Convert(std::move(const_cast<DBVBuckets &>(extends)));
92 auto valIn = ExtensionUtil::Convert(std::move(values));
93 if (valIn.first == nullptr || exdIn.first == nullptr) {
94 return DBErr::E_ERROR;
95 }
96 auto status = OhCloudExtCloudDbBatchUpdate(database_, reinterpret_cast<const unsigned char *>(table.c_str()),
97 table.size(), valIn.first, exdIn.first);
98 OhCloudExtVectorFree(exdIn.first);
99 OhCloudExtVectorFree(valIn.first);
100 return ExtensionUtil::ConvertStatus(status);
101 }
102
BatchDelete(const std::string & table,const DBVBuckets & extends)103 int32_t CloudDbImpl::BatchDelete(const std::string &table, const DBVBuckets &extends)
104 {
105 auto data = ExtensionUtil::Convert(std::move(const_cast<DBVBuckets &>(extends)));
106 if (data.first == nullptr) {
107 return DBErr::E_ERROR;
108 }
109 auto status = OhCloudExtCloudDbBatchDelete(database_, reinterpret_cast<const unsigned char *>(table.c_str()),
110 table.size(), data.first);
111 OhCloudExtVectorFree(data.first);
112 return ExtensionUtil::ConvertStatus(status);
113 }
114
Query(const std::string & table,const DBVBucket & extend)115 std::shared_ptr<DBCursor> CloudDbImpl::Query(const std::string &table, const DBVBucket &extend)
116 {
117 std::string cursor;
118 auto it = extend.find(DistributedData::SchemaMeta::CURSOR_FIELD);
119 if (it != extend.end()) {
120 cursor = std::get<std::string>(it->second);
121 }
122 OhCloudExtQueryInfo info {
123 .table = reinterpret_cast<const unsigned char *>(table.c_str()),
124 .tableLen = table.size(),
125 .cursor = reinterpret_cast<const unsigned char *>(cursor.c_str()),
126 .cursorLen = cursor.size()
127 };
128 OhCloudExtCloudDbData *cloudData = nullptr;
129 auto status = OhCloudExtCloudDbBatchQuery(database_, &info, &cloudData);
130 return (status == ERRNO_SUCCESS && cloudData != nullptr) ? std::make_shared<CloudCursorImpl>(cloudData) : nullptr;
131 }
132
Lock()133 int32_t CloudDbImpl::Lock()
134 {
135 int expire = 0;
136 auto status = OhCloudExtCloudDbLock(database_, &expire);
137 interval_ = expire;
138 return ExtensionUtil::ConvertStatus(status);
139 }
140
Heartbeat()141 int32_t CloudDbImpl::Heartbeat()
142 {
143 return ExtensionUtil::ConvertStatus(OhCloudExtCloudDbHeartbeat(database_));
144 }
145
Unlock()146 int32_t CloudDbImpl::Unlock()
147 {
148 auto status = OhCloudExtCloudDbUnlock(database_);
149 return ExtensionUtil::ConvertStatus(status);
150 }
151
AliveTime()152 int64_t CloudDbImpl::AliveTime()
153 {
154 return interval_;
155 }
156
Close()157 int32_t CloudDbImpl::Close()
158 {
159 if (database_ != nullptr) {
160 OhCloudExtCloudDbFree(database_);
161 database_ = nullptr;
162 }
163 return DBErr::E_OK;
164 }
165 } // namespace OHOS::CloudData