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