• 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 data_rdb from '@ohos.data.relationalStore';
18import dataSharePredicates from '@ohos.data.dataSharePredicates';
19import LinkedList from '@ohos.util.LinkedList';
20
21import { Log } from '@ohos/common/src/main/ets/utils/Log';
22import { Observable } from '@ohos/common/src/main/ets/observer/Observable';
23import { Observer, ObserverMessage } from '@ohos/common/src/main/ets/observer/Observer';
24import { hasNoError } from '@ohos/common/src/main/ets/utils/ErrorUtils';
25
26import {
27  notifyProviderChange,
28  OPERATION_INSERT,
29  OPERATION_UPDATE,
30  OPERATION_DELETE
31} from '../commonevents/notify/ProviderChangeNotifier';
32import { DatabaseProcessor } from './DatabaseProcessor';
33import getTableByUri from '../utils/CalendarUriHelper';
34import { AlertsMessage } from './alerts/AlertsMessage';
35import { BusinessError } from '@ohos.base';
36
37export const INSERT_OPERATION_NAME = 'insert';
38
39export const UPDATE_OPERATION_NAME = 'update';
40
41export const DELETE_OPERATION_NAME = 'delete';
42
43const TAG = 'DefaultProcessor';
44
45
46/**
47 * the default database Processors
48 *
49 * @since 2022-06-21
50 */
51export class DefaultProcessor implements DatabaseProcessor, Observable {
52  protected isFromMigrate: boolean = false;
53  protected logTag: string = TAG;
54  private mObserverList: LinkedList<Observer> = new LinkedList();
55
56  constructor(isFromMigrate: boolean = false) {
57    this.isFromMigrate = isFromMigrate;
58    this.initParas();
59    Log.info(this.logTag, `isFromMigrate is ${this.isFromMigrate}`);
60  }
61
62  protected initParas() {
63
64  }
65
66  insertByHighAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket, callback: Function) {
67    this.doInsert(rdbStore, uri, values, callback);
68  }
69
70  insertByLowAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket, callback: Function) {
71    this.doInsert(rdbStore, uri, values, callback);
72  }
73
74  deleteByHighAuthority(rdbStore: data_rdb.RdbStore, uri: string, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
75    this.doDelete(rdbStore, uri, predicates, callback);
76  }
77
78  deleteByLowAuthority(rdbStore: data_rdb.RdbStore, uri: string, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
79    this.doDelete(rdbStore, uri, predicates, callback);
80  }
81
82  updateByHighAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
83    this.doUpdate(rdbStore, uri, values, predicates, callback);
84  }
85
86  updateByLowAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
87    this.doUpdate(rdbStore, uri, values, predicates, callback);
88  }
89
90  queryByHighAuthority(rdbStore: data_rdb.RdbStore, uri: string, columns: Array<string>, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
91    this.doQuery(rdbStore, uri, columns, predicates, callback);
92  }
93
94  queryByLowAuthority(rdbStore: data_rdb.RdbStore, uri: string, columns: Array<string>, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
95    this.doQuery(rdbStore, uri, columns, predicates, callback);
96  }
97
98  /**
99   * 插入的公共方法
100   *
101   * @param rdbStore rdb数据库
102   * @param uri DataShare的uri
103   * @param values 插入的数据
104   * @param callback 回调方法
105   */
106  doInsert(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket, callback: Function) {
107    const table = getTableByUri(uri);
108    rdbStore.insert(table, values, (err, rowId) => {
109      Log.log(this.logTag, `insert ${table} before callback`);
110      callback(err, rowId);
111      if (hasNoError(err)) {
112        Log.log(this.logTag, `insert ${table} after callback: rowId = ` + rowId);
113        if (!this.isFromMigrate) {
114          notifyProviderChange(table, OPERATION_INSERT);
115          this.notifyAlertsChanges(INSERT_OPERATION_NAME, table, values);
116        }
117      } else {
118        Log.warn(this.logTag, `insert get err:${err?.code}, ${err?.message}`);
119      }
120    });
121  }
122
123  /**
124   * 删除的公共方法
125   *
126   * @param rdbStore rdb数据库
127   * @param uri DataShare的uri
128   * @param predicates 删除条件
129   * @param callback 回调方法
130   */
131  doDelete(rdbStore: data_rdb.RdbStore, uri: string, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
132    const table = getTableByUri(uri);
133    rdbStore.delete(table, predicates, (err: BusinessError, count) => {
134      Log.log(this.logTag, `delete ${table} before callback`);
135      callback(err, count);
136      if (hasNoError(err)) {
137        Log.log(this.logTag, `delete ${table} after callback: count = ` + count);
138        notifyProviderChange(table, OPERATION_DELETE);
139        const deleteValue: data_rdb.ValuesBucket = {
140          'deleteCounts': count
141        }
142        Log.log(this.logTag, `deleteValue: [deleteCounts]: ${deleteValue['deleteCounts']}`);
143        this.notifyAlertsChanges(DELETE_OPERATION_NAME, table, deleteValue);
144      } else {
145        Log.error(this.logTag, `delete get err:${err?.code}, ${err?.message}`);
146      }
147    });
148  }
149
150  /**
151   * 更新的公共方法
152   *
153   * @param rdbStore rdb数据库
154   * @param uri DataShare的uri
155   * @param values 更新的数据
156   * @param predicates 更新条件
157   * @param callback 回调方法
158   */
159  doUpdate(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
160    const table = getTableByUri(uri);
161    rdbStore.update(table, values, predicates, (err, count) => {
162      Log.log(this.logTag, `update ${table} before callback`);
163      callback(err, count);
164      if (hasNoError(err)) {
165        Log.log(this.logTag, `update ${table} after callback: count = ` + count);
166        notifyProviderChange(table, OPERATION_UPDATE);
167        this.notifyAlertsChanges(UPDATE_OPERATION_NAME, table, values);
168      } else {
169        Log.warn(this.logTag, `update get err:${err?.code}, ${err?.message}`);
170      }
171    });
172  }
173
174  /**
175   * 查询的公共方法
176   *
177   * @param rdbStore rdb数据库
178   * @param uri DataShare的uri
179   * @param columns 查询的列名
180   * @param predicates 查询条件
181   * @param callback 回调方法
182   */
183  doQuery(rdbStore: data_rdb.RdbStore, uri: string, columns: Array<string>, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
184    const table = getTableByUri(uri);
185    let queryInnerFun = (err: BusinessError, resultSet: data_rdb.ResultSet) => {
186      Log.log(this.logTag, `query ${table} before callback`);
187      callback(err, resultSet);
188      if (!hasNoError(err)) {
189        Log.warn(this.logTag, `query get err:${err?.code}, ${err?.message}`);
190      }
191    }
192    rdbStore.query(table, predicates, columns, queryInnerFun);
193  }
194
195  /**
196   * 增加一个观察者
197   */
198  addObserver(observer: Observer) {
199    this.mObserverList.add(observer);
200  }
201
202  /**
203   * 删除一个观察者
204   */
205  removeObserver(observer: Observer) {
206    this.mObserverList.remove(observer);
207  }
208
209  /**
210   * 被观察者状态发生改变后,通知d订阅的所有观察者更新
211   */
212  notifyChanges(message: ObserverMessage) {
213    this.mObserverList.forEach((observer) => {
214      observer.onChange(message);
215    })
216  }
217
218  notifyAlertsChanges(operationName: string, table: string, values?: data_rdb.ValuesBucket) {
219    let message = new AlertsMessage();
220    message.setOperationName(operationName);
221    message.setTableName(table);
222    if (values) {
223      message.setValues(values);
224    }
225    this.notifyChanges(message);
226  }
227}
228