package org.aplikator.server.persistence.empiredb.oracle; import java.sql.Connection; import java.sql.SQLException; import org.apache.empire.db.*; import org.apache.empire.db.exceptions.EmpireSQLException; import org.apache.empire.db.oracle.OracleDDLGenerator; import org.apache.empire.exceptions.InvalidArgumentException; import org.apache.empire.exceptions.NotImplementedException; import org.apache.empire.exceptions.NotSupportedException; import org.aplikator.server.persistence.PersisterFactory; public class EmpireDDLGeneratorOracle extends OracleDDLGenerator { public EmpireDDLGeneratorOracle(EmpireDriverOracle driver) { super(driver); } @Override protected void appendColumnDesc(DBTableColumn c, boolean alter, StringBuilder sql) { if (alter) { // Append name c.addSQL(sql, DBExpr.CTX_NAME); sql.append(" "); // Unknown data type if (!appendColumnDataType(c.getDataType(), c.getSize(), c, sql)) return; // Default Value if (driver.isDDLColumnDefaults() && !c.isAutoGenerated() && c.getDefaultValue() != null) { sql.append(" DEFAULT "); sql.append(driver.getValueString(c.getDefaultValue(), c.getDataType())); } } else { super.appendColumnDesc(c, alter, sql); } } @Override protected void createSequence(DBDatabase db, DBTableColumn c, DBSQLScript script) { super.createSequence(db, c, script); } protected void dropSequence(String sequenceName, DBSQLScript script) { String sql = "drop sequence \"" + sequenceName + "\""; script.addStmt(sql); } public void getDDLDropRelation(String tableName, String relationName, DBSQLScript script) { String sql = "ALTER TABLE " + tableName + " DROP CONSTRAINT " + relationName; script.addStmt(sql); } private void getDDLPrimaryKey(DBIndex pk, DBSQLScript script, DBCmdType type) { StringBuilder sql = new StringBuilder(); boolean addSeparator; if (DBCmdType.DROP.equals(type)) { sql.append("ALTER TABLE " + pk.getTable().getName() + " DROP PRIMARY KEY"); script.addStmt(sql); } if (DBCmdType.CREATE.equals(type)) { if (pk != null) { // add the primary key sql.append("ALTER TABLE " + pk.getTable().getName() + " ADD"); if (namePrimaryKeyConstraint) { sql.append(" CONSTRAINT "); appendElementName(sql, pk.getName()); } sql.append(" PRIMARY KEY ("); addSeparator = false; // columns DBColumn[] keyColumns = pk.getColumns(); for (int i = 0; i < keyColumns.length; i++) { sql.append((addSeparator) ? ", " : ""); keyColumns[i].addSQL(sql, DBExpr.CTX_NAME); addSeparator = true; } sql.append(")"); } script.addStmt(sql); } } // GetDDL public void getDDLScript(DBCmdType type, DBObject dbo, DBSQLScript script) { if (dbo == null) throw new InvalidArgumentException("dbo", dbo); // The Object's database must be attached to this driver if (!DBCmdType.DROP.equals(type)) if (dbo.getDatabase().getDriver() != driver) throw new InvalidArgumentException("dbo", dbo); // Check Type of object if (dbo instanceof DBDatabase) { // Database switch (type) { case CREATE: createDatabase((DBDatabase) dbo, script); return; case DROP: dropObject(((DBDatabase) dbo).getSchema(), "USER", script); return; case ALTER: if (((DBDatabase) dbo).getDriver() != null) { EmpireDriverOracle driver = (EmpireDriverOracle) ((DBDatabase) dbo).getDriver(); Connection conn = null; try { conn = PersisterFactory.getPersister().getJDBCConnection(); ((EmpireDriverOracle) driver).checkDatabase((DBDatabase) dbo, conn.getMetaData().getUserName(), conn, script); } catch (SQLException ex) { throw new EmpireSQLException(driver, ex); } finally { if (conn != null) { try { conn.commit(); conn.close(); } catch (SQLException ex) { throw new EmpireSQLException(driver, ex); } } } } return; default: throw new NotImplementedException(this, "getDDLScript." + dbo.getClass().getName() + "." + type); } } else if (dbo instanceof DBTable) { // Table switch (type) { case CREATE: createTable((DBTable) dbo, script); return; case DROP: dropObject(((DBTable) dbo).getName(), "TABLE", script); return; default: throw new NotImplementedException(this, "getDDLScript." + dbo.getClass().getName() + "." + type); } } else if (dbo instanceof DBView) { // View switch (type) { case CREATE: createView((DBView) dbo, script); return; case DROP: dropObject(((DBView) dbo).getName(), "VIEW", script); return; case ALTER: dropObject(((DBView) dbo).getName(), "VIEW", script); createView((DBView) dbo, script); return; default: throw new NotImplementedException(this, "getDDLScript." + dbo.getClass().getName() + "." + type); } } else if (dbo instanceof DBRelation) { // Relation switch (type) { case CREATE: createRelation((DBRelation) dbo, script); return; case DROP: getDDLDropRelation(((DBRelation) dbo).getReferences()[0] .getSourceColumn().getRowSet().getName(), ((DBRelation) dbo).getName(), script); return; case ALTER: getDDLDropRelation(((DBRelation) dbo).getReferences()[0] .getSourceColumn().getRowSet().getName(), ((DBRelation) dbo).getName(), script); createRelation((DBRelation) dbo, script); return; default: throw new NotImplementedException(this, "getDDLScript." + dbo.getClass().getName() + "." + type); } } else if (dbo instanceof DBIndex) { // Relation switch (type) { case CREATE: if (((DBIndex) dbo).getType() == DBIndex.PRIMARYKEY) { getDDLPrimaryKey((DBIndex) dbo, script, type); } else { createIndex(((DBIndex) dbo).getTable(), (DBIndex) dbo, script); } return; case DROP: if (((DBIndex) dbo).getType() == DBIndex.PRIMARYKEY) { getDDLPrimaryKey((DBIndex) dbo, script, DBCmdType.DROP); } else { dropObject(((DBIndex) dbo).getName(), "INDEX", script); } return; case ALTER: if (((DBIndex) dbo).getType() == DBIndex.PRIMARYKEY) { getDDLPrimaryKey((DBIndex) dbo, script, DBCmdType.DROP); getDDLPrimaryKey((DBIndex) dbo, script, DBCmdType.CREATE); } else { dropObject(((DBIndex) dbo).getName(), "INDEX", script); createIndex(((DBIndex) dbo).getTable(), (DBIndex) dbo, script); } return; default: throw new NotImplementedException(this, "getDDLScript." + dbo.getClass().getName() + "." + type); } } else if (dbo instanceof DBTableColumn) { // Table Column alterTable((DBTableColumn) dbo, type, script); return; } else { // dll generation not supported for this type throw new NotSupportedException(this, "getDDLScript() for " + dbo.getClass().getName()); } } public void changeNullabilityOnly(DBTableColumn c, DBSQLScript script) { StringBuilder sql = new StringBuilder(); sql.append("ALTER TABLE "); c.getRowSet().addSQL(sql, DBExpr.CTX_FULLNAME); sql.append(alterColumnPhrase); sql.append(c.getName()); if (c.isAutoGenerated() || c.isRequired()) { sql.append(" NOT NULL"); } else { sql.append(" NULL"); } script.addStmt(sql); } }