package com.idega.util.dbschema;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import com.idega.util.IWTimestamp;
/**
*
*
* Last modified: $Date: 2007/01/12 19:31:31 $ by $Author: idegaweb $
*
* @author <a href="mailto:aron@idega.com">aron</a>
* @version $Revision: 1.1.2.1 $
*/
public class McKoiSchemaAdapter extends SQLSchemaAdapter {
protected McKoiSchemaAdapter(){
super.useTransactionsInSchemaCreation=false;
}
public String getSQLType(String javaClassName, int maxlength) {
String theReturn;
if (javaClassName.equals("java.lang.Integer")) {
theReturn = "NUMERIC";
}
else if (javaClassName.equals("java.lang.String")) {
if (maxlength < 0) {
theReturn = "VARCHAR(255)";
}
else if (maxlength <= 1000000000) {
theReturn = "VARCHAR(" + maxlength + ")";
}
else {
theReturn = "CLOB";
}
}
else if (javaClassName.equals("java.lang.Boolean")) {
theReturn = "CHAR(1)";
}
else if (javaClassName.equals("java.lang.Float")) {
theReturn = "FLOAT";
}
else if (javaClassName.equals("java.lang.Double")) {
theReturn = "FLOAT(15)";
}
else if (javaClassName.equals("java.sql.Timestamp")) {
theReturn = "DATE";
}
else if (javaClassName.equals("java.sql.Date") || javaClassName.equals("java.util.Date")) {
theReturn = "DATE";
}
else if (javaClassName.equals("java.sql.Blob")) {
theReturn = "BLOB";
}
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 = "BLOB";
}
else {
theReturn = "";
}
return theReturn;
}
/* (non-Javadoc)
* @see com.idega.data.store.DatastoreInterface#createTrigger(java.lang.String, com.idega.data.IDOEntityDefinition)
*/
public void createTrigger(Schema entityDefinition) throws Exception {
createSequence( entityDefinition);
}
public void createSequence(Schema entityDefinition) throws Exception {
createSequence(entityDefinition, 0);
}
public void createSequence(Schema entityDefinition, int startNumber) throws Exception {
Connection conn = null;
Statement Stmt = null;
try {
conn = getConnection();
Stmt = conn.createStatement();
String seqCreate =
"CREATE SEQUENCE "
+ getSequenceName(entityDefinition)
+ " START "
+ startNumber
+ " CACHE 20";
Stmt.executeUpdate(seqCreate);
System.out.println(seqCreate);
}
finally {
if (Stmt != null) {
Stmt.close();
}
if (conn != null) {
freeConnection(conn);
}
}
}
/*
public void createSequence(IDOLegacyEntity entity) throws Exception {
Connection conn = null;
Statement Stmt = null;
try {
conn = entity.getConnection();
Stmt = conn.createStatement();
int i =
Stmt.executeUpdate(
"create sequence "
+ entity.getTableName()
+ "_seq INCREMENT BY 1 START WITH 1 MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE CACHE 20 NOORDER");
}
finally {
if (Stmt != null) {
Stmt.close();
}
if (conn != null) {
entity.freeConnection(conn);
}
}
}*/
/* (non-Javadoc)
* @see com.idega.data.store.DatastoreInterface#deleteEntityRecord(java.lang.String, com.idega.data.EntityDefinition)
*/
public void removeSchema(Schema entity) throws Exception {
super.removeSchema(entity);
deleteTrigger(entity);
deleteSequence(entity);
}
protected void deleteTrigger(Schema entity) throws Exception {
executeUpdate("drop trigger " + entity.getSQLName() + "_trig");
}
protected void deleteSequence(Schema entity) throws Exception {
executeUpdate("drop sequence " + getSequenceName(entity));
}
protected String getCreateUniqueIDQuery(Schema entity) {
return "SELECT NEXTVAL('" + getSequenceName(entity) + "')";
}
private String getSequenceName(Schema entity) {
String entityName = entity.getSQLName();
String theReturn = entityName + "_SEQ";
return theReturn.toUpperCase();
/*if (entityName.endsWith("_")){
return entityName+"seq";
}
else{
return entityName+"_seq";
}*/
}
public void setNumberGeneratorValue(Schema entity, int value) {
//throw new RuntimeException("setSequenceValue() not implemented for "+this.getClass().getName());
//String statement = "update sequences set last_number="+value+" where sequence_name='"+this.getSequenceName(entity)+"'";
String statement = "drop sequence " + this.getSequenceName(entity);
try {
this.executeUpdate( statement);
this.createSequence(entity, value + 1);
}
catch (Exception e) {
e.printStackTrace();
}
}
/* (non-Javadoc)
* @see com.idega.data.DatastoreInterface#getTableColumnNames(java.lang.String, java.lang.String)
*/
public String[] getTableColumnNames( String tableName) {
Connection conn = null;
Statement stmnt = null;
ResultSet rs = null;
java.util.Vector v = new java.util.Vector();
try{
conn = getConnection();
stmnt = conn.createStatement();
rs = stmnt.executeQuery("DESCRIBE "+tableName);
while (rs.next()) {
String column = rs.getString("NAME");
v.add(column);
//System.out.println("\t\t"+column);
}
rs.close();
return (String[])v.toArray(new String[0]);
}
catch(SQLException e){
e.printStackTrace();
}
finally{
if(conn!=null){
freeConnection(conn);
}
}
if(v!=null && !v.isEmpty()) {
return (String[])v.toArray(new String[0]);
}
return null;
}
public boolean useIndexes() {
return false;
}
/* (non-Javadoc)
* @see com.idega.data.DatastoreInterface#format(java.sql.Date)
*/
public String format(Date date) {
IWTimestamp stamp = new IWTimestamp(date);
return " {d '"+(stamp.toSQLString())+"'} ";
}
/* (non-Javadoc)
* @see com.idega.data.DatastoreInterface#format(java.sql.Timestamp)
*/
public String format(Timestamp timestamp) {
IWTimestamp stamp = new IWTimestamp(timestamp);
return " {d '"+(stamp.toSQLString())+"'} ";
}
}