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