Skip to content

Commit

Permalink
fix: add delete items
Browse files Browse the repository at this point in the history
  • Loading branch information
sylvia1106 committed Oct 26, 2019
1 parent 4a063b8 commit 47b93b2
Show file tree
Hide file tree
Showing 5 changed files with 238 additions and 115 deletions.
35 changes: 33 additions & 2 deletions demo/demo.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<button onclick="getItem()">getItem</button>
<button onclick="getItems()">getItems</button>
<button onclick="deleteDB()">deleteDB</button>
<button onclick="deleteItems()">deleteItems</button>
<script src="./idb-managed.js"></script>
<script>
console.log(IDBM.idbIsSupported());
Expand Down Expand Up @@ -44,8 +45,8 @@
return db.addItems([
{
tableName: 'table1',
item: { key1: 'heihei', value1: '1' },
itemDuration: 1000 * 3600
item: { key1: 'xixi', value1: '1' },
itemDuration: 1000
},
{
tableName: 'table1',
Expand All @@ -55,6 +56,11 @@
{
tableName: 'table2',
item: { key2: 'xiuxiu', value2: 'lala' }
},
{
tableName: 'table3',
item: { value: '2'},
itemDuration: 1000
}
])
.then(ob => {
Expand Down Expand Up @@ -95,6 +101,31 @@
});
})
}
function deleteItems() {
// addItems()
// .then(() => {
db.deleteItems([
{
tableName: 'table1',
indexRange: {
// FIXME
}
},
{
tableName: 'table3',
indexRange: {
// FIXME
}
}
])
.then(ob => {
console.log(ob);
})
.catch(e => {
console.log(e);
});
// })
}
function deleteDB() {
IDBM.deleteDB('DEMO_DB')
.then(ob => {
Expand Down
153 changes: 120 additions & 33 deletions src/db_wrapper.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
/**
* @file Wrap idb apis for idb-managed
* @file Wrap idb APIs for idb-managed
*/
import { CustomDB } from './index';
import { openDB as IDBOpenDB, deleteDB as IDBDeleteDB } from 'idb';
import { deduplicateList } from './lib/utils';
import FormattedResult from './lib/formatted_result';
const IDB_MANAGER_VERSION = 1;
const IDB_MANAGER_DB_NAME = 'IDB_MANAGER_DB';
const IDB_MANAGER_DB_TABLE_NAME = 'IDB_MANAGER_STORE';
const IDB_MANAGER_DB_TABLE_INDEX_NAME = 'dbName';
Expand Down Expand Up @@ -66,31 +67,39 @@ async function registerDBInManager(dbInfo: DB) {
dbManager as any,
IDB_MANAGER_DB_TABLE_NAME,
dbInfo.name
)) as any) as ItemInDBManager
)) as any) as ItemInDBManager;
if (dbAlreadyInManager && dbInfo.version <= dbAlreadyInManager.version) {
// No need to register
return;
} else {
// update db in manager
const addDBTrans = dbManager.transaction(IDB_MANAGER_DB_TABLE_NAME, 'readwrite');
const table = addDBTrans.objectStore(IDB_MANAGER_DB_TABLE_NAME)
const addDBTrans = dbManager.transaction(
IDB_MANAGER_DB_TABLE_NAME,
'readwrite'
);
const table = addDBTrans.objectStore(IDB_MANAGER_DB_TABLE_NAME);
const dbItem: ItemInDBManager = {
dbName: dbInfo.name,
tableList: dbInfo.tableList,
version: dbInfo.version
}
table.put(itemWrapper({
item: dbItem,
tableName: IDB_MANAGER_DB_TABLE_NAME
}));
};
table.put(
itemWrapper({
item: dbItem,
tableName: IDB_MANAGER_DB_TABLE_NAME
})
);
await addDBTrans.done;
dbManager.close();
dbManager.close();
}
}

async function unregisterDBInManager(dbName: string) {
const dbManager = await openDBManager();
const deleteTrans = dbManager.transaction(IDB_MANAGER_DB_TABLE_NAME, 'readwrite');
const deleteTrans = dbManager.transaction(
IDB_MANAGER_DB_TABLE_NAME,
'readwrite'
);
const table = deleteTrans.objectStore(IDB_MANAGER_DB_TABLE_NAME);
table.delete(dbName);
await deleteTrans.done;
Expand All @@ -101,14 +110,18 @@ async function createDB(dbInfo: DB) {
await registerDBInManager(dbInfo);
const db = await IDBOpenDB(dbInfo.name, dbInfo.version as number, {
upgrade(upgradeDB, oldVersion, newVersion, transaction) {
upgradeDBWithTableList(upgradeDB as any, dbInfo.tableList, transaction);
upgradeDBWithTableList(
upgradeDB as any,
dbInfo.tableList,
transaction
);
}
});
return db;
}

async function openDBManager() {
return await IDBOpenDB(IDB_MANAGER_DB_NAME, 1, {
return await IDBOpenDB(IDB_MANAGER_DB_NAME, IDB_MANAGER_VERSION, {
// In case DB Manager has not been created.
upgrade(upgradeDB) {
upgradeDBManager(upgradeDB as any);
Expand All @@ -125,16 +138,20 @@ async function openDB(dbName: string) {
)) as any) as ItemInDBManager | null;
dbManager.close();
if (dbAlreadyInManager) {
const db = await IDBOpenDB(dbAlreadyInManager.dbName, dbAlreadyInManager.version as number, {
// In case this DB has not been created.
upgrade(upgradeDB, oldVersion, newVersion, transaction) {
upgradeDBWithTableList(
upgradeDB as any,
dbAlreadyInManager.tableList || [],
transaction
);
const db = await IDBOpenDB(
dbAlreadyInManager.dbName,
dbAlreadyInManager.version as number,
{
// In case this DB has not been created.
upgrade(upgradeDB, oldVersion, newVersion, transaction) {
upgradeDBWithTableList(
upgradeDB as any,
dbAlreadyInManager.tableList || [],
transaction
);
}
}
});
);
return db;
} else {
throw FormattedResult['DB_NOT_FOUND'];
Expand Down Expand Up @@ -172,11 +189,7 @@ function upgradeDBWithTableList(
try {
tableList.forEach(tableConfig => {
// If table already exists.
if (
upgradeDB.objectStoreNames.contains(
tableConfig.tableName
)
) {
if (upgradeDB.objectStoreNames.contains(tableConfig.tableName)) {
const currentTable = transaction.objectStore(
tableConfig.tableName
);
Expand Down Expand Up @@ -242,16 +255,74 @@ function upgradeDBWithTableList(
}
}

async function deleteExpiredItemsFromTable(
db: any,
tableNameList: string[]
) {
tableNameList.forEach(tableName => {
if (!db.objectStoreNames.contains(tableName)) {
throw FormattedResult['TABLE_NOT_FOUND'];
}
})
const deleteItemsTrans = db.transaction(tableNameList, 'readwrite');
try {
tableNameList.forEach(async tableName => {
const table = deleteItemsTrans.objectStore(tableName);
let index = table.index(EXPIRETIME_KEYNAME);
if (tableName === 'table3') {
index = table.index('a').catch((err: Error) => {
console.log('index rror' + err)
})
}
let cursor = (await index.openCursor(
indexRange2DBKey({
indexName: EXPIRETIME_KEYNAME,
lowerIndex: 0,
upperIndex: Date.now(),
lowerExclusive: false,
upperExclusive: false
})
)) as any;
while (cursor) {
await table.delete(cursor.primaryKey);
cursor = await cursor.continue();
}
});
} catch (e) {
console.log('trans abort catch')
try {
deleteItemsTrans.abort();
} catch (e) {
console.log('trans abort failed!');
// Do nothing if trans aborted failed
}
// throw FormattedResult['DELETE_ITEMS_FAIL'].setData({ desc: e });
}
await deleteItemsTrans.done;
}

export async function addItems(customDB: CustomDB, items: ItemConfig[]) {
const db = await createDB(customDB);
const dedupTableNameList = deduplicateList(
const dedupTableNameList: string[] = deduplicateList(
items.map(item => item.tableName)
);
// FIXME
// await deleteExpiredItemsFromTable(db, dedupTableNameList);
const addItemsTrans = db.transaction(dedupTableNameList, 'readwrite');
items.forEach(item => {
const table = addItemsTrans.objectStore(item.tableName);
table.put(itemWrapper(item));
});
try {
items.forEach(item => {
const table = addItemsTrans.objectStore(item.tableName);
table.put(itemWrapper(item));
});
} catch (e) {
// Make sure addItems operation is atomic
try {
addItemsTrans.abort();
} catch (e) {
console.log('trans abort failed!');
// Do nothing if trans aborted failed
}
}
await addItemsTrans.done;
db.close();
}
Expand Down Expand Up @@ -306,9 +377,25 @@ export async function deleteDB(dbName: string) {
await IDBDeleteDB(dbName);
}

export async function deleteItems(
dbName: string,
itemsToDelete: {
tableName: string;
indexRange: IndexRange;
}[]
) {
const db = await openDB(dbName);
const dedupTableNameList: string[] = deduplicateList(
itemsToDelete.map(item => item.tableName)
);
// FIXME
await deleteExpiredItemsFromTable(db, dedupTableNameList);
}

export default {
addItems,
getItem,
getItemsInRange,
deleteDB
deleteDB,
deleteItems
};
Loading

0 comments on commit 47b93b2

Please sign in to comment.