1/** 2 * @file Describe the file 3 * Copyright (c) 2023 Huawei Device Co., Ltd. 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17import ohosDataRdb from '@ohos.data.relationalStore'; 18import { EventColumns } from '@ohos/datastructure/src/main/ets/events/EventColumns'; 19import { InstancesColumns } from '@ohos/datastructure/src/main/ets/instances/InstancesColumns'; 20import { CalendarsColumns } from '@ohos/datastructure/src/main/ets/calendars/CalendarsColumns'; 21import { ColorsColumns } from '@ohos/datastructure/src/main/ets/colors/ColorsColumns'; 22import { RemindersColumns } from '@ohos/datastructure/src/main/ets/reminders/RemindersColumns'; 23import { AttendeesColumns } from '@ohos/datastructure/src/main/ets/attendees/AttendeesColumns'; 24import { CalendarAlertsColumns } from '@ohos/datastructure/src/main/ets/calendaralerts/CalendarAlertsColumns'; 25import { CalendarCacheColumns } from '@ohos/datastructure/src/main/ets/calendarcache/CalendarCacheColumns'; 26import { EventsRawTimesColumns } from '@ohos/datastructure/src/main/ets/eventsrawtimes/EventsRawTimesColumns'; 27import { 28 ExtendCalendarEventColumns 29} from '@ohos/datastructure/src/main/ets/extendcalendarevent/ExtendCalendarEventColumns'; 30import { 31 ExtendedPropertiesColumns 32} from '@ohos/datastructure/src/main/ets/extendedproperties/ExtendedPropertiesColumns'; 33import { SyncStateColumns } from '@ohos/datastructure/src/main/ets/syncstate/SyncStateColumns'; 34import { MapAddressHistoryColumns } from '@ohos/datastructure/src/main/ets/location/MapAddressHistoryColumns'; 35import { SyncStateMetadataColumns } from '@ohos/datastructure/src/main/ets/syncstate/SyncStateMetadataColumns'; 36import { Constants } from '@ohos/datastructure/src/main/ets/Constants'; 37import { CalendarMetaDataColumns } from '@ohos/datastructure/src/main/ets/calendarmetadata/CalendarMetaDataColumns'; 38import { Log } from '@ohos/common/src/main/ets/utils/Log'; 39import { GlobalThis } from '@ohos/common/src/main/ets/utils/GlobalThis'; 40 41/** 42 * the create Events table sql. OS has a limit of 1024 bytes for each sql string, and this sql string is beyond 43 * 1024 bytes, so we don't use this sql directly now. 44 */ 45let CREATE_EVENTS_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ${EventColumns.TABLE_NAME} (` 46 + `${EventColumns.ID} INTEGER PRIMARY KEY AUTOINCREMENT, ` 47 + `${EventColumns.SYNC_ID} TEXT, ` 48 + `${EventColumns.DIRTY} INTEGER, ` 49 + `${EventColumns.MUTATORS} TEXT, ` 50+ `${EventColumns.EVENT_CALENDAR_TYPE} INTEGER NOT NULL DEFAULT 0), ` 51+ `${EventColumns.EVENT_IMAGE_TYPE} TEXT, ` 52+ `${EventColumns.LAST_SYNCED} INTEGER DEFAULT 0, ` 53+ `${EventColumns.CALENDAR_ID} INTEGER NOT NULL, ` 54+ `${EventColumns.TITLE} TEXT, ` 55+ `${EventColumns.EVENT_LOCATION} TEXT, ` 56+ `${EventColumns.LOCATION_LONGITUDE} TEXT, ` 57+ `${EventColumns.LOCATION_LATITUDE} TEXT, ` 58+ `${EventColumns.DESCRIPTION} TEXT, ` 59+ `${EventColumns.EVENT_COLOR} INTEGER, ` 60+ `${EventColumns.EVENT_COLOR_INDEX} TEXT, ` 61+ `${EventColumns.EVENT_STATUS} INTEGER, ` 62+ `${EventColumns.SELF_ATTENDEE_STATUS} INTEGER NOT NULL DEFAULT 0, ` 63+ `${EventColumns.DTSTART} INTEGER, ` 64+ `${EventColumns.DTEND} INTEGER, ` 65+ `${EventColumns.EVENT_TIMEZONE} TEXT, ` 66+ `${EventColumns.DURATION} TEXT, ` 67+ `${EventColumns.ALLDAY} INTEGER NOT NULL DEFAULT 0, ` 68+ `${EventColumns.ACCESS_LEVEL} INTEGER NOT NULL DEFAULT 0, ` 69+ `${EventColumns.AVAILABILITY} INTEGER NOT NULL DEFAULT 0, ` 70+ `${EventColumns.HAS_ALARM} INTEGER NOT NULL DEFAULT 0, ` 71+ `${EventColumns.HAS_EXTENDED_PROPERTIES} INTEGER NOT NULL DEFAULT 0, ` 72+ `${EventColumns.RRULE} TEXT, ` 73+ `${EventColumns.RDATE} TEXT, ` 74+ `${EventColumns.EXRULE} TEXT, ` 75+ `${EventColumns.EXDATE} TEXT, ` 76+ `${EventColumns.ORIGINAL_ID} INTEGER, ` 77+ `${EventColumns.ORIGINAL_SYNC_ID} TEXT, ` 78+ `${EventColumns.ORIGINAL_INSTANCE_TIME} INTEGER, ` 79+ `${EventColumns.ORIGINAL_ALL_DAY} INTEGER, ` 80+ `${EventColumns.LAST_DATE} INTEGER, ` 81+ `${EventColumns.EVENT_TIME_STAMP} INTEGER NOT NULL DEFAULT 0, ` 82+ `${EventColumns.HAS_ATTENDEE_DATE} INTEGER NOT NULL DEFAULT 0, ` 83+ `${EventColumns.GUESTS_CAN_MODIFY} INTEGER NOT NULL DEFAULT 0, ` 84+ `${EventColumns.GUESTS_CAN_INVITE_OTHERS} INTEGER NOT NULL DEFAULT 1, ` 85+ `${EventColumns.GUESTS_CAN_SEE_GUESTS} INTEGER NOT NULL DEFAULT 1, ` 86+ `${EventColumns.ORGANIZER} TEXT, ` //STRING 87+ `${EventColumns.IS_ORGANIZER} INTEGER, ` 88+ `${EventColumns.DELETED} INTEGER NOT NULL DEFAULT 0, ` 89+ `${EventColumns.EVENT_END_TIMEZONE} TEXT, ` 90+ `${EventColumns.CUSTOM_APP_PACKAGE} TEXT, ` 91+ `${EventColumns.CUSTOM_APP_URI} TEXT, ` 92+ `${EventColumns.UID2445} TEXT, ` 93+ `${EventColumns.VERSION} INTEGER NOT NULL DEFAULT 0, ` 94+ `${EventColumns.EVENT_UUID} TEXT, ` 95+ `${EventColumns.HWEXT_ALERT_TYPE} INTEGER NOT NULL DEFAULT 0, ` 96+ `${EventColumns.IMPORTANT_EVENT_TYPE} INTEGER NOT NULL DEFAULT 0, ` 97+ `${EventColumns.SYNC_DATA1} TEXT, ` 98+ `${EventColumns.SYNC_DATA2} TEXT, ` 99+ `${EventColumns.SYNC_DATA3} TEXT, ` 100+ `${EventColumns.SYNC_DATA4} TEXT, ` 101+ `${EventColumns.SYNC_DATA5} TEXT, ` 102+ `${EventColumns.SYNC_DATA6} TEXT, ` 103+ `${EventColumns.SYNC_DATA7} TEXT, ` 104+ `${EventColumns.SYNC_DATA8} TEXT, ` 105+ `${EventColumns.SYNC_DATA9} TEXT, ` 106+ `${EventColumns.SYNC_DATA10} TEXT, ` 107+ `${EventColumns.KV_SYNC} INTEGER NOT NULL DEFAULT 0, ` 108+ `${EventColumns.KV_SYNC_TIME} INTEGER NOT NULL DEFAULT 0, ` 109+ `${EventColumns.CREATOR} TEXT NOT NULL)`; 110 111/** 112 * the create Calendars table sql 113 */ 114let CREATE_CALENDARS_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ${CalendarsColumns.TABLE_NAME} (` 115+ `${CalendarsColumns.ID} INTEGER PRIMARY KEY, ` 116+ `${CalendarsColumns.ACCOUNT_NAME} TEXT, ` 117+ `${CalendarsColumns.ACCOUNT_TYPE} TEXT, ` 118+ `${CalendarsColumns.SYNC_ID} TEXT, ` 119+ `${CalendarsColumns.DIRTY} INTEGER, ` 120+ `${CalendarsColumns.MUTATORS} TEXT, ` 121+ `${CalendarsColumns.NAME} TEXT, ` 122+ `${CalendarsColumns.CALENDAR_DISPLAY_NAME} TEXT, ` 123+ `${CalendarsColumns.CALENDAR_COLOR} INTEGER, ` 124+ `${CalendarsColumns.CALENDAR_COLOR_INDEX} TEXT, ` 125+ `${CalendarsColumns.CALENDAR_ACCESS_LEVEL} INTEGER, ` 126+ `${CalendarsColumns.VISIBLE} INTEGER NOT NULL DEFAULT 1, ` 127+ `${CalendarsColumns.SYNC_EVENTS} INTEGER NOT NULL DEFAULT 0, ` 128+ `${CalendarsColumns.CALENDAR_LOCATION} TEXT, ` 129+ `${CalendarsColumns.CALENDAR_TIMEZONE} TEXT, ` 130+ `${CalendarsColumns.OWNER_ACCOUNT} TEXT, ` 131+ `${CalendarsColumns.IS_PRIMARY} INTEGER, ` 132+ `${CalendarsColumns.CAN_ORGANIZER_RESPOND} INTEGER NOT NULL DEFAULT 1, ` 133+ `${CalendarsColumns.CAN_MODIFY_TIMEZONE} INTEGER DEFAULT 1, ` 134+ `${CalendarsColumns.CAN_PARTIALLY_UPDATE} INTEGER DEFAULT 0, ` 135+ `${CalendarsColumns.MAX_REMINDERS} INTEGER DEFAULT 5, ` 136+ `${CalendarsColumns.ALLOWED_REMINDERS} TEXT DEFAULT '0,1', ` 137+ `${CalendarsColumns.ALLOWED_AVAILABILITY} TEXT DEFAULT '0,1', ` 138+ `${CalendarsColumns.ALLOWED_ATTENDEE_TYPES} TEXT DEFAULT '0,1,2', ` 139+ `${CalendarsColumns.DELETED} INTEGER NOT NULL DEFAULT 0, ` 140+ `${CalendarsColumns.CALENDAR_TIME_STAMP} INTEGER NOT NULL DEFAULT 0, ` 141+ `${CalendarsColumns.CAL_SYNC1} TEXT, ` 142+ `${CalendarsColumns.CAL_SYNC2} TEXT, ` 143+ `${CalendarsColumns.CAL_SYNC3} TEXT, ` 144+ `${CalendarsColumns.CAL_SYNC4} TEXT, ` 145+ `${CalendarsColumns.CAL_SYNC5} TEXT, ` 146+ `${CalendarsColumns.CAL_SYNC6} TEXT, ` 147+ `${CalendarsColumns.CAL_SYNC7} TEXT, ` 148+ `${CalendarsColumns.CAL_SYNC8} TEXT, ` 149+ `${CalendarsColumns.CAL_SYNC9} TEXT, ` 150+ `${CalendarsColumns.CAL_SYNC10} TEXT, ` 151+ `${CalendarsColumns.CAN_REMINDER} INTEGER NOT NULL DEFAULT 1, ` 152+ `${CalendarsColumns.CREATOR} TEXT NOT NULL)`; 153 154/** 155 * the create Reminders table sql 156 */ 157let CREATE_REMINDERS_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ${RemindersColumns.TABLE_NAME} (` 158+ `${RemindersColumns.ID} INTEGER PRIMARY KEY, ` 159+ `${RemindersColumns.EVENT_ID} INTEGER, ` 160+ `${RemindersColumns.MINUTES} INTEGER, ` 161+ `${RemindersColumns.METHOD} INTEGER NOT NULL DEFAULT 0, ` 162+ `${RemindersColumns.CREATOR} TEXT NOT NULL)`; 163 164/** 165 * the create Instances table sql 166 */ 167let CREATE_INSTANCES_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ${InstancesColumns.TABLE_NAME} (` 168+ `${InstancesColumns.ID} INTEGER PRIMARY KEY, ` 169+ `${InstancesColumns.EVENT_ID} INTEGER, ` 170+ `${InstancesColumns.BEGIN} INTEGER, ` 171+ `${InstancesColumns.END} INTEGER, ` 172+ `${InstancesColumns.START_DAY} INTEGER, ` 173+ `${InstancesColumns.END_DAY} INTEGER, ` 174+ `${InstancesColumns.START_MINUTE} INTEGER, ` 175+ `${InstancesColumns.END_MINUTE} INTEGER, ` 176+ `${InstancesColumns.CREATOR} TEXT NOT NULL,` 177+ `UNIQUE (${InstancesColumns.EVENT_ID},${InstancesColumns.BEGIN},` 178+ `${InstancesColumns.END}))`; 179 180/** 181 * the create Colors table sql 182 */ 183let CREATE_COLORS_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ${ColorsColumns.TABLE_NAME} (` 184+ `${ColorsColumns.ID} INTEGER PRIMARY KEY, ` 185+ `${ColorsColumns.ACCOUNT_NAME} TEXT NOT NULL, ` 186+ `${ColorsColumns.ACCOUNT_TYPE} TEXT NOT NULL, ` 187+ `${ColorsColumns.DATA} TEXT, ` 188+ `${ColorsColumns.COLOR_TYPE} INTEGER NOT NULL, ` 189+ `${ColorsColumns.COLOR_INDEX} TEXT NOT NULL, ` 190+ `${ColorsColumns.COLOR} INTEGER NOT NULL)`; 191 192/** 193 * the create Attendees table sql 194 */ 195let CREATE_ATTENDEES_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ${AttendeesColumns.TABLE_NAME} (` 196+ `${AttendeesColumns.ID} INTEGER PRIMARY KEY, ` 197+ `${AttendeesColumns.EVENT_ID} INTEGER, ` 198+ `${AttendeesColumns.ATTENDEE_NAME} TEXT, ` 199+ `${AttendeesColumns.ATTENDEE_EMAIL} TEXT, ` 200+ `${AttendeesColumns.ATTENDEE_STATUS} INTEGER, ` 201+ `${AttendeesColumns.ATTENDEE_RELATIONSHIP} INTEGER, ` 202+ `${AttendeesColumns.ATTENDEE_TYPE} INTEGER, ` 203+ `${AttendeesColumns.ATTENDEE_IDENTITY} TEXT, ` 204+ `${AttendeesColumns.ATTENDEE_ID_NAMESPACE} TEXT)`; 205 206/** 207 * the create CalendarAlerts table sql 208 */ 209let CREATE_CALENDAR_ALERTS_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ${CalendarAlertsColumns.TABLE_NAME} (` 210+ `${CalendarAlertsColumns.ID} INTEGER PRIMARY KEY, ` 211+ `${CalendarAlertsColumns.EVENT_ID} INTEGER, ` 212+ `${CalendarAlertsColumns.BEGIN} INTEGER NOT NULL, ` 213+ `${CalendarAlertsColumns.END} INTEGER NOT NULL, ` 214+ `${CalendarAlertsColumns.ALARM_TIME} INTEGER NOT NULL, ` 215+ `${CalendarAlertsColumns.CREATION_TIME} INTEGER NOT NULL DEFAULT 0, ` 216+ `${CalendarAlertsColumns.RECEIVED_TIME} INTEGER NOT NULL DEFAULT 0, ` 217+ `${CalendarAlertsColumns.NOTIFY_TIME} INTEGER NOT NULL DEFAULT 0, ` 218+ `${CalendarAlertsColumns.STATE} INTEGER NOT NULL, ` 219+ `${CalendarAlertsColumns.MINUTES} INTEGER, ` 220+ `${CalendarAlertsColumns.CREATOR} TEXT NOT NULL,` 221+ `UNIQUE (${CalendarAlertsColumns.ALARM_TIME},${CalendarAlertsColumns.BEGIN},` 222+ `${CalendarAlertsColumns.EVENT_ID}))`; 223 224/** 225 * the create CalendarCache table sql 226 */ 227let CREATE_CALENDAR_CACHE_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ${CalendarCacheColumns.TABLE_NAME} (` 228+ `${CalendarCacheColumns.ID} INTEGER PRIMARY KEY, ` 229+ `${CalendarCacheColumns.KEY} TEXT NOT NULL, ` 230+ `${CalendarCacheColumns.VALUE} TEXT)`; 231 232/** 233 * the create CalendarMetaData table sql 234 */ 235let CREATE_CALENDAR_METADATA_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ` 236+ `${CalendarMetaDataColumns.TABLE_NAME} (` 237+ `${CalendarMetaDataColumns.ID} INTEGER PRIMARY KEY, ` 238+ `${CalendarMetaDataColumns.LOCAL_TIME_ZONE} TEXT, ` 239+ `${CalendarMetaDataColumns.MIN_INSTANCE} INTEGER, ` 240+ `${CalendarMetaDataColumns.MAX_INSTANCE} INTEGER)`; 241 242/** 243 * the create EventsRawTimes table sql 244 */ 245let CREATE_EVENTS_RAW_TIMES_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ` 246 + `${EventsRawTimesColumns.TABLE_NAME} (` 247 + `${EventsRawTimesColumns.ID} INTEGER PRIMARY KEY, ` 248 + `${EventsRawTimesColumns.EVENT_ID} INTEGER NOT NULL, ` 249 + `${EventsRawTimesColumns.DT_START_2445} TEXT, ` 250 + `${EventsRawTimesColumns.DT_END_2445} TEXT, ` 251+ `${EventsRawTimesColumns.ORIGINAL_INSTANCE_TIME2445} TEXT, ` 252+ `${EventsRawTimesColumns.LAST_DATE2445} TEXT, ` 253+ `UNIQUE (${EventsRawTimesColumns.EVENT_ID}))`; 254 255/** 256 * the create map_address_history table sql 257 */ 258let CREATE_MAP_ADDRESS_HISTORY_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ` 259+ `${MapAddressHistoryColumns.TABLE_NAME} (` 260+ `${MapAddressHistoryColumns.ID} INTEGER PRIMARY KEY AUTOINCREMENT, ` 261+ `${MapAddressHistoryColumns.ADDRESS} TEXT, ` 262+ `${MapAddressHistoryColumns.NAME} TEXT, ` 263+ `${MapAddressHistoryColumns.LAT} TEXT, ` 264+ `${MapAddressHistoryColumns.LON} TEXT, ` 265+ `${MapAddressHistoryColumns.TIME} TEXT, ` 266+ `${MapAddressHistoryColumns.DATA1} TEXT, ` 267+ `${MapAddressHistoryColumns.DATA2} TEXT)`; 268 269/** 270 * the create ExtendedProperties table sql 271 */ 272let CREATE_EXTENDED_PROPERTIES_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ` 273+ `${ExtendedPropertiesColumns.TABLE_NAME} (` 274+ `${ExtendedPropertiesColumns.ID} INTEGER PRIMARY KEY, ` 275+ `${ExtendedPropertiesColumns.EVENT_ID} INTEGER, ` 276+ `${ExtendedPropertiesColumns.NAME} TEXT, ` 277+ `${ExtendedPropertiesColumns.VALUE} TEXT)`; 278 279/** 280 * the create _sync_state table sql 281 */ 282let CREATE_SYNC_STATE_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ${SyncStateColumns.TABLE_NAME} (` 283+ `${SyncStateColumns.ID} INTEGER PRIMARY KEY, ` 284+ `${SyncStateColumns.ACCOUNT_NAME} TEXT NOT NULL, ` 285+ `${SyncStateColumns.ACCOUNT_TYPE} TEXT NOT NULL, ` 286+ `${SyncStateColumns.DATA} TEXT NOT NULL, ` 287+ `UNIQUE (${SyncStateColumns.ACCOUNT_NAME},${SyncStateColumns.ACCOUNT_TYPE}))`; 288 289/** 290 * the create _sync_state_metadata table sql 291 */ 292let CREATE_SYNC_STATE_METADATA_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ` 293+ `${SyncStateMetadataColumns.TABLE_NAME} (` 294+ `${SyncStateMetadataColumns.VERSION} INTEGER)`; 295 296/** 297 * the create ExtendCalendarEvent table sql 298 */ 299let CREATE_EXTEND_CALENDAR_EVENT_TABLE_NAME_SQL = `CREATE TABLE IF NOT EXISTS ` 300+ `${ExtendCalendarEventColumns.TABLE_NAME} (` 301+ `${ExtendCalendarEventColumns.ID} INTEGER PRIMARY KEY, ` 302+ `${ExtendCalendarEventColumns.HWEXT_EVENT_ID} INTEGER, ` 303+ `${ExtendCalendarEventColumns.HWEXT_TYPE} INTEGER, ` 304+ `${ExtendCalendarEventColumns.HWEXT_APP_URI} TEXT, ` 305+ `${ExtendCalendarEventColumns.HWEXT_APP_NAME} TEXT, ` 306+ `${ExtendCalendarEventColumns.HWEXT_ACTION} TEXT, ` 307+ `${ExtendCalendarEventColumns.HWEXT_METHOD} INTEGER, ` 308+ `${ExtendCalendarEventColumns.HWEXT_SUPPORT_MIN_VERSION} INTEGER, ` 309+ `${ExtendCalendarEventColumns.HWEXT_STATUS} INTEGER, ` 310+ `${ExtendCalendarEventColumns.HWEXT_DESCRIPTION} TEXT)`; 311 312let TAG = "CalendarDataHelper" 313 314/** 315 * the class to initialize the calendar database 316 * 317 * @since 2022-04-06 318 */ 319class CalendarDataHelper { 320 private static instance: CalendarDataHelper; 321 322 private rdbStore: ohosDataRdb.RdbStore | null = null; 323 324 private constructor() { 325 } 326 327 /** 328 * get the instance of CalendarDataHelper class 329 */ 330 public static getInstance() { 331 if (!CalendarDataHelper.instance) { 332 Log.log(TAG, 'call getInstance init'); 333 CalendarDataHelper.instance = new CalendarDataHelper(); 334 } 335 return CalendarDataHelper.instance; 336 } 337 338 /** 339 * get the instance of rdbStore 340 */ 341 public async getRdbStore() { 342 if (this.rdbStore === null || this.rdbStore === undefined) { 343 await CalendarDataHelper.getInstance().initRdbStore(); 344 } 345 return this.rdbStore; 346 } 347 348 private async initRdbStore() { 349 Log.log(TAG, 'call initRdbStore start'); 350 this.rdbStore = await ohosDataRdb.getRdbStore(GlobalThis.getExtensionContext(), { 351 name: Constants.DB_NAME, 352 securityLevel: ohosDataRdb.SecurityLevel.S1, 353 }); 354 if (this.rdbStore == null || this.rdbStore == undefined) { 355 Log.error(TAG, 'initRdbStore rdbStore is null'); 356 return; 357 } 358 try { 359 await this.createEventsTable(); 360 Log.log(TAG, "initRdbStore createEventsTable succeed"); 361 } catch (err) { 362 Log.error(TAG, `initRdbStore createEventsTable get err:${err}`); 363 } 364 Log.log(TAG, "initRdbStore executeSql start"); 365 await this.rdbStore?.executeSql(CREATE_CALENDARS_TABLE_SQL, []); 366 Log.log(TAG, "initRdbStore createCalendarsTable succeed"); 367 await this.rdbStore?.executeSql(CREATE_REMINDERS_TABLE_SQL, []); 368 Log.log(TAG, "initRdbStore CREATE_REMINDERS_TABLE_SQL succeed"); 369 await this.rdbStore?.executeSql(CREATE_INSTANCES_TABLE_SQL, []); 370 Log.log(TAG, "initRdbStore CREATE_INSTANCES_TABLE_SQL succeed"); 371 await this.rdbStore?.executeSql(CREATE_COLORS_TABLE_SQL, []); 372 Log.log(TAG, "initRdbStore CREATE_COLORS_TABLE_SQL succeed"); 373 await this.rdbStore?.executeSql(CREATE_ATTENDEES_TABLE_SQL, []); 374 Log.log(TAG, "initRdbStore CREATE_ATTENDEES_TABLE_SQL succeed"); 375 await this.rdbStore?.executeSql(CREATE_CALENDAR_ALERTS_TABLE_SQL, []); 376 Log.log(TAG, "initRdbStore CREATE_CALENDAR_ALERTS_TABLE_SQL succeed"); 377 await this.rdbStore?.executeSql(CREATE_CALENDAR_CACHE_TABLE_SQL, []); 378 Log.log(TAG, "initRdbStore CREATE_CALENDAR_CACHE_TABLE_SQL succeed"); 379 await this.rdbStore?.executeSql(CREATE_CALENDAR_METADATA_TABLE_SQL, []); 380 Log.log(TAG, "initRdbStore CREATE_CALENDAR_METADATA_TABLE_SQL succeed"); 381 await this.rdbStore?.executeSql(CREATE_EVENTS_RAW_TIMES_TABLE_SQL, []); 382 Log.log(TAG, "initRdbStore CREATE_EVENTS_RAW_TIMES_TABLE_SQL succeed"); 383 await this.rdbStore?.executeSql(CREATE_MAP_ADDRESS_HISTORY_TABLE_SQL, []); 384 Log.log(TAG, "initRdbStore CREATE_MAP_ADDRESS_HISTORY_TABLE_SQL succeed"); 385 await this.rdbStore?.executeSql(CREATE_EXTENDED_PROPERTIES_TABLE_SQL, []); 386 Log.log(TAG, "initRdbStore CREATE_EXTENDED_PROPERTIES_TABLE_SQL succeed"); 387 await this.rdbStore?.executeSql(CREATE_SYNC_STATE_TABLE_SQL, []); 388 Log.log(TAG, "initRdbStore CREATE_SYNC_STATE_TABLE_SQL succeed"); 389 await this.rdbStore?.executeSql(CREATE_SYNC_STATE_METADATA_TABLE_SQL, []); 390 Log.log(TAG, "initRdbStore CREATE_SYNC_STATE_METADATA_TABLE_SQL succeed"); 391 await this.rdbStore?.executeSql(CREATE_EXTEND_CALENDAR_EVENT_TABLE_NAME_SQL, []); 392 Log.log(TAG, "initRdbStore CREATE_EXTEND_CALENDAR_EVENT_TABLE_NAME_SQL succeed"); 393 394 this.createSyncIdUpdateTrigger(); 395 Log.log(TAG, "initRdbStore createSyncIdUpdateTrigger succeed"); 396 this.createDeleteEventTriggers(); 397 Log.log(TAG, "initRdbStore createDeleteEventTriggers succeed"); 398 this.createColorsTriggers(); 399 Log.log(TAG, "initRdbStore createColorsTriggers succeed"); 400 this.createCalendarCleanupTrigger(); 401 Log.log(TAG, "initRdbStore createCalendarCleanupTrigger succeed"); 402 Log.log(TAG, "initRdbStore executeSql end"); 403 } 404 405 private async createEventsTable() { 406 // the database has a limit of 1024 byte for sql strings, so we create some fields in the create sql, 407 // other fields are added later. 408 Log.log(TAG, 'call createEventsTable start'); 409 let CREATE_EVENTS_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ${EventColumns.TABLE_NAME} (` 410 + `${EventColumns.ID} INTEGER PRIMARY KEY AUTOINCREMENT, ` 411 + `${EventColumns.SYNC_ID} TEXT, ` 412 + `${EventColumns.DIRTY} INTEGER, ` 413 + `${EventColumns.MUTATORS} TEXT, ` 414 + `${EventColumns.EVENT_CALENDAR_TYPE} INTEGER NOT NULL DEFAULT 0)`; 415 416 await this.rdbStore?.executeSql(CREATE_EVENTS_TABLE_SQL, []); 417 Log.log(TAG, 'call createEventsTable add column start'); 418 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 419 `${EventColumns.EVENT_IMAGE_TYPE} TEXT`, []); 420 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 421 `${EventColumns.LAST_SYNCED} INTEGER DEFAULT 0`, []); 422 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 423 `${EventColumns.CALENDAR_ID} INTEGER NOT NULL`, []); 424 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 425 `${EventColumns.TITLE} TEXT`, []); 426 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 427 `${EventColumns.EVENT_LOCATION} TEXT`, []); 428 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 429 `${EventColumns.LOCATION_LONGITUDE} TEXT`, []); 430 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 431 `${EventColumns.LOCATION_LATITUDE} TEXT`, []); 432 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 433 `${EventColumns.DESCRIPTION} TEXT`, []); 434 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 435 `${EventColumns.EVENT_COLOR} INTEGER`, []); 436 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 437 `${EventColumns.EVENT_COLOR_INDEX} TEXT`, []); 438 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 439 `${EventColumns.EVENT_STATUS} INTEGER`, []); 440 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 441 `${EventColumns.SELF_ATTENDEE_STATUS} INTEGER NOT NULL DEFAULT 0`, []); 442 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 443 `${EventColumns.DTSTART} INTEGER`, []); 444 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 445 `${EventColumns.DTEND} INTEGER`, []); 446 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 447 `${EventColumns.EVENT_TIMEZONE} TEXT`, []); 448 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 449 `${EventColumns.DURATION} TEXT`, []); 450 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 451 `${EventColumns.ALLDAY} INTEGER NOT NULL DEFAULT 0`, []); 452 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 453 `${EventColumns.ACCESS_LEVEL} INTEGER NOT NULL DEFAULT 0`, []); 454 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 455 `${EventColumns.AVAILABILITY} INTEGER NOT NULL DEFAULT 0`, []); 456 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 457 `${EventColumns.HAS_ALARM} INTEGER NOT NULL DEFAULT 0`, []); 458 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 459 `${EventColumns.HAS_EXTENDED_PROPERTIES} INTEGER NOT NULL DEFAULT 0`, []); 460 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ${EventColumns.RRULE} TEXT`, []); 461 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ${EventColumns.RDATE} TEXT`, []); 462 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ${EventColumns.EXRULE} TEXT`, []); 463 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ${EventColumns.EXDATE} TEXT`, []); 464 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 465 `${EventColumns.ORIGINAL_ID} INTEGER`, []); 466 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 467 `${EventColumns.ORIGINAL_SYNC_ID} TEXT`, []); 468 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 469 `${EventColumns.ORIGINAL_INSTANCE_TIME} INTEGER`, []); 470 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 471 `${EventColumns.ORIGINAL_ALL_DAY} INTEGER`, []); 472 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 473 `${EventColumns.LAST_DATE} INTEGER`, []); 474 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 475 `${EventColumns.EVENT_TIME_STAMP} INTEGER NOT NULL DEFAULT 0`, []); 476 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 477 `${EventColumns.HAS_ATTENDEE_DATE} INTEGER NOT NULL DEFAULT 0`, []); 478 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 479 `${EventColumns.GUESTS_CAN_MODIFY} INTEGER NOT NULL DEFAULT 0`, []); 480 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 481 `${EventColumns.GUESTS_CAN_INVITE_OTHERS} INTEGER NOT NULL DEFAULT 1`, []); 482 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 483 `${EventColumns.GUESTS_CAN_SEE_GUESTS} INTEGER NOT NULL DEFAULT 1`, []); 484 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 485 `${EventColumns.ORGANIZER} STRING`, []); 486 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 487 `${EventColumns.IS_ORGANIZER} INTEGER`, []); 488 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 489 `${EventColumns.DELETED} INTEGER NOT NULL DEFAULT 0`, []); 490 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 491 `${EventColumns.EVENT_END_TIMEZONE} TEXT`, []); 492 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 493 `${EventColumns.CUSTOM_APP_PACKAGE} TEXT`, []); 494 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 495 `${EventColumns.CUSTOM_APP_URI} TEXT`, []); 496 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ${EventColumns.UID2445} TEXT`, []); 497 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 498 `${EventColumns.VERSION} INTEGER NOT NULL DEFAULT 0`, []); 499 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 500 `${EventColumns.EVENT_UUID} TEXT`, []); 501 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 502 `${EventColumns.HWEXT_ALERT_TYPE} INTEGER NOT NULL DEFAULT 0`, []); 503 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 504 `${EventColumns.IMPORTANT_EVENT_TYPE} INTEGER NOT NULL DEFAULT 0`, []); 505 await this.rdbStore?.executeSql(`ALTER TABLE EVENTS ADD COLUMN ` + 506 `${EventColumns.SERVICE.SERVICE_VERIFIED} INTEGER`, []); 507 await this.rdbStore?.executeSql(`ALTER TABLE EVENTS ADD COLUMN ` + 508 `${EventColumns.SERVICE.SERVICE_TYPE} TEXT`, []); 509 await this.rdbStore?.executeSql(`ALTER TABLE EVENTS ADD COLUMN ` + 510 `${EventColumns.SERVICE.SERVICE_CP_BZ_URI} TEXT`, []); 511 await this.rdbStore?.executeSql(`ALTER TABLE EVENTS ADD COLUMN ` + 512 `${EventColumns.SERVICE.SERVICE_CP_MNG_URI} TEXT`, []); 513 await this.rdbStore?.executeSql(`ALTER TABLE EVENTS ADD COLUMN ` + 514 `${EventColumns.SERVICE.SERVICE_DESCRIPTION} TEXT`, []); 515 await this.rdbStore?.executeSql(`ALTER TABLE EVENTS ADD COLUMN ` + 516 `${EventColumns.SERVICE.SERVICE_MIN_VERSION} INTEGER`, []); 517 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 518 `${EventColumns.SYNC_DATA1} TEXT`, []); 519 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 520 `${EventColumns.SYNC_DATA2} TEXT`, []); 521 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 522 `${EventColumns.SYNC_DATA3} TEXT`, []); 523 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 524 `${EventColumns.SYNC_DATA4} TEXT`, []); 525 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 526 `${EventColumns.SYNC_DATA5} TEXT`, []); 527 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 528 `${EventColumns.SYNC_DATA6} TEXT`, []); 529 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 530 `${EventColumns.SYNC_DATA7} TEXT`, []); 531 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 532 `${EventColumns.SYNC_DATA8} TEXT`, []); 533 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 534 `${EventColumns.SYNC_DATA9} TEXT`, []); 535 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 536 `${EventColumns.SYNC_DATA10} TEXT`, []); 537 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 538 `${EventColumns.KV_SYNC} INTEGER NOT NULL DEFAULT 0`, []); 539 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 540 `${EventColumns.KV_SYNC_TIME} INTEGER NOT NULL DEFAULT 0`, []); 541 await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` + 542 `${EventColumns.CREATOR} TEXT NOT NULL`, []); 543 Log.log(TAG, 'call createEventsTable end'); 544 } 545 546 private async createDeleteEventTriggers() { 547 Log.log(TAG, 'call createDeleteEventTriggers start'); 548 let EVENTS_CLEANUP_TRIGGER_SQL = 549 `DELETE FROM ${InstancesColumns.TABLE_NAME}` + 550 ` WHERE ${InstancesColumns.EVENT_ID} = old.${EventColumns.ID};` + 551 `DELETE FROM ${EventsRawTimesColumns.TABLE_NAME}` + 552 ` WHERE ${EventsRawTimesColumns.EVENT_ID} = old.${EventColumns.ID};` + 553 `DELETE FROM ${AttendeesColumns.TABLE_NAME}` + 554 ` WHERE ${AttendeesColumns.EVENT_ID} = old.${EventColumns.ID};` + 555 `DELETE FROM ${ExtendCalendarEventColumns.TABLE_NAME}` + 556 ` WHERE ${ExtendCalendarEventColumns.HWEXT_EVENT_ID} = ` + 557 `old.${EventColumns.ID};` + 558 `DELETE FROM ${RemindersColumns.TABLE_NAME}` + 559 ` WHERE ${RemindersColumns.EVENT_ID} = old.${EventColumns.ID};` + 560 `DELETE FROM ${CalendarAlertsColumns.TABLE_NAME}` + 561 ` WHERE ${CalendarAlertsColumns.EVENT_ID} = old.${EventColumns.ID};` + 562 `DELETE FROM ${ExtendedPropertiesColumns.TABLE_NAME}` + 563 ` WHERE ${ExtendedPropertiesColumns.EVENT_ID} = old.${EventColumns.ID};` 564 565 let EVENTS_CLEANUP_TRIGGER = `CREATE TRIGGER events_cleanup_delete DELETE ON ` + 566 `${EventColumns.TABLE_NAME} BEGIN ${EVENTS_CLEANUP_TRIGGER_SQL} END` 567 await this.rdbStore?.executeSql(EVENTS_CLEANUP_TRIGGER, []); 568 Log.log(TAG, 'call createDeleteEventTriggers end'); 569 } 570 571 private async createColorsTriggers() { 572 Log.log(TAG, 'call createColorsTriggers start'); 573 let EVENT_UPDATE_COLOR_TRIGGER_SQL = `UPDATE ${EventColumns.TABLE_NAME}` + 574 ` SET eventColor=(SELECT ${ColorsColumns.COLOR} FROM ` + 575 `${ColorsColumns.TABLE_NAME}` + 576 ` WHERE ${ColorsColumns.ACCOUNT_NAME} = (SELECT ` + 577 `${CalendarsColumns.ACCOUNT_NAME}` + 578 ` FROM ${CalendarsColumns.TABLE_NAME} WHERE ${CalendarsColumns.ID} =` + 579 ` new.${EventColumns.CALENDAR_ID}) AND ${ColorsColumns.ACCOUNT_TYPE}` + 580 ` = (SELECT ${CalendarsColumns.ACCOUNT_TYPE} FROM ` + 581 `${CalendarsColumns.TABLE_NAME}` + 582 ` WHERE ${CalendarsColumns.ID} = new.${EventColumns.CALENDAR_ID})` + 583 ` AND ${ColorsColumns.COLOR_INDEX} = ` + 584 `new.${EventColumns.EVENT_COLOR_INDEX}` + 585 ` AND ${ColorsColumns.COLOR_TYPE} = 1)` + 586 ` WHERE ${EventColumns.ID} = old.${EventColumns.ID};` 587 let CREATE_EVENT_COLOR_UPDATE_TRIGGER = `CREATE TRIGGER ` + 588 `event_color_update UPDATE OF ${EventColumns.EVENT_COLOR_INDEX} ON ` + 589 `${EventColumns.TABLE_NAME} WHEN new.${EventColumns.EVENT_COLOR_INDEX} ` + 590 `NOT NULL BEGIN ${EVENT_UPDATE_COLOR_TRIGGER_SQL} END` 591 592 let CALENDAR_UPDATE_COLOR_TRIGGER_SQL = `UPDATE ${CalendarsColumns.TABLE_NAME} ` + 593 `SET ${CalendarsColumns.CALENDAR_COLOR} = (SELECT ` + 594 `${ColorsColumns.COLOR} FROM ${ColorsColumns.TABLE_NAME} WHERE ` + 595 `${ColorsColumns.ACCOUNT_NAME} = ` + 596 `new.${CalendarsColumns.ACCOUNT_NAME} AND ` + 597 `${ColorsColumns.ACCOUNT_TYPE} = ` + 598 `new.${CalendarsColumns.ACCOUNT_TYPE} AND ` + 599 `${ColorsColumns.COLOR_INDEX} = ` + 600 `new.${CalendarsColumns.CALENDAR_COLOR_INDEX} AND ` + 601 `${ColorsColumns.COLOR_TYPE} = 0) ` + 602 ` WHERE ${CalendarsColumns.ID} = old.${CalendarsColumns.ID};` 603 let CREATE_CALENDAR_COLOR_UPDATE_TRIGGER = `CREATE TRIGGER ` + 604 `calendar_color_update UPDATE OF ${CalendarsColumns.CALENDAR_COLOR_INDEX}` + 605 ` ON ${CalendarsColumns.TABLE_NAME} WHEN` + 606 ` new.${CalendarsColumns.CALENDAR_COLOR_INDEX} NOT NULL` + 607 ` BEGIN ${CALENDAR_UPDATE_COLOR_TRIGGER_SQL} END` 608 609 Log.log(TAG, 'call CREATE_EVENT_COLOR_UPDATE_TRIGGER'); 610 await this.rdbStore?.executeSql(CREATE_EVENT_COLOR_UPDATE_TRIGGER, []) 611 Log.log(TAG, 'call CREATE_CALENDAR_COLOR_UPDATE_TRIGGER'); 612 await this.rdbStore?.executeSql(CREATE_CALENDAR_COLOR_UPDATE_TRIGGER, []) 613 Log.log(TAG, 'call createColorsTriggers end'); 614 } 615 616 private async createCalendarCleanupTrigger() { 617 Log.log(TAG, 'call createCalendarCleanupTrigger start') 618 let CALENDAR_CLEANUP_TRIGGER_SQL = `DELETE FROM ` + 619 `${EventColumns.TABLE_NAME} WHERE ` + 620 `${EventColumns.CALENDAR_ID} = old.${EventColumns.ID};` 621 let CALENDAR_CLEANUP_TRIGGER = `CREATE TRIGGER calendar_cleanup DELETE ON ` + 622 `${CalendarsColumns.TABLE_NAME} ` + 623 `BEGIN ${CALENDAR_CLEANUP_TRIGGER_SQL} END` 624 await this.rdbStore?.executeSql(CALENDAR_CLEANUP_TRIGGER, []); 625 Log.log(TAG, 'call createCalendarCleanupTrigger end'); 626 } 627 628 private async createSyncIdUpdateTrigger() { 629 Log.log(TAG, 'call createSyncIdUpdateTrigger start'); 630 let EVENTS_ORIGINAL_SYNC_TRIGGER_SQL = `UPDATE ${EventColumns.TABLE_NAME}` + 631 ` SET ${EventColumns.ORIGINAL_SYNC_ID} = ` + 632 `new.${EventColumns.SYNC_ID}` + 633 ` WHERE ${EventColumns.ORIGINAL_ID} =old.${EventColumns.ID};` 634 let CREATE_SYNC_ID_UPDATE_TRIGGER = `CREATE TRIGGER original_sync_update` + 635 ` UPDATE OF ${EventColumns.SYNC_ID}` + 636 ` ON ${EventColumns.TABLE_NAME}` + 637 ` BEGIN ${EVENTS_ORIGINAL_SYNC_TRIGGER_SQL} END` 638 639 await this.rdbStore?.executeSql(CREATE_SYNC_ID_UPDATE_TRIGGER, []); 640 Log.log(TAG, 'call createSyncIdUpdateTrigger end'); 641 } 642} 643 644export default CalendarDataHelper;