Skip to content

Commit 90efb13

Browse files
authored
🐛 fix: fix nothing return when reset the client db (lobehub#7738)
1 parent ceaf7bb commit 90efb13

File tree

1 file changed

+40
-5
lines changed

1 file changed

+40
-5
lines changed

src/database/client/db.ts

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -313,16 +313,33 @@ export class DatabaseManager {
313313
}
314314

315315
async resetDatabase(): Promise<void> {
316-
// 删除 IndexedDB 数据库
316+
// 1. 关闭现有的 PGlite 连接(如果存在)
317+
if (this.dbInstance) {
318+
try {
319+
// @ts-ignore
320+
await (this.dbInstance.session as any).client.close();
321+
console.log('PGlite instance closed successfully.');
322+
} catch (e) {
323+
console.error('Error closing PGlite instance:', e);
324+
// 即使关闭失败,也尝试继续删除,IndexedDB 的 onblocked 或 onerror 会处理后续问题
325+
}
326+
}
327+
328+
// 2. 重置数据库实例和初始化状态
329+
this.dbInstance = null;
330+
this.initPromise = null;
331+
this.isLocalDBSchemaSynced = false; // 重置同步状态
332+
333+
// 3. 删除 IndexedDB 数据库
317334
return new Promise<void>((resolve, reject) => {
318335
// 检查 IndexedDB 是否可用
319336
if (typeof indexedDB === 'undefined') {
320337
console.warn('IndexedDB is not available, cannot delete database');
321-
resolve();
338+
resolve(); // 在此环境下无法删除,直接解决
322339
return;
323340
}
324341

325-
const dbName = `/pglite/${DB_NAME}`;
342+
const dbName = `/pglite/${DB_NAME}`; // PGlite IdbFs 使用的路径
326343
const request = indexedDB.deleteDatabase(dbName);
327344

328345
request.onsuccess = () => {
@@ -338,8 +355,26 @@ export class DatabaseManager {
338355

339356
// eslint-disable-next-line unicorn/prefer-add-event-listener
340357
request.onerror = (event) => {
341-
console.error('❌ Error resetting database:', event);
342-
reject(new Error(`Failed to reset database '${dbName}'`));
358+
const error = (event.target as IDBOpenDBRequest)?.error;
359+
console.error(`❌ Error resetting database '${dbName}':`, error);
360+
reject(
361+
new Error(
362+
`Failed to reset database '${dbName}'. Error: ${error?.message || 'Unknown error'}`,
363+
),
364+
);
365+
};
366+
367+
request.onblocked = (event) => {
368+
// 当其他打开的连接阻止数据库删除时,会触发此事件
369+
console.warn(
370+
`Deletion of database '${dbName}' is blocked. This usually means other connections (e.g., in other tabs) are still open. Event:`,
371+
event,
372+
);
373+
reject(
374+
new Error(
375+
`Failed to reset database '${dbName}' because it is blocked by other open connections. Please close other tabs or applications using this database and try again.`,
376+
),
377+
);
343378
};
344379
});
345380
}

0 commit comments

Comments
 (0)