• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 | undefined = undefined;
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    }).then(); //IDE识别接口有问题,暂时改成这样,待后续更新IDE改回
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.message}`);
363    }
364    Log.log(TAG, 'initRdbStore executeSql start');
365    try {
366      await this.rdbStore?.executeSql(CREATE_CALENDARS_TABLE_SQL, []);
367      Log.log(TAG, 'initRdbStore createCalendarsTable succeed');
368      await this.rdbStore?.executeSql(CREATE_REMINDERS_TABLE_SQL, []);
369      Log.log(TAG, 'initRdbStore CREATE_REMINDERS_TABLE_SQL succeed');
370      await this.rdbStore?.executeSql(CREATE_INSTANCES_TABLE_SQL, []);
371      Log.log(TAG, 'initRdbStore CREATE_INSTANCES_TABLE_SQL succeed');
372      await this.rdbStore?.executeSql(CREATE_COLORS_TABLE_SQL, []);
373      Log.log(TAG, 'initRdbStore CREATE_COLORS_TABLE_SQL succeed');
374      await this.rdbStore?.executeSql(CREATE_ATTENDEES_TABLE_SQL, []);
375      Log.log(TAG, 'initRdbStore CREATE_ATTENDEES_TABLE_SQL succeed');
376      await this.rdbStore?.executeSql(CREATE_CALENDAR_ALERTS_TABLE_SQL, []);
377      Log.log(TAG, 'initRdbStore CREATE_CALENDAR_ALERTS_TABLE_SQL succeed');
378      await this.rdbStore?.executeSql(CREATE_CALENDAR_CACHE_TABLE_SQL, []);
379      Log.log(TAG, 'initRdbStore CREATE_CALENDAR_CACHE_TABLE_SQL succeed');
380      await this.rdbStore?.executeSql(CREATE_CALENDAR_METADATA_TABLE_SQL, []);
381      Log.log(TAG, 'initRdbStore CREATE_CALENDAR_METADATA_TABLE_SQL succeed');
382      await this.rdbStore?.executeSql(CREATE_EVENTS_RAW_TIMES_TABLE_SQL, []);
383      Log.log(TAG, 'initRdbStore CREATE_EVENTS_RAW_TIMES_TABLE_SQL succeed');
384      await this.rdbStore?.executeSql(CREATE_MAP_ADDRESS_HISTORY_TABLE_SQL, []);
385      Log.log(TAG, 'initRdbStore CREATE_MAP_ADDRESS_HISTORY_TABLE_SQL succeed');
386      await this.rdbStore?.executeSql(CREATE_EXTENDED_PROPERTIES_TABLE_SQL, []);
387      Log.log(TAG, 'initRdbStore CREATE_EXTENDED_PROPERTIES_TABLE_SQL succeed');
388      await this.rdbStore?.executeSql(CREATE_SYNC_STATE_TABLE_SQL, []);
389      Log.log(TAG, 'initRdbStore CREATE_SYNC_STATE_TABLE_SQL succeed');
390      await this.rdbStore?.executeSql(CREATE_SYNC_STATE_METADATA_TABLE_SQL, []);
391      Log.log(TAG, 'initRdbStore CREATE_SYNC_STATE_METADATA_TABLE_SQL succeed');
392      await this.rdbStore?.executeSql(CREATE_EXTEND_CALENDAR_EVENT_TABLE_NAME_SQL, []);
393      Log.log(TAG, 'initRdbStore CREATE_EXTEND_CALENDAR_EVENT_TABLE_NAME_SQL succeed');
394
395      this.createSyncIdUpdateTrigger();
396      Log.log(TAG, 'initRdbStore createSyncIdUpdateTrigger succeed');
397      this.createDeleteEventTriggers();
398      Log.log(TAG, 'initRdbStore createDeleteEventTriggers succeed');
399      this.createColorsTriggers();
400      Log.log(TAG, 'initRdbStore createColorsTriggers succeed');
401      this.createCalendarCleanupTrigger();
402      Log.log(TAG, 'initRdbStore createCalendarCleanupTrigger succeed');
403      Log.log(TAG, 'initRdbStore executeSql end');
404    } catch (err) {
405      Log.error(TAG, `initRdbStore err:${err.message}`);
406    }
407  }
408
409  private async createEventsTable() {
410    // the database has a limit of 1024 byte for sql strings, so we create some fields in the create sql,
411    // other fields are added later.
412    Log.log(TAG, 'call createEventsTable start');
413    let CREATE_EVENTS_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ${EventColumns.TABLE_NAME} (`
414      + `${EventColumns.ID} INTEGER PRIMARY KEY AUTOINCREMENT, `
415      + `${EventColumns.SYNC_ID} TEXT, `
416      + `${EventColumns.DIRTY} INTEGER, `
417      + `${EventColumns.MUTATORS} TEXT, `
418      + `${EventColumns.EVENT_CALENDAR_TYPE} INTEGER NOT NULL DEFAULT 0)`;
419
420    try {
421      await this.rdbStore?.executeSql(CREATE_EVENTS_TABLE_SQL, []);
422      Log.log(TAG, 'call createEventsTable add column start');
423      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
424        `${EventColumns.EVENT_IMAGE_TYPE} TEXT`, []);
425      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
426        `${EventColumns.LAST_SYNCED} INTEGER DEFAULT 0`, []);
427      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
428        `${EventColumns.CALENDAR_ID} INTEGER NOT NULL`, []);
429      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
430        `${EventColumns.TITLE} TEXT`, []);
431      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
432        `${EventColumns.EVENT_LOCATION} TEXT`, []);
433      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
434        `${EventColumns.LOCATION_LONGITUDE} TEXT`, []);
435      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
436        `${EventColumns.LOCATION_LATITUDE} TEXT`, []);
437      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
438        `${EventColumns.DESCRIPTION} TEXT`, []);
439      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
440        `${EventColumns.EVENT_COLOR} INTEGER`, []);
441      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
442        `${EventColumns.EVENT_COLOR_INDEX} TEXT`, []);
443      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
444        `${EventColumns.EVENT_STATUS} INTEGER`, []);
445      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
446        `${EventColumns.SELF_ATTENDEE_STATUS} INTEGER NOT NULL DEFAULT 0`, []);
447      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
448        `${EventColumns.DTSTART} INTEGER`, []);
449      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
450        `${EventColumns.DTEND} INTEGER`, []);
451      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
452        `${EventColumns.EVENT_TIMEZONE} TEXT`, []);
453      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
454        `${EventColumns.DURATION} TEXT`, []);
455      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
456        `${EventColumns.ALLDAY} INTEGER NOT NULL DEFAULT 0`, []);
457      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
458        `${EventColumns.ACCESS_LEVEL} INTEGER NOT NULL DEFAULT 0`, []);
459      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
460        `${EventColumns.AVAILABILITY} INTEGER NOT NULL DEFAULT 0`, []);
461      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
462        `${EventColumns.HAS_ALARM} INTEGER NOT NULL DEFAULT 0`, []);
463      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
464        `${EventColumns.HAS_EXTENDED_PROPERTIES} INTEGER NOT NULL DEFAULT 0`, []);
465      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ${EventColumns.RRULE} TEXT`, []);
466      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ${EventColumns.RDATE} TEXT`, []);
467      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ${EventColumns.EXRULE} TEXT`, []);
468      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ${EventColumns.EXDATE} TEXT`, []);
469      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
470        `${EventColumns.ORIGINAL_ID} INTEGER`, []);
471      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
472        `${EventColumns.ORIGINAL_SYNC_ID} TEXT`, []);
473      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
474        `${EventColumns.ORIGINAL_INSTANCE_TIME} INTEGER`, []);
475      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
476        `${EventColumns.ORIGINAL_ALL_DAY} INTEGER`, []);
477      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
478        `${EventColumns.LAST_DATE} INTEGER`, []);
479      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
480        `${EventColumns.EVENT_TIME_STAMP} INTEGER NOT NULL DEFAULT 0`, []);
481      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
482        `${EventColumns.HAS_ATTENDEE_DATE} INTEGER NOT NULL DEFAULT 0`, []);
483      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
484        `${EventColumns.GUESTS_CAN_MODIFY} INTEGER NOT NULL DEFAULT 0`, []);
485      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
486        `${EventColumns.GUESTS_CAN_INVITE_OTHERS} INTEGER NOT NULL DEFAULT 1`, []);
487      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
488        `${EventColumns.GUESTS_CAN_SEE_GUESTS} INTEGER NOT NULL DEFAULT 1`, []);
489      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
490        `${EventColumns.ORGANIZER} STRING`, []);
491      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
492        `${EventColumns.IS_ORGANIZER} INTEGER`, []);
493      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
494        `${EventColumns.DELETED} INTEGER NOT NULL DEFAULT 0`, []);
495      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
496        `${EventColumns.EVENT_END_TIMEZONE} TEXT`, []);
497      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
498        `${EventColumns.CUSTOM_APP_PACKAGE} TEXT`, []);
499      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
500        `${EventColumns.CUSTOM_APP_URI} TEXT`, []);
501      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ${EventColumns.UID2445} TEXT`, []);
502      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
503        `${EventColumns.VERSION} INTEGER NOT NULL DEFAULT 0`, []);
504      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
505        `${EventColumns.EVENT_UUID} TEXT`, []);
506      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
507        `${EventColumns.HWEXT_ALERT_TYPE} INTEGER NOT NULL DEFAULT 0`, []);
508      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
509        `${EventColumns.IMPORTANT_EVENT_TYPE} INTEGER NOT NULL DEFAULT 0`, []);
510      await this.rdbStore?.executeSql(`ALTER TABLE EVENTS ADD COLUMN ` +
511        `${EventColumns.SERVICE.SERVICE_VERIFIED} INTEGER`, []);
512      await this.rdbStore?.executeSql(`ALTER TABLE EVENTS ADD COLUMN ` +
513        `${EventColumns.SERVICE.SERVICE_TYPE} TEXT`, []);
514      await this.rdbStore?.executeSql(`ALTER TABLE EVENTS ADD COLUMN ` +
515        `${EventColumns.SERVICE.SERVICE_CP_BZ_URI} TEXT`, []);
516      await this.rdbStore?.executeSql(`ALTER TABLE EVENTS ADD COLUMN ` +
517        `${EventColumns.SERVICE.SERVICE_CP_MNG_URI} TEXT`, []);
518      await this.rdbStore?.executeSql(`ALTER TABLE EVENTS ADD COLUMN ` +
519        `${EventColumns.SERVICE.SERVICE_DESCRIPTION} TEXT`, []);
520      await this.rdbStore?.executeSql(`ALTER TABLE EVENTS ADD COLUMN ` +
521        `${EventColumns.SERVICE.SERVICE_MIN_VERSION} INTEGER`, []);
522      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
523        `${EventColumns.SYNC_DATA1} TEXT`, []);
524      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
525        `${EventColumns.SYNC_DATA2} TEXT`, []);
526      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
527        `${EventColumns.SYNC_DATA3} TEXT`, []);
528      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
529        `${EventColumns.SYNC_DATA4} TEXT`, []);
530      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
531        `${EventColumns.SYNC_DATA5} TEXT`, []);
532      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
533        `${EventColumns.SYNC_DATA6} TEXT`, []);
534      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
535        `${EventColumns.SYNC_DATA7} TEXT`, []);
536      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
537        `${EventColumns.SYNC_DATA8} TEXT`, []);
538      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
539        `${EventColumns.SYNC_DATA9} TEXT`, []);
540      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
541        `${EventColumns.SYNC_DATA10} TEXT`, []);
542      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
543        `${EventColumns.KV_SYNC} INTEGER NOT NULL DEFAULT 0`, []);
544      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
545        `${EventColumns.KV_SYNC_TIME} INTEGER NOT NULL DEFAULT 0`, []);
546      await this.rdbStore?.executeSql(`ALTER TABLE Events ADD COLUMN ` +
547        `${EventColumns.CREATOR} TEXT NOT NULL`, []);
548      Log.log(TAG, 'call createEventsTable end');
549    } catch (err) {
550      Log.error(TAG, `createEventsTable err:${err.message}`);
551    }
552  }
553
554  private async createDeleteEventTriggers() {
555    Log.log(TAG, 'call createDeleteEventTriggers start');
556    let EVENTS_CLEANUP_TRIGGER_SQL =
557      `DELETE FROM ${InstancesColumns.TABLE_NAME}` +
558      ` WHERE ${InstancesColumns.EVENT_ID} = old.${EventColumns.ID};` +
559      `DELETE FROM ${EventsRawTimesColumns.TABLE_NAME}` +
560      ` WHERE ${EventsRawTimesColumns.EVENT_ID} = old.${EventColumns.ID};` +
561      `DELETE FROM ${AttendeesColumns.TABLE_NAME}` +
562      ` WHERE ${AttendeesColumns.EVENT_ID} = old.${EventColumns.ID};` +
563      `DELETE FROM ${ExtendCalendarEventColumns.TABLE_NAME}` +
564      ` WHERE ${ExtendCalendarEventColumns.HWEXT_EVENT_ID} = ` +
565      `old.${EventColumns.ID};` +
566      `DELETE FROM ${RemindersColumns.TABLE_NAME}` +
567      ` WHERE ${RemindersColumns.EVENT_ID} = old.${EventColumns.ID};` +
568      `DELETE FROM ${CalendarAlertsColumns.TABLE_NAME}` +
569      ` WHERE ${CalendarAlertsColumns.EVENT_ID} = old.${EventColumns.ID};` +
570      `DELETE FROM ${ExtendedPropertiesColumns.TABLE_NAME}` +
571      ` WHERE ${ExtendedPropertiesColumns.EVENT_ID} = old.${EventColumns.ID};`
572
573    let EVENTS_CLEANUP_TRIGGER = `CREATE TRIGGER events_cleanup_delete DELETE ON ` +
574      `${EventColumns.TABLE_NAME} BEGIN ${EVENTS_CLEANUP_TRIGGER_SQL} END`;
575    try {
576      await this.rdbStore?.executeSql(EVENTS_CLEANUP_TRIGGER, []);
577      Log.log(TAG, 'call createDeleteEventTriggers end');
578    } catch (err) {
579      Log.error(TAG, `createDeleteEventTriggers err:${err?.message}`);
580    }
581  }
582
583  private async createColorsTriggers() {
584    Log.log(TAG, 'call createColorsTriggers start');
585    let EVENT_UPDATE_COLOR_TRIGGER_SQL = `UPDATE ${EventColumns.TABLE_NAME}` +
586      ` SET eventColor=(SELECT ${ColorsColumns.COLOR} FROM ` +
587      `${ColorsColumns.TABLE_NAME}` +
588      ` WHERE ${ColorsColumns.ACCOUNT_NAME} = (SELECT ` +
589      `${CalendarsColumns.ACCOUNT_NAME}` +
590      ` FROM ${CalendarsColumns.TABLE_NAME} WHERE ${CalendarsColumns.ID} =` +
591      ` new.${EventColumns.CALENDAR_ID}) AND ${ColorsColumns.ACCOUNT_TYPE}` +
592      ` = (SELECT ${CalendarsColumns.ACCOUNT_TYPE} FROM ` +
593      `${CalendarsColumns.TABLE_NAME}` +
594      ` WHERE ${CalendarsColumns.ID} = new.${EventColumns.CALENDAR_ID})` +
595      ` AND ${ColorsColumns.COLOR_INDEX} = ` +
596      `new.${EventColumns.EVENT_COLOR_INDEX}` +
597      ` AND ${ColorsColumns.COLOR_TYPE} = 1)` +
598      ` WHERE ${EventColumns.ID} = old.${EventColumns.ID};`;
599    let CREATE_EVENT_COLOR_UPDATE_TRIGGER = `CREATE TRIGGER ` +
600      `event_color_update UPDATE OF ${EventColumns.EVENT_COLOR_INDEX} ON ` +
601      `${EventColumns.TABLE_NAME} WHEN new.${EventColumns.EVENT_COLOR_INDEX} ` +
602      `NOT NULL BEGIN ${EVENT_UPDATE_COLOR_TRIGGER_SQL} END`;
603
604    let CALENDAR_UPDATE_COLOR_TRIGGER_SQL = `UPDATE ${CalendarsColumns.TABLE_NAME} ` +
605      `SET ${CalendarsColumns.CALENDAR_COLOR} = (SELECT ` +
606      `${ColorsColumns.COLOR} FROM ${ColorsColumns.TABLE_NAME} WHERE ` +
607      `${ColorsColumns.ACCOUNT_NAME} = ` +
608      `new.${CalendarsColumns.ACCOUNT_NAME} AND ` +
609      `${ColorsColumns.ACCOUNT_TYPE} = ` +
610      `new.${CalendarsColumns.ACCOUNT_TYPE} AND ` +
611      `${ColorsColumns.COLOR_INDEX} = ` +
612      `new.${CalendarsColumns.CALENDAR_COLOR_INDEX} AND ` +
613      `${ColorsColumns.COLOR_TYPE} = 0) ` +
614      ` WHERE ${CalendarsColumns.ID} = old.${CalendarsColumns.ID};`;
615    let CREATE_CALENDAR_COLOR_UPDATE_TRIGGER = `CREATE TRIGGER ` +
616      `calendar_color_update UPDATE OF ${CalendarsColumns.CALENDAR_COLOR_INDEX}` +
617      ` ON ${CalendarsColumns.TABLE_NAME} WHEN` +
618      ` new.${CalendarsColumns.CALENDAR_COLOR_INDEX} NOT NULL` +
619      ` BEGIN ${CALENDAR_UPDATE_COLOR_TRIGGER_SQL} END`;
620
621    try {
622      Log.log(TAG, 'call CREATE_EVENT_COLOR_UPDATE_TRIGGER');
623      await this.rdbStore?.executeSql(CREATE_EVENT_COLOR_UPDATE_TRIGGER, []);
624      Log.log(TAG, 'call CREATE_CALENDAR_COLOR_UPDATE_TRIGGER');
625      await this.rdbStore?.executeSql(CREATE_CALENDAR_COLOR_UPDATE_TRIGGER, []);
626      Log.log(TAG, 'call createColorsTriggers end');
627    } catch (err) {
628      Log.error(TAG, `createColorsTriggers err:${err?.message}`);
629    }
630
631  }
632
633  private async createCalendarCleanupTrigger() {
634    Log.log(TAG, 'call createCalendarCleanupTrigger start');
635    let CALENDAR_CLEANUP_TRIGGER_SQL = `DELETE FROM ` +
636      `${EventColumns.TABLE_NAME} WHERE ` +
637      `${EventColumns.CALENDAR_ID} = old.${EventColumns.ID};`;
638    let CALENDAR_CLEANUP_TRIGGER = `CREATE TRIGGER calendar_cleanup DELETE ON ` +
639      `${CalendarsColumns.TABLE_NAME} ` +
640      `BEGIN ${CALENDAR_CLEANUP_TRIGGER_SQL} END`;
641    try {
642      await this.rdbStore?.executeSql(CALENDAR_CLEANUP_TRIGGER, []);
643      Log.log(TAG, 'call createCalendarCleanupTrigger end');
644    } catch (err) {
645      Log.error(TAG, `createCalendarCleanupTrigger err:${err?.message}`);
646    }
647  }
648
649  private async createSyncIdUpdateTrigger() {
650    let EVENTS_ORIGINAL_SYNC_TRIGGER_SQL = `UPDATE ${EventColumns.TABLE_NAME}` +
651      ` SET ${EventColumns.ORIGINAL_SYNC_ID} = ` +
652      `new.${EventColumns.SYNC_ID}` +
653      ` WHERE ${EventColumns.ORIGINAL_ID} =old.${EventColumns.ID};`;
654    let CREATE_SYNC_ID_UPDATE_TRIGGER = `CREATE TRIGGER original_sync_update` +
655      ` UPDATE OF ${EventColumns.SYNC_ID}` +
656      ` ON ${EventColumns.TABLE_NAME}` +
657      ` BEGIN ${EVENTS_ORIGINAL_SYNC_TRIGGER_SQL} END`;
658    try {
659      Log.log(TAG, 'call createSyncIdUpdateTrigger start');
660      await this.rdbStore?.executeSql(CREATE_SYNC_ID_UPDATE_TRIGGER, []);
661      Log.log(TAG, 'call createSyncIdUpdateTrigger end');
662    } catch (err) {
663      Log.error(TAG, `createSyncIdUpdateTrigger err:${err?.message}`);
664    }
665  }
666}
667
668export default CalendarDataHelper;