14faa1673Sopenharmony_ci/* 24faa1673Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 34faa1673Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44faa1673Sopenharmony_ci * you may not use this file except in compliance with the License. 54faa1673Sopenharmony_ci * You may obtain a copy of the License at 64faa1673Sopenharmony_ci * 74faa1673Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84faa1673Sopenharmony_ci * 94faa1673Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104faa1673Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114faa1673Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124faa1673Sopenharmony_ci * See the License for the specific language governing permissions and 134faa1673Sopenharmony_ci * limitations under the License. 144faa1673Sopenharmony_ci */ 154faa1673Sopenharmony_ci 164faa1673Sopenharmony_ci#include "statement.h" 174faa1673Sopenharmony_ci#include "sandbox_manager_log.h" 184faa1673Sopenharmony_ci 194faa1673Sopenharmony_cinamespace OHOS { 204faa1673Sopenharmony_cinamespace AccessControl { 214faa1673Sopenharmony_cinamespace SandboxManager { 224faa1673Sopenharmony_cinamespace { 234faa1673Sopenharmony_cistatic constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, ACCESSCONTROL_DOMAIN_SANDBOXMANAGER, "Statement"}; 244faa1673Sopenharmony_ci} 254faa1673Sopenharmony_ci 264faa1673Sopenharmony_ciStatement::Statement(sqlite3* db, const std::string &sql) : db_(db), sql_(sql) 274faa1673Sopenharmony_ci{ 284faa1673Sopenharmony_ci if (sqlite3_prepare_v2(db, sql.c_str(), sql.size(), &statement_, nullptr) != SQLITE_OK) { 294faa1673Sopenharmony_ci SANDBOXMANAGER_LOG_ERROR(LABEL, "Cannot prepare, errorMsg: %{public}s", sqlite3_errmsg(db_)); 304faa1673Sopenharmony_ci } 314faa1673Sopenharmony_ci} 324faa1673Sopenharmony_ci 334faa1673Sopenharmony_ciStatement::~Statement() 344faa1673Sopenharmony_ci{ 354faa1673Sopenharmony_ci sqlite3_finalize(statement_); 364faa1673Sopenharmony_ci statement_ = nullptr; 374faa1673Sopenharmony_ci} 384faa1673Sopenharmony_ci 394faa1673Sopenharmony_civoid Statement::Bind(const int32_t index, const std::string &text) 404faa1673Sopenharmony_ci{ 414faa1673Sopenharmony_ci if (index < 0) { 424faa1673Sopenharmony_ci SANDBOXMANAGER_LOG_ERROR(LABEL, "input index < 0"); 434faa1673Sopenharmony_ci return; 444faa1673Sopenharmony_ci } 454faa1673Sopenharmony_ci 464faa1673Sopenharmony_ci if (sqlite3_bind_text(statement_, index, text.c_str(), text.size(), SQLITE_TRANSIENT) != SQLITE_OK) { 474faa1673Sopenharmony_ci SANDBOXMANAGER_LOG_ERROR(LABEL, "Cannot bind string, errorMsg: %{public}s", sqlite3_errmsg(db_)); 484faa1673Sopenharmony_ci } 494faa1673Sopenharmony_ci} 504faa1673Sopenharmony_ci 514faa1673Sopenharmony_civoid Statement::Bind(const int32_t index, int32_t value) 524faa1673Sopenharmony_ci{ 534faa1673Sopenharmony_ci if (index < 0) { 544faa1673Sopenharmony_ci SANDBOXMANAGER_LOG_ERROR(LABEL, "input index < 0"); 554faa1673Sopenharmony_ci return; 564faa1673Sopenharmony_ci } 574faa1673Sopenharmony_ci 584faa1673Sopenharmony_ci if (sqlite3_bind_int(statement_, index, value) != SQLITE_OK) { 594faa1673Sopenharmony_ci SANDBOXMANAGER_LOG_ERROR(LABEL, "Cannot bind int32_t, errorMsg: %{public}s", sqlite3_errmsg(db_)); 604faa1673Sopenharmony_ci } 614faa1673Sopenharmony_ci} 624faa1673Sopenharmony_ci 634faa1673Sopenharmony_civoid Statement::Bind(const int32_t index, int64_t value) 644faa1673Sopenharmony_ci{ 654faa1673Sopenharmony_ci if (index < 0) { 664faa1673Sopenharmony_ci SANDBOXMANAGER_LOG_ERROR(LABEL, "input index < 0"); 674faa1673Sopenharmony_ci return; 684faa1673Sopenharmony_ci } 694faa1673Sopenharmony_ci 704faa1673Sopenharmony_ci if (sqlite3_bind_int64(statement_, index, value) != SQLITE_OK) { 714faa1673Sopenharmony_ci SANDBOXMANAGER_LOG_ERROR(LABEL, "Cannot bind int64_t, errorMsg: %{public}s", sqlite3_errmsg(db_)); 724faa1673Sopenharmony_ci } 734faa1673Sopenharmony_ci} 744faa1673Sopenharmony_ci 754faa1673Sopenharmony_ciint32_t Statement::GetColumnInt(const int32_t column) const 764faa1673Sopenharmony_ci{ 774faa1673Sopenharmony_ci return sqlite3_column_int(statement_, column); 784faa1673Sopenharmony_ci} 794faa1673Sopenharmony_ci 804faa1673Sopenharmony_ciint64_t Statement::GetColumnInt64(const int32_t column) const 814faa1673Sopenharmony_ci{ 824faa1673Sopenharmony_ci return sqlite3_column_int64(statement_, column); 834faa1673Sopenharmony_ci} 844faa1673Sopenharmony_ci 854faa1673Sopenharmony_cistd::string Statement::GetColumnString(const int32_t column) const 864faa1673Sopenharmony_ci{ 874faa1673Sopenharmony_ci return std::string(reinterpret_cast<const char*>(sqlite3_column_text(statement_, column))); 884faa1673Sopenharmony_ci} 894faa1673Sopenharmony_ci 904faa1673Sopenharmony_cistd::string Statement::GetColumnName(const int32_t column) const 914faa1673Sopenharmony_ci{ 924faa1673Sopenharmony_ci return sqlite3_column_name(statement_, column); 934faa1673Sopenharmony_ci} 944faa1673Sopenharmony_ci 954faa1673Sopenharmony_ciStatement::State Statement::Step() 964faa1673Sopenharmony_ci{ 974faa1673Sopenharmony_ci int32_t ret = sqlite3_step(statement_); 984faa1673Sopenharmony_ci switch (ret) { 994faa1673Sopenharmony_ci case SQLITE_ROW: 1004faa1673Sopenharmony_ci return Statement::State::ROW; 1014faa1673Sopenharmony_ci case SQLITE_DONE: 1024faa1673Sopenharmony_ci return Statement::State::DONE; 1034faa1673Sopenharmony_ci case SQLITE_BUSY: 1044faa1673Sopenharmony_ci return Statement::State::BUSY; 1054faa1673Sopenharmony_ci case SQLITE_MISUSE: 1064faa1673Sopenharmony_ci return Statement::State::MISUSE; 1074faa1673Sopenharmony_ci default: 1084faa1673Sopenharmony_ci return Statement::State::UNKNOWN; 1094faa1673Sopenharmony_ci } 1104faa1673Sopenharmony_ci} 1114faa1673Sopenharmony_ci 1124faa1673Sopenharmony_ciint32_t Statement::GetParameterIndex(const std::string &name) const 1134faa1673Sopenharmony_ci{ 1144faa1673Sopenharmony_ci return sqlite3_bind_parameter_index(statement_, name.c_str()); 1154faa1673Sopenharmony_ci} 1164faa1673Sopenharmony_ci 1174faa1673Sopenharmony_civoid Statement::Bind(const std::string &tableColumnName, const VariantValue &value) 1184faa1673Sopenharmony_ci{ 1194faa1673Sopenharmony_ci int32_t index = GetParameterIndex(":" + tableColumnName); 1204faa1673Sopenharmony_ci if (value.GetType() == ValueType::TYPE_STRING) { 1214faa1673Sopenharmony_ci Bind(index, value.GetString()); 1224faa1673Sopenharmony_ci } else if (value.GetType() == ValueType::TYPE_INT) { 1234faa1673Sopenharmony_ci Bind(index, value.GetInt()); 1244faa1673Sopenharmony_ci } else if (value.GetType() == ValueType::TYPE_INT64) { 1254faa1673Sopenharmony_ci Bind(index, value.GetInt64()); 1264faa1673Sopenharmony_ci } 1274faa1673Sopenharmony_ci} 1284faa1673Sopenharmony_ci 1294faa1673Sopenharmony_ciint32_t Statement::Reset() 1304faa1673Sopenharmony_ci{ 1314faa1673Sopenharmony_ci return sqlite3_reset(statement_); 1324faa1673Sopenharmony_ci} 1334faa1673Sopenharmony_ci 1344faa1673Sopenharmony_ciint32_t Statement::GetColumnCount() const 1354faa1673Sopenharmony_ci{ 1364faa1673Sopenharmony_ci return sqlite3_column_count(statement_); 1374faa1673Sopenharmony_ci} 1384faa1673Sopenharmony_ci 1394faa1673Sopenharmony_ciVariantValue Statement::GetValue(const int32_t column, const bool flagInt64) const 1404faa1673Sopenharmony_ci{ 1414faa1673Sopenharmony_ci int32_t type = sqlite3_column_type(statement_, column); 1424faa1673Sopenharmony_ci switch (type) { 1434faa1673Sopenharmony_ci case SQLITE_INTEGER: 1444faa1673Sopenharmony_ci if (flagInt64) { 1454faa1673Sopenharmony_ci return VariantValue(GetColumnInt64(column)); 1464faa1673Sopenharmony_ci } else { 1474faa1673Sopenharmony_ci return VariantValue(GetColumnInt(column)); 1484faa1673Sopenharmony_ci } 1494faa1673Sopenharmony_ci case SQLITE_TEXT: 1504faa1673Sopenharmony_ci return VariantValue(GetColumnString(column)); 1514faa1673Sopenharmony_ci default: 1524faa1673Sopenharmony_ci return VariantValue(); 1534faa1673Sopenharmony_ci } 1544faa1673Sopenharmony_ci} 1554faa1673Sopenharmony_ci} // namespace SandboxManager 1564faa1673Sopenharmony_ci} // namespace AccessControl 1574faa1673Sopenharmony_ci} // namespace OHOS 158