You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
2.2 KiB

import ConnectionMutable from "./ConnectionMutable.ts";
import {MalformedSQLGrammarError} from "./Select.ts";
import {TableRefBuilder} from "./TableRefBuilder.ts";
import {applyMixins} from "../../../../lib/src/support/mixins.ts";
import {QuerySource} from "../types.ts";
export class Truncate<T> extends ConnectionMutable<T> {
protected _source?: QuerySource
protected _only: boolean = false
protected _restart: boolean = false
protected _continue: boolean = false
protected _cascade: boolean = false
protected _restrict: boolean = false
constructor(table?: QuerySource, alias?: string) {
super()
if ( table ) this.table(table, alias)
}
sql(level: number = 0): string {
const indent = Array(level).fill(' ').join('')
if ( typeof this._source === 'undefined' )
throw new MalformedSQLGrammarError(`No table reference has been provided.`)
const table_ref = this.source_alias_to_table_ref(this._source)
let identity = ''
if ( this._continue ) identity = 'CONTINUE IDENTITY '
else if ( this._restart ) identity = 'RESTART IDENTITY '
let cascade_redirect = ''
if ( this._cascade ) cascade_redirect = 'CASCADE '
else if ( this._restrict ) cascade_redirect = 'RESTRICT'
return [
`TRUNCATE TABLE ${this._only ? 'ONLY ' : ''}${this.serialize_table_ref(table_ref)}`,
`${identity}${cascade_redirect}`,
].filter(x => String(x).trim()).join(`\n${indent}`)
}
table(source: QuerySource, alias?: string) {
if ( !alias ) this._source = source
else this._source = { ref: source, alias }
return this
}
restart_identity() {
this._continue = false
this._restart = true
return this
}
continue_identity() {
this._continue = true
this._restart = false
return this
}
cascade() {
this._cascade = true
this._restrict = false
return this
}
restrict() {
this._cascade = false
this._restrict = true
return this
}
}
export interface Truncate<T> extends TableRefBuilder {}
applyMixins(Truncate, [TableRefBuilder])