package com.idega.util.dbschema; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; /** * * @author <a href="mailto:tryggvi@idega.is">Tryggvi Larusson </a> * * @version 1.0 * */ public class HSQLSchemaAdapter extends SQLSchemaAdapter { //implements // org.hsqldb.Trigger{ public String getSQLType(String javaClassName, int maxlength) { String theReturn; if (javaClassName.equals("java.lang.Integer")) { if(maxlength>10){ theReturn = "BIGINT"; } else{ theReturn = "INTEGER"; } } else if (javaClassName.equals("java.lang.String")) { if (maxlength <= 0) { theReturn = "VARCHAR(255)"; } else if (maxlength<=4000){ theReturn = "VARCHAR("+maxlength+")"; } else { theReturn = "LONGVARCHAR"; } } else if (javaClassName.equals("java.lang.Boolean")) { theReturn = "CHAR(1)"; } else if (javaClassName.equals("java.lang.Float")) { theReturn = "DOUBLE"; } else if (javaClassName.equals("java.lang.Double")) { theReturn = "DOUBLE"; } else if (javaClassName.equals("java.sql.Timestamp")) { theReturn = "TIMESTAMP"; } else if (javaClassName.equals("java.sql.Date") || javaClassName.equals("java.util.Date")) { theReturn = "DATE"; } else if (javaClassName.equals("java.sql.Blob")) { theReturn = "LONGVARBINARY"; } else if (javaClassName.equals("java.sql.Time")) { theReturn = "TIME"; } else if (javaClassName.equals("com.idega.util.Gender")) { theReturn = "VARCHAR(1)"; } else if (javaClassName.equals("com.idega.data.BlobWrapper")) { theReturn = "LONGVARBINARY"; } else { theReturn = ""; } return theReturn; } /* protected void createForeignKey(GenericEntity entity, String baseTableName, String columnName, String refrencingTableName, String referencingColumnName) throws Exception { String SQLCommand = "ALTER TABLE " + baseTableName + " ADD CONSTRAINT " + columnName + refrencingTableName + referencingColumnName + " FOREIGN KEY " + columnName + " REFERENCES " + refrencingTableName + "(" + referencingColumnName + ")"; executeUpdate(entity, SQLCommand); } */ protected String getCreatePrimaryKeyStatementBeginning(String tableName) { return "alter table " + tableName + " add constraint " + tableName + "_PK UNIQUE ("; } public void createTrigger( Schema schema) throws Exception { //super.executeQuery(entity,"CREATE TRIGGER ins_after BEFORE INSERT ON // "+entity.getTableName()+" CALL \""+this.getClass().getName()+"\""); } /* (non-Javadoc) * @see com.idega.data.store.DatastoreInterface#getIDColumnType(com.idega.data.IDOEntityDefinition) */ public String getIDColumnType(Schema entity) { if (entity.hasAutoIncrementColumn()) { return "INTEGER IDENTITY"; } else { return "INTEGER"; } } public void createSequence(Schema schema) throws Exception { } /* (non-Javadoc) * @see com.idega.data.store.DatastoreInterface#deleteEntityRecord(java.lang.String, com.idega.data.IDOEntityDefinition) */ public void removeSchema(Schema schema) throws Exception { super.removeSchema(schema); deleteTrigger(schema); deleteSequence(schema); } protected void deleteTrigger(Schema schema) throws Exception { } protected void deleteSequence(Schema schema) throws Exception { } /*protected String getCreateUniqueIDQuery(GenericEntity entity) { return "insert into " + getSequenceTableName(entity) + "(" + entity.getIDColumnName() + ") values(null)"; }*/ public String getSequenceTableName(Schema schema) { //return "seq_"+entity.getTableName(); return schema.getSQLName(); } //Implementing org.hsqldb.Trigger: public void fire(String trigName, String tabName, Object row[]) { System.out.println(trigName + " trigger fired on " + tabName); System.out.print("col 0 value <"); System.out.print(row[0]); System.out.println(">"); // you can cast row[i] given your knowledge of what the table // format is. } /** * Returns the string "CREATE CACHED TABLE [tableName]".<br> * This is overrided from the superclass. * @param tableName * @return */ public String getCreateTableCommand(String tableName){ return "CREATE CACHED TABLE "+tableName; } /** * Override in subclasses **/ public void onConnectionCreate(Connection newConn) { try { Statement stmt = newConn.createStatement(); stmt.execute("SET PROPERTY \"hsqldb.first_identity\" 1"); stmt.close(); System.out.println("HSQLDatastoreInterface: Setting first_identity property to 1 for HSQLDB"); /* This parameter is set for the OCI driver in a shell script usually but could be set here also stmt = newConn.createStatement(); stmt.execute("ALTER SESSION SET NLS_LANG='.AL32UTF8'"); stmt.close(); System.out.println("OracleDatastoreInterface: Setting language environment variable for Oracle to NLS_LANG=.UTF8 for Unicode support."); */ } catch (SQLException sqle) { System.err.println("HSQLDatastoreInterface: Error when changing property: " + sqle.getMessage()); sqle.printStackTrace(); } } /** * Returns the command for "ALTER TABLE [tableName] ADD <strong>COLUMN</strong> [columnName] [dataType] by default.<br> * This is overrided from the superclass. * @param columnName * @param entity * @return */ public String getAddColumnCommand(SchemaColumn column, Schema schema) { String SQLString = "alter table "+schema.getSQLName()+" add column "+getColumnSQLDefinition(column,schema); return SQLString; } public boolean supportsUniqueConstraintInColumnDefinition(){ //TODO: Implement support for UNIQUE for HSQLDB return false; } }