module uim.sql.tables.altercolumn;

import uim.sql;

class DSQLAlterColumn : DSQLUpdateStatement {
	this() { super(); }
	this(string aTableName) { this(); _tableName = aTableName; }
	this(string aTableName, string aColumnName) { this(aTableName); _columnName = aColumnName; }
	this(string aTableName, string aColumnName, string aColumnDefinition) { this(aTableName, aColumnName); _columnDefinition = aColumnDefinition; }
	
	mixin(TProperty!("string", "tableName")); 
	mixin(TProperty!("string", "columnName")); 
	mixin(TProperty!("string", "columnDefinition")); 
	
	O column(this O)(string name, string definition) {
		_columnName = name;
		_columnDefinition = definition;
		return cast(O)this;
	}
	
	override string toSQL() {
		return "ALTER %s ALTER COLUMN %s %s".format(_tableName, _columnName, _columnDefinition);
	}
}
auto SQLAlterColumn() { return new DSQLAlterColumn; }
auto SQLAlterColumn(string aTableName) { return new DSQLAlterColumn(aTableName); }
auto SQLAlterColumn(string aTableName, string aColumnName) { return new DSQLAlterColumn(aTableName, aColumnName); }
auto SQLAlterColumn(string aTableName, string aColumnName, string aColumnDefinition) { return new DSQLAlterColumn(aTableName, aColumnName, aColumnDefinition); }

unittest {
	writeln("Testing ", __MODULE__);
	
	assert(SQLAlterColumn("xxx", "yyy", "zzz") == "ALTER xxx ALTER COLUMN yyy zzz");
	assert(SQLAlterColumn
		.tableName("xxx")
		.columnName("yyy")
		.columnDefinition("zzz") == "ALTER xxx ALTER COLUMN yyy zzz");
	assert(SQLAlterColumn
		.tableName("xxx")
		.column("yyy", "zzz") == "ALTER xxx ALTER COLUMN yyy zzz");
}