125c1cde8Sopenharmony_ci/*
225c1cde8Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd.
325c1cde8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
425c1cde8Sopenharmony_ci * you may not use this file except in compliance with the License.
525c1cde8Sopenharmony_ci * You may obtain a copy of the License at
625c1cde8Sopenharmony_ci *
725c1cde8Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
825c1cde8Sopenharmony_ci *
925c1cde8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1025c1cde8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1125c1cde8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1225c1cde8Sopenharmony_ci * See the License for the specific language governing permissions and
1325c1cde8Sopenharmony_ci * limitations under the License.
1425c1cde8Sopenharmony_ci */
1525c1cde8Sopenharmony_ci
1625c1cde8Sopenharmony_ci#include "rdb_sim_helper.h"
1725c1cde8Sopenharmony_ci
1825c1cde8Sopenharmony_ci#include "data_storage_errors.h"
1925c1cde8Sopenharmony_ci#include "data_storage_log_wrapper.h"
2025c1cde8Sopenharmony_ci#include "rdb_errno.h"
2125c1cde8Sopenharmony_ci#include "rdb_sim_callback.h"
2225c1cde8Sopenharmony_ci#include "rdb_store_config.h"
2325c1cde8Sopenharmony_ci#include "sim_data.h"
2425c1cde8Sopenharmony_ci#include "values_bucket.h"
2525c1cde8Sopenharmony_ci#include "vector"
2625c1cde8Sopenharmony_ci
2725c1cde8Sopenharmony_cinamespace OHOS {
2825c1cde8Sopenharmony_cinamespace Telephony {
2925c1cde8Sopenharmony_ciRdbSimHelper::RdbSimHelper() {}
3025c1cde8Sopenharmony_ci
3125c1cde8Sopenharmony_ciint RdbSimHelper::Init()
3225c1cde8Sopenharmony_ci{
3325c1cde8Sopenharmony_ci    int errCode = NativeRdb::E_OK;
3425c1cde8Sopenharmony_ci    NativeRdb::RdbStoreConfig config(dbPath_);
3525c1cde8Sopenharmony_ci    config.SetJournalMode(NativeRdb::JournalMode::MODE_TRUNCATE);
3625c1cde8Sopenharmony_ci    std::string simInfoStr;
3725c1cde8Sopenharmony_ci    CreateSimInfoTableStr(simInfoStr);
3825c1cde8Sopenharmony_ci    std::vector<std::string> createTableVec;
3925c1cde8Sopenharmony_ci    createTableVec.push_back(simInfoStr);
4025c1cde8Sopenharmony_ci    RdbSimCallback callback(createTableVec);
4125c1cde8Sopenharmony_ci    CreateRdbStore(config, VERSION, callback, errCode);
4225c1cde8Sopenharmony_ci    return errCode;
4325c1cde8Sopenharmony_ci}
4425c1cde8Sopenharmony_ci
4525c1cde8Sopenharmony_civoid RdbSimHelper::UpdateDbPath(const std::string &path)
4625c1cde8Sopenharmony_ci{
4725c1cde8Sopenharmony_ci    dbPath_ = path + DB_NAME;
4825c1cde8Sopenharmony_ci}
4925c1cde8Sopenharmony_ci
5025c1cde8Sopenharmony_civoid RdbSimHelper::CreateSimInfoTableStr(std::string &createTableStr)
5125c1cde8Sopenharmony_ci{
5225c1cde8Sopenharmony_ci    createTableStr.append("CREATE TABLE IF NOT EXISTS ").append(TABLE_SIM_INFO);
5325c1cde8Sopenharmony_ci    createTableStr.append("(").append(SimData::SIM_ID).append(" INTEGER PRIMARY KEY AUTOINCREMENT, ");
5425c1cde8Sopenharmony_ci    createTableStr.append(SimData::ICC_ID).append(" TEXT NOT NULL, ");
5525c1cde8Sopenharmony_ci    createTableStr.append(SimData::CARD_ID).append(" TEXT NOT NULL, ");
5625c1cde8Sopenharmony_ci    createTableStr.append(SimData::SLOT_INDEX).append(" INTEGER DEFAULT -1, ");
5725c1cde8Sopenharmony_ci    createTableStr.append(SimData::SHOW_NAME).append(" TEXT DEFAULT '', ");
5825c1cde8Sopenharmony_ci    createTableStr.append(SimData::PHONE_NUMBER).append(" TEXT DEFAULT '', ");
5925c1cde8Sopenharmony_ci    createTableStr.append(SimData::COUNTRY_CODE).append(" TEXT DEFAULT '', ");
6025c1cde8Sopenharmony_ci    createTableStr.append(SimData::IMSI).append(" TEXT DEFAULT '', ");
6125c1cde8Sopenharmony_ci    createTableStr.append(SimData::IS_MAIN_CARD).append(" INTEGER DEFAULT 0, ");
6225c1cde8Sopenharmony_ci    createTableStr.append(SimData::IS_VOICE_CARD).append(" INTEGER DEFAULT 0, ");
6325c1cde8Sopenharmony_ci    createTableStr.append(SimData::IS_MESSAGE_CARD).append(" INTEGER DEFAULT 0, ");
6425c1cde8Sopenharmony_ci    createTableStr.append(SimData::IS_CELLULAR_DATA_CARD).append(" INTEGER DEFAULT 0, ");
6525c1cde8Sopenharmony_ci    createTableStr.append(SimData::IS_ACTIVE).append(" INTEGER DEFAULT 1, ");
6625c1cde8Sopenharmony_ci    createTableStr.append(SimData::CARD_TYPE).append(" INTEGER , ");
6725c1cde8Sopenharmony_ci    createTableStr.append(SimData::IMS_SWITCH).append(" INTEGER DEFAULT -1, ");
6825c1cde8Sopenharmony_ci    createTableStr.append(SimData::LANGUAGE).append(" TEXT DEFAULT '', ");
6925c1cde8Sopenharmony_ci    createTableStr.append(SimData::OPKEY).append(" TEXT DEFAULT '', ");
7025c1cde8Sopenharmony_ci    createTableStr.append(SimData::MCC).append(" TEXT DEFAULT '', ");
7125c1cde8Sopenharmony_ci    createTableStr.append(SimData::MNC).append(" TEXT DEFAULT '', ");
7225c1cde8Sopenharmony_ci    createTableStr.append("UNIQUE (");
7325c1cde8Sopenharmony_ci    createTableStr.append(SimData::ICC_ID).append(", ");
7425c1cde8Sopenharmony_ci    createTableStr.append(SimData::CARD_ID).append("))");
7525c1cde8Sopenharmony_ci}
7625c1cde8Sopenharmony_ci
7725c1cde8Sopenharmony_ciint32_t RdbSimHelper::SetDefaultCardByType(int32_t simId, int32_t type)
7825c1cde8Sopenharmony_ci{
7925c1cde8Sopenharmony_ci    int result = BeginTransaction();
8025c1cde8Sopenharmony_ci    if (result != NativeRdb::E_OK) {
8125c1cde8Sopenharmony_ci        DATA_STORAGE_LOGE("RdbSimHelper::SetDefaultCardByType BeginTransaction is error!");
8225c1cde8Sopenharmony_ci        return result;
8325c1cde8Sopenharmony_ci    }
8425c1cde8Sopenharmony_ci    int updateState = 0;
8525c1cde8Sopenharmony_ci    int whereState = 1;
8625c1cde8Sopenharmony_ci    result = UpdateCardStateByType(type, updateState, whereState);
8725c1cde8Sopenharmony_ci    if (result != NativeRdb::E_OK) {
8825c1cde8Sopenharmony_ci        DATA_STORAGE_LOGE("RdbSimHelper::SetDefaultCardByType UpdateCardStateByType is error!");
8925c1cde8Sopenharmony_ci        return result;
9025c1cde8Sopenharmony_ci    }
9125c1cde8Sopenharmony_ci    int changedRows = 0;
9225c1cde8Sopenharmony_ci    NativeRdb::ValuesBucket values;
9325c1cde8Sopenharmony_ci    switch (type) {
9425c1cde8Sopenharmony_ci        case static_cast<int32_t>(SimCardType::MAIN): {
9525c1cde8Sopenharmony_ci            values.PutInt(SimData::IS_MAIN_CARD, 1);
9625c1cde8Sopenharmony_ci            break;
9725c1cde8Sopenharmony_ci        }
9825c1cde8Sopenharmony_ci        case static_cast<int32_t>(SimCardType::VOICE): {
9925c1cde8Sopenharmony_ci            values.PutInt(SimData::IS_VOICE_CARD, 1);
10025c1cde8Sopenharmony_ci            break;
10125c1cde8Sopenharmony_ci        }
10225c1cde8Sopenharmony_ci        case static_cast<int32_t>(SimCardType::MESSAGE): {
10325c1cde8Sopenharmony_ci            values.PutInt(SimData::IS_MESSAGE_CARD, 1);
10425c1cde8Sopenharmony_ci            break;
10525c1cde8Sopenharmony_ci        }
10625c1cde8Sopenharmony_ci        case static_cast<int32_t>(SimCardType::CELLULAR_DATA): {
10725c1cde8Sopenharmony_ci            values.PutInt(SimData::IS_CELLULAR_DATA_CARD, 1);
10825c1cde8Sopenharmony_ci            break;
10925c1cde8Sopenharmony_ci        }
11025c1cde8Sopenharmony_ci        default:
11125c1cde8Sopenharmony_ci            DATA_STORAGE_LOGE("RdbSimHelper::SetDefaultDataByType is error!");
11225c1cde8Sopenharmony_ci            return DATA_STORAGE_ERROR;
11325c1cde8Sopenharmony_ci    }
11425c1cde8Sopenharmony_ci    std::string whereClause;
11525c1cde8Sopenharmony_ci    whereClause.append(SimData::SIM_ID).append("=").append(std::to_string(simId));
11625c1cde8Sopenharmony_ci    result = Update(changedRows, TABLE_SIM_INFO, values, whereClause);
11725c1cde8Sopenharmony_ci    if (result != NativeRdb::E_OK) {
11825c1cde8Sopenharmony_ci        DATA_STORAGE_LOGE("RdbSimHelper::SetDefaultCardByType Update is error!");
11925c1cde8Sopenharmony_ci    }
12025c1cde8Sopenharmony_ci    result = CommitTransactionAction();
12125c1cde8Sopenharmony_ci    return result;
12225c1cde8Sopenharmony_ci}
12325c1cde8Sopenharmony_ci
12425c1cde8Sopenharmony_ciint32_t RdbSimHelper::UpdateCardStateByType(int32_t type, int32_t updateState, int32_t whereSate)
12525c1cde8Sopenharmony_ci{
12625c1cde8Sopenharmony_ci    int32_t result = DATA_STORAGE_ERROR;
12725c1cde8Sopenharmony_ci    bool isExist = false;
12825c1cde8Sopenharmony_ci    NativeRdb::ValuesBucket values;
12925c1cde8Sopenharmony_ci    std::string whereClause;
13025c1cde8Sopenharmony_ci    switch (type) {
13125c1cde8Sopenharmony_ci        case static_cast<int32_t>(SimCardType::MAIN): {
13225c1cde8Sopenharmony_ci            isExist = true;
13325c1cde8Sopenharmony_ci            values.PutInt(SimData::IS_MAIN_CARD, updateState);
13425c1cde8Sopenharmony_ci            whereClause.append(SimData::IS_MAIN_CARD).append("=").append(std::to_string(whereSate));
13525c1cde8Sopenharmony_ci            break;
13625c1cde8Sopenharmony_ci        }
13725c1cde8Sopenharmony_ci        case static_cast<int32_t>(SimCardType::VOICE): {
13825c1cde8Sopenharmony_ci            isExist = true;
13925c1cde8Sopenharmony_ci            values.PutInt(SimData::IS_VOICE_CARD, updateState);
14025c1cde8Sopenharmony_ci            whereClause.append(SimData::IS_VOICE_CARD).append("=").append(std::to_string(whereSate));
14125c1cde8Sopenharmony_ci            break;
14225c1cde8Sopenharmony_ci        }
14325c1cde8Sopenharmony_ci        case static_cast<int32_t>(SimCardType::MESSAGE): {
14425c1cde8Sopenharmony_ci            isExist = true;
14525c1cde8Sopenharmony_ci            values.PutInt(SimData::IS_MESSAGE_CARD, updateState);
14625c1cde8Sopenharmony_ci            whereClause.append(SimData::IS_MESSAGE_CARD).append("=").append(std::to_string(whereSate));
14725c1cde8Sopenharmony_ci            break;
14825c1cde8Sopenharmony_ci        }
14925c1cde8Sopenharmony_ci        case static_cast<int32_t>(SimCardType::CELLULAR_DATA): {
15025c1cde8Sopenharmony_ci            isExist = true;
15125c1cde8Sopenharmony_ci            values.PutInt(SimData::IS_CELLULAR_DATA_CARD, updateState);
15225c1cde8Sopenharmony_ci            whereClause.append(SimData::IS_CELLULAR_DATA_CARD).append("=").append(std::to_string(whereSate));
15325c1cde8Sopenharmony_ci            break;
15425c1cde8Sopenharmony_ci        }
15525c1cde8Sopenharmony_ci        default:
15625c1cde8Sopenharmony_ci            break;
15725c1cde8Sopenharmony_ci    }
15825c1cde8Sopenharmony_ci    if (isExist) {
15925c1cde8Sopenharmony_ci        int changedRows = 0;
16025c1cde8Sopenharmony_ci        return Update(changedRows, TABLE_SIM_INFO, values, whereClause);
16125c1cde8Sopenharmony_ci    }
16225c1cde8Sopenharmony_ci    return result;
16325c1cde8Sopenharmony_ci}
16425c1cde8Sopenharmony_ci
16525c1cde8Sopenharmony_ciint RdbSimHelper::CommitTransactionAction()
16625c1cde8Sopenharmony_ci{
16725c1cde8Sopenharmony_ci    int result = Commit();
16825c1cde8Sopenharmony_ci    if (result != NativeRdb::E_OK) {
16925c1cde8Sopenharmony_ci        RollBack();
17025c1cde8Sopenharmony_ci    }
17125c1cde8Sopenharmony_ci    return result;
17225c1cde8Sopenharmony_ci}
17325c1cde8Sopenharmony_ci
17425c1cde8Sopenharmony_ciint32_t RdbSimHelper::ClearData()
17525c1cde8Sopenharmony_ci{
17625c1cde8Sopenharmony_ci    std::string sql;
17725c1cde8Sopenharmony_ci    sql.append("delete from ").append(TABLE_SIM_INFO);
17825c1cde8Sopenharmony_ci    return ExecuteSql(sql);
17925c1cde8Sopenharmony_ci}
18025c1cde8Sopenharmony_ci} // namespace Telephony
18125c1cde8Sopenharmony_ci} // namespace OHOS