1 /*
2 * Copyright (c) 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 <gtest/gtest.h>
17
18 #include <map>
19 #include <string>
20
21 #include "common.h"
22 #include "connection_pool.h"
23 #include "rdb_errno.h"
24 #include "rdb_predicates.h"
25 #include "sqlite_sql_builder.h"
26 #include "trans_db.h"
27 using namespace testing::ext;
28 using namespace OHOS::NativeRdb;
29 namespace Test {
30 class RdbTransDBTest : public testing::Test {
31 public:
32 static void SetUpTestCase(void);
33 static void TearDownTestCase(void);
34 void SetUp();
35 void TearDown();
36
37 protected:
38 static constexpr const char *CREATE_TABLE = "CREATE TABLE IF NOT EXISTS TEST (id INT PRIMARY KEY, name TEXT, "
39 "extend BLOB, code REAL, years UNLIMITED INT, attachment ASSET, "
40 "attachments ASSETS)";
41 static constexpr const char *DROP_TABLE = "DROP TABLE IF EXISTS TEST";
42 static constexpr const char *TABLE_NAME = "TEST";
43 static std::shared_ptr<ConnectionPool> connPool_;
44 static RdbStoreConfig config_;
45 static ValuesBucket row_;
46 std::shared_ptr<RdbStore> transDB_;
47 std::shared_ptr<Connection> conn_;
48 };
49 std::shared_ptr<ConnectionPool> RdbTransDBTest::connPool_ = nullptr;
50 RdbStoreConfig RdbTransDBTest::config_(RDB_TEST_PATH + "transDb_test.db");
51 ValuesBucket RdbTransDBTest::row_(std::map<std::string, ValueObject>{
52 { "id", ValueObject(1) },
53 { "name", ValueObject("xiaoming") },
54 { "extend", ValueObject(std::vector<uint8_t>(100, 128)) },
55 { "code", ValueObject(3.1415926) },
56 { "years", ValueObject(BigInteger(0, { 128, 225 })) },
57 { "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111" }) },
58 { "attachments", ValueObject(ValueObject::Assets{
59 AssetValue{ .id = "120", .name = "picture2", .hash = "112" },
60 AssetValue{ .id = "121", .name = "picture3", .hash = "113" },
61 AssetValue{ .id = "122", .name = "picture4", .hash = "114" },
62 AssetValue{ .id = "123", .name = "picture5", .hash = "115" }
63 })
64 }
65 });
66
SetUpTestCase(void)67 void RdbTransDBTest::SetUpTestCase(void)
68 {
69 config_.SetBundleName("arkdata_test");
70 config_.SetSecurityLevel(OHOS::NativeRdb::SecurityLevel::S1);
71 Connection::Delete(config_);
72 int32_t errCode = E_OK;
73 connPool_ = ConnectionPool::Create(config_, errCode);
74 EXPECT_TRUE(connPool_ != nullptr);
75 }
76
TearDownTestCase(void)77 void RdbTransDBTest::TearDownTestCase(void)
78 {
79 connPool_ = nullptr;
80 Connection::Delete(config_);
81 }
82
SetUp()83 void RdbTransDBTest::SetUp()
84 {
85 auto [errCode, conn] = connPool_->CreateTransConn();
86 ASSERT_NE(conn, nullptr);
87 ASSERT_EQ(errCode, E_OK);
88 transDB_ = std::make_shared<TransDB>(conn, config_.GetName());
89 ASSERT_NE(transDB_, nullptr);
90 auto [err, object] = transDB_->Execute(DROP_TABLE);
91 ASSERT_EQ(err, E_OK);
92 std::tie(err, object) = transDB_->Execute(CREATE_TABLE);
93 ASSERT_EQ(err, E_OK);
94 conn_ = conn;
95 }
96
TearDown()97 void RdbTransDBTest::TearDown()
98 {
99 transDB_ = nullptr;
100 conn_ = nullptr;
101 }
102
103 /* *
104 * @tc.name: ALREADY_CLOSED_001
105 * @tc.desc: closed db
106 * @tc.type: FUNC
107 */
108 HWTEST_F(RdbTransDBTest, ALREADY_CLOSED_001, TestSize.Level1)
109 {
110 conn_ = nullptr;
111 ValuesBucket row = row_;
112 int32_t changed = 0;
113 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
114 ASSERT_EQ(errCode, E_ALREADY_CLOSED);
115 std::tie(errCode, changed) = transDB_->Update(TABLE_NAME, row);
116 ASSERT_EQ(errCode, E_ALREADY_CLOSED);
117 errCode = transDB_->Delete(changed, TABLE_NAME);
118 ASSERT_EQ(errCode, E_ALREADY_CLOSED);
119 auto resultSet = transDB_->QueryByStep("select * from TEST");
120 ASSERT_NE(resultSet, nullptr);
121 errCode = resultSet->GoToNextRow();
122 ASSERT_EQ(errCode, E_ALREADY_CLOSED);
123 resultSet = transDB_->QuerySql("select * from TEST");
124 ASSERT_NE(resultSet, nullptr);
125 errCode = resultSet->GoToNextRow();
126 ASSERT_EQ(errCode, E_ALREADY_CLOSED);
127 }
128
129 /* *
130 * @tc.name: ALREADY_CLOSED_002
131 * @tc.desc: closed db
132 * @tc.type: FUNC
133 */
134 HWTEST_F(RdbTransDBTest, ALREADY_CLOSED_002, TestSize.Level1)
135 {
136 ValuesBucket row = row_;
137 int32_t changed = 0;
138 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
139 ASSERT_EQ(errCode, E_OK);
140 auto resultSet = transDB_->QueryByStep("select * from TEST");
141 ASSERT_NE(resultSet, nullptr);
142 errCode = resultSet->GoToNextRow();
143 ASSERT_EQ(errCode, E_OK);
144 conn_ = nullptr;
145 resultSet->Close();
146 errCode = transDB_->Delete(changed, TABLE_NAME);
147 ASSERT_EQ(errCode, E_ALREADY_CLOSED);
148 errCode = resultSet->GoToNextRow();
149 ASSERT_EQ(errCode, E_ALREADY_CLOSED);
150 }
151
152 /* *
153 * @tc.name: Insert_NEW_001
154 * @tc.desc: insert into test(...) values(?)
155 * @tc.type: FUNC
156 */
157 HWTEST_F(RdbTransDBTest, Insert_NEW_001, TestSize.Level1)
158 {
159 ValuesBucket row = row_;
160 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
161 ASSERT_EQ(errCode, E_OK);
162 ASSERT_EQ(rowId, 1);
163 auto resultSet = transDB_->QueryByStep("select * from TEST");
164 ASSERT_NE(resultSet, nullptr);
165 errCode = resultSet->GoToNextRow();
166 ASSERT_EQ(errCode, E_OK);
167 RowEntity rowEntity;
168 errCode = resultSet->GetRow(rowEntity);
169 ASSERT_EQ(errCode, E_OK);
170 ASSERT_TRUE(row.values_ == rowEntity.Get());
171 }
172
173 /* *
174 * @tc.name: Insert_NEW_002
175 * @tc.desc: insert or replace into test(...) values(?)
176 * @tc.type: FUNC
177 */
178 HWTEST_F(RdbTransDBTest, Insert_NEW_002, TestSize.Level1)
179 {
180 ValuesBucket row = row_;
181 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
182 ASSERT_EQ(errCode, E_OK);
183 ASSERT_EQ(rowId, 1);
184 row.Put("name", "xiaohua");
185 std::tie(errCode, rowId) = transDB_->Insert(TABLE_NAME, row, ConflictResolution::ON_CONFLICT_REPLACE);
186 ASSERT_EQ(errCode, E_INVALID_ARGS);
187 row.Put("attachments", ValueObject());
188 std::tie(errCode, rowId) = transDB_->Insert(TABLE_NAME, row, ConflictResolution::ON_CONFLICT_REPLACE);
189 ASSERT_EQ(errCode, E_OK);
190 auto resultSet = transDB_->QueryByStep("select * from TEST");
191 ASSERT_NE(resultSet, nullptr);
192 errCode = resultSet->GoToNextRow();
193 ASSERT_EQ(errCode, E_OK);
194 RowEntity rowEntity;
195 errCode = resultSet->GetRow(rowEntity);
196 ASSERT_EQ(errCode, E_OK);
197 ASSERT_TRUE(row.values_ == rowEntity.Get());
198 }
199
200 /* *
201 * @tc.name: Insert_NEW_003
202 * @tc.desc: insert or ignore into test(...) values(?)
203 * @tc.type: FUNC
204 */
205 HWTEST_F(RdbTransDBTest, Insert_NEW_003, TestSize.Level1)
206 {
207 ValuesBucket row = row_;
208 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
209 ASSERT_EQ(errCode, E_OK);
210 ASSERT_EQ(rowId, 1);
211 row.Put("name", "xiaohua");
212 std::tie(errCode, rowId) = transDB_->Insert(TABLE_NAME, row, ConflictResolution::ON_CONFLICT_IGNORE);
213 ASSERT_EQ(errCode, E_OK);
214 auto resultSet = transDB_->QueryByStep("select * from TEST");
215 ASSERT_NE(resultSet, nullptr);
216 errCode = resultSet->GoToNextRow();
217 ASSERT_EQ(errCode, E_OK);
218 RowEntity rowEntity;
219 errCode = resultSet->GetRow(rowEntity);
220 ASSERT_EQ(errCode, E_OK);
221 row = row_;
222 SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachment"], AssetValue::STATUS_INSERT);
223 SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachments"], AssetValue::STATUS_INSERT);
224 ASSERT_TRUE(row.values_ == rowEntity.Get());
225 }
226
227 /* *
228 * @tc.name: Insert_NEW_003
229 * @tc.desc: insert or fail into test(...) values(?)
230 * @tc.type: FUNC
231 */
232 HWTEST_F(RdbTransDBTest, Insert_NEW_004, TestSize.Level1)
233 {
234 ValuesBucket row = row_;
235 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
236 ASSERT_EQ(errCode, E_OK);
237 ASSERT_EQ(rowId, 1);
238 row.Put("name", "xiaohua");
239 std::tie(errCode, rowId) = transDB_->Insert(TABLE_NAME, row, ConflictResolution::ON_CONFLICT_FAIL);
240 ASSERT_EQ(errCode, E_SQLITE_CONSTRAINT);
241 auto resultSet = transDB_->QueryByStep("select * from TEST");
242 ASSERT_NE(resultSet, nullptr);
243 errCode = resultSet->GoToNextRow();
244 ASSERT_EQ(errCode, E_OK);
245 RowEntity rowEntity;
246 errCode = resultSet->GetRow(rowEntity);
247 ASSERT_EQ(errCode, E_OK);
248 row = row_;
249 SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachment"], AssetValue::STATUS_INSERT);
250 SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachments"], AssetValue::STATUS_INSERT);
251 ASSERT_TRUE(row.values_ == rowEntity.Get());
252 }
253
254 /* *
255 * @tc.name: Insert_NEW_003
256 * @tc.desc: insert or abort into test(...) values(?)
257 * @tc.type: FUNC
258 */
259 HWTEST_F(RdbTransDBTest, Insert_NEW_005, TestSize.Level1)
260 {
261 ValuesBucket row = row_;
262 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
263 ASSERT_EQ(errCode, E_OK);
264 ASSERT_EQ(rowId, 1);
265 row.Put("name", "xiaohua");
266 std::tie(errCode, rowId) = transDB_->Insert(TABLE_NAME, row, ConflictResolution::ON_CONFLICT_ABORT);
267 ASSERT_EQ(errCode, E_SQLITE_CONSTRAINT);
268 auto resultSet = transDB_->QueryByStep("select * from TEST");
269 ASSERT_NE(resultSet, nullptr);
270 errCode = resultSet->GoToNextRow();
271 ASSERT_EQ(errCode, E_OK);
272 RowEntity rowEntity;
273 errCode = resultSet->GetRow(rowEntity);
274 ASSERT_EQ(errCode, E_OK);
275 row = row_;
276 SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachment"], AssetValue::STATUS_INSERT);
277 SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachments"], AssetValue::STATUS_INSERT);
278 ASSERT_TRUE(row.values_ == rowEntity.Get());
279 }
280
281 /* *
282 * @tc.name: Insert_NEW_006
283 * @tc.desc: insert or rollback into test(...) values(?)
284 * @tc.type: FUNC
285 */
286 HWTEST_F(RdbTransDBTest, Insert_NEW_006, TestSize.Level1)
287 {
288 ValuesBucket row = row_;
289 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
290 ASSERT_EQ(errCode, E_OK);
291 ASSERT_EQ(rowId, 1);
292 row.Put("name", "xiaohua");
293 std::tie(errCode, rowId) = transDB_->Insert(TABLE_NAME, row, ConflictResolution::ON_CONFLICT_ROLLBACK);
294 ASSERT_EQ(errCode, E_SQLITE_CONSTRAINT);
295 auto resultSet = transDB_->QueryByStep("select * from TEST");
296 ASSERT_NE(resultSet, nullptr);
297 errCode = resultSet->GoToNextRow();
298 ASSERT_EQ(errCode, E_OK);
299 RowEntity rowEntity;
300 errCode = resultSet->GetRow(rowEntity);
301 ASSERT_EQ(errCode, E_OK);
302 row = row_;
303 SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachment"], AssetValue::STATUS_INSERT);
304 SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachments"], AssetValue::STATUS_INSERT);
305 ASSERT_TRUE(row.values_ == rowEntity.Get());
306 }
307
308 /* *
309 * @tc.name: Insert_001
310 * @tc.desc: insert into test(...) values(?)
311 * @tc.type: FUNC
312 */
313 HWTEST_F(RdbTransDBTest, Insert_001, TestSize.Level1)
314 {
315 int64_t rowId = -1;
316 ValuesBucket row = row_;
317 auto errCode = transDB_->Insert(rowId, TABLE_NAME, row);
318 ASSERT_EQ(errCode, E_OK);
319 ASSERT_EQ(rowId, 1);
320 auto resultSet = transDB_->QueryByStep("select * from TEST");
321 ASSERT_NE(resultSet, nullptr);
322 errCode = resultSet->GoToNextRow();
323 ASSERT_EQ(errCode, E_OK);
324 RowEntity rowEntity;
325 errCode = resultSet->GetRow(rowEntity);
326 ASSERT_EQ(errCode, E_OK);
327 ASSERT_TRUE(row.values_ == rowEntity.Get());
328 }
329
330 /* *
331 * @tc.name: Insert_002
332 * @tc.desc: insert into test(...) values(?)
333 * @tc.type: FUNC
334 */
335 HWTEST_F(RdbTransDBTest, Insert_002, TestSize.Level1)
336 {
337 int64_t rowId = -1;
338 ValuesBucket row = row_;
339 auto errCode = transDB_->Insert(rowId, TABLE_NAME, row);
340 ASSERT_EQ(errCode, E_OK);
341 ASSERT_EQ(rowId, 1);
342 errCode = transDB_->Insert(rowId, TABLE_NAME, row);
343 ASSERT_EQ(errCode, E_SQLITE_CONSTRAINT);
344 }
345
346 /* *
347 * @tc.name: InsertWithConflictResolution_001
348 * @tc.desc: insert or replace into test(...) values(?)
349 * @tc.type: FUNC
350 */
351 HWTEST_F(RdbTransDBTest, InsertWithConflictResolution_001, TestSize.Level1)
352 {
353 ValuesBucket row = row_;
354 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
355 ASSERT_EQ(errCode, E_OK);
356 ASSERT_EQ(rowId, 1);
357 row.Put("name", "xiaohua");
358 errCode = transDB_->InsertWithConflictResolution(rowId, TABLE_NAME, row, ConflictResolution::ON_CONFLICT_REPLACE);
359 ASSERT_EQ(errCode, E_INVALID_ARGS);
360 row.Put("attachments", ValueObject());
361 errCode = transDB_->InsertWithConflictResolution(rowId, TABLE_NAME, row, ConflictResolution::ON_CONFLICT_REPLACE);
362 ASSERT_EQ(errCode, E_OK);
363 auto resultSet = transDB_->QueryByStep("select * from TEST");
364 ASSERT_NE(resultSet, nullptr);
365 errCode = resultSet->GoToNextRow();
366 ASSERT_EQ(errCode, E_OK);
367 RowEntity rowEntity;
368 errCode = resultSet->GetRow(rowEntity);
369 ASSERT_EQ(errCode, E_OK);
370 ASSERT_TRUE(row.values_ == rowEntity.Get());
371 }
372
373 /* *
374 * @tc.name: Replace_001
375 * @tc.desc: insert or replace into test(...) values(?)
376 * @tc.type: FUNC
377 */
378 HWTEST_F(RdbTransDBTest, Replace_001, TestSize.Level1)
379 {
380 ValuesBucket row = row_;
381 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
382 ASSERT_EQ(errCode, E_OK);
383 ASSERT_EQ(rowId, 1);
384 row.Put("name", "xiaohua");
385 errCode = transDB_->Replace(rowId, TABLE_NAME, row);
386 ASSERT_EQ(errCode, E_INVALID_ARGS);
387 row.Put("attachments", ValueObject());
388 errCode = transDB_->Replace(rowId, TABLE_NAME, row);
389 ASSERT_EQ(errCode, E_OK);
390 auto resultSet = transDB_->QueryByStep("select * from TEST");
391 ASSERT_NE(resultSet, nullptr);
392 errCode = resultSet->GoToNextRow();
393 ASSERT_EQ(errCode, E_OK);
394 RowEntity rowEntity;
395 errCode = resultSet->GetRow(rowEntity);
396 ASSERT_EQ(errCode, E_OK);
397 ASSERT_TRUE(row.values_ == rowEntity.Get());
398 }
399
400 /* *
401 * @tc.name: BatchInsert
402 * @tc.desc: insert Normal ValuesBucket to db
403 * @tc.type: FUNC
404 */
405 HWTEST_F(RdbTransDBTest, BatchInsert_001, TestSize.Level1)
406 {
407 int64_t changedNum = -1;
408 std::vector<ValuesBucket> rows;
409 for (int i = 0; i < 20; i++) {
410 ValuesBucket row = row_;
411 row.Put("id", i);
412 row.Put("name", "xiaoming_" + std::to_string(i));
413 row.Put("years", BigInteger(i % 2, { 128, 225 }));
414 rows.push_back(std::move(row));
415 }
416 auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
417 ASSERT_EQ(errCode, E_OK);
418 ASSERT_EQ(changedNum, 20);
419 auto resultSet = transDB_->QueryByStep("select * from TEST order by id");
420 ASSERT_NE(resultSet, nullptr);
421 size_t index = 0;
422 while (resultSet->GoToNextRow() == E_OK && index < rows.size()) {
423 RowEntity rowEntity;
424 errCode = resultSet->GetRow(rowEntity);
425 ASSERT_EQ(errCode, E_OK);
426 auto row = rowEntity.Steal();
427 SqliteSqlBuilder::UpdateAssetStatus(rows[index].values_["attachment"], AssetValue::STATUS_INSERT);
428 SqliteSqlBuilder::UpdateAssetStatus(rows[index].values_["attachments"], AssetValue::STATUS_INSERT);
429 ASSERT_TRUE(rows[index].values_ == row);
430 index++;
431 }
432 int32_t rowCount = 0;
433 errCode = resultSet->GetRowCount(rowCount);
434 ASSERT_EQ(errCode, E_OK);
435 ASSERT_EQ(rowCount, rows.size());
436 }
437
438 /* *
439 * @tc.name: BatchInsert
440 * @tc.desc: insert RefRows to db
441 * @tc.type: FUNC
442 */
443 HWTEST_F(RdbTransDBTest, BatchInsert_002, TestSize.Level1)
444 {
445 ValuesBuckets rows;
446 for (int i = 0; i < 20; i++) {
447 ValuesBucket row = row_;
448 row.Put("id", i);
449 row.Put("name", "xiaoming_" + std::to_string(i));
450 row.Put("years", BigInteger(i % 2, { 128, 225 }));
451 rows.Put(row);
452 }
453 auto [errCode, changedNum] = transDB_->BatchInsert(TABLE_NAME, rows);
454 ASSERT_EQ(errCode, E_OK);
455 ASSERT_EQ(changedNum, 20);
456 auto resultSet = transDB_->QueryByStep("select * from TEST order by id");
457 ASSERT_NE(resultSet, nullptr);
458 size_t index = 0;
459 while (resultSet->GoToNextRow() == E_OK) {
460 RowEntity rowEntity;
461 errCode = resultSet->GetRow(rowEntity);
462 ASSERT_EQ(errCode, E_OK);
463 auto row = rowEntity.Steal();
464 for (auto &[key, value] : row) {
465 auto [ret, val] = rows.Get(index, ValuesBuckets::FieldType(key));
466 ASSERT_EQ(ret, E_OK);
467 ASSERT_TRUE(val.get() == value);
468 }
469 index++;
470 }
471 int32_t rowCount = 0;
472 errCode = resultSet->GetRowCount(rowCount);
473 ASSERT_EQ(errCode, E_OK);
474 ASSERT_EQ(rows.RowSize(), size_t(rowCount));
475 }
476
477 /* *
478 * @tc.name: Update_001
479 * @tc.desc: update test set(id=?,...)
480 * @tc.type: FUNC
481 */
482 HWTEST_F(RdbTransDBTest, Update_001, TestSize.Level1)
483 {
484 ValuesBucket row = row_;
485 int32_t changed = -1;
486 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
487 ASSERT_EQ(errCode, E_OK);
488 ASSERT_EQ(rowId, 1);
489 row.Put("name", "xiaohua");
490 row.Put(
491 "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111", .path = "/data/test" }));
492 std::tie(errCode, changed) = transDB_->Update(TABLE_NAME, row);
493 ASSERT_EQ(errCode, E_OK);
494 auto resultSet = transDB_->QueryByStep("select * from TEST");
495 ASSERT_NE(resultSet, nullptr);
496 errCode = resultSet->GoToNextRow();
497 ASSERT_EQ(errCode, E_OK);
498 RowEntity rowEntity;
499 errCode = resultSet->GetRow(rowEntity);
500 ASSERT_EQ(errCode, E_OK);
501 SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachment"], AssetValue::STATUS_UPDATE);
502 ASSERT_TRUE(row.values_ == rowEntity.Get());
503 }
504
505 /* *
506 * @tc.name: Update_002
507 * @tc.desc: update test set(id=?,...) where id > ? and id < ?
508 * @tc.type: FUNC
509 */
510 HWTEST_F(RdbTransDBTest, Update_002, TestSize.Level1)
511 {
512 int64_t changedNum = -1;
513 std::vector<ValuesBucket> rows;
514 for (int i = 0; i < 20; i++) {
515 ValuesBucket row = row_;
516 row.Put("id", i);
517 row.Put("name", "xiaoming_" + std::to_string(i));
518 row.Put("years", BigInteger(i % 2, { 128, 225 }));
519 rows.push_back(std::move(row));
520 }
521 auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
522 ASSERT_EQ(errCode, E_OK);
523 ASSERT_EQ(changedNum, 20);
524 auto updateRow = row_;
525 updateRow.values_.erase("id");
526 updateRow.Put(
527 "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111", .path = "/data/test" }));
528 int32_t updatedNum = -1;
529 std::tie(errCode, updatedNum) = transDB_->Update(TABLE_NAME, updateRow, "id > ? and id < ?", { 0, 10 });
530 ASSERT_EQ(errCode, E_OK);
531 ASSERT_EQ(updatedNum, 9);
532 auto resultSet = transDB_->QueryByStep("select * from TEST where id > ? and id < ? order by id", { 0, 10 });
533 ASSERT_NE(resultSet, nullptr);
534 SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachment"], AssetValue::STATUS_UPDATE);
535 SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachments"], AssetValue::STATUS_INSERT);
536 size_t index = 0;
537 while (resultSet->GoToNextRow() == E_OK) {
538 RowEntity rowEntity;
539 errCode = resultSet->GetRow(rowEntity);
540 ASSERT_EQ(errCode, E_OK);
541 auto row = rowEntity.Steal();
542 row.erase("id");
543 ASSERT_TRUE(updateRow.values_ == row);
544 index++;
545 }
546 ASSERT_EQ(index, 9);
547 }
548
549 /* *
550 * @tc.name: Update_003
551 * @tc.desc: update test set(id=?,...) where id > ? and id < ?
552 * @tc.type: FUNC
553 */
554 HWTEST_F(RdbTransDBTest, Update_003, TestSize.Level1)
555 {
556 int64_t changedNum = -1;
557 std::vector<ValuesBucket> rows;
558 for (int i = 0; i < 20; i++) {
559 ValuesBucket row = row_;
560 row.Put("id", i);
561 row.Put("name", "xiaoming_" + std::to_string(i));
562 row.Put("years", BigInteger(i % 2, { 128, 225 }));
563 rows.push_back(std::move(row));
564 }
565 auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
566 ASSERT_EQ(errCode, E_OK);
567 ASSERT_EQ(changedNum, 20);
568 auto updateRow = row_;
569 updateRow.values_.erase("id");
570 updateRow.Put(
571 "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111", .path = "/data/test" }));
572 int32_t updatedNum = -1;
573 std::tie(errCode, updatedNum) = transDB_->Update(
574 TABLE_NAME, updateRow, "id > ? and id < ?", { 0, 10 }, ConflictResolution::ON_CONFLICT_ROLLBACK);
575 ASSERT_EQ(errCode, E_OK);
576 ASSERT_EQ(updatedNum, 9);
577 auto resultSet = transDB_->QueryByStep("select * from TEST where id > ? and id < ? order by id", { 0, 10 });
578 ASSERT_NE(resultSet, nullptr);
579 SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachment"], AssetValue::STATUS_UPDATE);
580 SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachments"], AssetValue::STATUS_INSERT);
581 size_t index = 0;
582 while (resultSet->GoToNextRow() == E_OK) {
583 RowEntity rowEntity;
584 errCode = resultSet->GetRow(rowEntity);
585 ASSERT_EQ(errCode, E_OK);
586 auto row = rowEntity.Steal();
587 row.erase("id");
588 ASSERT_TRUE(updateRow.values_ == row);
589 index++;
590 }
591 ASSERT_EQ(index, 9);
592 }
593
594 /* *
595 * @tc.name: Update_004
596 * @tc.desc: update test set(id=?,...)
597 * @tc.type: FUNC
598 */
599 HWTEST_F(RdbTransDBTest, Update_004, TestSize.Level1)
600 {
601 ValuesBucket row = row_;
602 int32_t changed = -1;
603 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
604 ASSERT_EQ(errCode, E_OK);
605 ASSERT_EQ(rowId, 1);
606 row.Put("name", "xiaohua");
607 row.Put(
608 "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111", .path = "/data/test" }));
609 errCode = transDB_->Update(changed, TABLE_NAME, row);
610 ASSERT_EQ(errCode, E_OK);
611 auto resultSet = transDB_->QueryByStep("select * from TEST");
612 ASSERT_NE(resultSet, nullptr);
613 errCode = resultSet->GoToNextRow();
614 ASSERT_EQ(errCode, E_OK);
615 RowEntity rowEntity;
616 errCode = resultSet->GetRow(rowEntity);
617 ASSERT_EQ(errCode, E_OK);
618 SqliteSqlBuilder::UpdateAssetStatus(row.values_["attachment"], AssetValue::STATUS_UPDATE);
619 ASSERT_TRUE(row.values_ == rowEntity.Get());
620 }
621
622 /* *
623 * @tc.name: Update_005
624 * @tc.desc: update test set(id=?,...) where id > ? and id < ?
625 * @tc.type: FUNC
626 */
627 HWTEST_F(RdbTransDBTest, Update_005, TestSize.Level1)
628 {
629 int64_t changedNum = -1;
630 std::vector<ValuesBucket> rows;
631 for (int i = 0; i < 20; i++) {
632 ValuesBucket row = row_;
633 row.Put("id", i);
634 row.Put("name", "xiaoming_" + std::to_string(i));
635 row.Put("years", BigInteger(i % 2, { 128, 225 }));
636 rows.push_back(std::move(row));
637 }
638 auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
639 ASSERT_EQ(errCode, E_OK);
640 ASSERT_EQ(changedNum, 20);
641 auto updateRow = row_;
642 updateRow.values_.erase("id");
643 updateRow.Put(
644 "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111", .path = "/data/test" }));
645 int32_t updatedNum = -1;
646 RdbPredicates rdbPredicates(TABLE_NAME);
647 rdbPredicates.GreaterThan("id", 0);
648 rdbPredicates.And();
649 rdbPredicates.LessThan("id", 10);
650 errCode = transDB_->Update(updatedNum, updateRow, rdbPredicates);
651 ASSERT_EQ(errCode, E_OK);
652 ASSERT_EQ(updatedNum, 9);
653 auto resultSet = transDB_->QueryByStep(rdbPredicates);
654 ASSERT_NE(resultSet, nullptr);
655 SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachment"], AssetValue::STATUS_UPDATE);
656 SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachments"], AssetValue::STATUS_INSERT);
657 size_t index = 0;
658 while (resultSet->GoToNextRow() == E_OK) {
659 RowEntity rowEntity;
660 errCode = resultSet->GetRow(rowEntity);
661 ASSERT_EQ(errCode, E_OK);
662 auto row = rowEntity.Steal();
663 row.erase("id");
664 ASSERT_TRUE(updateRow.values_ == row);
665 index++;
666 }
667 ASSERT_EQ(index, 9);
668 }
669
670 /* *
671 * @tc.name: UpdateWithConflictResolution_001
672 * @tc.desc: update test set(id=?,...) where id > ? and id < ?
673 * @tc.type: FUNC
674 */
675 HWTEST_F(RdbTransDBTest, UpdateWithConflictResolution_001, TestSize.Level1)
676 {
677 int64_t changedNum = -1;
678 std::vector<ValuesBucket> rows;
679 for (int i = 0; i < 20; i++) {
680 ValuesBucket row = row_;
681 row.Put("id", i);
682 row.Put("name", "xiaoming_" + std::to_string(i));
683 row.Put("years", BigInteger(i % 2, { 128, 225 }));
684 rows.push_back(std::move(row));
685 }
686 auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
687 ASSERT_EQ(errCode, E_OK);
688 ASSERT_EQ(changedNum, 20);
689 auto updateRow = row_;
690 updateRow.values_.erase("id");
691 updateRow.Put(
692 "attachment", ValueObject(AssetValue{ .id = "119", .name = "picture1", .hash = "111", .path = "/data/test" }));
693 int32_t updatedNum = -1;
694 errCode =
695 transDB_->UpdateWithConflictResolution(updatedNum, TABLE_NAME, updateRow, "id > ? and id < ?", { 0, 10 });
696 ASSERT_EQ(errCode, E_OK);
697 ASSERT_EQ(updatedNum, 9);
698 auto resultSet = transDB_->QueryByStep("select * from TEST where id > ? and id < ? order by id", { 0, 10 });
699 ASSERT_NE(resultSet, nullptr);
700 SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachment"], AssetValue::STATUS_UPDATE);
701 SqliteSqlBuilder::UpdateAssetStatus(updateRow.values_["attachments"], AssetValue::STATUS_INSERT);
702 size_t index = 0;
703 while (resultSet->GoToNextRow() == E_OK) {
704 RowEntity rowEntity;
705 errCode = resultSet->GetRow(rowEntity);
706 ASSERT_EQ(errCode, E_OK);
707 auto row = rowEntity.Steal();
708 row.erase("id");
709 ASSERT_TRUE(updateRow.values_ == row);
710 index++;
711 }
712 ASSERT_EQ(index, 9);
713 }
714
715 /* *
716 * @tc.name: Delete_001
717 * @tc.desc: delete from test where id > ? and id < ?
718 * @tc.type: FUNC
719 */
720 HWTEST_F(RdbTransDBTest, Delete_001, TestSize.Level1)
721 {
722 int64_t changedNum = -1;
723 std::vector<ValuesBucket> rows;
724 for (int i = 0; i < 20; i++) {
725 ValuesBucket row = row_;
726 row.Put("id", i);
727 row.Put("name", "xiaoming_" + std::to_string(i));
728 row.Put("years", BigInteger(i % 2, { 128, 225 }));
729 rows.push_back(std::move(row));
730 }
731 auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
732 ASSERT_EQ(errCode, E_OK);
733 ASSERT_EQ(changedNum, 20);
734 int32_t deleteNum = -1;
735 RdbPredicates rdbPredicates(TABLE_NAME);
736 rdbPredicates.GreaterThan("id", 0);
737 rdbPredicates.And();
738 rdbPredicates.LessThan("id", 10);
739 errCode = transDB_->Delete(deleteNum, rdbPredicates);
740 ASSERT_EQ(errCode, E_OK);
741 ASSERT_EQ(deleteNum, 9);
742 auto resultSet = transDB_->QueryByStep(rdbPredicates);
743 ASSERT_NE(resultSet, nullptr);
744 int32_t count = -1;
745 errCode = resultSet->GetRowCount(count);
746 ASSERT_EQ(errCode, E_OK);
747 ASSERT_EQ(count, 0);
748 }
749
750 /* *
751 * @tc.name: Delete_002
752 * @tc.desc: delete from test where id > ? and id < ?
753 * @tc.type: FUNC
754 */
755 HWTEST_F(RdbTransDBTest, Delete_002, TestSize.Level1)
756 {
757 int64_t changedNum = -1;
758 std::vector<ValuesBucket> rows;
759 for (int i = 0; i < 20; i++) {
760 ValuesBucket row = row_;
761 row.Put("id", i);
762 row.Put("name", "xiaoming_" + std::to_string(i));
763 row.Put("years", BigInteger(i % 2, { 128, 225 }));
764 rows.push_back(std::move(row));
765 }
766 auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
767 ASSERT_EQ(errCode, E_OK);
768 ASSERT_EQ(changedNum, 20);
769 int32_t deleteNum = -1;
770 errCode = transDB_->Delete(deleteNum, TABLE_NAME, "id > ? and id < ?", { 0, 10 });
771 ASSERT_EQ(errCode, E_OK);
772 ASSERT_EQ(deleteNum, 9);
773 auto resultSet = transDB_->QueryByStep("select * from TEST where id > ? and id < ? order by id", { 0, 10 });
774 ASSERT_NE(resultSet, nullptr);
775 int32_t count = -1;
776 errCode = resultSet->GetRowCount(count);
777 ASSERT_EQ(errCode, E_OK);
778 ASSERT_EQ(count, 0);
779 }
780
781 /* *
782 * @tc.name: QueryByStep_001
783 * @tc.desc: select id, name, yeas from test where id > ? and id < ? order by id asc
784 * @tc.type: FUNC
785 */
786 HWTEST_F(RdbTransDBTest, QueryByStep_001, TestSize.Level1)
787 {
788 int64_t changedNum = -1;
789 std::vector<ValuesBucket> rows;
790 for (int i = 0; i < 20; i++) {
791 ValuesBucket row = row_;
792 row.Put("id", i);
793 row.Put("name", "xiaoming_" + std::to_string(i));
794 row.Put("years", BigInteger(i % 2, { 128, 225 }));
795 rows.push_back(std::move(row));
796 }
797 auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
798 ASSERT_EQ(errCode, E_OK);
799 ASSERT_EQ(changedNum, 20);
800 RdbPredicates rdbPredicates(TABLE_NAME);
801 rdbPredicates.GreaterThan("id", 0);
802 rdbPredicates.And();
803 rdbPredicates.LessThan("id", 10);
804 rdbPredicates.OrderByAsc("id");
805 auto resultSet = transDB_->QueryByStep(rdbPredicates, { "id", "name", "years" });
806 ASSERT_NE(resultSet, nullptr);
807 int64_t index = 1;
808 while (resultSet->GoToNextRow() == E_OK) {
809 RowEntity rowEntity;
810 errCode = resultSet->GetRow(rowEntity);
811 ASSERT_EQ(errCode, E_OK);
812 auto row = rowEntity.Steal();
813 ASSERT_TRUE(row.size() == 3);
814 ASSERT_TRUE(row["id"] == ValueObject(index));
815 ASSERT_TRUE(row["name"] == ValueObject("xiaoming_" + std::to_string(index)));
816 ASSERT_TRUE(row["years"] == ValueObject(BigInteger(index % 2, { 128, 225 })));
817 index++;
818 }
819 int32_t count = -1;
820 errCode = resultSet->GetRowCount(count);
821 ASSERT_EQ(errCode, E_OK);
822 ASSERT_EQ(count, 9);
823 }
824
825 /* *
826 * @tc.name: Query_001
827 * @tc.desc: select id, name, yeas from test where id > ? and id < ? order by id asc
828 * @tc.type: FUNC
829 */
830 HWTEST_F(RdbTransDBTest, Query_001, TestSize.Level1)
831 {
832 int64_t changedNum = -1;
833 std::vector<ValuesBucket> rows;
834 for (int i = 0; i < 20; i++) {
835 ValuesBucket row = row_;
836 row.Put("id", i);
837 row.Put("name", "xiaoming_" + std::to_string(i));
838 row.Put("years", BigInteger(i % 2, { 128, 225 }));
839 rows.push_back(std::move(row));
840 }
841 auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
842 ASSERT_EQ(errCode, E_OK);
843 ASSERT_EQ(changedNum, 20);
844 RdbPredicates rdbPredicates(TABLE_NAME);
845 rdbPredicates.GreaterThan("id", 0);
846 rdbPredicates.And();
847 rdbPredicates.LessThan("id", 10);
848 rdbPredicates.OrderByAsc("id");
849 auto resultSet = transDB_->Query(rdbPredicates, { "id", "name", "years" });
850 ASSERT_NE(resultSet, nullptr);
851 int64_t index = 1;
852 while (resultSet->GoToNextRow() == E_OK) {
853 RowEntity rowEntity;
854 errCode = resultSet->GetRow(rowEntity);
855 ASSERT_EQ(errCode, E_OK);
856 auto row = rowEntity.Steal();
857 ASSERT_TRUE(row.size() == 3);
858 ASSERT_TRUE(row["id"] == ValueObject(index));
859 ASSERT_TRUE(row["name"] == ValueObject("xiaoming_" + std::to_string(index)));
860 ASSERT_TRUE(row["years"] == ValueObject(BigInteger(index % 2, { 128, 225 })));
861 index++;
862 }
863 int32_t count = -1;
864 errCode = resultSet->GetRowCount(count);
865 ASSERT_EQ(errCode, E_OK);
866 ASSERT_EQ(count, 9);
867 }
868
869 /* *
870 * @tc.name: QuerySql_001
871 * @tc.desc: select * from test where id > ? and id < ? order by id asc
872 * @tc.type: FUNC
873 */
874 HWTEST_F(RdbTransDBTest, QuerySql_001, TestSize.Level1)
875 {
876 int64_t changedNum = -1;
877 std::vector<ValuesBucket> rows;
878 for (int i = 0; i < 20; i++) {
879 ValuesBucket row = row_;
880 row.Put("id", i);
881 row.Put("name", "xiaoming_" + std::to_string(i));
882 row.Put("years", BigInteger(i % 2, { 128, 225 }));
883 rows.push_back(std::move(row));
884 }
885 auto errCode = transDB_->BatchInsert(changedNum, TABLE_NAME, rows);
886 ASSERT_EQ(errCode, E_OK);
887 ASSERT_EQ(changedNum, 20);
888 auto resultSet = transDB_->QuerySql("select * from TEST where id > ? and id < ? order by id", { 0, 10 });
889 ASSERT_NE(resultSet, nullptr);
890 int64_t index = 1;
891 while (resultSet->GoToNextRow() == E_OK) {
892 RowEntity rowEntity;
893 errCode = resultSet->GetRow(rowEntity);
894 ASSERT_EQ(errCode, E_OK);
895 auto row = rowEntity.Steal();
896 ASSERT_TRUE(row["id"] == ValueObject(index));
897 ASSERT_TRUE(row["name"] == ValueObject("xiaoming_" + std::to_string(index)));
898 ASSERT_TRUE(row["years"] == ValueObject(BigInteger(index % 2, { 128, 225 })));
899 index++;
900 }
901 int32_t count = -1;
902 errCode = resultSet->GetRowCount(count);
903 ASSERT_EQ(errCode, E_OK);
904 ASSERT_EQ(count, 9);
905 }
906
907 /* *
908 * @tc.name: Execute_001
909 * @tc.desc: PRAGMA user_version
910 * @tc.type: FUNC
911 */
912 HWTEST_F(RdbTransDBTest, Execute_PRAGMA_001, TestSize.Level1)
913 {
914 auto [errCode, value] = transDB_->Execute("PRAGMA user_version=100");
915 ASSERT_EQ(errCode, E_OK);
916 std::tie(errCode, value) = transDB_->Execute("PRAGMA user_version");
917 ASSERT_EQ(errCode, E_OK);
918 ASSERT_TRUE(value == ValueObject(100));
919 }
920
921 /* *
922 * @tc.name: Execute_DDL_001
923 * @tc.desc: PRAGMA user_version
924 * @tc.type: FUNC
925 */
926 HWTEST_F(RdbTransDBTest, Execute_DDL_001, TestSize.Level1)
927 {
928 auto [errCode, value] = transDB_->Execute("PRAGMA schema_version");
929 ASSERT_EQ(errCode, E_OK);
930 ASSERT_NE(value, ValueObject());
931 auto oldVer = value;
932 std::tie(errCode, value) = transDB_->Execute("CREATE TABLE IF NOT EXISTS TEST1 (id INT PRIMARY KEY, name TEXT)");
933 ASSERT_EQ(errCode, E_OK);
934 ASSERT_TRUE(value == ValueObject());
935 std::tie(errCode, value) = transDB_->Execute("DROP TABLE IF EXISTS TEST1");
936 ASSERT_EQ(errCode, E_OK);
937 ASSERT_TRUE(value == ValueObject());
938 std::tie(errCode, value) = transDB_->Execute("PRAGMA schema_version");
939 ASSERT_EQ(errCode, E_OK);
940 ASSERT_FALSE(value == ValueObject());
941 ASSERT_FALSE(value == oldVer);
942 }
943
944 /* *
945 * @tc.name: Execute_Insert_001
946 * @tc.desc: INSERT INTO TEST(id, name) VALUES(?,?)
947 * @tc.type: FUNC
948 */
949 HWTEST_F(RdbTransDBTest, Execute_Insert_001, TestSize.Level1)
950 {
951 auto [errCode, value] = transDB_->Execute("INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
952 ASSERT_EQ(errCode, E_OK);
953 ASSERT_EQ(value, ValueObject(1));
954 auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
955 ASSERT_NE(resultSet, nullptr);
956 errCode = resultSet->GoToNextRow();
957 ASSERT_EQ(errCode, E_OK);
958 RowEntity rowEntity;
959 errCode = resultSet->GetRow(rowEntity);
960 ASSERT_EQ(errCode, E_OK);
961 auto row = rowEntity.Steal();
962 ASSERT_TRUE(row["id"] == ValueObject(100));
963 ASSERT_TRUE(row["name"] == ValueObject("xiaohong"));
964 ASSERT_TRUE(row["years"] == ValueObject());
965 int32_t count = -1;
966 errCode = resultSet->GetRowCount(count);
967 ASSERT_EQ(errCode, E_OK);
968 ASSERT_EQ(count, 1);
969 }
970
971 /* *
972 * @tc.name: Execute_Insert_002
973 * @tc.desc: INSERT OR IGNORE INTO TEST(id, name) VALUES(?,?)
974 * @tc.type: FUNC
975 */
976 HWTEST_F(RdbTransDBTest, Execute_Insert_002, TestSize.Level1)
977 {
978 auto [errCode, value] = transDB_->Execute("INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
979 ASSERT_EQ(errCode, E_OK);
980 ASSERT_EQ(value, ValueObject(1));
981 std::tie(errCode, value) =
982 transDB_->Execute("INSERT OR IGNORE INTO TEST(id, name) VALUES (?,?)", { 100, "xiaoming" });
983 ASSERT_EQ(errCode, E_OK);
984 ASSERT_EQ(value, ValueObject(-1));
985 auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
986 ASSERT_NE(resultSet, nullptr);
987 errCode = resultSet->GoToNextRow();
988 ASSERT_EQ(errCode, E_OK);
989 RowEntity rowEntity;
990 errCode = resultSet->GetRow(rowEntity);
991 ASSERT_EQ(errCode, E_OK);
992 auto row = rowEntity.Steal();
993 ASSERT_TRUE(row["id"] == ValueObject(100));
994 ASSERT_TRUE(row["name"] == ValueObject("xiaohong"));
995 int32_t count = -1;
996 errCode = resultSet->GetRowCount(count);
997 ASSERT_EQ(errCode, E_OK);
998 ASSERT_EQ(count, 1);
999 }
1000
1001 /* *
1002 * @tc.name: Execute_Update_001
1003 * @tc.desc: UPDATE TEST SET id=?, name=?
1004 * @tc.type: FUNC
1005 */
1006 HWTEST_F(RdbTransDBTest, Execute_Update_001, TestSize.Level1)
1007 {
1008 auto [errCode, value] = transDB_->Execute("INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
1009 ASSERT_EQ(errCode, E_OK);
1010 ASSERT_EQ(value, ValueObject(1));
1011 std::tie(errCode, value) = transDB_->Execute("UPDATE TEST SET id=?, name=?", { 100, "xiaoming" });
1012 ASSERT_EQ(errCode, E_OK);
1013 ASSERT_EQ(value, ValueObject(1));
1014 auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1015 ASSERT_NE(resultSet, nullptr);
1016 errCode = resultSet->GoToNextRow();
1017 ASSERT_EQ(errCode, E_OK);
1018 RowEntity rowEntity;
1019 errCode = resultSet->GetRow(rowEntity);
1020 ASSERT_EQ(errCode, E_OK);
1021 auto row = rowEntity.Steal();
1022 ASSERT_TRUE(row["id"] == ValueObject(100));
1023 ASSERT_TRUE(row["name"] == ValueObject("xiaoming"));
1024 int32_t count = -1;
1025 errCode = resultSet->GetRowCount(count);
1026 ASSERT_EQ(errCode, E_OK);
1027 ASSERT_EQ(count, 1);
1028 }
1029
1030 /* *
1031 * @tc.name: Execute_Transaction_001
1032 * @tc.desc: UPDATE TEST SET(id=?, name=?)
1033 * @tc.type: FUNC
1034 */
1035 HWTEST_F(RdbTransDBTest, Execute_Transaction_001, TestSize.Level1)
1036 {
1037 auto [errCode, value] = transDB_->Execute("BEGIN");
1038 ASSERT_EQ(errCode, E_OK);
1039 ASSERT_TRUE(value == ValueObject());
1040 std::tie(errCode, value) = transDB_->Execute("INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
1041 ASSERT_EQ(errCode, E_OK);
1042 ASSERT_TRUE(value == ValueObject(1));
1043 auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1044 ASSERT_NE(resultSet, nullptr);
1045 int32_t count = -1;
1046 errCode = resultSet->GetRowCount(count);
1047 ASSERT_EQ(errCode, E_OK);
1048 ASSERT_EQ(count, 1);
1049 std::tie(errCode, value) = transDB_->Execute("ROLLBACK");
1050 ASSERT_EQ(errCode, E_OK);
1051 resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1052 ASSERT_NE(resultSet, nullptr);
1053 count = -1;
1054 errCode = resultSet->GetRowCount(count);
1055 ASSERT_EQ(errCode, E_OK);
1056 ASSERT_EQ(count, 0);
1057 }
1058
1059 /* *
1060 * @tc.name: Execute_Transaction_002
1061 * @tc.desc: BEGIN, COMMIT, ROLLBACK
1062 * @tc.type: FUNC
1063 */
1064 HWTEST_F(RdbTransDBTest, Execute_Transaction_002, TestSize.Level1)
1065 {
1066 auto [errCode, value] = transDB_->Execute("BEGIN");
1067 ASSERT_EQ(errCode, E_OK);
1068 ASSERT_TRUE(value == ValueObject());
1069 std::tie(errCode, value) = transDB_->Execute("INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
1070 ASSERT_EQ(errCode, E_OK);
1071 ASSERT_TRUE(value == ValueObject(1));
1072 std::tie(errCode, value) = transDB_->Execute("COMMIT");
1073 auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1074 ASSERT_NE(resultSet, nullptr);
1075 int32_t count = -1;
1076 errCode = resultSet->GetRowCount(count);
1077 ASSERT_EQ(errCode, E_OK);
1078 ASSERT_EQ(count, 1);
1079 std::tie(errCode, value) = transDB_->Execute("ROLLBACK");
1080 resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1081 ASSERT_NE(resultSet, nullptr);
1082 count = -1;
1083 errCode = resultSet->GetRowCount(count);
1084 ASSERT_EQ(errCode, E_OK);
1085 ASSERT_EQ(count, 1);
1086 }
1087
1088 /* *
1089 * @tc.name: Execute_INVALID_001
1090 * @tc.desc: attach detach select and etc.
1091 * @tc.type: FUNC
1092 */
1093 HWTEST_F(RdbTransDBTest, Execute_INVALID_001, TestSize.Level1)
1094 {
1095 auto [errCode, value] = transDB_->Execute(" ATTACH DATABASE ? AS ? ", { "/data/test/a.db", "a" });
1096 ASSERT_EQ(errCode, E_INVALID_ARGS);
1097 std::tie(errCode, value) = transDB_->Execute(" DETACH DATABASE ?", { "/data/test/a.db" });
1098 ASSERT_EQ(errCode, E_INVALID_ARGS);
1099 std::tie(errCode, value) = transDB_->Execute(" select * from TEST where id == ?", RdbStore::Values{ 100 });
1100 ASSERT_EQ(errCode, E_INVALID_ARGS);
1101 }
1102
1103 /* *
1104 * @tc.name: QueryByStep_ThreadSafe_001
1105 * @tc.desc: multi-thread use resultSet and closed etc.
1106 * @tc.type: FUNC
1107 */
1108 HWTEST_F(RdbTransDBTest, QueryByStep_ThreadSafe_001, TestSize.Level1)
1109 {
1110 ValuesBucket row = row_;
1111 auto [errCode, rowId] = transDB_->Insert(TABLE_NAME, row);
1112 ASSERT_EQ(errCode, E_OK);
1113 ASSERT_EQ(rowId, 1);
1114 auto resultSet = transDB_->QueryByStep("select * from TEST");
1115 ASSERT_NE(resultSet, nullptr);
1116 errCode = resultSet->GoToNextRow();
1117 ASSERT_EQ(errCode, E_OK);
1118 std::shared_ptr<std::thread> threads[4];
1119 for (int i = 0; i < 4; ++i) {
__anon18d5abb60102() 1120 threads[i] = std::make_shared<std::thread>([resultSet]() {
1121 RowEntity rowEntity;
1122 while (resultSet->GetRow(rowEntity) != E_ALREADY_CLOSED) {
1123 };
1124 });
1125 }
1126 usleep(200);
1127 resultSet->Close();
1128 for (int i = 0; i < 4; ++i) {
1129 if (threads[i] == nullptr) {
1130 continue;
1131 }
1132 threads[i]->join();
1133 threads[i] = nullptr;
1134 }
1135 }
1136
1137 /* *
1138 * @tc.name: ExecuteForLastInsertRowId_001
1139 * @tc.desc: INSERT OR IGNORE INTO TEST(id, name) VALUES(?,?)
1140 * @tc.type: FUNC
1141 */
1142 HWTEST_F(RdbTransDBTest, ExecuteForLastInsertRowId_001, TestSize.Level1)
1143 {
1144 int64_t rowId = 0;
1145 auto errCode =
1146 transDB_->ExecuteForLastInsertedRowId(rowId, "INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
1147 ASSERT_EQ(errCode, E_OK);
1148 ASSERT_EQ(rowId, 1);
1149 errCode = transDB_->ExecuteForLastInsertedRowId(
1150 rowId, "INSERT OR IGNORE INTO TEST(id, name) VALUES (?,?)", { 100, "xiaoming" });
1151 ASSERT_EQ(errCode, E_OK);
1152 ASSERT_EQ(rowId, -1);
1153 auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1154 ASSERT_NE(resultSet, nullptr);
1155 errCode = resultSet->GoToNextRow();
1156 ASSERT_EQ(errCode, E_OK);
1157 RowEntity rowEntity;
1158 errCode = resultSet->GetRow(rowEntity);
1159 ASSERT_EQ(errCode, E_OK);
1160 auto row = rowEntity.Steal();
1161 ASSERT_TRUE(row["id"] == ValueObject(100));
1162 ASSERT_TRUE(row["name"] == ValueObject("xiaohong"));
1163 int32_t count = -1;
1164 errCode = resultSet->GetRowCount(count);
1165 ASSERT_EQ(errCode, E_OK);
1166 ASSERT_EQ(count, 1);
1167 }
1168
1169 /* *
1170 * @tc.name: ExecuteForChangedRowCount_001
1171 * @tc.desc: UPDATE TEST SET id=?, name=?
1172 * @tc.type: FUNC
1173 */
1174 HWTEST_F(RdbTransDBTest, ExecuteForChangedRowCount_001, TestSize.Level1)
1175 {
1176 auto [errCode, value] = transDB_->Execute("INSERT INTO TEST(id, name) VALUES (?,?)", { 100, "xiaohong" });
1177 ASSERT_EQ(errCode, E_OK);
1178 ASSERT_EQ(value, ValueObject(1));
1179 int64_t changedRow = 0;
1180 errCode = transDB_->ExecuteForChangedRowCount(changedRow, "UPDATE TEST SET id=?, name=?", { 100, "xiaoming" });
1181 ASSERT_EQ(errCode, E_OK);
1182 ASSERT_EQ(changedRow, 1);
1183 auto resultSet = transDB_->QueryByStep("select * from TEST where id == ?", RdbStore::Values{ 100 });
1184 ASSERT_NE(resultSet, nullptr);
1185 errCode = resultSet->GoToNextRow();
1186 ASSERT_EQ(errCode, E_OK);
1187 RowEntity rowEntity;
1188 errCode = resultSet->GetRow(rowEntity);
1189 ASSERT_EQ(errCode, E_OK);
1190 auto row = rowEntity.Steal();
1191 ASSERT_TRUE(row["id"] == ValueObject(100));
1192 ASSERT_TRUE(row["name"] == ValueObject("xiaoming"));
1193 int32_t count = -1;
1194 errCode = resultSet->GetRowCount(count);
1195 ASSERT_EQ(errCode, E_OK);
1196 ASSERT_EQ(count, 1);
1197 }
1198 } // namespace Test
1199