mirror of
https://github.com/frappe/books.git
synced 2025-01-22 22:58:28 +00:00
fix: db async issue
This commit is contained in:
parent
058d5dc24e
commit
2efc2908fc
@ -354,37 +354,25 @@ export default class DatabaseCore extends DatabaseBase {
|
||||
return (res?.count ?? 0) > 0;
|
||||
}
|
||||
|
||||
async #removeColumns(schemaName: string, targetColumns: string[]) {
|
||||
const fields = this.schemaMap[schemaName]?.fields
|
||||
.filter((f) => f.fieldtype !== FieldTypeEnum.Table && !f.computed)
|
||||
.map((f) => f.fieldname);
|
||||
const tableRows = await this.getAll(schemaName, { fields });
|
||||
this.prestigeTheTable(schemaName, tableRows);
|
||||
async #dropColumns(schemaName: string, targetColumns: string[]) {
|
||||
await this.knex!.schema.table(schemaName, (table) => {
|
||||
table.dropColumns(...targetColumns);
|
||||
});
|
||||
}
|
||||
|
||||
async prestigeTheTable(schemaName: string, tableRows: FieldValueMap[]) {
|
||||
const max = 200;
|
||||
|
||||
// Alter table hacx for sqlite in case of schema change.
|
||||
const tempName = `__${schemaName}`;
|
||||
await this.knex!.schema.dropTableIfExists(tempName);
|
||||
|
||||
// Create replacement table
|
||||
await this.knex!.schema.dropTableIfExists(tempName);
|
||||
await this.knex!.raw('PRAGMA foreign_keys=OFF');
|
||||
await this.#createTable(schemaName, tempName);
|
||||
|
||||
if (tableRows.length > 200) {
|
||||
const fi = Math.floor(tableRows.length / max);
|
||||
for (let i = 0; i <= fi; i++) {
|
||||
const rowSlice = tableRows.slice(i * max, i + 1 * max);
|
||||
if (rowSlice.length === 0) {
|
||||
break;
|
||||
}
|
||||
await this.knex!.batchInsert(tempName, rowSlice);
|
||||
}
|
||||
} else {
|
||||
await this.knex!.batchInsert(tempName, tableRows);
|
||||
}
|
||||
// Insert rows from source table into the replacement table
|
||||
await this.knex!.batchInsert(tempName, tableRows, 200);
|
||||
|
||||
// Replace with the replacement table
|
||||
await this.knex!.schema.dropTable(schemaName);
|
||||
await this.knex!.schema.renameTable(tempName, schemaName);
|
||||
await this.knex!.raw('PRAGMA foreign_keys=ON');
|
||||
@ -593,21 +581,23 @@ export default class DatabaseCore extends DatabaseBase {
|
||||
const diff: ColumnDiff = await this.#getColumnDiff(schemaName);
|
||||
const newForeignKeys: Field[] = await this.#getNewForeignKeys(schemaName);
|
||||
|
||||
return this.knex!.schema.table(schemaName, (table) => {
|
||||
if (diff.added.length) {
|
||||
for (const field of diff.added) {
|
||||
this.#buildColumnForTable(table, field);
|
||||
}
|
||||
await this.knex!.schema.table(schemaName, (table) => {
|
||||
if (!diff.added.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (diff.removed.length) {
|
||||
this.#removeColumns(schemaName, diff.removed);
|
||||
}
|
||||
}).then(() => {
|
||||
if (newForeignKeys.length) {
|
||||
return this.#addForeignKeys(schemaName, newForeignKeys);
|
||||
for (const field of diff.added) {
|
||||
this.#buildColumnForTable(table, field);
|
||||
}
|
||||
});
|
||||
|
||||
if (diff.removed.length) {
|
||||
await this.#dropColumns(schemaName, diff.removed);
|
||||
}
|
||||
|
||||
if (newForeignKeys.length) {
|
||||
await this.#addForeignKeys(schemaName, newForeignKeys);
|
||||
}
|
||||
}
|
||||
|
||||
async #createTable(schemaName: string, tableName?: string) {
|
||||
@ -687,34 +677,8 @@ export default class DatabaseCore extends DatabaseBase {
|
||||
}
|
||||
|
||||
async #addForeignKeys(schemaName: string, newForeignKeys: Field[]) {
|
||||
await this.knex!.raw('PRAGMA foreign_keys=OFF');
|
||||
await this.knex!.raw('BEGIN TRANSACTION');
|
||||
|
||||
const tempName = 'TEMP' + schemaName;
|
||||
|
||||
// create temp table
|
||||
await this.#createTable(schemaName, tempName);
|
||||
|
||||
try {
|
||||
// copy from old to new table
|
||||
await this.knex!(tempName).insert(this.knex!.select().from(schemaName));
|
||||
} catch (err) {
|
||||
await this.knex!.raw('ROLLBACK');
|
||||
await this.knex!.raw('PRAGMA foreign_keys=ON');
|
||||
|
||||
const rows = await this.knex!.select().from(schemaName);
|
||||
await this.prestigeTheTable(schemaName, rows);
|
||||
return;
|
||||
}
|
||||
|
||||
// drop old table
|
||||
await this.knex!.schema.dropTable(schemaName);
|
||||
|
||||
// rename new table
|
||||
await this.knex!.schema.renameTable(tempName, schemaName);
|
||||
|
||||
await this.knex!.raw('COMMIT');
|
||||
await this.knex!.raw('PRAGMA foreign_keys=ON');
|
||||
const tableRows = await this.knex!.select().from(schemaName);
|
||||
await this.prestigeTheTable(schemaName, tableRows);
|
||||
}
|
||||
|
||||
async #loadChildren(
|
||||
|
Loading…
x
Reference in New Issue
Block a user