1 /*
2 * Copyright (c) 2021 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 "shared_block_serializer_info.h"
17
18 #include "logger.h"
19 #include "value_object.h"
20
21 namespace OHOS {
22 namespace NativeRdb {
23 using namespace OHOS::Rdb;
24
SharedBlockSerializerInfo(AppDataFwk::SharedBlock * sharedBlock,sqlite3_stmt * stat,int numColumns,int startPos)25 SharedBlockSerializerInfo::SharedBlockSerializerInfo(AppDataFwk::SharedBlock *sharedBlock, sqlite3_stmt *stat,
26 int numColumns, int startPos)
27 : sharedBlock_(sharedBlock), statement_(stat), anumColumns(numColumns), atotalRows(0), astartPos(startPos),
28 raddedRows(0)
29 {
30 }
31
~SharedBlockSerializerInfo()32 SharedBlockSerializerInfo::~SharedBlockSerializerInfo() {}
33
AddRow(int addedRows)34 int SharedBlockSerializerInfo::AddRow(int addedRows)
35 {
36 // Allocate a new field directory for the row.
37 int status = sharedBlock_->AllocRow();
38 if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
39 raddedRows = addedRows + 1;
40 return SQLITE_OK;
41 }
42 return SQLITE_FULL;
43 }
44
Reset(int startPos)45 int SharedBlockSerializerInfo::Reset(int startPos)
46 {
47 int status = sharedBlock_->Clear();
48 if (status != AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
49 LOG_ERROR("reset : Failed in clearing, error=%{public}d", status);
50 return SQLITE_ERROR;
51 }
52 status = sharedBlock_->SetColumnNum(anumColumns);
53 if (status != AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
54 return SQLITE_ERROR;
55 }
56 astartPos = startPos;
57 raddedRows = 0;
58 return SQLITE_OK;
59 }
60
Finish(int addedRows,int totalRows)61 int SharedBlockSerializerInfo::Finish(int addedRows, int totalRows)
62 {
63 raddedRows = addedRows;
64 atotalRows = totalRows;
65 return SQLITE_OK;
66 }
67
PutLong(int row,int column,sqlite3_int64 value)68 int SharedBlockSerializerInfo::PutLong(int row, int column, sqlite3_int64 value)
69 {
70 int status = sharedBlock_->PutLong(row, column, value);
71 if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
72 return SQLITE_OK;
73 }
74 sharedBlock_->FreeLastRow();
75 return SQLITE_FULL;
76 }
77
PutDouble(int row,int column,double value)78 int SharedBlockSerializerInfo::PutDouble(int row, int column, double value)
79 {
80 int status = sharedBlock_->PutDouble(row, column, value);
81 if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
82 return SQLITE_OK;
83 }
84 sharedBlock_->FreeLastRow();
85 return SQLITE_FULL;
86 }
87
PutBlob(int row,int column,const void * blob,int len)88 int SharedBlockSerializerInfo::PutBlob(int row, int column, const void *blob, int len)
89 {
90 auto action = &AppDataFwk::SharedBlock::PutBlob;
91 auto *declType = sqlite3_column_decltype(statement_, column);
92 if (declType != nullptr) {
93 std::string type(declType);
94 std::transform(type.begin(), type.end(), type.begin(), [](auto ch) { return std::toupper(ch); });
95 action = (type == ValueObject::DeclType<ValueObject::Asset>()) ? &AppDataFwk::SharedBlock::PutAsset
96 : (type == ValueObject::DeclType<ValueObject::Assets>()) ? &AppDataFwk::SharedBlock::PutAssets
97 : &AppDataFwk::SharedBlock::PutBlob;
98 }
99
100 int status = (sharedBlock_->*action)(row, column, blob, len);
101 if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
102 return SQLITE_OK;
103 }
104 sharedBlock_->FreeLastRow();
105 return SQLITE_FULL;
106 }
107
PutNull(int row,int column)108 int SharedBlockSerializerInfo::PutNull(int row, int column)
109 {
110 int status = sharedBlock_->PutNull(row, column);
111 if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
112 return SQLITE_OK;
113 }
114 sharedBlock_->FreeLastRow();
115 LOG_ERROR("Failed allocating space for a null in column %{public}d, error=%{public}d", column, status);
116 return SQLITE_FULL;
117 }
118
PutOther(int row,int column)119 int SharedBlockSerializerInfo::PutOther(int row, int column)
120 {
121 sharedBlock_->FreeLastRow();
122 return SQLITE_ERROR;
123 }
124 } // namespace NativeRdb
125 } // namespace OHOS