preloaded rows works with autoinc columns (fix for mssql)

This commit is contained in:
SPRINX0\prochazka
2024-08-29 10:53:56 +02:00
parent e982e8cd9b
commit c097e78dd0
5 changed files with 40 additions and 7 deletions

View File

@@ -210,7 +210,6 @@ export class SqlDumper implements AlterProcessor {
} else { } else {
this.putRaw(SqlDumper.convertKeywordCase(type)); this.putRaw(SqlDumper.convertKeywordCase(type));
} }
} }
columnDefinition(column: ColumnInfo, { includeDefault = true, includeNullable = true, includeCollate = true } = {}) { columnDefinition(column: ColumnInfo, { includeDefault = true, includeNullable = true, includeCollate = true } = {}) {
@@ -653,7 +652,14 @@ export class SqlDumper implements AlterProcessor {
this.putCmd('^drop %s %f', this.getSqlObjectSqlName(obj.objectTypeField), obj); this.putCmd('^drop %s %f', this.getSqlObjectSqlName(obj.objectTypeField), obj);
} }
fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[], insertOnly: string[]) { fillPreloadedRows(
table: NamedObjectInfo,
oldRows: any[],
newRows: any[],
key: string[],
insertOnly: string[],
autoIncrementColumn: string
) {
let was = false; let was = false;
for (const row of newRows) { for (const row of newRows) {
const old = oldRows?.find(r => key.every(col => r[col] == row[col])); const old = oldRows?.find(r => key.every(col => r[col] == row[col]));
@@ -676,12 +682,15 @@ export class SqlDumper implements AlterProcessor {
} else { } else {
if (was) this.put(';\n'); if (was) this.put(';\n');
was = true; was = true;
const autoinc = rowKeys.includes(autoIncrementColumn);
if (autoinc) this.allowIdentityInsert(table, true);
this.put( this.put(
'^insert ^into %f (%,i) ^values (%,v)', '^insert ^into %f (%,i) ^values (%,v)',
table, table,
rowKeys, rowKeys,
rowKeys.map(x => row[x]) rowKeys.map(x => row[x])
); );
if (autoinc) this.allowIdentityInsert(table, false);
} }
} }
if (was) { if (was) {

View File

@@ -94,6 +94,7 @@ interface AlterOperation_FillPreloadedRows {
newRows: any[]; newRows: any[];
key: string[]; key: string[];
insertOnly: string[]; insertOnly: string[];
autoIncrementColumn: string;
} }
type AlterOperation = type AlterOperation =
@@ -233,7 +234,14 @@ export class AlterPlan {
this.recreates.tables += 1; this.recreates.tables += 1;
} }
fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[], insertOnly: string[]) { fillPreloadedRows(
table: NamedObjectInfo,
oldRows: any[],
newRows: any[],
key: string[],
insertOnly: string[],
autoIncrementColumn: string
) {
this.operations.push({ this.operations.push({
operationType: 'fillPreloadedRows', operationType: 'fillPreloadedRows',
table, table,
@@ -241,6 +249,7 @@ export class AlterPlan {
newRows, newRows,
key, key,
insertOnly, insertOnly,
autoIncrementColumn,
}); });
} }
@@ -567,7 +576,7 @@ export function runAlterOperation(op: AlterOperation, processor: AlterProcessor)
processor.dropSqlObject(op.oldObject); processor.dropSqlObject(op.oldObject);
break; break;
case 'fillPreloadedRows': case 'fillPreloadedRows':
processor.fillPreloadedRows(op.table, op.oldRows, op.newRows, op.key, op.insertOnly); processor.fillPreloadedRows(op.table, op.oldRows, op.newRows, op.key, op.insertOnly, op.autoIncrementColumn);
break; break;
case 'recreateTable': case 'recreateTable':
{ {

View File

@@ -116,7 +116,14 @@ export class DatabaseInfoAlterProcessor {
throw new Error('recreateTable not implemented for DatabaseInfoAlterProcessor'); throw new Error('recreateTable not implemented for DatabaseInfoAlterProcessor');
} }
fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[], insertOnly: string[]) { fillPreloadedRows(
table: NamedObjectInfo,
oldRows: any[],
newRows: any[],
key: string[],
insertOnly: string[],
autoIncrementColumn: string
) {
const tableInfo = this.db.tables.find(x => x.pureName == table.pureName && x.schemaName == table.schemaName); const tableInfo = this.db.tables.find(x => x.pureName == table.pureName && x.schemaName == table.schemaName);
tableInfo.preloadedRows = newRows; tableInfo.preloadedRows = newRows;
tableInfo.preloadedRowsKey = key; tableInfo.preloadedRowsKey = key;

View File

@@ -368,7 +368,8 @@ function planTablePreload(plan: AlterPlan, oldTable: TableInfo, newTable: TableI
oldTable?.preloadedRows, oldTable?.preloadedRows,
newTable.preloadedRows, newTable.preloadedRows,
key, key,
newTable.preloadedRowsInsertOnly newTable.preloadedRowsInsertOnly,
newTable.columns.find(x => x.autoIncrement)?.columnName
); );
} }
} }

View File

@@ -15,5 +15,12 @@ export interface AlterProcessor {
recreateTable(oldTable: TableInfo, newTable: TableInfo); recreateTable(oldTable: TableInfo, newTable: TableInfo);
createSqlObject(obj: SqlObjectInfo); createSqlObject(obj: SqlObjectInfo);
dropSqlObject(obj: SqlObjectInfo); dropSqlObject(obj: SqlObjectInfo);
fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[], insertOnly: string[]); fillPreloadedRows(
table: NamedObjectInfo,
oldRows: any[],
newRows: any[],
key: string[],
insertOnly: string[],
autoIncrementColumn: string
);
} }