package com.venky.swf.sql;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.venky.swf.db.Database;
import com.venky.swf.db.table.BindVariable;
import com.venky.swf.routing.Config;
public abstract class DDL extends DataManupulationStatement{
protected List<BindVariable> values = new ArrayList<BindVariable>();
protected String table ;
protected DDL(String pool,String table){
super(pool);
this.table = table;
}
protected void finalizeParameterizedSQL(){
}
@Override
public List<BindVariable> getValues() {
return values;
}
public static final class DropTable extends DDL {
public DropTable(String pool,String table){
super(pool,table);
getQuery().append("drop table ").append(table);
}
}
public static final class CreateTable extends DDL {
List<String> columnsSpec = new ArrayList<String>();
List<String> pk = new ArrayList<String>();
public CreateTable(String pool,String table){
super(pool,table);
}
String asSelect = null;
public CreateTable as(String selectClause){
if (columnsSpec.isEmpty() && pk.isEmpty()){
asSelect = selectClause;
}else {
throw new RuntimeException("Syntax Error for Create Table");
}
return this;
}
protected void finalizeParameterizedSQL(){
StringBuilder query = getQuery();
query.append("create table ").append(table);
if (asSelect != null){
query.append(" AS ");
query.append(asSelect);
}else {
query.append("( ");
Iterator<String> colSpecIterator = columnsSpec.iterator();
while(colSpecIterator.hasNext()){
String colSpec = colSpecIterator.next();
query.append(colSpec);
if (colSpecIterator.hasNext()){
query.append(" , ");
}
}
if (pk.size() > 0 && Database.getJdbcTypeHelper(getPool()).requiresSeparatePrimaryKeyClause()){
query.append(" , ").append(" primary key(");
Iterator<String> pkColumnIterator = pk.iterator();
while (pkColumnIterator.hasNext()){
String col = pkColumnIterator.next();
query.append(col);
if (pkColumnIterator.hasNext()){
query.append(",");
}
}
query.append(")");
}
query.append(" )");
}
Config.instance().getLogger(getClass().getName()).fine(query.toString());
}
public void addColumn(String columnSpec){
assert asSelect == null;
columnsSpec.add(columnSpec);
}
public void addPrimaryKeyColumn(String pkColumn){
assert asSelect == null;
pk.add(pkColumn);
}
}
public static final class AlterTable extends DDL {
public AlterTable(String pool,String table){
super(pool,table);
}
private String alterSpec = null ;
public void dropColumn(String columnName){
if (alterSpec == null){
alterSpec = " drop column " + columnName;
}
}
public void addColumn(String columnSpec){
if (alterSpec == null){
alterSpec = " add column " + columnSpec;
}
}
protected void finalizeParameterizedSQL(){
StringBuilder query = getQuery();
query.append("alter table ").append(table);
query.append(alterSpec);
}
}
}