1 /*
2 * Copyright (c) 2021-2022 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 "statement.h"
17
18 #include "account_log_wrapper.h"
19
20 namespace OHOS {
21 namespace AccountSA {
Statement(sqlite3 * db,const std::string & sql)22 Statement::Statement(sqlite3* db, const std::string& sql) : db_(db), sql_(sql)
23 {
24 if (sqlite3_prepare_v2(db, sql.c_str(), sql.size(), &statement_, nullptr) != SQLITE_OK) {
25 ACCOUNT_LOGE("Cannot prepare, errorMsg: %{public}s", sqlite3_errmsg(db_));
26 }
27 }
28
~Statement()29 Statement::~Statement()
30 {
31 sqlite3_finalize(statement_);
32 statement_ = nullptr;
33 }
34
Bind(const int32_t index,const std::string & text)35 void Statement::Bind(const int32_t index, const std::string& text)
36 {
37 if (sqlite3_bind_text(statement_, index, text.c_str(), text.size(), SQLITE_TRANSIENT) != SQLITE_OK) {
38 ACCOUNT_LOGE("Cannot bind string, errorMsg: %{public}s", sqlite3_errmsg(db_));
39 }
40 }
41
Bind(const int32_t index,int32_t value)42 void Statement::Bind(const int32_t index, int32_t value)
43 {
44 if (sqlite3_bind_int(statement_, index, value) != SQLITE_OK) {
45 ACCOUNT_LOGE("Cannot bind int32_t, errorMsg: %{public}s", sqlite3_errmsg(db_));
46 }
47 }
48
Bind(const int32_t index,int64_t value)49 void Statement::Bind(const int32_t index, int64_t value)
50 {
51 if (sqlite3_bind_int64(statement_, index, value) != SQLITE_OK) {
52 ACCOUNT_LOGE("Cannot bind int64_t, errorMsg: %{public}s", sqlite3_errmsg(db_));
53 }
54 }
55
GetColumnInt(const int32_t column) const56 int32_t Statement::GetColumnInt(const int32_t column) const
57 {
58 return sqlite3_column_int(statement_, column);
59 }
60
GetColumnInt64(const int32_t column) const61 int64_t Statement::GetColumnInt64(const int32_t column) const
62 {
63 return sqlite3_column_int64(statement_, column);
64 }
65
GetColumnString(const int32_t column) const66 std::string Statement::GetColumnString(const int32_t column) const
67 {
68 return std::string(reinterpret_cast<const char*>(sqlite3_column_text(statement_, column)));
69 }
70
GetColumnName(const int32_t column) const71 std::string Statement::GetColumnName(const int32_t column) const
72 {
73 return sqlite3_column_name(statement_, column);
74 }
75
Step()76 Statement::State Statement::Step()
77 {
78 int32_t ret = sqlite3_step(statement_);
79 switch (ret) {
80 case SQLITE_ROW:
81 return Statement::State::ROW;
82 case SQLITE_DONE:
83 return Statement::State::DONE;
84 case SQLITE_BUSY:
85 return Statement::State::BUSY;
86 case SQLITE_MISUSE:
87 return Statement::State::MISUSE;
88 default:
89 return Statement::State::UNKNOWN;
90 }
91 }
92
GetParameterIndex(const std::string & name) const93 int32_t Statement::GetParameterIndex(const std::string& name) const
94 {
95 return sqlite3_bind_parameter_index(statement_, name.c_str());
96 }
97
Bind(const std::string & tableColumnName,const VariantValue & value)98 void Statement::Bind(const std::string& tableColumnName, const VariantValue& value)
99 {
100 int32_t index = GetParameterIndex(":" + tableColumnName);
101 if (value.GetType() == ValueType::TYPE_STRING) {
102 Bind(index, value.GetString());
103 } else if (value.GetType() == ValueType::TYPE_INT) {
104 Bind(index, value.GetInt());
105 } else if (value.GetType() == ValueType::TYPE_INT64) {
106 Bind(index, value.GetInt64());
107 }
108 }
109
Reset()110 int32_t Statement::Reset()
111 {
112 return sqlite3_reset(statement_);
113 }
114
GetColumnCount() const115 int32_t Statement::GetColumnCount() const
116 {
117 return sqlite3_column_count(statement_);
118 }
119
GetValue(const int32_t column,const bool flagInt64) const120 VariantValue Statement::GetValue(const int32_t column, const bool flagInt64) const
121 {
122 int32_t type = sqlite3_column_type(statement_, column);
123 switch (type) {
124 case SQLITE_INTEGER:
125 if (flagInt64) {
126 return VariantValue(GetColumnInt64(column));
127 } else {
128 return VariantValue(GetColumnInt(column));
129 }
130 case SQLITE_TEXT:
131 return VariantValue(GetColumnString(column));
132 default:
133 return VariantValue();
134 }
135 }
136 } // namespace AccountSA
137 } // namespace OHOS
138