insert into tables with identity

This commit is contained in:
Jan Prochazka
2020-05-21 15:09:48 +02:00
parent 6df7743b4c
commit 68f5c88fb8
9 changed files with 87 additions and 36 deletions

View File

@@ -1,6 +1,6 @@
import _ from 'lodash';
import { Command, Insert, Update, Delete, UpdateField, Condition } from '@dbgate/sqltree';
import { NamedObjectInfo } from '@dbgate/types';
import { Command, Insert, Update, Delete, UpdateField, Condition, AllowIdentityInsert } from '@dbgate/sqltree';
import { NamedObjectInfo, DatabaseInfo } from '@dbgate/types';
export interface ChangeSetItem {
pureName: string;
@@ -175,17 +175,48 @@ function extractFields(item: ChangeSetItem, allowNulls = true): UpdateField[] {
}));
}
function insertToSql(item: ChangeSetItem): Insert {
function insertToSql(
item: ChangeSetItem,
dbinfo: DatabaseInfo = null
): [AllowIdentityInsert, Insert, AllowIdentityInsert] {
const fields = extractFields(item, false);
if (fields.length == 0) return null;
return {
targetTable: {
pureName: item.pureName,
schemaName: item.schemaName,
},
commandType: 'insert',
fields,
let autoInc = false;
if (dbinfo) {
const table = dbinfo.tables.find((x) => x.schemaName == item.schemaName && x.pureName == item.pureName);
if (table) {
const autoIncCol = table.columns.find((x) => x.autoIncrement);
console.log('autoIncCol', autoIncCol);
if (autoIncCol && fields.find((x) => x.targetColumn == autoIncCol.columnName)) {
autoInc = true;
}
}
}
const targetTable = {
pureName: item.pureName,
schemaName: item.schemaName,
};
return [
autoInc
? {
targetTable,
commandType: 'allowIdentityInsert',
allow: true,
}
: null,
{
targetTable,
commandType: 'insert',
fields,
},
autoInc
? {
targetTable,
commandType: 'allowIdentityInsert',
allow: false,
}
: null,
];
}
function extractCondition(item: ChangeSetItem): Condition {
@@ -239,12 +270,14 @@ function deleteToSql(item: ChangeSetItem): Delete {
};
}
export function changeSetToSql(changeSet: ChangeSet): Command[] {
return _.compact([
...changeSet.inserts.map(insertToSql),
...changeSet.updates.map(updateToSql),
...changeSet.deletes.map(deleteToSql),
]);
export function changeSetToSql(changeSet: ChangeSet, dbinfo: DatabaseInfo): Command[] {
return _.compact(
_.flatten([
...changeSet.inserts.map((item) => insertToSql(item, dbinfo)),
...changeSet.updates.map(updateToSql),
...changeSet.deletes.map(deleteToSql),
])
);
}
export function revertChangeSetRowChanges(changeSet: ChangeSet, definition: ChangeSetRowDefinition): ChangeSet {

View File

@@ -1,6 +1,6 @@
import _ from 'lodash';
import { GridConfig, GridCache, GridConfigColumns, createGridCache } from './GridConfig';
import { ForeignKeyInfo, TableInfo, ColumnInfo, DbType, EngineDriver, NamedObjectInfo } from '@dbgate/types';
import { ForeignKeyInfo, TableInfo, ColumnInfo, DbType, EngineDriver, NamedObjectInfo, DatabaseInfo } from '@dbgate/types';
import { parseFilter, getFilterType } from '@dbgate/filterparser';
import { filterName } from './filterName';
import { ChangeSetFieldDefinition, ChangeSetRowDefinition } from './ChangeSet';
@@ -47,7 +47,8 @@ export abstract class GridDisplay {
protected setConfig: ChangeConfigFunc,
public cache: GridCache,
protected setCache: ChangeCacheFunc,
public driver?: EngineDriver
public driver?: EngineDriver,
public dbinfo: DatabaseInfo = null
) {}
columns: DisplayColumn[];
baseTable?: TableInfo;

View File

@@ -15,9 +15,9 @@ export class TableGridDisplay extends GridDisplay {
setConfig: ChangeConfigFunc,
cache: GridCache,
setCache: ChangeCacheFunc,
protected dbinfo: DatabaseInfo
dbinfo: DatabaseInfo
) {
super(config, setConfig, cache, setCache, driver);
super(config, setConfig, cache, setCache, driver, dbinfo);
this.table = this.findTable(tableName);
if (!this.table) {