Files
dbgate/plugins/dbgate-plugin-postgres/src/frontend/Dumper.js
Jan Prochazka f72dbf19c2 driver tests
2024-12-13 15:06:11 +01:00

168 lines
4.9 KiB
JavaScript

const { SqlDumper, arrayToHexString, testEqualTypes } = global.DBGATE_PACKAGES['dbgate-tools'];
class Dumper extends SqlDumper {
/** @param type {import('dbgate-types').TransformType} */
transform(type, dumpExpr) {
switch (type) {
case 'GROUP:YEAR':
case 'YEAR':
this.put('^extract(^year ^from %c)', dumpExpr);
break;
case 'MONTH':
this.put('^extract(^month ^from %c)', dumpExpr);
break;
case 'DAY':
this.put('^extract(^day ^from %c)', dumpExpr);
break;
case 'GROUP:MONTH':
this.put("^to_char(%c, '%s')", dumpExpr, 'YYYY-MM');
break;
case 'GROUP:DAY':
this.put("^to_char(%c, '%s')", dumpExpr, 'YYYY-MM-DD');
break;
default:
dumpExpr();
break;
}
}
dropDatabase(name) {
this.putCmd('^drop ^database %i ^with(^force)', name);
}
dropRecreatedTempTable(tmptable) {
this.putCmd('^drop ^table %i ^cascade', tmptable);
}
renameTable(obj, newname) {
this.putCmd('^alter ^table %f ^rename ^to %i', obj, newname);
}
renameSqlObject(obj, newname) {
this.putCmd('^alter %k %f ^rename ^to %i', this.getSqlObjectSqlName(obj.objectTypeField), obj, newname);
}
renameColumn(column, newcol) {
this.putCmd('^alter ^table %f ^rename ^column %i ^to %i', column, column.columnName, newcol);
}
dropTable(obj, options = {}) {
this.put('^drop ^table');
if (options.testIfExists) this.put(' ^if ^exists');
this.put(' %f', obj);
this.endCommand();
}
//public override void CreateIndex(IndexInfo ix)
//{
//}
enableConstraints(table, enabled) {
this.putCmd('^alter ^table %f %k ^trigger ^all', table, enabled ? 'enable' : 'disable');
}
columnDefinition(col, options) {
if (col.autoIncrement) {
this.put('^serial');
return;
}
super.columnDefinition(col, options);
}
changeColumn(oldcol, newcol, constraints) {
if (oldcol.columnName != newcol.columnName) {
this.putCmd('^alter ^table %f ^rename ^column %i ^to %i', oldcol, oldcol.columnName, newcol.columnName);
}
if (!testEqualTypes(oldcol, newcol)) {
this.putCmd('^alter ^table %f ^alter ^column %i ^type %s', oldcol, newcol.columnName, newcol.dataType);
}
if (oldcol.defaultValue != newcol.defaultValue) {
if (newcol.defaultValue == null) {
this.putCmd('^alter ^table %f ^alter ^column %i ^drop ^default', newcol, newcol.columnName);
} else {
this.putCmd(
'^alter ^table %f ^alter ^column %i ^set ^default %s',
newcol,
newcol.columnName,
newcol.defaultValue
);
}
}
if (oldcol.notNull != newcol.notNull) {
if (!oldcol.notNull) {
this.fillNewNotNullDefaults(newcol);
}
if (newcol.notNull) this.putCmd('^alter ^table %f ^alter ^column %i ^set ^not ^null', newcol, newcol.columnName);
else this.putCmd('^alter ^table %f ^alter ^column %i ^drop ^not ^null', newcol, newcol.columnName);
}
}
putValue(value) {
if (value === true) this.putRaw('true');
else if (value === false) this.putRaw('false');
else super.putValue(value);
}
putByteArrayValue(value) {
this.putRaw(`e'\\\\x${arrayToHexString(value)}'`);
}
selectScopeIdentity(table) {
const column = table.columns && table.columns.find(x => x.autoIncrement);
this.put("^SELECT currval(pg_get_serial_sequence('%f','%s'))", table, column ? column.columnName : null);
}
callableTemplate(func) {
const putDeclareParamters = parameters => {
for (const param of parameters.filter(i => i.parameterMode != 'RETURN')) {
if (param.parameterMode == 'IN') {
this.put('%s %s := :%s', param.parameterName, param.dataType, param.parameterName);
this.endCommand();
} else {
this.put('%s %s', param.parameterName, param.dataType);
this.endCommand();
}
}
this.put('&n');
};
const putParameters = (parameters, delimiter) => {
this.putCollection(delimiter, parameters || [], param => {
this.putRaw(param.parameterName);
});
};
if (func.objectTypeField == 'procedures') {
this.put('^do $$&n');
this.put('^declare&n');
putDeclareParamters(func.parameters);
this.put('^begin&n');
this.put('^call %f(&>&n', func);
putParameters(func.parameters, ',&n');
this.put('&<&n)');
this.endCommand();
this.put('&n');
this.put('^end $$');
this.endCommand();
}
if (func.objectTypeField == 'functions') {
this.put('^do $$&n');
this.put('^declare&n');
this.put('result %s', func.returnType);
this.endCommand();
putDeclareParamters(func.parameters);
this.put('^begin&n');
this.put('result := %f(&>&n', func);
putParameters(func.parameters, ',&n');
this.put('&<&n)');
this.endCommand();
this.put('&n');
this.put('^end $$');
this.endCommand();
}
}
}
module.exports = Dumper;