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 #ifndef COMMON_H 17 #define COMMON_H 18 19 #include <string> 20 21 #include "contacts_path.h" 22 23 namespace OHOS { 24 namespace Contacts { 25 // error code 26 constexpr int RDB_EXECUTE_OK = 0; 27 constexpr int RDB_EXECUTE_FAIL = -1; 28 constexpr int RDB_PERMISSION_ERROR = -2; 29 constexpr int OPERATION_ERROR = -1; 30 constexpr int OPERATION_OK = 0; 31 constexpr int RDB_OBJECT_EMPTY = -1; 32 constexpr int PARAMETER_EMPTY = -1; 33 34 constexpr int DELETE_MARK = 1; 35 constexpr int ID_EMPTY = 0; 36 constexpr int BATCH_INSERT_COUNT = 40; 37 38 // ResultSet get Num 39 constexpr int RESULT_GET_ONE = 1; 40 constexpr int RESULT_GET_TWO = 2; 41 42 // contact table has Judge 43 constexpr int HAS_NAME = 1; 44 constexpr int HAS_PHONE = 2; 45 constexpr int HAS_EMAIL = 3; 46 constexpr int HAS_GROUP = 4; 47 48 // Contacts DataBase Code 49 constexpr int CONTACTS_CONTACT = 10000; 50 constexpr int CONTACTS_RAW_CONTACT = 10001; 51 constexpr int CONTACTS_CONTACT_DATA = 10002; 52 constexpr int CONTACTS_CONTACT_TYPE = 10003; 53 constexpr int CONTACTS_DELETED_RAW_CONTACT = 10004; 54 constexpr int CONTACTS_GROUPS = 10005; 55 constexpr int CONTACTS_ACCOUNT = 10006; 56 constexpr int CONTACTS_BLOCKLIST = 10007; 57 constexpr int CONTACTS_SEARCH_CONTACT = 10008; 58 constexpr int CONTACTS_SYNC_STATUS = 10009; 59 constexpr int CONTACTS_PHOTO_FILES = 100010; 60 constexpr int CONTACTS_LOCAL_LANG = 10011; 61 constexpr int CONTACTS_DATABASE_BACKUP_TASK = 10012; 62 constexpr int CONTACTS_DELETE = 10013; 63 constexpr int QUERY_MERGE_LIST = 10014; 64 constexpr int SPLIT_CONTACT = 10015; 65 constexpr int MANUAL_MERGE = 10016; 66 constexpr int AUTO_MERGE = 10017; 67 constexpr int CONTACTS_DELETE_RECORD = 10018; 68 constexpr int CONTACT_TYPE = 10019; 69 constexpr int CONTACT_BACKUP = 10020; 70 constexpr int CONTACT_RECOVER = 10021; 71 72 constexpr int ACCOUNT = 10020; 73 constexpr int CALLLOG = 20000; 74 constexpr int VOICEMAIL = 20001; 75 constexpr int REPLAYING = 20002; 76 77 // PROFILE DATABASE CODE 78 constexpr int PROFILE_CONTACT = 30000; 79 constexpr int PROFILE_RAW_CONTACT = 30001; 80 constexpr int PROFILE_CONTACT_DATA = 30002; 81 constexpr int PROFILE_CONTACT_TYPE = 30003; 82 constexpr int PROFILE_DELETED_RAW_CONTACT = 30004; 83 constexpr int PROFILE_GROUPS = 30005; 84 constexpr int PROFILE_ACCOUNT = 30006; 85 constexpr int PROFILE_BLOCKLIST = 30007; 86 constexpr int PROFILE_SEARCH_CONTACT = 30008; 87 constexpr int PROFILE_SYNC_STATUS = 30009; 88 constexpr int PROFILE_PHOTO_FILES = 300010; 89 constexpr int PROFILE_LOCAL_LANG = 30011; 90 constexpr int PROFILE_DATABASE_BACKUP_TASK = 30012; 91 constexpr int PROFILE_DELETE_RECORD = 30013; 92 constexpr int PROFILE_TYPE = 30014; 93 constexpr int PROFILE_DELETE = 30015; 94 constexpr int PROFILE_BACKUP = 30016; 95 constexpr int PROFILE_RECOVER = 30017; 96 97 // DATABASE VERSION 2 98 constexpr int DATABASE_VERSION_2 = 2; 99 100 // DATABASE OPEN VERSION 101 constexpr int DATABASE_OPEN_VERSION = 2; 102 103 // DATABASE NEW VERSION 104 constexpr int DATABASE_NEW_VERSION = 2; 105 106 // REQUEST PARAMS ARGS NUM 107 constexpr int REQUEST_PARAMS_NUM = 2; 108 109 constexpr const char *PROFILE_DATABASE_NAME = "profile"; 110 constexpr const char *CONTACT_DATABASE_NAME = "contacts"; 111 112 // Rebase 113 constexpr int REBASE_SETTING = 0; 114 constexpr int REBASE_COUNT = 5; 115 116 // MergeMode Number 117 constexpr int MERGE_MODE_DEFAULT = 0; 118 constexpr int MERGE_MODE_MANUAL = 1; 119 constexpr int MERGE_MODE_AUTO = 2; 120 121 // Uri 122 constexpr const char *CONTACT_URI = "datashare:///com.ohos.contactsdataability"; 123 constexpr const char *VOICEMAIL_URI = "datashare:///com.ohos.voicemailability"; 124 constexpr const char *CALL_LOG_URI = "datashare:///com.ohos.calllogability"; 125 126 constexpr const char *CREATE_CALLLOG = 127 "CREATE TABLE IF NOT EXISTS [calllog](" 128 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 129 "[slot_id] INTEGER NOT NULL DEFAULT 0, " 130 "[phone_number] TEXT, " 131 "[display_name] TEXT, " 132 "[call_direction] INTEGER NOT NULL DEFAULT 0, " 133 "[voicemail_uri] TEXT, " 134 "[sim_type] INTEGER , " 135 "[is_hd] INTEGER , " 136 "[is_read] INTEGER NOT NULL DEFAULT 0, " 137 "[ring_duration] INTEGER NOT NULL DEFAULT 0, " 138 "[talk_duration] INTEGER NOT NULL DEFAULT 0, " 139 "[format_number] TEXT, " 140 "[quicksearch_key] TEXT, " 141 "[number_type] INTEGER, " 142 "[number_type_name] TEXT, " 143 "[begin_time] INTEGER NOT NULL DEFAULT 0, " 144 "[end_time] INTEGER NOT NULL DEFAULT 0, " 145 "[answer_state] INTEGER , " 146 "[create_time] INTEGER, " 147 "[number_location] TEXT, " 148 "[photo_id] INTEGER, " 149 "[photo_uri] TEXT, " 150 "[country_iso_code] INTEGER, " 151 "[extra1] TEXT, " 152 "[extra2] TEXT, " 153 "[extra3] TEXT, " 154 "[extra4] TEXT, " 155 "[extra5] TEXT, " 156 "[extra6] TEXT, " 157 "[features] INTEGER DEFAULT 0);"; 158 159 constexpr const char *CREATE_VOICEMAIL = 160 "CREATE TABLE IF NOT EXISTS [voicemail](" 161 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 162 "[phone_number] TEXT, " 163 "[quicksearch_key] TEXT, " 164 "[display_name] TEXT, " 165 "[voicemail_uri] TEXT, " 166 "[voicemail_type] INTEGER NOT NULL DEFAULT 0, " 167 "[voice_file_size] INTEGER NOT NULL DEFAULT 0, " 168 "[voice_duration] INTEGER NOT NULL DEFAULT 0, " 169 "[voice_status] INTEGER NOT NULL DEFAULT 0, " 170 "[origin_type] TEXT, " 171 "[create_time] INTEGER);"; 172 173 constexpr const char *CREATE_REPLYING = 174 "CREATE TABLE [replying](" 175 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 176 "[name] TEXT, " 177 "[replying_uri] TEXT, " 178 "[replying_path] TEXT, " 179 "[phone_account_id] TEXT, " 180 "[has_content] NOT NULL DEFAULT 0, " 181 "[duration] INTEGER NOT NULL DEFAULT 0, " 182 "[content_type] TEXT, " 183 "[last_modified] INTEGER NOT NULL DEFAULT 0, " 184 "[synced] INTEGER NOT NULL DEFAULT 0 );"; 185 186 constexpr const char *CREATE_CONTACT = 187 "CREATE TABLE IF NOT EXISTS [contact](" 188 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 189 "[name_raw_contact_id] INTEGER REFERENCES raw_contact(id), " 190 "[photo_id] INTEGER, " 191 "[photo_file_id] INTEGER REFERENCES [photo_files]([id]), " 192 "[personal_ringtone] TEXT, " 193 "[is_transfer_voicemail] INTEGER NOT NULL DEFAULT 0, " 194 "[company] TEXT, " 195 "[position] TEXT, " 196 "[quick_search_key] TEXT, " 197 "[read_only] INTEGER NOT NULL DEFAULT 0, " 198 "[personal_notification_ringtone] TEXT, " 199 "[has_phone_number] INTEGER NOT NULL DEFAULT 0, " 200 "[has_display_name] INTEGER NOT NULL DEFAULT 0, " 201 "[has_email] INTEGER NOT NULL DEFAULT 0, " 202 "[has_group] INTEGER NOT NULL DEFAULT 0)"; 203 204 constexpr const char *CREATE_CONTACT_INDEX = 205 "CREATE INDEX IF NOT EXISTS [contact_name_raw_contact_id_index] " 206 "ON [contact] ([name_raw_contact_id])"; 207 208 constexpr const char *CREATE_RAW_CONTACT = 209 "CREATE TABLE IF NOT EXISTS [raw_contact]( " 210 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 211 "[contact_id] INTEGER REFERENCES [contact]([id]), " 212 "[photo_id] INTEGER, " 213 "[photo_file_id] INTEGER REFERENCES [photo_files]([id]), " 214 "[is_transfer_voicemail] INTEGER NOT NULL DEFAULT 0, " 215 "[personal_ringtone] TEXT, " 216 "[is_deleted] INTEGER NOT NULL DEFAULT 0, " 217 "[personal_notification_ringtone] TEXT, " 218 "[photo_first_name] TEXT, " 219 "[account_id] INTEGER, " 220 "[version] INTEGER NOT NULL DEFAULT 0, " 221 "[display_name] TEXT, " 222 "[sort] TEXT, " 223 "[contacted_count] INTEGER NOT NULL DEFAULT 0, " 224 "[lastest_contacted_time] INTEGER NOT NULL DEFAULT 0, " 225 "[favorite] INTEGER NOT NULL DEFAULT 0, " 226 "[favorite_order] INTEGER, " 227 "[phonetic_name] TEXT, " 228 "[phonetic_name_type] INTEGER , " 229 "[company] TEXT, " 230 "[position] TEXT, " 231 "[read_only] INTEGER NOT NULL DEFAULT 0, " 232 "[sort_first_letter] TEXT, " 233 "[merge_mode] INTEGER NOT NULL DEFAULT 0, " 234 "[is_need_merge] INTEGER NOT NULL DEFAULT 1, " 235 "[merge_status] INTEGER NOT NULL DEFAULT 1, " 236 "[is_merge_target] INTEGER NOT NULL DEFAULT 0, " 237 "[vibration_setting] INTEGER NOT NULL DEFAULT 0, " 238 "[sync_id] INTEGER, " 239 "[syn_1] TEXT, " 240 "[syn_2] TEXT, " 241 "[syn_3] TEXT, " 242 "[primary_contact] INTEGER DEFAULT 0, " 243 "[extra1] TEXT, " 244 "[extra2] TEXT, " 245 "[extra3] TEXT, " 246 "[extra4] TEXT)"; 247 248 constexpr const char *CREATE_CONTACT_DATA = 249 "CREATE TABLE IF NOT EXISTS [contact_data]( " 250 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 251 "[type_id] INTEGER REFERENCES [contact_type]([id]), " 252 "[raw_contact_id] INTEGER REFERENCES [raw_contact]([id]), " 253 "[read_only] INTEGER NOT NULL DEFAULT 0, " 254 "[version] INTEGER NOT NULL DEFAULT 0, " 255 "[is_preferred_number] INTEGER NOT NULL DEFAULT 0, " 256 "[detail_info] TEXT, " 257 "[family_name] TEXT, " 258 "[middle_name_phonetic] TEXT, " 259 "[given_name] TEXT, " 260 "[given_name_phonetic] TEXT, " 261 "[alias_detail_info] TEXT, " 262 "[phonetic_name] TEXT, " 263 "[position] TEXT, " 264 "[extend1] TEXT, " 265 "[extend2] TEXT, " 266 "[extend3] TEXT, " 267 "[extend4] TEXT, " 268 "[city] TEXT, " 269 "[country] TEXT, " 270 "[neighborhood] TEXT, " 271 "[pobox] TEXT, " 272 "[postcode] TEXT, " 273 "[region] TEXT, " 274 "[street] TEXT, " 275 "[alpha_name] TEXT, " 276 "[other_lan_last_name] TEXT, " 277 "[other_lan_first_name] TEXT, " 278 "[extend5] TEXT, " 279 "[lan_style] TEXT, " 280 "[custom_data] TEXT, " 281 "[extend6] TEXT, " 282 "[extend7] TEXT, " 283 "[blob_data] BLOB, " 284 "[syn_1] TEXT, " 285 "[syn_2] TEXT, " 286 "[syn_3] TEXT, " 287 "[extend8] TEXT, " 288 "[extend9] TEXT, " 289 "[extend10] TEXT, " 290 "[extend11] TEXT)"; 291 292 constexpr const char *CREATE_CONTACT_TYPE = 293 "CREATE TABLE IF NOT EXISTS [contact_type]( " 294 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 295 "[content_type] TEXT )"; 296 297 constexpr const char *CREATE_DELETED_RAW_CONTACT = 298 "CREATE TABLE IF NOT EXISTS [deleted_raw_contact]( " 299 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 300 "[contact_id] INTEGER REFERENCES [contact]([id])," 301 "[raw_contact_id] INTEGER REFERENCES [raw_contact]([id]), " 302 "[delete_source] TEXT, " 303 "[delete_time] INTEGER NOT NULL DEFAULT 0, " 304 "[display_name] TEXT, " 305 "[delete_account] TEXT, " 306 "[backup_data] TEXT, " 307 "[delete_date] TEXT, " 308 "[is_deleted] INTEGER NOT NULL DEFAULT 0)"; 309 310 constexpr const char *CREATE_GROUPS = 311 "CREATE TABLE IF NOT EXISTS [groups]( " 312 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 313 "[account_id] INTEGER REFERENCES [account]([id]), " 314 "[group_name] TEXT, " 315 "[group_notes] TEXT, " 316 "[is_deleted] INTEGER NOT NULL DEFAULT 0, " 317 "[group_ringtone] TEXT, " 318 "[ringtone_modify_time] INTEGER NOT NULL DEFAULT 0, " 319 "[lastest_modify_time] INTEGER NOT NULL DEFAULT 0)"; 320 321 constexpr const char *CREATE_ACCOUNT = 322 "CREATE TABLE IF NOT EXISTS [account]( " 323 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 324 "[account_name] TEXT, " 325 "[account_type] TEXT, " 326 "[data_info] TEXT)"; 327 328 constexpr const char *CREATE_CONTACT_BLOCKLIST = 329 "CREATE TABLE IF NOT EXISTS [contact_blocklist]( " 330 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 331 "[types] INTEGER NOT NULL DEFAULT 0, " 332 "[phone_number] TEXT, " 333 "[content] TEXT, " 334 "[time_stamp] INTEGER NOT NULL DEFAULT 0)"; 335 336 constexpr const char *CREATE_SEARCH_CONTACT = 337 "CREATE TABLE IF NOT EXISTS [search_contact]( " 338 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 339 "[account_id] INTEGER REFERENCES [account]([id]), " 340 "[contact_id] INTEGER REFERENCES [contact]([id]), " 341 "[raw_contact_id] INTEGER REFERENCES [raw_contact]([id]), " 342 "[search_name] TEXT, " 343 "[display_name] TEXT, " 344 "[phonetic_name] TEXT, " 345 "[photo_id] TEXT, " 346 "[photo_file_id] INTEGER REFERENCES [photo_files]([id]))"; 347 348 constexpr const char *CREATE_PHOTO_FILES = 349 "CREATE TABLE IF NOT EXISTS [photo_files]( " 350 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 351 "[file_height] INTEGER NOT NULL DEFAULT 0, " 352 "[file_width] INTEGER NOT NULL DEFAULT 0, " 353 "[file_size] INTEGER NOT NULL DEFAULT 0)"; 354 355 constexpr const char *CREATE_LOCAL_LANG = 356 "CREATE TABLE IF NOT EXISTS[local_lang]( " 357 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 358 "[local] TEXT)"; 359 360 constexpr const char *CREATE_DATABASE_BACKUP_TASK = 361 "CREATE TABLE IF NOT EXISTS[database_backup_task]( " 362 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 363 "[backup_time] TEXT, " 364 "[backup_path] TEXT, " 365 "[remarks] TEXT)"; 366 367 constexpr const char *CREATE_INSERT_BACKUP_TIME = 368 "CREATE TRIGGER [insert_database_backup_task] AFTER INSERT ON [database_backup_task] " 369 " BEGIN " 370 " UPDATE " 371 " [database_backup_task] " 372 " SET " 373 " [backup_time] = STRFTIME ('%s', 'now') " 374 " WHERE " 375 " [id] = [NEW].[id]; " 376 " END "; 377 378 constexpr const char *CREATE_CONTACT_INDEX_DATA1 = 379 "CREATE INDEX IF NOT EXISTS [contact_data_type_contact_data_index] " 380 "ON [contact_data] ([type_id],[detail_info])"; 381 constexpr const char *CREATE_CONTACT_INDEX_DATA2 = 382 "CREATE INDEX IF NOT EXISTS [contact_data_raw_contact_id] " 383 "ON [contact_data] ([raw_contact_id])"; 384 385 constexpr const char *CREATE_SEARCH_CONTACT_INDEX1 = 386 "CREATE INDEX IF NOT EXISTS [search_contact_id_index] " 387 "ON [search_contact] ([contact_id])"; 388 constexpr const char *CREATE_SEARCH_CONTACT_INDEX2 = 389 "CREATE INDEX IF NOT EXISTS [search_raw_contact_id_index] " 390 "ON [search_contact] ([raw_contact_id])"; 391 392 constexpr const char *CREATE_RAW_CONTACT_INDEX = 393 "CREATE INDEX IF NOT EXISTS [raw_contact_id_index] " 394 "ON [raw_contact] ([contact_id])"; 395 396 constexpr const char *CREATE_VIEW_CONTACT = 397 "CREATE VIEW IF NOT EXISTS[view_contact] AS SELECT " 398 "[contact].[id] AS [id], " 399 "[contact].[photo_id] AS [photo_id], " 400 "[contact].[photo_file_id] AS [photo_file_id], " 401 "[contact].[quick_search_key] AS [quick_search_key], " 402 "[contact].[has_phone_number] AS [has_phone_number], " 403 "[contact].[has_display_name] AS [has_display_name], " 404 "[contact].[has_email] AS [has_email], " 405 "[contact].[has_group] AS [has_group], " 406 "[name_raw_contact_id], " 407 "[name_raw_contact].[account_id] AS [account_id], " 408 "[name_raw_contact].[is_transfer_voicemail] AS [is_transfer_voicemail], " 409 "[name_raw_contact].[personal_ringtone] AS [personal_ringtone], " 410 "[name_raw_contact].[is_deleted] AS [is_deleted], " 411 "[name_raw_contact].[photo_first_name] AS [photo_first_name], " 412 "[name_raw_contact].[version] AS [version], " 413 "[name_raw_contact].[display_name] AS [display_name], " 414 "[name_raw_contact].[sort] AS [sort], " 415 "[name_raw_contact].[contacted_count] AS [contacted_count], " 416 "[name_raw_contact].[lastest_contacted_time] AS [lastest_contacted_time], " 417 "[name_raw_contact].[favorite] AS [favorite], " 418 "[name_raw_contact].[favorite_order] AS [favorite_order], " 419 "[name_raw_contact].[phonetic_name] AS [phonetic_name], " 420 "[name_raw_contact].[phonetic_name_type] AS [phonetic_name_type], " 421 "[name_raw_contact].[company] AS [company], " 422 "[name_raw_contact].[position] AS [position], " 423 "[name_raw_contact].[read_only] AS [read_only], " 424 "[name_raw_contact].[sort_first_letter] AS [sort_first_letter], " 425 "[name_raw_contact].[merge_mode] AS [merge_mode], " 426 "[name_raw_contact].[personal_notification_ringtone] AS [personal_notification_ringtone], " 427 "[name_raw_contact].[is_need_merge] AS [is_need_merge], " 428 "[name_raw_contact].[merge_status] AS [merge_status], " 429 "[name_raw_contact].[is_merge_target] AS [is_merge_target], " 430 "[name_raw_contact].[vibration_setting] AS [vibration_setting], " 431 "[name_raw_contact].[sync_id] AS [sync_id], " 432 "[name_raw_contact].[syn_1] AS [syn_1], " 433 "[name_raw_contact].[syn_2] AS [syn_2], " 434 "[name_raw_contact].[syn_3] AS [syn_3], " 435 "[name_raw_contact].[primary_contact] AS [primary_contact], " 436 "[name_raw_contact].[extra1] AS [extra1], " 437 "[name_raw_contact].[extra2] AS [extra2], " 438 "[name_raw_contact].[extra3] AS [extra3], " 439 "[name_raw_contact].[extra4] AS [extra4], " 440 "[account].[account_name] AS [account_name], " 441 "[account].[account_type] AS [account_type], " 442 "[photo_files].[file_size] AS [file_size], " 443 "[photo_files].[file_height] AS [file_height], " 444 "[photo_files].[file_width] AS [file_width] " 445 "FROM [contact] " 446 "JOIN [raw_contact] AS [name_raw_contact] " 447 "ON ([name_raw_contact_id] = [name_raw_contact].[id]) " 448 "LEFT JOIN [account] ON " 449 "([name_raw_contact].[account_id] = [account].[id]) " 450 "LEFT JOIN [photo_files] ON " 451 "([photo_files].[id] = [contact].[photo_file_id])"; 452 453 constexpr const char *CREATE_VIEW_RAW_CONTACT = 454 "CREATE VIEW IF NOT EXISTS [view_raw_contact] AS SELECT " 455 "[contact_id], " 456 "[raw_contact].[id] AS [id], " 457 "[raw_contact].[account_id] AS [account_id], " 458 "[raw_contact].[photo_id] AS [photo_id], " 459 "[raw_contact].[photo_file_id] AS [photo_file_id], " 460 "[raw_contact].[is_transfer_voicemail] AS [is_transfer_voicemail], " 461 "[raw_contact].[personal_ringtone] AS [personal_ringtone], " 462 "[raw_contact].[is_deleted] AS [is_deleted], " 463 "[raw_contact].[photo_first_name] AS [photo_first_name], " 464 "[raw_contact].[version] AS [version], " 465 "[raw_contact].[display_name] AS [display_name], " 466 "[raw_contact].[sort] AS [sort], " 467 "[raw_contact].[contacted_count] AS [contacted_count], " 468 "[raw_contact].[lastest_contacted_time] AS [lastest_contacted_time], " 469 "[raw_contact].[favorite] AS [favorite], " 470 "[raw_contact].[favorite_order] AS [favorite_order], " 471 "[raw_contact].[phonetic_name] AS [phonetic_name], " 472 "[raw_contact].[phonetic_name_type] AS [phonetic_name_type], " 473 "[raw_contact].[company] AS [company], " 474 "[raw_contact].[position] AS [position], " 475 "[raw_contact].[read_only] AS [read_only], " 476 "[raw_contact].[sort_first_letter] AS [sort_first_letter], " 477 "[raw_contact].[merge_mode] AS [merge_mode], " 478 "[raw_contact].[is_need_merge] AS [is_need_merge], " 479 "[raw_contact].[merge_status] AS [merge_status], " 480 "[raw_contact].[is_merge_target] AS [is_merge_target], " 481 "[raw_contact].[vibration_setting] AS [vibration_setting], " 482 "[raw_contact].[sync_id] AS [sync_id], " 483 "[raw_contact].[personal_notification_ringtone] AS [personal_notification_ringtone], " 484 "[raw_contact].[syn_1] AS [syn_1], " 485 "[raw_contact].[syn_2] AS [syn_2], " 486 "[raw_contact].[syn_3] AS [syn_3], " 487 "[raw_contact].[primary_contact] AS [primary_contact], " 488 "[raw_contact].[extra1] AS [extra1], " 489 "[raw_contact].[extra2] AS [extra2], " 490 "[raw_contact].[extra3] AS [extra3], " 491 "[raw_contact].[extra4] AS [extra4], " 492 "[photo_files].[file_size] AS [file_size], " 493 "[photo_files].[file_height] AS [file_height], " 494 "[photo_files].[file_width] AS [file_width], " 495 "[account].[account_name] AS [account_name], " 496 "[account].[account_type] AS [account_type] " 497 "FROM [raw_contact] " 498 "LEFT JOIN [account] ON " 499 "([raw_contact].[account_id] = [account].[id]) " 500 "LEFT JOIN [photo_files] ON " 501 "([photo_files].[id] = [photo_file_id])"; 502 503 constexpr const char *CREATE_VIEW_CONTACT_DATA = 504 "CREATE VIEW IF NOT EXISTS [view_contact_data] AS SELECT " 505 "[contact_data].[id] AS [id], " 506 "[contact_data].[type_id] AS [type_id], " 507 "[contact_data].[raw_contact_id] AS [raw_contact_id], " 508 "[contact_data].[read_only] AS [read_only], " 509 "[contact_data].[version] AS [version], " 510 "[contact_data].[family_name] AS [family_name], " 511 "[contact_data].[middle_name_phonetic] AS [middle_name_phonetic], " 512 "[contact_data].[given_name] AS [given_name], " 513 "[contact_data].[given_name_phonetic] AS [given_name_phonetic], " 514 "[contact_data].[is_preferred_number] AS [is_preferred_number], " 515 "[contact_data].[phonetic_name] AS [phonetic_name], " 516 "[contact_data].[detail_info] AS [detail_info], " 517 "[contact_data].[alias_detail_info] AS [alias_detail_info], " 518 "[contact_data].[position] AS [position], " 519 "[contact_data].[extend1] AS [extend1], " 520 "[contact_data].[extend2] AS [extend2], " 521 "[contact_data].[extend3] AS [extend3], " 522 "[contact_data].[extend4] AS [extend4], " 523 "[contact_data].[alpha_name] AS [alpha_name], " 524 "[contact_data].[other_lan_last_name] AS [other_lan_last_name], " 525 "[contact_data].[other_lan_first_name] AS [other_lan_first_name], " 526 "[contact_data].[extend5] AS [extend5], " 527 "[contact_data].[lan_style] AS [lan_style], " 528 "[contact_data].[custom_data] AS [custom_data], " 529 "[contact_data].[extend6] AS [extend6], " 530 "[contact_data].[extend7] AS [extend7], " 531 "[contact_data].[blob_data] AS [blob_data], " 532 "[contact_data].[syn_1] AS [syn_1], " 533 "[contact_data].[city] AS [city], " 534 "[contact_data].[syn_2] AS [syn_2], " 535 "[contact_data].[syn_3] AS [syn_3], " 536 "[contact_data].[country] AS [country], " 537 "[contact_data].[neighborhood] AS [neighborhood], " 538 "[contact_data].[pobox] AS [pobox], " 539 "[contact_data].[postcode] AS [postcode], " 540 "[contact_data].[region] AS [region], " 541 "[contact_data].[street] AS [street], " 542 "[contact_data].[extend8] AS [extend8], " 543 "[contact_data].[extend9] AS [extend9], " 544 "[contact_data].[extend10] AS [extend10], " 545 "[contact_data].[extend11] AS [extend11], " 546 "[contact_type].[content_type] AS [content_type], " 547 "[account].[account_name] AS [account_name], " 548 "[account].[account_type] AS [account_type], " 549 "[account].[data_info] AS [data_info], " 550 "[account].[id] AS [account_id], " 551 "[groups].[id] AS [group_id], " 552 "[groups].[group_name] AS [group_name], " 553 "[groups].[group_notes] AS [group_notes], " 554 "[groups].[is_deleted] AS [group_is_deleted], " 555 "[groups].[group_ringtone] AS [group_ringtone], " 556 "[groups].[ringtone_modify_time] AS [ringtone_modify_time], " 557 "[groups].[lastest_modify_time] AS [lastest_modify_time], " 558 "[photo_files].[file_size] AS [file_size], " 559 "[photo_files].[file_height] AS [file_height], " 560 "[photo_files].[file_width] AS [file_width], " 561 "[contact].[id] AS [contact_id], " 562 "[contact].[photo_id] AS [photo_id], " 563 "[contact].[photo_file_id] AS [photo_file_id], " 564 "[contact].[personal_ringtone] AS [personal_ringtone], " 565 "[contact].[is_transfer_voicemail] AS [is_transfer_voicemail], " 566 "[contact].[company] AS [company], " 567 "[contact].[quick_search_key] AS [quick_search_key], " 568 "[contact].[personal_notification_ringtone] AS " 569 "[personal_notification_ringtone], " 570 "[contact].[has_phone_number] AS [has_phone_number], " 571 "[contact].[has_display_name] AS [has_display_name], " 572 "[contact].[has_email] AS [has_email], " 573 "[contact].[has_group] AS [has_group], " 574 "[raw_contact].[contacted_count] AS [contacted_count], " 575 "[raw_contact].[lastest_contacted_time] AS [lastest_contacted_time], " 576 "[raw_contact].[favorite] AS [favorite], " 577 "[raw_contact].[favorite_order] AS [favorite_order], " 578 "[raw_contact].[display_name] AS [display_name], " 579 "[raw_contact].[sort] AS [sort], " 580 "[raw_contact].[sort_first_letter] AS [sort_first_letter], " 581 "[raw_contact].[is_deleted] AS [is_deleted], " 582 "[raw_contact].[phonetic_name_type] AS [phonetic_name_type], " 583 "[raw_contact].[photo_first_name] AS [photo_first_name], " 584 "[raw_contact].[primary_contact] AS [primary_contact], " 585 "[raw_contact].[extra1] AS [extra1], " 586 "[raw_contact].[extra2] AS [extra2], " 587 "[raw_contact].[extra3] AS [extra3], " 588 "[raw_contact].[extra4] AS [extra4] " 589 "FROM [contact_data] " 590 "JOIN [raw_contact] ON " 591 "([contact_data].[raw_contact_id] = [raw_contact].[id]) " 592 "JOIN [contact] ON ([contact].[id] = [raw_contact].[contact_id]) " 593 "JOIN [raw_contact] AS [name_raw_contact] ON " 594 "([name_raw_contact_id] = [name_raw_contact].[id]) " 595 "LEFT JOIN [account] ON " 596 "([raw_contact].[account_id] = [account].[id]) " 597 "LEFT JOIN [contact_type] ON " 598 "([contact_type].[id] = [contact_data].[type_id]) " 599 "LEFT JOIN [groups] ON " 600 "([contact_type].[content_type] = 'group_membership' " 601 "AND [groups].[id] = [contact_data].[detail_info]) " 602 "LEFT JOIN [photo_files] ON " 603 "([contact_type].[content_type] = 'photo' " 604 "AND [photo_files].[id] = [raw_contact].[photo_file_id])"; 605 606 constexpr const char *CREATE_SEARCH_CONTACT_VIEW = 607 "CREATE VIEW IF NOT EXISTS [search_contact_view] AS SELECT " 608 "[search_contact].[id] AS [id], " 609 "[search_contact].[account_id] AS [account_id], " 610 "[search_contact].[contact_id] AS [contact_id], " 611 "[search_contact].[raw_contact_id] AS [raw_contact_id], " 612 "[search_contact].[search_name] AS [search_name], " 613 "[search_contact].[photo_id] AS [photo_id], " 614 "[search_contact].[photo_file_id] AS [photo_file_id], " 615 "[contact_type].[content_type] AS [content_type], " 616 "[account].[account_name] AS [account_name], " 617 "[account].[account_type] AS [account_type], " 618 "[account].[data_info] AS [data_info], " 619 "[groups].[group_name] AS [group_name], " 620 "[groups].[group_notes] AS [group_notes], " 621 "[groups].[is_deleted] AS [group_is_deleted], " 622 "[groups].[group_ringtone] AS [group_ringtone], " 623 "[groups].[ringtone_modify_time] AS [ringtone_modify_time], " 624 "[groups].[lastest_modify_time] AS [lastest_modify_time], " 625 "[photo_files].[file_size] AS [file_size], " 626 "[photo_files].[file_height] AS [file_height], " 627 "[photo_files].[file_width] AS [file_width], " 628 "[contact].[personal_ringtone] AS [personal_ringtone], " 629 "[contact].[is_transfer_voicemail] AS [is_transfer_voicemail], " 630 "[contact].[personal_notification_ringtone] AS " 631 "[personal_notification_ringtone], " 632 "[contact].[has_phone_number] AS [has_phone_number], " 633 "[contact].[has_display_name] AS [has_display_name], " 634 "[contact].[has_email] AS [has_email], " 635 "[contact].[has_group] AS [has_group], " 636 "[raw_contact].[contacted_count] AS [contacted_count], " 637 "[raw_contact].[favorite] AS [favorite], " 638 "[raw_contact].[favorite_order] AS [favorite_order], " 639 "[raw_contact].[display_name] AS [display_name], " 640 "[raw_contact].[lastest_contacted_time] AS [lastest_contacted_time], " 641 "[raw_contact].[sort_first_letter] AS [sort_first_letter], " 642 "[raw_contact].[sort] AS [sort], " 643 "[raw_contact].[photo_first_name] AS [photo_first_name], " 644 "[raw_contact].[personal_notification_ringtone] AS [personal_notification_ringtone], " 645 "[raw_contact].[is_deleted] AS [is_deleted], " 646 "[raw_contact].[primary_contact] AS [primary_contact], " 647 "[raw_contact].[extra1] AS [extra1], " 648 "[raw_contact].[extra2] AS [extra2], " 649 "[raw_contact].[extra3] AS [extra3], " 650 "[raw_contact].[extra4] AS [extra4], " 651 "[contact_data].[type_id] AS [type_id], " 652 "[contact_data].[phonetic_name] AS [phonetic_name], " 653 "[contact_data].[raw_contact_id] AS [raw_contact_id], " 654 "[contact_data].[read_only] AS [read_only], " 655 "[contact_data].[version] AS [version], " 656 "[contact_data].[alias_detail_info] AS [alias_detail_info], " 657 "[contact_data].[is_preferred_number] AS [is_preferred_number], " 658 "[contact_data].[detail_info] AS [detail_info], " 659 "[contact_data].[city] AS [city], " 660 "[contact_data].[position] AS [position], " 661 "[contact_data].[middle_name_phonetic] AS [middle_name_phonetic], " 662 "[contact_data].[given_name] AS [given_name], " 663 "[contact_data].[family_name] AS [family_name], " 664 "[contact_data].[given_name_phonetic] AS [given_name_phonetic], " 665 "[contact_data].[country] AS [country], " 666 "[contact_data].[neighborhood] AS [neighborhood], " 667 "[contact_data].[pobox] AS [pobox], " 668 "[contact_data].[postcode] AS [postcode], " 669 "[contact_data].[region] AS [region], " 670 "[contact_data].[street] AS [street], " 671 "[contact_data].[extend1] AS [extend1], " 672 "[contact_data].[extend2] AS [extend2], " 673 "[contact_data].[extend3] AS [extend3], " 674 "[contact_data].[extend4] AS [extend4], " 675 "[contact_data].[alpha_name] AS [alpha_name], " 676 "[contact_data].[other_lan_last_name] AS [other_lan_last_name], " 677 "[contact_data].[other_lan_first_name] AS [other_lan_first_name], " 678 "[contact_data].[extend5] AS [extend5], " 679 "[contact_data].[lan_style] AS [lan_style], " 680 "[contact_data].[custom_data] AS [custom_data], " 681 "[contact_data].[extend6] AS [extend6], " 682 "[contact_data].[extend7] AS [extend7], " 683 "[contact_data].[blob_data] AS [blob_data], " 684 "[contact_data].[syn_1] AS [syn_1], " 685 "[contact_data].[syn_2] AS [syn_2], " 686 "[contact_data].[syn_3] AS [syn_3], " 687 "[contact_data].[extend8] AS [extend8], " 688 "[contact_data].[extend9] AS [extend9], " 689 "[contact_data].[extend10] AS [extend10], " 690 "[contact_data].[extend11] AS [extend11] " 691 "FROM [search_contact] " 692 "JOIN [raw_contact] ON " 693 "([search_contact].[raw_contact_id] = [raw_contact].[id]) " 694 "JOIN [contact] ON " 695 "([contact].[id] = [raw_contact].[contact_id]) " 696 "JOIN [raw_contact] AS [name_raw_contact] ON " 697 "([name_raw_contact_id] = [name_raw_contact].[id]) " 698 "LEFT JOIN [account] ON " 699 "([search_contact].[account_id] = [account].[id]) " 700 "LEFT JOIN [contact_data] ON " 701 "([contact_data].[raw_contact_id] = [raw_contact].[id]) " 702 "LEFT JOIN [contact_type] ON " 703 "([contact_data].[type_id] = [contact_type].[id]) " 704 "LEFT JOIN [groups] ON " 705 "([contact_type].[content_type] = 'group_membership' " 706 "AND [groups].[id] = [contact_data].[detail_info]) " 707 "LEFT JOIN [photo_files] ON " 708 "([contact_type].[content_type] = 'photo' " 709 "AND [photo_files].[id] = [search_contact].[photo_file_id])"; 710 711 constexpr const char *CREATE_VIEW_GROUPS = 712 "CREATE VIEW IF NOT EXISTS [view_groups] " 713 "AS SELECT " 714 "[groups].[id] AS [id], " 715 "[groups].[account_id] AS [account_id], " 716 "[account].[account_name] AS [account_name], " 717 "[account].[account_type] AS [account_type], " 718 "[groups].[group_name] AS [group_name] , " 719 "[groups].[group_notes] AS [group_notes] , " 720 "[groups].[is_deleted] AS [is_deleted] , " 721 "[groups].[group_ringtone] AS [group_ringtone], " 722 "[groups].[ringtone_modify_time] AS [ringtone_modify_time] , " 723 "[groups].[lastest_modify_time] AS [lastest_modify_time] " 724 "FROM [groups] " 725 "LEFT JOIN [account] ON ([groups].[account_id] = [account].[id])"; 726 727 constexpr const char *CREATE_VIEW_DELETED = 728 "CREATE VIEW IF NOT EXISTS [view_deleted] " 729 "AS SELECT " 730 "[deleted_raw_contact].[id] AS [id], " 731 "[contact].[id] AS [contact_id], " 732 "[contact].[photo_id] AS [photo_id], " 733 "[contact].[photo_file_id] AS [photo_file_id], " 734 "[contact].[quick_search_key] AS [quick_search_key], " 735 "[contact].[has_phone_number] AS [has_phone_number], " 736 "[contact].[has_display_name] AS [has_display_name], " 737 "[contact].[has_email] AS [has_email], " 738 "[contact].[has_group] AS [has_group], " 739 "[name_raw_contact].[account_id] AS [account_id], " 740 "[name_raw_contact].[id] AS [raw_contact_id], " 741 "[name_raw_contact].[is_transfer_voicemail] AS [is_transfer_voicemail], " 742 "[name_raw_contact].[personal_ringtone] AS [personal_ringtone], " 743 "[name_raw_contact].[is_deleted] AS [is_deleted], " 744 "[name_raw_contact].[version] AS [version], " 745 "[name_raw_contact].[display_name] AS [display_name], " 746 "[name_raw_contact].[sort] AS [sort], " 747 "[name_raw_contact].[contacted_count] AS [contacted_count], " 748 "[name_raw_contact].[lastest_contacted_time] AS [lastest_contacted_time], " 749 "[name_raw_contact].[favorite] AS [favorite], " 750 "[name_raw_contact].[favorite_order] AS [favorite_order], " 751 "[name_raw_contact].[personal_notification_ringtone] AS [personal_notification_ringtone], " 752 "[name_raw_contact].[phonetic_name] AS [phonetic_name], " 753 "[name_raw_contact].[phonetic_name_type] AS [phonetic_name_type], " 754 "[name_raw_contact].[company] AS [company], " 755 "[name_raw_contact].[position] AS [position], " 756 "[name_raw_contact].[read_only] AS [read_only], " 757 "[name_raw_contact].[sort_first_letter] AS [sort_first_letter], " 758 "[name_raw_contact].[merge_mode] AS [merge_mode], " 759 "[name_raw_contact].[is_need_merge] AS [is_need_merge], " 760 "[name_raw_contact].[merge_status] AS [merge_status], " 761 "[name_raw_contact].[is_merge_target] AS [is_merge_target], " 762 "[name_raw_contact].[vibration_setting] AS [vibration_setting], " 763 "[name_raw_contact].[photo_first_name] AS [photo_first_name], " 764 "[name_raw_contact].[sync_id] AS [sync_id], " 765 "[name_raw_contact].[syn_1] AS [syn_1], " 766 "[name_raw_contact].[syn_2] AS [syn_2], " 767 "[name_raw_contact].[syn_3] AS [syn_3], " 768 "[raw_contact].[primary_contact] AS [primary_contact], " 769 "[raw_contact].[extra1] AS [extra1], " 770 "[raw_contact].[extra2] AS [extra2], " 771 "[raw_contact].[extra3] AS [extra3], " 772 "[raw_contact].[extra4] AS [extra4], " 773 "[deleted_raw_contact].[delete_source] AS [delete_source]," 774 "[deleted_raw_contact].[delete_time] AS [delete_time], " 775 "[deleted_raw_contact].[delete_account] AS [delete_account], " 776 "[deleted_raw_contact].[backup_data] AS [backup_data], " 777 "[account].[account_name] AS [account_name], " 778 "[account].[account_type] AS [account_type], " 779 "[photo_files].[file_size] AS [file_size], " 780 "[photo_files].[file_height] AS [file_height], " 781 "[photo_files].[file_width] AS [file_width] " 782 "FROM [deleted_raw_contact] " 783 "LEFT JOIN [contact] ON ([contact].[id] = [deleted_raw_contact].[contact_id]) " 784 "LEFT JOIN [raw_contact] AS [name_raw_contact] ON ([name_raw_contact].[id] = " 785 "[deleted_raw_contact].[raw_contact_id] " 786 "AND [name_raw_contact].[is_deleted] = 1)" 787 "LEFT JOIN [account] ON ([name_raw_contact].[account_id] = [account].[id]) " 788 "LEFT JOIN [photo_files] ON ([photo_files].[id] = [name_raw_contact].[photo_file_id]) "; 789 790 constexpr const char *UPDATE_CONTACT_BY_INSERT_CONTACT_DATA = 791 "CREATE TRIGGER IF NOT EXISTS [update_contact_by_insert_contact_data] AFTER INSERT ON [contact_data] FOR EACH ROW " 792 "BEGIN " 793 "UPDATE " 794 "[contact] " 795 "SET " 796 "[has_display_name] = 1 " 797 "WHERE " 798 "[NEW].[raw_contact_id] = [name_raw_contact_id] " 799 "AND [NEW].[type_id] = 6 " 800 "AND [NEW].[detail_info] IS NOT NULL; " 801 "UPDATE " 802 "[contact] " 803 "SET " 804 "[has_email] = 1 " 805 "WHERE " 806 "[NEW].[raw_contact_id] = [name_raw_contact_id] " 807 "AND [NEW].[type_id] = 1 " 808 "AND [NEW].[detail_info] IS NOT NULL; " 809 "UPDATE " 810 "[contact] " 811 "SET " 812 "[has_group] = 1 " 813 "WHERE " 814 "[NEW].[raw_contact_id] = [name_raw_contact_id] " 815 "AND [NEW].[type_id] = 9 " 816 "AND [NEW].[detail_info] IS NOT NULL; " 817 "UPDATE " 818 "[contact] " 819 "SET " 820 "[has_phone_number] = 1 " 821 "WHERE " 822 "[NEW].[raw_contact_id] = [name_raw_contact_id] " 823 "AND [NEW].[type_id] = 5 " 824 "AND [NEW].[detail_info] IS NOT NULL; " 825 "END"; 826 827 constexpr const char *UPDATE_CONTACT_BY_DELETE_CONTACT_DATA = 828 "CREATE TRIGGER IF NOT EXISTS [update_contact_by_delete_contact_data] AFTER DELETE ON [contact_data] FOR EACH ROW " 829 "BEGIN " 830 "UPDATE " 831 "[contact] " 832 "SET " 833 "[has_display_name] = 0 " 834 "WHERE " 835 "[OLD].[raw_contact_id] = [name_raw_contact_id] " 836 "AND [OLD].[type_id] = 6; " 837 "UPDATE " 838 "[contact] " 839 "SET " 840 "[has_email] = 0 " 841 "WHERE " 842 "[OLD].[raw_contact_id] = [name_raw_contact_id] " 843 "AND [OLD].[type_id] = 1; " 844 "UPDATE " 845 "[contact] " 846 "SET " 847 "[has_group] = 0 " 848 "WHERE " 849 "[OLD].[raw_contact_id] = [name_raw_contact_id] " 850 "AND [OLD].[type_id] = 9; " 851 "UPDATE " 852 "[contact] " 853 "SET " 854 "[has_phone_number] = 0 " 855 "WHERE " 856 "[OLD].[raw_contact_id] = [name_raw_contact_id] " 857 "AND [OLD].[type_id] = 5; " 858 "END"; 859 860 constexpr const char *UPDATE_CONTACT_BY_UPDATE_CONTACT_DATA = 861 "CREATE TRIGGER IF NOT EXISTS [update_contact_by_update_contact_data] AFTER UPDATE ON [contact_data] FOR EACH ROW " 862 "BEGIN " 863 "UPDATE " 864 "[contact] " 865 "SET " 866 "[has_display_name] = 1 " 867 "WHERE " 868 "[NEW].[raw_contact_id] = [name_raw_contact_id] " 869 "AND [NEW].[type_id] = 6 " 870 "AND [NEW].[detail_info] IS NOT NULL; " 871 "UPDATE " 872 "[contact] " 873 "SET " 874 "[has_email] = 1 " 875 "WHERE " 876 "[NEW].[raw_contact_id] = [name_raw_contact_id] " 877 "AND [NEW].[type_id] = 1 " 878 "AND [NEW].[detail_info] IS NOT NULL; " 879 "UPDATE " 880 "[contact] " 881 "SET " 882 "[has_group] = 1 " 883 "WHERE " 884 "[NEW].[raw_contact_id] = [name_raw_contact_id] " 885 "AND [NEW].[type_id] = 9 " 886 "AND [NEW].[detail_info] IS NOT NULL; " 887 "UPDATE " 888 "[contact] " 889 "SET " 890 "[has_phone_number] = 1 " 891 "WHERE " 892 "[NEW].[raw_contact_id] = [name_raw_contact_id] " 893 "AND [NEW].[type_id] = 5 " 894 "AND [NEW].[detail_info] IS NOT NULL; " 895 "END"; 896 897 constexpr const char *INSERT_DELETE_RAW_CONTACT = 898 "CREATE TRIGGER IF NOT EXISTS insert_delete_raw_contact AFTER INSERT ON deleted_raw_contact " 899 "BEGIN " 900 "UPDATE deleted_raw_contact SET delete_time = STRFTIME('%s','now') WHERE id = NEW.id; " 901 "END"; 902 903 constexpr const char *UPDATE_RAW_CONTACT_VERSION = 904 "CREATE TRIGGER IF NOT EXISTS [update_raw_contact_version] AFTER UPDATE ON [raw_contact] " 905 "BEGIN " 906 "UPDATE " 907 "[raw_contact] " 908 "SET " 909 "[version] = [OLD].[version] + 1 " 910 "WHERE " 911 "[id] = [OLD].[id] AND [NEW].[is_deleted] != [OLD].[is_deleted]; " 912 "END"; 913 914 constexpr const char *UPDATE_CONTACT_DATA_VERSION = 915 "CREATE TRIGGER IF NOT EXISTS [update_contact_data_version] AFTER UPDATE ON [contact_data] " 916 "BEGIN " 917 "IF UPDATE " 918 "[version] RETURN; " 919 "UPDATE " 920 "[contact_data] " 921 "SET " 922 "[version] = [OLD].[version] + 1 " 923 "WHERE " 924 "[id] = [OLD].[id]; " 925 "END"; 926 927 constexpr const char *INSERT_CONTACT_QUICK_SEARCH = 928 "CREATE TRIGGER IF NOT EXISTS [insert_contact_quick_search]AFTER INSERT ON [contact] BEGIN " 929 "UPDATE [contact] SET [quick_search_key] = [NEW].[id] WHERE [id] = [NEW].[id]; END"; 930 931 constexpr const char *CALL_LOG_PHONE_NUMBER_INDEX = 932 "CREATE INDEX IF NOT EXISTS [calllog_phone_number_index] ON [calllog] ([phone_number])"; 933 934 constexpr const char *MERGE_INFO = 935 "CREATE TABLE IF NOT EXISTS [merge_info](" 936 "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " 937 "[raw_contact_id] INTEGER NOT NULL DEFAULT 0 )"; 938 939 constexpr const char *MERGE_INFO_INDEX = 940 "CREATE INDEX IF NOT EXISTS [merge_info_index] ON [merge_info] ([raw_contact_id])"; 941 } // namespace Contacts 942 } // namespace OHOS 943 #endif // COMMON_H 944