/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.core.db.setup;
import java.util.Collection;
import java.util.List;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
import org.rhq.core.db.DatabaseType;
/**
* @author Joseph Marques
*/
class SQLServerColumn extends Column {
protected SQLServerColumn(Node node, Table table) throws SAXException {
super(node, table);
}
protected String getCreateCommand(List cmds, Collection typemaps, DatabaseType dbtype) {
String defaultValue = this.getsDefault();
if (defaultValue != null) {
if (defaultValue.equalsIgnoreCase("TRUE")) {
this.m_sDefault = "1";
} else if (defaultValue.equalsIgnoreCase("FALSE")) {
this.m_sDefault = "0";
}
}
return super.getCreateCommand(cmds, typemaps, dbtype);
}
/*
* Recursive cascade path to RHQ_CONFIG_PROPERTY causes constraint creation errors on SQL Server, see
* http://support.microsoft.com/kb/321843
*
* So, prevent creation of recursive cascades, which will require more code in the SLSBs to handle logic properly
*/
protected String getOnDelete() {
if (m_strTableName.equalsIgnoreCase(getReferences())) {
return null;
}
return super.getOnDelete();
}
protected String getSizeCommand(List cmds) {
/*
* to create a VARCHAR data type with a maximum of more than 8K character, they must be declared
* as VARCHAR(MAX) data type with a check constraint to the column for the desired length
*/
if (getType().equals("CLOB")) { // translates into TEXT datatype, which takes no size param
return "";
} else if (getType().equals("VARCHAR2") && getSize() > 8000) {
return "(MAX)";
} else {
return super.getSizeCommand(cmds);
}
}
protected void getPostCreateCommands(List cmds) {
/*
* to create a VARCHAR data type with a maximum of more than 8K character, they must be declared
* as VARCHAR(MAX) data type with a check constraint to the column for the desired length
*/
if (getType().equals("VARCHAR2") && getSize() > 8000) {
String table = this.m_strTableName.toUpperCase();
String column = this.m_strName.toUpperCase();
String constraintName = column + String.valueOf(getSize());
cmds.add("ALTER TABLE " + table //
+ " ADD CONSTRAINT " + constraintName //
+ " CHECK DATALENGTH(" + column + ") <= " + getSize());
}
}
protected String getDefaultCommand(List cmds) {
String strCmd = "DEFAULT ";
switch (this.getDefault()) {
case Column.DEFAULT_AUTO_INCREMENT:
case Column.DEFAULT_SEQUENCE_ONLY: {
int seed = this.getIncrementSequence() > 0 ? this.getIncrementSequence() : 1;
int increment = this.getIncrementSequence() > 0 ? this.getIncrementSequence() : 1;
// IDENTITY columns do not start as DEFAULT definitions, they are special
strCmd = "IDENTITY ( " + String.valueOf(seed) + ", " + String.valueOf(increment) + " )";
}
}
return strCmd;
}
protected void getDropCommands(List cmds) {
if (this.hasDefault()) {
switch (this.getDefault()) {
case Column.DEFAULT_AUTO_INCREMENT:
case Column.DEFAULT_SEQUENCE_ONLY: {
// there's apparently no way to remove the IDENTITY property via T-SQL
// it needs to be done through system tables
cmds.add("sp_configure 'allow update', 1");
cmds.add("reconfigure with override");
cmds.add("update syscolumns set colstat = colstat - 1 " //
+ "where id = object_id('" + this.m_strTableName.toUpperCase() + "') " //
+ "and name = '" + this.getName().toUpperCase() + "'");
cmds.add("exec sp_configure 'allow update', 0");
cmds.add("reconfigure with override");
break;
}
}
}
}
}