!118 与会人修改为批量插入

Merge pull request !118 from x00600181/master
This commit is contained in:
openharmony_ci
2024-04-29 04:15:15 +00:00
committed by Gitee
11 changed files with 158 additions and 18 deletions
@@ -34,6 +34,17 @@ public:
* @return Returns the index of the inserted data record.
*/
int Insert(const Uri &uri, const DataShare::DataShareValuesBucket &value);
/**
* @brief batch insert data records into the database.
*
* @param uri Indicates the path of the data to operate.
* @param values Indicates the data records to insert. If this parameter is null, a blank row will be inserted.
*
* @return Returns the index of the inserted data count.
*/
int BatchInsert(const Uri &uri, const std::vector<DataShare::DataShareValuesBucket> &values);
/**
* @brief Updates data records in the database.
*
@@ -38,6 +38,15 @@ int DataShareHelperManager::Insert(const Uri &uri, const DataShareValuesBucket &
return dataShareHelper->Insert(const_cast<Uri &>(uri), value);
}
int DataShareHelperManager::BatchInsert(const Uri &uri, const std::vector<DataShare::DataShareValuesBucket> &values)
{
if (!dataShareHelper) {
LOG_ERROR("dataShareHelper null");
return -1;
}
return dataShareHelper->BatchInsert(const_cast<Uri &>(uri), values);
}
int DataShareHelperManager::Update(const Uri &uri, const DataSharePredicates &predicates,
const DataShareValuesBucket &value)
{
+10 -5
View File
@@ -71,11 +71,14 @@ int Calendar::AddEvent(const Event& event)
return eventId;
}
// insert attendee
auto valueAttendees = std::vector<DataShare::DataShareValuesBucket>();
for (const auto &attendee : event.attendees) {
auto valueAttendee = BuildAttendeeValue(attendee, eventId);
auto index = DataShareHelperManager::GetInstance().Insert(*(m_attendeeUri.get()), valueAttendee);
LOG_INFO("Insert attendee index %{public}d", index);
valueAttendees.emplace_back(valueAttendee);
}
auto count = DataShareHelperManager::GetInstance().BatchInsert(*(m_attendeeUri.get()), valueAttendees);
LOG_INFO("batchInsert attendees count %{public}d", count);
// insert reminder
if (event.reminderTime.has_value()) {
InsertReminders(eventId, event.reminderTime.value());
@@ -176,12 +179,14 @@ bool Calendar::UpdateEvent(const Event& event)
auto ret = DataShareHelperManager::GetInstance().Delete(*(m_attendeeUri.get()), predicates);
LOG_INFO("Delete attendee num %{public}d", ret);
}
auto valueAttendees = std::vector<DataShare::DataShareValuesBucket>();
for (const auto &attendee : event.attendees) {
auto valueAttendee = BuildAttendeeValue(attendee, eventId);
auto index = DataShareHelperManager::GetInstance().Insert(*(m_attendeeUri.get()), valueAttendee);
LOG_INFO("Update attendee index %{public}d", index);
valueAttendees.emplace_back(valueAttendee);
}
auto count = DataShareHelperManager::GetInstance().BatchInsert(*(m_attendeeUri.get()), valueAttendees);
LOG_INFO("batchInsert attendees count %{public}d", count);
{
// delete reminder
DataShare::DataSharePredicates predicates;
@@ -33,6 +33,17 @@ export interface DatabaseProcessor {
*/
insertByHighAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket, callback: Function);
/**
* 高权限批量插入接口
*
* @param rdbStore rdb数据库
* @param uri DataShare的uri
* @param values 插入的数据
* @param callback 回调方法
*/
batchInsertByHighAuthority(rdbStore: data_rdb.RdbStore, uri: string,
values: data_rdb.ValuesBucket[], callback: Function): void;
/**
* 低权限插入接口
*
@@ -43,6 +54,17 @@ export interface DatabaseProcessor {
*/
insertByLowAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket, callback: Function);
/**
* 低权限批量插入接口
*
* @param rdbStore rdb数据库
* @param uri DataShare的uri
* @param values 插入的数据
* @param callback 回调方法
*/
batchInsertByLowAuthority(rdbStore: data_rdb.RdbStore, uri: string,
values: data_rdb.ValuesBucket[], callback: Function): void;
/**
* 高权限删除接口
*
@@ -67,10 +67,20 @@ export class DefaultProcessor implements DatabaseProcessor, Observable {
this.doInsert(rdbStore, uri, values, callback);
}
batchInsertByHighAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket[],
callback: Function) {
this.doBatchInsert(rdbStore, uri, values, callback);
}
insertByLowAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket, callback: Function) {
this.doInsert(rdbStore, uri, values, callback);
}
batchInsertByLowAuthority(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket[],
callback: Function) {
this.doBatchInsert(rdbStore, uri, values, callback);
}
deleteByHighAuthority(rdbStore: data_rdb.RdbStore, uri: string, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
this.doDelete(rdbStore, uri, predicates, callback);
}
@@ -120,6 +130,31 @@ export class DefaultProcessor implements DatabaseProcessor, Observable {
});
}
/**
* 批量插入的公共方法
*
* @param rdbStore rdb数据库
* @param uri DataShare的uri
* @param values 插入的数据
* @param callback 回调方法
*/
doBatchInsert(rdbStore: data_rdb.RdbStore, uri: string, values: data_rdb.ValuesBucket[], callback: Function) {
const table = getTableByUri(uri);
rdbStore.batchInsert(table, values, (err, rowId) => {
Log.log(this.logTag, `insert ${table} before callback`);
callback(err, rowId);
if (hasNoError(err)) {
Log.log(this.logTag, `insert ${table} after callback: rowId = ` + rowId);
if (!this.isFromMigrate) {
notifyProviderChange(table, OPERATION_INSERT);
this.notifyAlertsChanges(INSERT_OPERATION_NAME, table, values);
}
} else {
Log.warn(this.logTag, `insert get err:${err?.code}, ${err?.message}`);
}
});
}
/**
* 删除的公共方法
*
@@ -215,7 +250,7 @@ export class DefaultProcessor implements DatabaseProcessor, Observable {
})
}
notifyAlertsChanges(operationName: string, table: string, values?: data_rdb.ValuesBucket) {
notifyAlertsChanges(operationName: string, table: string, values?: data_rdb.ValuesBucket | data_rdb.ValuesBucket[]) {
let message = new AlertsMessage();
message.setOperationName(operationName);
message.setTableName(table);
@@ -25,7 +25,7 @@ import { ObserverMessage } from '@ohos/common/src/main/ets/observer/Observer';
export class AlertsMessage extends ObserverMessage {
private mOperationName: string;
private mTableName: string;
private mValues: data_rdb.ValuesBucket;
private mValues: data_rdb.ValuesBucket | data_rdb.ValuesBucket[];
constructor() {
super();
@@ -42,7 +42,7 @@ export class AlertsMessage extends ObserverMessage {
this.mTableName = mTableName;
}
setValues(mValues: data_rdb.ValuesBucket) {
setValues(mValues: data_rdb.ValuesBucket | data_rdb.ValuesBucket[]) {
this.mValues = mValues;
}
@@ -54,7 +54,7 @@ export class AlertsMessage extends ObserverMessage {
return this.mTableName;
}
getValues(): data_rdb.ValuesBucket {
getValues(): data_rdb.ValuesBucket | data_rdb.ValuesBucket[] {
return this.mValues;
}
}
@@ -136,7 +136,7 @@ function isNeedToUpdateAlerts(message: AlertsMessage): boolean {
// 传入的参数为操作名称和具体操作细节
let operationName: string = message.getOperationName();
let tableName: string = message.getTableName();
let values: data_rdb.ValuesBucket = message.getValues();
let values: data_rdb.ValuesBucket | data_rdb.ValuesBucket[] = message.getValues();
// 策略模式+工厂模式:根据operationName使用不同的判断逻辑生产不同实例,扩展不同场景只需要额外增加多的AlarmNeedUpdateJudger类即可
let alarmNeedUpdateJudgerFactory = new AlertsUpdateJudgerFactory();
@@ -29,5 +29,5 @@ export default interface AlertsUpdateJudger {
* @Param values 修改操作的更新值
* @Return 是否需要更新 Alerts 表
*/
isNeedToUpdateAlerts(tableName: string, values: data_rdb.ValuesBucket): boolean;
isNeedToUpdateAlerts(tableName: string, values: data_rdb.ValuesBucket | data_rdb.ValuesBucket[]): boolean;
}
@@ -27,6 +27,7 @@ import delegate from './DataShareAbilityDelegate'
import data_rdb from '@ohos.data.relationalStore';
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import { BusinessError } from '@ohos.base';
import { ValuesBucket } from '@ohos.data.ValuesBucket';
const TAG = "DataShareAbilityAuthenticateProxy";
@@ -60,7 +61,7 @@ class DataShareAbilityAuthenticateProxy {
return isDatabaseInitComplete;
}
async insertByProxy(uri: string, value: data_rdb.ValuesBucket, permission: Permissions, callback: Function) {
async insertByProxy(uri: string, value: data_rdb.ValuesBucket | data_rdb.ValuesBucket[], permission: Permissions, callback: Function) {
let insertDataParameter = new InsertDataParameter(value);
insertDataParameter.operationName = INSERT_BY_PROXY_OPERATION_NAME;
let verifyFlag = await verifyByUri(uri, insertDataParameter, PERMISSIONS_WRITE_WHOLE_CALENDAR,
@@ -204,10 +205,14 @@ async function dataOperateSelectorByHighAuthority(uri: string, dataParameter: Da
let callback = dataParameter.callback;
switch (operationName) {
case INSERT_BY_PROXY_OPERATION_NAME:
delegate.insertByHighAuthority(uri, value, callback);
if (value instanceof Array) {
delegate.batchInsertByHighAuthority(uri, value as ValuesBucket[], callback);
break;
}
delegate.insertByHighAuthority(uri, value as ValuesBucket, callback);
break;
case UPDATE_BY_PROXY_OPERATION_NAME:
delegate.updateByHighAuthority(uri, value, predicates, callback);
delegate.updateByHighAuthority(uri, value as ValuesBucket, predicates, callback);
break;
case DELETE_BY_PROXY_OPERATION_NAME:
delegate.deleteByHighAuthority(uri, predicates, callback);
@@ -234,10 +239,14 @@ async function dataOperateSelectorByLowAuthority(uri: string, dataParameter: Dat
let callback = dataParameter.callback;
switch (operationName) {
case INSERT_BY_PROXY_OPERATION_NAME:
delegate.insertByLowAuthority(uri, value, callback);
if (value instanceof Array) {
delegate.batchInsertByLowAuthority(uri, value as ValuesBucket[], callback);
break;
}
delegate.insertByLowAuthority(uri, value as ValuesBucket, callback);
break;
case UPDATE_BY_PROXY_OPERATION_NAME:
delegate.updateByLowAuthority(uri, value, predicates, callback);
delegate.updateByLowAuthority(uri, value as ValuesBucket, predicates, callback);
break;
case DELETE_BY_PROXY_OPERATION_NAME:
delegate.deleteByLowAuthority(uri, predicates, callback);
@@ -258,7 +267,7 @@ async function dataOperateSelectorByLowAuthority(uri: string, dataParameter: Dat
abstract class DataParameter {
operationName: string = '';
value: data_rdb.ValuesBucket = {} as data_rdb.ValuesBucket;
value: data_rdb.ValuesBucket | data_rdb.ValuesBucket[] = {};
columns: Array<string> = [];
@@ -274,7 +283,7 @@ abstract class DataParameter {
* @since 2022-12-28
*/
class InsertDataParameter extends DataParameter {
constructor(value: data_rdb.ValuesBucket) {
constructor(value: data_rdb.ValuesBucket | data_rdb.ValuesBucket[]) {
super();
this.value = value;
}
@@ -63,6 +63,25 @@ class DataShareAbilityDelegate {
}
}
batchInsertByHighAuthority(uri: string, value: data_rdb.ValuesBucket[], callback: Function) {
if (!rdbStore) {
this.getDb();
Log.warn(TAG, `insert uri: ${uri} rdbStore is null`)
return;
}
Log.info(TAG, `insert uri: ${uri}`);
let table = getTableByUri(uri);
Log.info(TAG, `insert table: ${table}`);
const processor = factory.getDatabaseProcessor(table);
if (processor !== null && processor !== undefined) {
processor.batchInsertByHighAuthority(rdbStore, uri, value, callback);
return;
} else {
Log.error(TAG, 'insert with invalid processor');
}
}
async getDb() {
rdbStore = await CalendarDataHelper.getInstance().getRdbStore() as data_rdb.RdbStore;
}
@@ -86,6 +105,26 @@ class DataShareAbilityDelegate {
}
}
batchInsertByLowAuthority(uri: string, value: data_rdb.ValuesBucket[], callback: Function) {
if (!rdbStore) {
Log.warn(TAG, `insert uri: ${uri} rdbStore is null`)
this.getDb();
return;
}
Log.info(TAG, `insert uri: ${uri}`);
let table = getTableByUri(uri);
Log.info(TAG, `insert table: ${table}`);
const processor = factory.getDatabaseProcessor(table);
if (processor !== null && processor !== undefined) {
processor.batchInsertByLowAuthority(rdbStore, uri, value, callback);
return;
} else {
Log.error(TAG, 'insert with invalid processor');
}
}
deleteByHighAuthority(uri: string, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
if (!rdbStore) {
this.getDb();
@@ -102,6 +102,16 @@ export default class DataShareExtAbility extends Extension {
Log.info(TAG, '[insert] leave');
}
doBachInsert(uri: string, value: relationalStore.ValuesBucket[], callback: Function) {
Log.info(TAG, '[insert] enter');
try {
dataShareProxy.insertByProxy(uri, value, WRITE_CALENDAR, callback);
} catch (err) {
Log.error(TAG, `err=${err?.message}`);
}
Log.info(TAG, '[insert] leave');
}
doDelete(uri: string, predicates: dataSharePredicates.DataSharePredicates, callback: Function) {
Log.info(TAG, '[delete] enter');
try {