Skip to content

Commit

Permalink
fix: deleteItemsInRange
Browse files Browse the repository at this point in the history
  • Loading branch information
sylvia1106 committed Oct 27, 2019
1 parent 997e317 commit c53e385
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 69 deletions.
66 changes: 32 additions & 34 deletions src/db_wrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -255,29 +255,29 @@ function upgradeDBWithTableList(
}
}

async function deleteExpiredItemsFromTable(db: any, tableNameList: string[]) {
tableNameList.forEach(tableName => {
async function deleteItemsFromDB(db: any, tableIndexRanges: TableIndexRange[]) {
const dedupTableNameList: string[] = deduplicateList(
tableIndexRanges.map(tableIndexRange => tableIndexRange.tableName)
);
dedupTableNameList.forEach(tableName => {
if (!db.objectStoreNames.contains(tableName)) {
throw FormattedResult['TABLE_NOT_FOUND'];
}
});
const deleteItemsTrans = db.transaction(tableNameList, 'readwrite');
const deleteItemsTrans = db.transaction(dedupTableNameList, 'readwrite');
try {
for (let tableName of tableNameList) {
for (let tableIndexRange of tableIndexRanges) {
const { tableName, indexRange } = tableIndexRange;
const table = deleteItemsTrans.objectStore(tableName);
let index = table.index(EXPIRETIME_KEYNAME);
let cursor = (await index.openCursor(
indexRange2DBKey({
indexName: EXPIRETIME_KEYNAME,
lowerIndex: 0,
upperIndex: Date.now(),
lowerExclusive: false,
upperExclusive: false
})
)) as any;
while (cursor) {
table.delete(cursor.primaryKey);
cursor = await cursor.continue();
if (!indexRange) {
await table.clear();
} else {
let index = table.index(indexRange.indexName);
let cursor = await index.openCursor(indexRange2DBKey(indexRange));
while (cursor) {
table.delete(cursor.primaryKey);
cursor = await cursor.continue();
}
}
}
await deleteItemsTrans.done;
Expand Down Expand Up @@ -353,9 +353,9 @@ export async function getItem(

export async function getItemsInRange(
dbName: string,
tableName: string,
indexRange?: IndexRange
tableIndexRange: TableIndexRange
) {
const { tableName, indexRange } = tableIndexRange
const db = await openDB(dbName);
try {
if (!db.objectStoreNames.contains(tableName)) {
Expand Down Expand Up @@ -386,26 +386,24 @@ export async function getItemsInRange(

export async function deleteDB(dbName: string) {
await unregisterDBInManager(dbName);
await IDBDeleteDB(dbName, {
blocked() {
console.log('blocked!')
}
});
await IDBDeleteDB(dbName);
}

export async function deleteItems(
dbName: string,
itemsToDelete: {
tableName: string;
indexRange: IndexRange;
}[]
tableIndexRanges: TableIndexRange[]
) {
const db = await openDB(dbName);
const dedupTableNameList: string[] = deduplicateList(
itemsToDelete.map(item => item.tableName)
);
// FIXME
await deleteExpiredItemsFromTable(db, dedupTableNameList);
try {
const db = await openDB(dbName);
await deleteItemsFromDB(db, tableIndexRanges);
} catch (e) {
if (e.msg === FormattedResult.DB_NOT_FOUND.msg || e.msg === FormattedResult.TABLE_NOT_FOUND.msg) {
// If db or table does not exist, no need to deleteItems at all.
return;
} else {
throw e;
}
}
}

export default {
Expand Down
104 changes: 70 additions & 34 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import DBEnvChecker from './lib/db_env_checker';
import FormattedResult from './lib/formatted_result';
import DBWrapper from './db_wrapper';
import { ParamCheckerEnum, paramChecker, optionWithBackup } from './lib/utils';
import { ParamCheckerEnum, paramChecker, optionWithBackup } from './lib/utils'
const DEFAULT_DB_VERSION: number = 1;
const OPTIONAL = true;
function _customDBConfigChecker(dbConfig: DBConfig): void {
Expand Down Expand Up @@ -71,50 +71,75 @@ function _customDBAddItemsParamChecker(
items: ItemConfig[],
tableListInDB: TableConfig[]
): void {
const tableNamesInDB = tableListInDB.map(table => table.tableName);
paramChecker(items, ParamCheckerEnum.Array, 'items', !OPTIONAL);
items.forEach(item => {
items.forEach(itemOfTable => {
paramChecker(
item.tableName,
itemOfTable.tableName,
ParamCheckerEnum.String,
"item's tableName",
!OPTIONAL
);
paramChecker(
item.itemDuration,
itemOfTable.itemDuration,
ParamCheckerEnum.NonNegativeInteger,
"item's itemDuration",
OPTIONAL
);
if (tableNamesInDB.indexOf(item.tableName) < 0) {
throw `Table ${item.tableName} does not exist`;
const theTable = tableListInDB.find(
table => table.tableName === itemOfTable.tableName
);
if (!theTable) {
throw `Table ${itemOfTable.tableName} does not exist`;
} else if (
theTable.primaryKey !== undefined &&
Object.getOwnPropertyNames(itemOfTable).indexOf(
theTable.primaryKey
) < 0
) {
throw `primaryKey is needed for item in table ${itemOfTable.tableName}`;
}
});
// TODO item不包含自定义的primaryKey需要报错
}

function indexRangeParamChecker(indexRange?: IndexRange): void {
function tableIndexRangeParamChecker(tableIndexRange: TableIndexRange): void {
paramChecker(
tableIndexRange,
ParamCheckerEnum.NotNullObject,
'tableIndexRange',
!OPTIONAL
);
paramChecker(
tableIndexRange.tableName,
ParamCheckerEnum.String,
"tableIndexRange's",
!OPTIONAL
);
paramChecker(
indexRange,
tableIndexRange.indexRange,
ParamCheckerEnum.NotNullObject,
'indexRange',
"tableIndexRange's indexRange",
OPTIONAL
);
if (indexRange) {
if (tableIndexRange.indexRange) {
const {
indexName,
lowerExclusive,
upperExclusive
} = tableIndexRange.indexRange;
paramChecker(
indexRange.indexName,
indexName,
ParamCheckerEnum.String,
"indexRange's indexName",
!OPTIONAL
);
paramChecker(
indexRange.lowerExclusive,
lowerExclusive,
ParamCheckerEnum.Boolean,
"indexRange's lowerExclusive",
OPTIONAL
);
paramChecker(
indexRange.upperExclusive,
upperExclusive,
ParamCheckerEnum.Boolean,
"indexRange's upperExclusive",
OPTIONAL
Expand Down Expand Up @@ -164,13 +189,13 @@ export class CustomDB {
}
};
try {
try {
_customDBAddItemsParamChecker(items, this.tableList);
} catch (errMsg) {
throw FormattedResult['PARAM_INVALID'].setData({
desc: `${errMsg}`
});
}
_customDBAddItemsParamChecker(items, this.tableList);
} catch (errMsg) {
throw FormattedResult['PARAM_INVALID'].setData({
desc: `${errMsg}`
});
}
try {
// Set backup itemDuration to each item
const itemsWithDuration = items.map(item => {
const theTable: TableConfig = this.tableList.find(
Expand Down Expand Up @@ -209,19 +234,18 @@ export class CustomDB {
}
}

async getItemsInRange(tableName: string, indexRange?: IndexRange) {
async getItemsInRange(tableIndexRange: TableIndexRange) {
try {
tableIndexRangeParamChecker(tableIndexRange);
} catch (errMsg) {
throw FormattedResult['PARAM_INVALID'].setData({
desc: `${errMsg}`
});
}
try {
try {
indexRangeParamChecker(indexRange);
} catch (errMsg) {
throw FormattedResult['PARAM_INVALID'].setData({
desc: `${errMsg}`
});
}
return await DBWrapper.getItemsInRange(
this.name,
tableName,
indexRange
tableIndexRange
);
} catch (e) {
throw FormattedResult['GET_IN_RANGE_FAIL'].setData({
Expand All @@ -230,9 +254,21 @@ export class CustomDB {
}
}

async deleteItems(items: { tableName: string; indexRange: IndexRange }[]) {
async deleteItemsInRange(
tableIndexRanges: TableIndexRange[]
) {
try {
paramChecker(tableIndexRanges, ParamCheckerEnum.Array, 'tableIndexRanges', !OPTIONAL);
tableIndexRanges.forEach((tableIndexRange) => {
tableIndexRangeParamChecker(tableIndexRange);
})
} catch (errMsg) {
throw FormattedResult['PARAM_INVALID'].setData({
desc: `${errMsg}`
});
}
try {
await DBWrapper.deleteItems(this.name, items);
await DBWrapper.deleteItems(this.name, tableIndexRanges);
return FormattedResult['SUCC'];
} catch (e) {
throw FormattedResult['DELETE_ITEMS_FAIL'].setData({
Expand Down
6 changes: 5 additions & 1 deletion types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ interface DB {
version: number;
}
interface ItemInTable {
[key: string]: any; // All properties in ItemConfig.item
[key: string]: any;
expireTime: number;
updateTime: number;
}
Expand Down Expand Up @@ -44,6 +44,10 @@ type IndexRange = {
lowerExclusive?: boolean;
upperExclusive?: boolean;
};
type TableIndexRange = {
tableName: string;
indexRange?: IndexRange;
}
type MiliSeconds = number;
type ParamChecker = {
rule: Function;
Expand Down

0 comments on commit c53e385

Please sign in to comment.