// idega 2000 - Tryggvi Larusson
/*
*
* Copyright 2000 idega.is All Rights Reserved.
*
*/
package com.idega.data;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
*
* @author <a href="mailto:tryggvi@idega.is">Tryggvi Larusson</a>
*
* @version 1.0
*
*/
public class MySQLDatastoreInterface extends DatastoreInterface {
private static final int MAX_TOTAL_INDEX_COLUMN_SIZE = 255; // 767 / 3 (Innodb max / 3 for unicode)
private static final int MAX_INDEX_COLUMN_SIZE = 100;
MySQLDatastoreInterface() {
this.useTransactionsInEntityCreation = false;
}
/*protected String getCreateUniqueIDQuery(GenericEntity entity) {
return "insert into " + getSequenceTableName(entity) + "(" + entity.getIDColumnName() + ") values(null)";
}*/
/*
public int createUniqueID(GenericEntity entity) throws Exception {
int returnInt = -1;
Connection conn = null;
Statement stmt = null;
ResultSet RS = null;
try {
conn = entity.getConnection();
stmt = conn.createStatement();
stmt.executeUpdate(getCreateUniqueIDQuery(entity));
stmt.close();
stmt = conn.createStatement();
RS = stmt.executeQuery("select last_insert_id()");
RS.next();
returnInt = RS.getInt(1);
}
finally {
if (RS != null) {
RS.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
entity.freeConnection(conn);
}
}
return returnInt;
}
protected void executeBeforeInsert(GenericEntity entity) throws Exception {
if (entity.isNull(entity.getIDColumnName())) {
entity.setID(createUniqueID(entity));
}
}
public String getSequenceTableName(GenericEntity entity) {
return "seq_" + entity.getTableName();
}*/
public String getSQLType(String javaClassName, int maxlength) {
String theReturn;
if (javaClassName.equals("java.lang.Integer")) {
theReturn = "INTEGER";
}
else if (javaClassName.equals("java.lang.String")) {
if (maxlength < 0) {
theReturn = "VARCHAR(255)";
}
else if (maxlength <= 255) {
theReturn = "VARCHAR(" + maxlength + ")";
}
else {
theReturn = "LONGTEXT";
}
}
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 = "DATETIME";
}
else if (javaClassName.equals("java.sql.Date") || javaClassName.equals("java.util.Date")) {
theReturn = "DATE";
}
else if (javaClassName.equals("java.sql.Blob")) {
theReturn = "LONGBLOB";
}
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 = "LONGBLOB";
}
else {
theReturn = "";
}
return theReturn;
}
/*
* Not Tested public boolean updateTriggers(GenericEntity entity, boolean
* createIfNot) throws Exception { Connection conn = null; Statement Stmt =
* null; ResultSet rs = null; ResultSet rs2 = null; boolean returner =
* false; try { conn = entity.getConnection(); Stmt =
* conn.createStatement(); boolean tableExists = false; String seqSQL =
* "select * from "+getSequenceTableName(entity); try { rs =
* Stmt.executeQuery(seqSQL); tableExists = true; } catch (Exception e) {
* log("Error finding sequence table"); } if (rs != null && rs.next()) {
* returner = true; } else if (createIfNot) { String maxSQL = "select max
* ("+entity.getIDColumnName()+" as MAX from "+entity.getEntityName(); if
* (!tableExists) { createSequenceTable(entity); } int valueToSet = 1; rs2 =
* Stmt.executeQuery(maxSQL); if (rs2 != null && rs2.next()) { valueToSet =
* Integer.parseInt(rs2.getString("MAX")); Stmt.executeUpdate("update
* "+getSequenceTableName(entity)+" set "+entity.getIDColumnName()+" =
* "+valueToSet); }
*
* returner = true; } } finally { if (Stmt != null) { Stmt.close(); } if (rs !=
* null) { rs.close(); } if (rs2 != null) { rs2.close(); } if (conn != null) {
* entity.freeConnection(conn); } } return returner; }
*/
/*public void createSequenceTable(GenericEntity entity) throws Exception {
Connection conn = null;
Statement Stmt = null;
try {
conn = entity.getConnection();
Stmt = conn.createStatement();
String s = "CREATE table " + getSequenceTableName(entity) + "(" + entity.getIDColumnName()
+ " integer PRIMARY KEY auto_increment)";
System.out.println(s);
Stmt.executeUpdate(s);
}
finally {
if (Stmt != null) {
Stmt.close();
}
if (conn != null) {
entity.freeConnection(conn);
}
}
}*/
public void createTrigger(GenericEntity entity) throws Exception {
//createSequenceTable(entity);
//Not needed anymore because now using auto_increment directly
}
//public void createForeignKeys(GenericEntity entity) throws Exception {
//}
public void createIndex(GenericEntity entity, String name, String[] fields) throws Exception {
if (useIndexes()) {
StringBuffer sql = new StringBuffer("CREATE INDEX ").append(name).append(" ON ").append(entity.getTableName()).append(" (");
int maxSize = MAX_TOTAL_INDEX_COLUMN_SIZE / fields.length;
if (maxSize > MAX_INDEX_COLUMN_SIZE) {
maxSize = MAX_INDEX_COLUMN_SIZE;
}
for (int i = 0; i < fields.length; i++) {
IDOEntityField field = entity.getEntityDefinition().findFieldByUniqueName(fields[i]);
int maxLength = field.getMaxLength();
if (i > 0) {
sql.append(", ");
}
sql.append(fields[i]);
Class dataTypeClass = field.getDataTypeClass();
if (maxLength > 0) {
if (maxLength > MAX_INDEX_COLUMN_SIZE) {
maxLength = MAX_INDEX_COLUMN_SIZE;
}
sql.append("(").append(maxLength).append(")");
} else if (maxLength == -1 && String.class.isAssignableFrom(dataTypeClass)) {
sql.append("(").append(maxSize).append(")");
} else if (Boolean.class.isAssignableFrom(dataTypeClass)) {
sql.append("(1)");
}
}
sql.append(")");
executeUpdate(entity, sql.toString());
}
}
//Auto_increment handling:
protected void updateNumberGeneratedValue(GenericEntity entity, Connection conn){
Statement stmt = null;
ResultSet rs = null;
try {
boolean pkIsNull = entity.isNull(entity.getIDColumnName());
if (pkIsNull) {
stmt = conn.createStatement();
rs = stmt.executeQuery("select last_insert_id()");
rs.next();
int id = rs.getInt(1);
entity.setID(id);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/**
* @return boolean
*/
protected boolean updateNumberGeneratedValueAfterInsert()
{
return true;
}
public String getIDColumnType(GenericEntity entity)
{
if (entity.getIfAutoIncrement()) {
return "INTEGER AUTO_INCREMENT";
} else {
return "INTEGER";
}
}
/*public void setNumberGeneratorValue(GenericEntity entity, int value) {
// throw new RuntimeException("setSequenceValue() not implemented for
// "+this.getClass().getName());
String statement = "insert into " + this.getSequenceTableName(entity) + " values(" + value + ")";
try {
this.executeUpdate(entity, statement);
}
catch (Exception e) {
// e.printStackTrace();
System.err.println("MySQLDatastoreInterface.setNumberGeneratorValue() Exception: " + e.getMessage());
}
}*/
}