• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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