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 dataSharePredicates from '@ohos.data.dataSharePredicates'; 18import DataShareResultSet from '@ohos.data.DataShareResultSet'; 19 20import { Log } from '@ohos/common/src/main/ets/utils/Log'; 21import { getBundleNameByUri } from '@ohos/common/src/main/ets/utils/UrlUtils'; 22 23import { EventColumns } from '@ohos/datastructure/src/main/ets/events/EventColumns'; 24import { Events } from '@ohos/datastructure/src/main/ets/events/Events'; 25import { RemindersColumns } from '@ohos/datastructure/src/main/ets/reminders/RemindersColumns'; 26import { parseIndexes, EventIndexes } from '@ohos/datastructure/src/main/ets/events/EventIndexes'; 27import { parseEvents } from '@ohos/datastructure/src/main/ets/events/EventParser'; 28 29import { initValueCreator, initPredicateCreator, deleteValueCreator } from '../DatabaseProcessorHelper'; 30import { DefaultProcessor } from '../DefaultProcessor'; 31import { ErrorCode } from '../../constants/ErrorCode'; 32 33const TAG = "RemindersProcessor"; 34 35/** 36 * the RemindersProcessor table processor 37 * 38 * @since 2022-10-17 39 */ 40export class RemindersProcessor extends DefaultProcessor { 41 async insertByHighAuthority(rdbStore, uri: string, values, callback) { 42 const callerName = getBundleNameByUri(uri); 43 initValueCreator(values, callerName); 44 const isEventExist = await isEventSameWithReminderId(rdbStore, values); 45 if (isEventExist) { 46 this.doInsert(rdbStore, uri, values, callback); 47 } else { 48 Log.warn(TAG, 'not support insert operation'); 49 const err = { 50 code: ErrorCode.UN_SUPPORT_OPERATION, 51 name: 'UnSupportedOperationException', 52 message: 'The calling application cannot insert an reminder without its own event' 53 }; 54 callback(err, -1); 55 } 56 } 57 58 async insertByLowAuthority(rdbStore, uri: string, values, callback) { 59 const callerName = getBundleNameByUri(uri); 60 initValueCreator(values, callerName); 61 const isEventCreatorExist = await isEventSameWithReminderCreator(rdbStore, values); 62 if (isEventCreatorExist) { 63 this.doInsert(rdbStore, uri, values, callback); 64 } else { 65 Log.warn(TAG, 'not support insert operation'); 66 const err = { 67 code: ErrorCode.UN_SUPPORT_OPERATION, 68 name: 'UnSupportedOperationException', 69 message: 'The calling application cannot insert an reminder with different creator from event' 70 }; 71 callback(err, -1); 72 } 73 } 74 75 async deleteByLowAuthority(rdbStore, uri: string, predicates, callback) { 76 const callerName = getBundleNameByUri(uri); 77 initPredicateCreator(predicates, callerName); 78 this.doDelete(rdbStore, uri, predicates, callback); 79 } 80 81 async updateByHighAuthority(rdbStore, uri: string, values, predicates, callback) { 82 deleteValueCreator(values); 83 this.doUpdate(rdbStore, uri, values, predicates, callback) 84 } 85 86 async updateByLowAuthority(rdbStore, uri: string, values, predicates, callback) { 87 const callerName = getBundleNameByUri(uri); 88 deleteValueCreator(values); 89 initPredicateCreator(predicates, callerName); 90 this.doUpdate(rdbStore, uri, values, predicates, callback) 91 } 92 93 async queryByLowAuthority(rdbStore, uri: string, columns: Array<string>, predicates, callback) { 94 const callerName = getBundleNameByUri(uri); 95 initPredicateCreator(predicates, callerName); 96 this.doQuery(rdbStore, uri, columns, predicates, callback); 97 } 98} 99/** 100 * 检查待插入的 reminder 与 event 表中相同 event_id 的元组是否拥有相同的 creator 101 * @param rdbStore rdb数据库 102 * @param values 插入操作的数据 103 * @return true 相同 false 不相同 104 */ 105async function isEventSameWithReminderCreator(rdbStore, values): Promise<boolean> { 106 Log.debug(TAG, 'isEventSameWithReminderCreator start'); 107 const reminderCreator = values[RemindersColumns.CREATOR]; 108 let resultSet = await queryEventIdAndCreatorByReminder(rdbStore, values); 109 if (resultSet === null || resultSet === undefined) { 110 return false; 111 } 112 const eventIndexes: EventIndexes = parseIndexes(resultSet); 113 if (resultSet.goToFirstRow()) { 114 let events: Events = parseEvents(resultSet, eventIndexes); 115 if (events === null || events === undefined) { 116 return false; 117 } 118 if (events.creator === reminderCreator) { 119 return true; 120 } 121 } 122 return false; 123} 124 125/** 126 * 检查待插入的 reminder 与 event 表中是否存在相同 event_id 的元组 127 * @param rdbStore rdb数据库 128 * @param values 插入操作的数据 129 * @return true 相同 false 不相同 130 */ 131async function isEventSameWithReminderId(rdbStore, values): Promise<boolean> { 132 Log.debug(TAG, 'isEventSameWithReminderId start'); 133 let resultSet = await queryEventIdAndCreatorByReminder(rdbStore, values); 134 if (resultSet === null || resultSet === undefined) { 135 return false; 136 } 137 if (resultSet.rowCount > 0) { 138 return true; 139 } 140 return false; 141} 142 143/** 144 * 查询待插入的 reminder 数据中 event_id 与 event 表相同的结果 145 * @param rdbStore rdb数据库 146 * @param values 插入操作的数据 147 * @return DataShareResultSet 148 */ 149async function queryEventIdAndCreatorByReminder(rdbStore, values): Promise<DataShareResultSet> { 150 const eventId = values[RemindersColumns.EVENT_ID]; 151 const columns = [EventColumns.ID, EventColumns.CREATOR]; 152 let predicates = new dataSharePredicates.DataSharePredicates(); 153 predicates.equalTo(EventColumns.ID, eventId); 154 let resultSet: DataShareResultSet; 155 try { 156 resultSet = await rdbStore.query(EventColumns.TABLE_NAME, predicates, columns); 157 } catch (err) { 158 Log.error(TAG, 'Event query data error'); 159 } 160 return resultSet; 161}