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;