[WEB-2706] fix: Fix issue with SQLite transactions (#5934)

* - Fix transaction within transaction issue
- Close DB handles on reload
- Fix GET_ISSUES tracking

* Cleanup stray code

* Fix lint error

* Possible fix for NoModificationAllowedError
This commit is contained in:
Satish Gandham 2024-11-04 16:54:13 +05:30 committed by GitHub
parent 20b2a70939
commit a1bfde6af9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 26 additions and 9 deletions

View file

@ -37,8 +37,18 @@ export class Storage {
constructor() {
this.db = null;
if (typeof window !== "undefined") {
window.addEventListener("beforeunload", this.closeDBConnection);
}
}
closeDBConnection = async () => {
if (this.db) {
await this.db.close();
}
};
reset = () => {
if (this.db) {
this.db.close();
@ -293,7 +303,10 @@ export class Storage {
let issuesRaw: any[] = [];
let count: any[];
try {
[issuesRaw, count] = await Promise.all([runQuery(query), runQuery(countQuery)]);
[issuesRaw, count] = await startSpan(
{ name: "GET_ISSUES" },
async () => await Promise.all([runQuery(query), runQuery(countQuery)])
);
} catch (e) {
logError(e);
const issueService = new IssueService();

View file

@ -17,7 +17,7 @@ export const addIssue = async (issue: any) => {
export const addIssuesBulk = async (issues: any, batchSize = 100) => {
if (!rootStore.user.localDBEnabled || !persistence.db) return;
if (!issues.length) return;
const insertStart = performance.now();
await persistence.db.exec("BEGIN;");

View file

@ -115,14 +115,14 @@ export const loadWorkSpaceData = async (workspaceSlug: string) => {
const [labels, modules, cycles, states, estimates, memebers] = await Promise.all(promises);
const start = performance.now();
await persistence.db.exec("BEGIN TRANSACTION;");
await persistence.db.exec("BEGIN;");
await batchInserts(labels, "labels", labelSchema);
await batchInserts(modules, "modules", moduleSchema);
await batchInserts(cycles, "cycles", cycleSchema);
await batchInserts(states, "states", stateSchema);
await batchInserts(estimates, "estimate_points", estimatePointSchema);
await batchInserts(memebers, "members", memberSchema);
await persistence.db.exec("COMMIT");
await persistence.db.exec("COMMIT;");
const end = performance.now();
log("Time taken to load workspace data", end - start);
};

View file

@ -36,7 +36,12 @@ export class DBClass {
this.sqlite3 = SQLite.Factory(m);
const vfs = await MyVFS.create("plane", m);
this.sqlite3.vfs_register(vfs, true);
const db = await this.sqlite3.open_v2(`${dbName}.sqlite3`);
const db = await this.sqlite3.open_v2(
`${dbName}.sqlite3`,
this.sqlite3.OPEN_READWRITE | this.sqlite3.OPEN_CREATE,
"plane"
);
this.instance.db = db;
this.instance.exec = async (sql: string) => {
const rows: any[] = [];
@ -57,6 +62,8 @@ export class DBClass {
}
async exec(props: string | TQueryProps) {
// @todo this will fail if the transaction is started any other way
// eg: BEGIN, OR BEGIN TRANSACTION
if (props === "BEGIN;") {
let promiseToAwait;
if (this.tp.length > 0) {

View file

@ -71,10 +71,7 @@ export class IssueService extends APIService {
if (!isEmpty(queries.expand as string) && !queries.group_by)
return await this.getIssuesFromServer(workspaceSlug, projectId, queries, config);
const response = await startSpan({ name: "GET_ISSUES" }, async () => {
const res = await persistence.getIssues(workspaceSlug, projectId, queries, config);
return res;
});
const response = await persistence.getIssues(workspaceSlug, projectId, queries, config);
return response as TIssuesResponse;
}