• 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 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}