• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #define LOG_TAG "SharedBlockSerializerInfo"
16 #include "shared_block_serializer_info.h"
17 
18 #include "logger.h"
19 #include "sqlite_utils.h"
20 #include "string_utils.h"
21 #include "value_object.h"
22 
23 namespace OHOS {
24 namespace NativeRdb {
25 using namespace OHOS::Rdb;
26 
SharedBlockSerializerInfo(AppDataFwk::SharedBlock * sharedBlock,sqlite3_stmt * stat,int numColumns,int startPos)27 SharedBlockSerializerInfo::SharedBlockSerializerInfo(
28     AppDataFwk::SharedBlock *sharedBlock, sqlite3_stmt *stat, int numColumns, int startPos)
29     : sharedBlock_(sharedBlock), statement_(stat), anumColumns(numColumns), atotalRows(0), astartPos(startPos),
30       raddedRows(0)
31 {
32 }
33 
~SharedBlockSerializerInfo()34 SharedBlockSerializerInfo::~SharedBlockSerializerInfo() {}
35 
AddRow(int addedRows)36 int SharedBlockSerializerInfo::AddRow(int addedRows)
37 {
38     // Allocate a new field directory for the row.
39     int status = sharedBlock_->AllocRow();
40     if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
41         raddedRows = addedRows + 1;
42         return SQLITE_OK;
43     }
44     if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_NO_MEMORY) {
45         isFull = true;
46     }
47     return SQLITE_FULL;
48 }
49 
Reset(int startPos)50 int SharedBlockSerializerInfo::Reset(int startPos)
51 {
52     int status = sharedBlock_->Clear();
53     if (status != AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
54         LOG_ERROR("SharedBlockSerializerInfo::Reset() Failed in Clear(), error=%{public}d.", status);
55         return SQLITE_ERROR;
56     }
57     status = sharedBlock_->SetColumnNum(anumColumns);
58     if (status != AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
59         LOG_ERROR("SharedBlockSerializerInfo::Reset() Failed in SetColumnNum(), error=%{public}d.", status);
60         return SQLITE_ERROR;
61     }
62     astartPos = startPos;
63     raddedRows = 0;
64     isFull = false;
65     return SQLITE_OK;
66 }
67 
Finish(int addedRows,int totalRows)68 int SharedBlockSerializerInfo::Finish(int addedRows, int totalRows)
69 {
70     raddedRows = addedRows;
71     atotalRows = totalRows;
72     return SQLITE_OK;
73 }
74 
PutLong(int row,int column,sqlite3_int64 value)75 int SharedBlockSerializerInfo::PutLong(int row, int column, sqlite3_int64 value)
76 {
77     int status = sharedBlock_->PutLong(row, column, value);
78     if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
79         return SQLITE_OK;
80     }
81     if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_NO_MEMORY) {
82         isFull = true;
83     }
84     sharedBlock_->FreeLastRow();
85     return SQLITE_FULL;
86 }
87 
PutDouble(int row,int column,double value)88 int SharedBlockSerializerInfo::PutDouble(int row, int column, double value)
89 {
90     int status = sharedBlock_->PutDouble(row, column, value);
91     if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
92         return SQLITE_OK;
93     }
94     if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_NO_MEMORY) {
95         isFull = true;
96     }
97     sharedBlock_->FreeLastRow();
98     return SQLITE_FULL;
99 }
100 
PutBlob(int row,int column,const void * blob,int len)101 int SharedBlockSerializerInfo::PutBlob(int row, int column, const void *blob, int len)
102 {
103     auto action = &AppDataFwk::SharedBlock::PutBlob;
104     auto *declType = sqlite3_column_decltype(statement_, column);
105     if (declType != nullptr) {
106         auto type = StringUtils::TruncateAfterFirstParen(SqliteUtils::StrToUpper(declType));
107         action = (type == ValueObject::DeclType<ValueObject::Asset>())         ? &AppDataFwk::SharedBlock::PutAsset
108                  : (type == ValueObject::DeclType<ValueObject::Assets>())      ? &AppDataFwk::SharedBlock::PutAssets
109                  : (type == ValueObject::DeclType<ValueObject::FloatVector>()) ? &AppDataFwk::SharedBlock::PutFloats
110                  : (type == ValueObject::DeclType<ValueObject::BigInt>())      ? &AppDataFwk::SharedBlock::PutBigInt
111                                                                                : &AppDataFwk::SharedBlock::PutBlob;
112     }
113 
114     int status = (sharedBlock_->*action)(row, column, blob, len);
115     if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
116         return SQLITE_OK;
117     }
118     if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_NO_MEMORY) {
119         isFull = true;
120     }
121     sharedBlock_->FreeLastRow();
122     return SQLITE_FULL;
123 }
124 
PutNull(int row,int column)125 int SharedBlockSerializerInfo::PutNull(int row, int column)
126 {
127     int status = sharedBlock_->PutNull(row, column);
128     if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_OK) {
129         return SQLITE_OK;
130     }
131     if (status == AppDataFwk::SharedBlock::SHARED_BLOCK_NO_MEMORY) {
132         isFull = true;
133     }
134     sharedBlock_->FreeLastRow();
135     LOG_ERROR("Failed allocating space for a null in column %{public}d, error=%{public}d", column, status);
136     return SQLITE_FULL;
137 }
138 
PutOther(int row,int column)139 int SharedBlockSerializerInfo::PutOther(int row, int column)
140 {
141     sharedBlock_->FreeLastRow();
142     return SQLITE_ERROR;
143 }
144 } // namespace NativeRdb
145 } // namespace OHOS