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 "profile_database.h"
17
18 #include <cstdio>
19 #include <mutex>
20 #include <unistd.h>
21
22 #include "common.h"
23 #include "contacts_account.h"
24 #include "contacts_columns.h"
25 #include "contacts_type.h"
26 #include "hilog_wrapper.h"
27
28 namespace OHOS {
29 namespace Contacts {
30 std::shared_ptr<ProfileDatabase> ProfileDatabase::profileDatabase_ = nullptr;
31 std::shared_ptr<OHOS::NativeRdb::RdbStore> ProfileDatabase::store_ = nullptr;
32 static std::string g_databaseName;
33 namespace {
34 std::mutex g_mtx;
35 } // namespace
36
ProfileDatabase()37 ProfileDatabase::ProfileDatabase()
38 {
39 int errCode = OHOS::NativeRdb::E_OK;
40 g_databaseName = ContactsPath::RDB_PATH + "profile.db";
41 OHOS::NativeRdb::RdbStoreConfig config(g_databaseName);
42 HILOG_INFO("ProfileDatabase g_databaseName :%{public}s", g_databaseName.c_str());
43 SqliteOpenHelperProfileCallback sqliteOpenHelperCallback;
44 store_ = OHOS::NativeRdb::RdbHelper::GetRdbStore(config, DATABASE_OPEN_VERSION, sqliteOpenHelperCallback, errCode);
45 if (errCode != OHOS::NativeRdb::E_OK) {
46 HILOG_ERROR("ProfileDatabase errCode :%{public}d", errCode);
47 } else {
48 HILOG_INFO("ProfileDatabase errCode :%{public}d", errCode);
49 }
50 if (errCode != OHOS::NativeRdb::E_OK) {
51 HILOG_ERROR("ProfileDatabase rebase open error :%{public}d", errCode);
52 return;
53 }
54 std::shared_ptr<ContactsAccount> contactsAccount = ContactsAccount::GetInstance();
55 contactsAccount->PrepopulateCommonAccountTypes(store_);
56 ContactsType contactsType;
57 contactsType.PrepopulateCommonTypes(store_);
58 }
59
GetInstance()60 std::shared_ptr<ProfileDatabase> ProfileDatabase::GetInstance()
61 {
62 if (profileDatabase_ == nullptr) {
63 g_mtx.lock();
64 profileDatabase_.reset(new ProfileDatabase());
65 g_mtx.unlock();
66 }
67 return profileDatabase_;
68 }
69
DestroyInstanceAndRestore(std::string restorePath)70 void ProfileDatabase::DestroyInstanceAndRestore(std::string restorePath)
71 {
72 g_mtx.lock();
73 if (access(restorePath.c_str(), F_OK) != 0) {
74 HILOG_ERROR("Restore file %{private}s does not exist", restorePath.c_str());
75 g_mtx.unlock();
76 return;
77 }
78 OHOS::NativeRdb::RdbHelper::DeleteRdbStore(g_databaseName);
79 OHOS::NativeRdb::RdbHelper::ClearCache();
80 profileDatabase_ = nullptr;
81 Restore(restorePath);
82 g_mtx.unlock();
83 }
84
Restore(std::string restorePath)85 bool ProfileDatabase::Restore(std::string restorePath)
86 {
87 if (rename(restorePath.c_str(), g_databaseName.c_str())) {
88 HILOG_ERROR("Restore rename oldFileName = %{private}s to newFileName %{private}s", restorePath.c_str(),
89 g_databaseName.c_str());
90 return true;
91 }
92 return false;
93 }
94
OnCreate(OHOS::NativeRdb::RdbStore & store)95 int SqliteOpenHelperProfileCallback::OnCreate(OHOS::NativeRdb::RdbStore &store)
96 {
97 store.ExecuteSql(CREATE_CONTACT);
98 store.ExecuteSql(CREATE_CONTACT_INDEX);
99 store.ExecuteSql(CREATE_RAW_CONTACT);
100 store.ExecuteSql(CREATE_RAW_CONTACT_INDEX);
101 store.ExecuteSql(CREATE_CONTACT_DATA);
102 store.ExecuteSql(CREATE_CONTACT_INDEX_DATA1);
103 store.ExecuteSql(CREATE_CONTACT_INDEX_DATA2);
104 store.ExecuteSql(CREATE_CONTACT_BLOCKLIST);
105 store.ExecuteSql(CREATE_LOCAL_LANG);
106 store.ExecuteSql(CREATE_ACCOUNT);
107 store.ExecuteSql(CREATE_PHOTO_FILES);
108 store.ExecuteSql(CREATE_CONTACT_TYPE);
109 store.ExecuteSql(CREATE_GROUPS);
110 store.ExecuteSql(CREATE_DELETED_RAW_CONTACT);
111 store.ExecuteSql(CREATE_SEARCH_CONTACT);
112 store.ExecuteSql(CREATE_SEARCH_CONTACT_INDEX1);
113 store.ExecuteSql(CREATE_SEARCH_CONTACT_INDEX2);
114 store.ExecuteSql(CREATE_SEARCH_CONTACT_VIEW);
115 store.ExecuteSql(MERGE_INFO);
116 store.ExecuteSql(CREATE_VIEW_CONTACT_DATA);
117 store.ExecuteSql(CREATE_VIEW_RAW_CONTACT);
118 store.ExecuteSql(CREATE_VIEW_CONTACT);
119 store.ExecuteSql(CREATE_VIEW_GROUPS);
120 store.ExecuteSql(CREATE_VIEW_DELETED);
121 store.ExecuteSql(INSERT_DELETE_RAW_CONTACT);
122 store.ExecuteSql(UPDATE_RAW_CONTACT_VERSION);
123 store.ExecuteSql(UPDATE_CONTACT_DATA_VERSION);
124 store.ExecuteSql(INSERT_CONTACT_QUICK_SEARCH);
125 store.ExecuteSql(CREATE_DATABASE_BACKUP_TASK);
126 store.ExecuteSql(CREATE_INSERT_BACKUP_TIME);
127 store.ExecuteSql(UPDATE_CONTACT_BY_INSERT_CONTACT_DATA);
128 store.ExecuteSql(UPDATE_CONTACT_BY_DELETE_CONTACT_DATA);
129 store.ExecuteSql(UPDATE_CONTACT_BY_UPDATE_CONTACT_DATA);
130 store.ExecuteSql(MERGE_INFO_INDEX);
131 return OHOS::NativeRdb::E_OK;
132 }
133
OnUpgrade(OHOS::NativeRdb::RdbStore & store,int oldVersion,int newVersion)134 int SqliteOpenHelperProfileCallback::OnUpgrade(OHOS::NativeRdb::RdbStore &store, int oldVersion, int newVersion)
135 {
136 HILOG_INFO("OnUpgrade oldVersion is %{public}d , newVersion is %{public}d", oldVersion, newVersion);
137 if (oldVersion < newVersion && newVersion == DATABASE_NEW_VERSION) {
138 store.ExecuteSql("ALTER TABLE database_backup_task ADD COLUMN sync TEXT");
139 }
140 if (oldVersion < newVersion && newVersion == DATABASE_VERSION_2) {
141 UpgradeToV2(store, oldVersion, newVersion);
142 }
143 store.SetVersion(newVersion);
144 return OHOS::NativeRdb::E_OK;
145 }
146
UpgradeToV2(OHOS::NativeRdb::RdbStore & store,int oldVersion,int newVersion)147 void SqliteOpenHelperProfileCallback::UpgradeToV2(OHOS::NativeRdb::RdbStore &store, int oldVersion, int newVersion)
148 {
149 if (oldVersion >= newVersion || newVersion != DATABASE_VERSION_2) {
150 return;
151 }
152 // raw_contact
153 store.ExecuteSql("ALTER TABLE raw_contact ADD COLUMN primary_contact INTEGER DEFAULT 0;");
154 store.ExecuteSql("ALTER TABLE raw_contact ADD COLUMN extra1 TEXT;");
155 store.ExecuteSql("ALTER TABLE raw_contact ADD COLUMN extra2 TEXT;");
156 store.ExecuteSql("ALTER TABLE raw_contact ADD COLUMN extra3 TEXT;");
157 store.ExecuteSql("ALTER TABLE raw_contact ADD COLUMN extra4 TEXT;");
158 // contact_data
159 store.ExecuteSql("ALTER TABLE contact_data ADD COLUMN extend8 TEXT;");
160 store.ExecuteSql("ALTER TABLE contact_data ADD COLUMN extend9 TEXT;");
161 store.ExecuteSql("ALTER TABLE contact_data ADD COLUMN extend10 TEXT;");
162 store.ExecuteSql("ALTER TABLE contact_data ADD COLUMN extend11 TEXT;");
163 // drop view
164 store.ExecuteSql("DROP VIEW view_contact;");
165 store.ExecuteSql("DROP VIEW view_contact_data;");
166 store.ExecuteSql("DROP VIEW search_contact_view;");
167 store.ExecuteSql("DROP VIEW view_deleted;");
168 // create view
169 store.ExecuteSql(CREATE_VIEW_CONTACT);
170 store.ExecuteSql(CREATE_VIEW_CONTACT_DATA);
171 store.ExecuteSql(CREATE_SEARCH_CONTACT_VIEW);
172 store.ExecuteSql(CREATE_VIEW_DELETED);
173 }
174
OnDowngrade(OHOS::NativeRdb::RdbStore & store,int oldVersion,int newVersion)175 int SqliteOpenHelperProfileCallback::OnDowngrade(OHOS::NativeRdb::RdbStore &store, int oldVersion, int newVersion)
176 {
177 HILOG_INFO("OnDowngrade oldVersion is %{public}d , newVersion is %{public}d", oldVersion, newVersion);
178 if (oldVersion > newVersion && newVersion == DATABASE_OPEN_VERSION) {
179 store.ExecuteSql(
180 "CREATE TABLE IF NOT EXISTS database_backup (id INTEGER PRIMARY KEY AUTOINCREMENT, backup_time "
181 "TEXT, backup_path TEXT, remarks TEXT)");
182 store.ExecuteSql(
183 "INSERT INTO database_backup(id, backup_time, backup_path, remarks) SELECT id, "
184 "backup_time, backup_path, remarks FROM database_backup_task");
185 store.ExecuteSql("DROP table database_backup_task");
186 store.ExecuteSql("ALTER table database_backup RENAME TO database_backup_task");
187 store.ExecuteSql(CREATE_INSERT_BACKUP_TIME);
188 }
189 int ret = store.SetVersion(newVersion);
190 return ret;
191 }
192 } // namespace Contacts
193 } // namespace OHOS