package cn.org.rapid_framework.generator.util.sqlparse;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.List;
import java.util.Random;
import cn.org.rapid_framework.generator.provider.db.sql.model.SqlParameter;
import cn.org.rapid_framework.generator.util.StringHelper;
public class StatementCreatorUtils {
//FIXME scale还未使用
public static Object getRandomValue(int sqlType,Integer scale) {
switch(sqlType) {
case Types.BIT:;
case Types.TINYINT:;
case Types.SMALLINT:;
return (byte)randomNumber();
case Types.INTEGER:;
case Types.BIGINT:;
case Types.FLOAT:;
case Types.REAL:;
case Types.DOUBLE:;
case Types.NUMERIC:;
case Types.DECIMAL:;
return (int)randomNumber();
case Types.DATE:
case Types.TIME:
case Types.TIMESTAMP:
return now();
case Types.VARCHAR:
case Types.CHAR:
return randomString(scale);
case Types.LONGVARCHAR:
case Types.CLOB:
return null;
case -9 : //Types.NVARCHAR
case -15: //Types.NCHAR
case 2011: //Types.NCLOB
return null;
case Types.BINARY:
case Types.VARBINARY:
case Types.LONGVARBINARY:
return null;
case Types.NULL:
case Types.OTHER:
case Types.BLOB:
return null;
case Types.BOOLEAN:
return false;
case -10: //CURSOR
case Integer.MIN_VALUE + 1000: //UNDEFINED
return null;
default:
return null;
}
}
static Random random = new Random(System.currentTimeMillis());
public static int randomNumber() {
return Math.abs(random.nextInt());
}
public static Timestamp now() {
return new Timestamp(System.currentTimeMillis());
}
public static String randomString(Integer count) {
if(count == null || count <= 0) {
count = 1;
}
String result = "";
for(int i = 0; i < count; i++) {
result += ""+(Math.abs(randomNumber()) % 9);
}
return result;
}
public static void setParameterRandomValue(PreparedStatement ps, int parameterIndex,int sqlType, Integer scale) throws SQLException {
Object v = getRandomValue(sqlType, scale);
if(v == null) {
ps.setNull(parameterIndex, Types.NULL);
}else if(v instanceof String) {
ps.setString(parameterIndex, (String)v);
}else if(v instanceof Timestamp) {
ps.setTimestamp(parameterIndex, (Timestamp)v);
}else if(v instanceof Number) {
ps.setByte(parameterIndex, ((Number)v).byteValue());
}else {
ps.setObject(parameterIndex, v);
}
}
public static void setRandomParamsValueForPreparedStatement(String executeSql, PreparedStatement ps,
List<SqlParameter> params)
throws SQLException {
//FIXME 在计算?时需要移除sql comments及 CDATA
int count = StringHelper.containsCount(SqlParseHelper.removeOrders(executeSql), "?");
if(count == 0) return;
SqlParameter[] sqlParameters = params.toArray(new SqlParameter[0]);
for(int parameterIndex = 1; parameterIndex <= count; parameterIndex++){
int index = parameterIndex - 1;
if(index < sqlParameters.length) {
SqlParameter parameter = sqlParameters[index];
StatementCreatorUtils.setParameterRandomValue(ps, parameterIndex, parameter.getSqlType(), parameter.getSize());
}else {
ps.setObject(parameterIndex, null); //FIXME 使用assert替换,不可能执行到这里
}
}
}
// private static void setParameterValueInternal(PreparedStatement ps, int paramIndex,
// int sqlType, Integer scale,
// Object inValue) throws SQLException {
//
// int sqlTypeToUse = sqlType;
// Object inValueToUse = inValue;
//
// GLogger.debug("Setting SQL statement parameter value: column index "
// + paramIndex
// + ", parameter value ["
// + inValueToUse
// + "], value class ["
// + (inValueToUse != null ? inValueToUse.getClass().getName() : "null")
// + "], SQL type "
// + (sqlTypeToUse == SqlTypeValue.TYPE_UNKNOWN ? "unknown" : Integer
// .toString(sqlTypeToUse)));
//
// if (inValueToUse == null) {
// if (sqlTypeToUse == SqlTypeValue.TYPE_UNKNOWN) {
// boolean useSetObject = false;
// sqlTypeToUse = Types.NULL;
// try {
// DatabaseMetaData dbmd = ps.getConnection().getMetaData();
// String databaseProductName = dbmd.getDatabaseProductName();
// String jdbcDriverName = dbmd.getDriverName();
// if (databaseProductName.startsWith("Informix")
// || jdbcDriverName.startsWith("Microsoft SQL Server")
// || jdbcDriverName.startsWith("Apache Derby Embedded")) {
// useSetObject = true;
// } else if (databaseProductName.startsWith("DB2")
// || jdbcDriverName.startsWith("jConnect")
// || jdbcDriverName.startsWith("SQLServer")) {
// sqlTypeToUse = Types.VARCHAR;
// }
// } catch (Throwable ex) {
// GLogger.debug("Could not check database or driver name,cause:"+ ex);
// }
// if (useSetObject) {
// ps.setObject(paramIndex, null);
// } else {
// ps.setNull(paramIndex, sqlTypeToUse);
// }
// } else {
// ps.setNull(paramIndex, sqlTypeToUse);
// }
// }
//
// else { // inValue != null
// if (sqlTypeToUse == Types.VARCHAR || sqlTypeToUse == Types.LONGVARCHAR
// || (sqlTypeToUse == Types.CLOB && isStringValue(inValueToUse.getClass()))) {
// ps.setString(paramIndex, inValueToUse.toString());
// } else if (sqlTypeToUse == Types.DECIMAL || sqlTypeToUse == Types.NUMERIC) {
// if (inValueToUse instanceof BigDecimal) {
// ps.setBigDecimal(paramIndex, (BigDecimal) inValueToUse);
// } else if (scale != null) {
// ps.setObject(paramIndex, inValueToUse, sqlTypeToUse, scale.intValue());
// } else {
// ps.setObject(paramIndex, inValueToUse, sqlTypeToUse);
// }
// } else if (sqlTypeToUse == Types.DATE) {
// if (inValueToUse instanceof java.util.Date) {
// if (inValueToUse instanceof java.sql.Date) {
// ps.setDate(paramIndex, (java.sql.Date) inValueToUse);
// } else {
// ps.setDate(paramIndex, new java.sql.Date(((java.util.Date) inValueToUse)
// .getTime()));
// }
// } else if (inValueToUse instanceof Calendar) {
// Calendar cal = (Calendar) inValueToUse;
// ps.setDate(paramIndex, new java.sql.Date(cal.getTime().getTime()), cal);
// } else {
// ps.setObject(paramIndex, inValueToUse, Types.DATE);
// }
// } else if (sqlTypeToUse == Types.TIME) {
// if (inValueToUse instanceof java.util.Date) {
// if (inValueToUse instanceof java.sql.Time) {
// ps.setTime(paramIndex, (java.sql.Time) inValueToUse);
// } else {
// ps.setTime(paramIndex, new java.sql.Time(((java.util.Date) inValueToUse)
// .getTime()));
// }
// } else if (inValueToUse instanceof Calendar) {
// Calendar cal = (Calendar) inValueToUse;
// ps.setTime(paramIndex, new java.sql.Time(cal.getTime().getTime()), cal);
// } else {
// ps.setObject(paramIndex, inValueToUse, Types.TIME);
// }
// } else if (sqlTypeToUse == Types.TIMESTAMP) {
// if (inValueToUse instanceof java.util.Date) {
// if (inValueToUse instanceof java.sql.Timestamp) {
// ps.setTimestamp(paramIndex, (java.sql.Timestamp) inValueToUse);
// } else {
// ps.setTimestamp(paramIndex, new java.sql.Timestamp(
// ((java.util.Date) inValueToUse).getTime()));
// }
// } else if (inValueToUse instanceof Calendar) {
// Calendar cal = (Calendar) inValueToUse;
// ps.setTimestamp(paramIndex, new java.sql.Timestamp(cal.getTime().getTime()),
// cal);
// } else {
// ps.setObject(paramIndex, inValueToUse, Types.TIMESTAMP);
// }
// } else if (sqlTypeToUse == SqlTypeValue.TYPE_UNKNOWN) {
// if (isStringValue(inValueToUse.getClass())) {
// ps.setString(paramIndex, inValueToUse.toString());
// } else if (isDateValue(inValueToUse.getClass())) {
// ps.setTimestamp(paramIndex, new java.sql.Timestamp(
// ((java.util.Date) inValueToUse).getTime()));
// } else if (inValueToUse instanceof Calendar) {
// Calendar cal = (Calendar) inValueToUse;
// ps.setTimestamp(paramIndex, new java.sql.Timestamp(cal.getTime().getTime()));
// } else {
// // Fall back to generic setObject call without SQL type
// // specified.
// ps.setObject(paramIndex, inValueToUse);
// }
// } else {
// // Fall back to generic setObject call with SQL type specified.
// ps.setObject(paramIndex, inValueToUse, sqlTypeToUse);
// }
// }
// }
// /**
// * Check whether the given value can be treated as a String value.
// */
// private static boolean isStringValue(Class inValueType) {
// // Consider any CharSequence (including JDK 1.5's StringBuilder) as String.
// return (CharSequence.class.isAssignableFrom(inValueType) ||
// StringWriter.class.isAssignableFrom(inValueType));
// }
//
// /**
// * Check whether the given value is a <code>java.util.Date</code>
// * (but not one of the JDBC-specific subclasses).
// */
// private static boolean isDateValue(Class inValueType) {
// return (java.util.Date.class.isAssignableFrom(inValueType) &&
// !(java.sql.Date.class.isAssignableFrom(inValueType) ||
// java.sql.Time.class.isAssignableFrom(inValueType) ||
// java.sql.Timestamp.class.isAssignableFrom(inValueType)));
// }
}