/* * Copyright 2008 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.frameworkset.orm.adapter; /* * * Licensed under the Apache License, Version 2.0 (the "License") * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.sql.Blob; import java.sql.CallableStatement; import java.sql.Clob; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; import org.frameworkset.spi.BaseApplicationContext; import org.frameworkset.util.annotations.DateFormateMeta; import com.frameworkset.common.poolman.PreparedDBUtil; import com.frameworkset.common.poolman.SQLExecutor; import com.frameworkset.common.poolman.handle.NullRowHandler; import com.frameworkset.common.poolman.handle.ValueExchange; import com.frameworkset.common.poolman.security.DBInfoEncrypt; import com.frameworkset.common.poolman.security.DESDBPasswordEncrypt; import com.frameworkset.common.poolman.util.JDBCPoolMetaData; import com.frameworkset.orm.engine.model.Domain; import com.frameworkset.orm.engine.model.SchemaType; import com.frameworkset.orm.platform.Platform; import com.frameworkset.orm.platform.PlatformDefaultImpl; import com.frameworkset.util.SimpleStringUtil; /** * <code>DB</code> defines the interface for a Torque database * adapter. Support for new databases is added by subclassing * <code>DB</code> and implementing its abstract interface, and by * registering the new database adapter and its corresponding * JDBC driver in the service configuration file. * * <p>The Torque database adapters exist to present a uniform * interface to database access across all available databases. Once * the necessary adapters have been written and configured, * transparent swapping of databases is theoretically supported with * <i>zero code changes</i> and minimal configuration file * modifications. * * <p>Torque uses the driver class name to find the right adapter. * A JDBC driver corresponding to your adapter must be added to the properties * file, using the fully-qualified class name of the driver. If no driver is * specified for your database, <code>driver.default</code> is used. * * <pre> * #### MySQL MM Driver * database.default.driver=org.gjt.mm.mysql.Driver * database.default.url=jdbc:mysql://localhost/DATABASENAME * </pre> * * @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a> * @author <a href="mailto:bmclaugh@algx.net">Brett McLaughlin</a> * @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a> * @author <a href="mailto:vido@ldh.org">Augustin Vidovic</a> * @version $Id: DB.java,v 1.34 2005/01/31 19:43:55 tfischer Exp $ */ public abstract class DB implements IDMethod,Platform { public static final String NULL_SCHEMA = "NULL_SCHEMA"; /** date format used in getDateString() */ protected String date_format = "yyyy-MM-dd HH:mm:ss"; private static String java_date_format = "yyyy-MM-dd HH:mm:ss"; protected String FORMART_YEAR = "yyyy"; protected String FORMART_MONTH = "MM"; protected String FORMART_DAY = "dd"; protected String FORMART_HOUR = "HH"; protected String FORMART_MINUTE = "mm"; protected String FORMART_SECOND = "ss"; protected String FORMART_ALL = "yyyy-MM-dd HH:mm:ss"; protected String FORMART_YEAR_MM_DD = "yyyy-MM-dd"; protected String FORMART_HH_MM_SS = "HH:mm:ss"; /** Database does not support limiting result sets. */ public static final int LIMIT_STYLE_NONE = 0; /** <code>SELECT ... LIMIT <limit>, [<offset>]</code> */ public static final int LIMIT_STYLE_POSTGRES = 1; /** <code>SELECT ... LIMIT [<offset>, ] <offset></code> */ public static final int LIMIT_STYLE_MYSQL = 2; /** <code>SET ROWCOUNT <offset> SELECT ... SET ROWCOUNT 0</code> */ public static final int LIMIT_STYLE_SYBASE = 3; /** <code><pre>SELECT ... WHERE ... AND ROWNUM < <limit></pre></code> */ public static final int LIMIT_STYLE_ORACLE = 4; /** <code><pre>SELECT ... WHERE ... AND ROW_NUMBER() OVER() < <limit></pre></code> */ public static final int LIMIT_STYLE_DB2 = 5; protected Platform platform = null; protected String dbtype = null; /** * Empty constructor. */ protected DB() { this.platform = new PlatformDefaultImpl(); } /** * This method is used to ignore case. * * @param in The string to transform to upper case. * @return The upper case string. */ public abstract String toUpperCase(String in); /** * Returns the character used to indicate the beginning and end of * a piece of text used in a SQL statement (generally a single * quote). * * @return The text delimeter. */ public char getStringDelimiter() { return '\''; } public boolean isWritebable(java.sql.ResultSetMetaData other,int idx) throws SQLException { return other.isWritable(idx); } public String sysdate() { return "sysdate"; } public long getNextValue(String sequence,Connection con,String dbname) throws SQLException { long curValue = 0; PreparedDBUtil dbutil = new PreparedDBUtil(); try { // if() String sql = "select " + sequence + ".nextval from dual"; dbutil.preparedSelect(dbname, sql); dbutil.executePrepared(con); if(dbutil.size() <= 0) { // System.out.println("select " + this.generator + ".nextval from dual"); throw new SQLException("[select " + sequence + ".nextval from dual] from [" + dbname + "] failed:retrun records is 0."); } curValue = dbutil.getInt(0,0); return curValue; } catch (SQLException e) { throw e; } } public long getNextValue(String seqfunctionname,String sequence,Connection con,String dbname) throws SQLException { long curValue = 0; PreparedDBUtil dbutil = new PreparedDBUtil(); try { // if() String sql = "select " + sequence + ".nextval from dual"; dbutil.preparedSelect(dbname, sql); dbutil.executePrepared(con); if(dbutil.size() <= 0) { // System.out.println("select " + this.generator + ".nextval from dual"); throw new SQLException("[select " + sequence + ".nextval from dual] from [" + dbname + "] failed:retrun records is 0."); } curValue = dbutil.getInt(0,0); return curValue; } catch (SQLException e) { throw e; } } /** * Returns the constant from the {@link * com.frameworkset.orm.adapter.IDMethod} interface denoting which * type of primary key generation method this type of RDBMS uses. * * @return IDMethod constant */ public abstract String getIDMethodType(); /** * Returns SQL used to get the most recently inserted primary key. * Databases which have no support for this return * <code>null</code>. * * @param obj Information used for key generation. * @return The most recently inserted database key. */ public abstract String getIDMethodSQL(Object obj); /** * Locks the specified table. * * @param con The JDBC connection to use. * @param table The name of the table to lock. * @throws SQLException No Statement could be created or executed. */ public abstract void lockTable(Connection con, String table) throws SQLException; /** * Unlocks the specified table. * * @param con The JDBC connection to use. * @param table The name of the table to unlock. * @throws SQLException No Statement could be created or executed. */ public abstract void unlockTable(Connection con, String table) throws SQLException; /** * This method is used to ignore case. * * @param in The string whose case to ignore. * @return The string in a case that can be ignored. */ public abstract String ignoreCase(String in); /** * This method is used to ignore case in an ORDER BY clause. * Usually it is the same as ignoreCase, but some databases * (Interbase for example) does not use the same SQL in ORDER BY * and other clauses. * * @param in The string whose case to ignore. * @return The string in a case that can be ignored. */ public String ignoreCaseInOrderBy(String in) { return ignoreCase(in); } /** * This method is used to check whether the database natively * supports limiting the size of the resultset. * * @return True if the database natively supports limiting the * size of the resultset. */ public boolean supportsNativeLimit() { return false; } /** * This method is used to check whether the database natively * supports returning results starting at an offset position other * than 0. * * @return True if the database natively supports returning * results starting at an offset position other than 0. */ public boolean supportsNativeOffset() { return false; } /** * This method is for the SqlExpression.quoteAndEscape rules. The rule is, * any string in a SqlExpression with a BACKSLASH will either be changed to * "\\" or left as "\". SapDB does not need the escape character. * * @return true if the database needs to escape text in SqlExpressions. */ public boolean escapeText() { return true; } /** * This method is used to check whether the database supports * limiting the size of the resultset. * * @return The limit style for the database. */ public int getLimitStyle() { return LIMIT_STYLE_NONE; } /** * This method is used to format any date string. * Database can use different default date formats. * * @param date the Date to format * @return The proper date formatted String. */ public String to_date(Date date) { Timestamp ts = null; if (date instanceof Timestamp) { ts = (Timestamp) date; } else { ts = new Timestamp(date.getTime()); } return ("{ts '" + ts + "'}"); } /** * This method is used to format any date string. * * @param date the Date to format * @return The date formatted String for Oracle. */ public String to_date(String date) { return ("{ts '" + date + "'}"); } /** * This method is used to format any date string. * Database can use different default date formats. * * @param date the Date to format * @return The proper date formatted String. */ public String to_date(Date date,String format) { Timestamp ts = null; if (date instanceof Timestamp) { ts = (Timestamp) date; } else { ts = new Timestamp(date.getTime()); } return ("{ts '" + ts + "'}"); } /** * This method is used to format any date string. * * @param date the Date to format * @return The date formatted String for Oracle. */ public String to_date(String date,String format) { return ("{ts '" + date + "'}"); } /** * This method is used to format any date string. * Database can use different default date formats. * * @param date the Date to format * @return The proper date formatted String. * @deprecated use to_date function. */ public String getDateString(Date date) { return to_date(date); } /** * This method is used to format any date string. * * @param date the Date to format * @return The date formatted String for Oracle. * @deprecated use to_date function. */ public String getDateString(String date) { return to_date(date); } /** * This method is used to format any date string. * Database can use different default date formats. * * @param date the Date to format * @return The proper date formatted String. * @deprecated use to_date function. */ public String getDateString(Date date,String format) { return to_date(date,format); } /** * This method is used to format any date string. * * @param date the Date to format * @return The date formatted String for Oracle. * @deprecated use to_date function. */ public String getDateString(String date,String format) { return to_date(date,format); } /** * This method is used to format a boolean string. * * @param b the Boolean to format * @return The proper date formatted String. */ public String getBooleanString(Boolean b) { return (Boolean.TRUE.equals(b) ? "1" : "0"); } /** * 获取受限制结果条数的sql语句,默认为mysql语法规则 * 不同的数据库需要重载本方法 * @param selectSql String * @param limit int * @return String */ public String getLimitSelect(String selectSql , int limit) { selectSql += " LIMIT " + limit; return selectSql; } public Object getCharValue(ResultSet res, int i, String value) { // TODO Auto-generated method stub return value; } public Object getCharValue(CallableStatement cstmt, int i, String value) { // TODO Auto-generated method stub return value; } public Object getCharValue(CallableStatement cstmt, String paramName, String value) { // TODO Auto-generated method stub return value; } public static int countZHWord(byte[] bytes) { if(bytes == null) return 0; int count = 0; for(int i = 0; i < bytes.length; i ++) { if(bytes[i] < 0) { count ++; } } return count / 3; } public String getOROPR() { return "|"; } public String getSchema(JDBCPoolMetaData info) { if(info.getUserName() == null || info.getUserName().equals("")) { return null; } if(!info.isEncryptdbinfo()) return info.getUserName().toUpperCase(); else { DBInfoEncrypt dbInfoEncrypt = getDBInfoEncrypt(); return dbInfoEncrypt.decryptDBUser(info.getUserName()).toUpperCase(); } } public String getDBCatalog(Connection con) throws SQLException{ return _getDBCatalog( con); } public String _getDBCatalog(Connection con) throws SQLException{ return con.getCatalog(); } public static DBInfoEncrypt getDBInfoEncrypt() { try { Properties p = BaseApplicationContext.fillProperties(); if(p != null) { String DBInfoEncryptclass = p.getProperty("DBInfoEncryptclass"); if(DBInfoEncryptclass != null && !DBInfoEncryptclass.trim().equals("")) { DBInfoEncryptclass = DBInfoEncryptclass.trim(); return (DBInfoEncrypt)Class.forName(DBInfoEncryptclass).newInstance(); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Throwable e) { // TODO Auto-generated catch block e.printStackTrace(); } return new DESDBPasswordEncrypt(); } public String getSchemaTableTableName(JDBCPoolMetaData info,String tablename) { if(tablename == null) return null; return tablename.toUpperCase(); } public String getIDMAXSql(String tableName,String table_id_name,String table_id_prefix,String type) { String maxSql = "select max("+ table_id_name + ") from " + tableName; return maxSql; } /********************************************* * * platform接口方法定义开始 * *********************************************/ public String getNativeIdMethod() { return this.platform.getNativeIdMethod(); } public int getMaxColumnNameLength() { return this.platform.getMaxColumnNameLength(); } public Domain getDomainForSchemaType(SchemaType jdbcType) { // TODO Auto-generated method stub return this.platform.getDomainForSchemaType(jdbcType); } public Domain getDomainForSchemaType(int jdbcType,String datatypeName) { // TODO Auto-generated method stub return this.platform.getDomainForSchemaType(jdbcType, datatypeName); } public String getNullString(boolean notNull) { // TODO Auto-generated method stub return this.platform.getNullString(notNull); } public String getAutoIncrement() { // TODO Auto-generated method stub return this.platform.getAutoIncrement(); } public boolean hasSize(String sqlType) { // TODO Auto-generated method stub return this.platform.hasSize(sqlType); } public boolean hasScale(String sqlType) { return this.platform.hasScale(sqlType); } public boolean hasSize(int sqlType) { return this.platform.hasSize(sqlType); } public boolean hasScale(int sqlType) { return this.platform.hasScale(sqlType); } public String getDBTYPE() { return this.dbtype; // return platform.getDBTYPE(); } /** * 获取指定数据的分页数据sql语句 * @param sql * @return */ public PagineSql getDBPagineSql(String sql, long offset, int maxsize,boolean prepared) { return new PagineSql(sql,-1L,-1L,offset,maxsize,prepared); } public void resetPostion( PreparedStatement statement,int startidx,int endidx,long offset,int maxsize) throws SQLException { // statement.setLong(startidx, offset); // statement.setLong(endidx, maxsize); } // public String getDBPagineSql(String sql, long offset, int maxsize) { // // return sql; // } public static class PagineSql { private long offset; private int maxsize; private String sql; private long start = -1L; private long end= -1L; private boolean prepared = true; private boolean rebuilded = false; public boolean isRebuilded() { return rebuilded; } public PagineSql setRebuilded(boolean rebuilded) { this.rebuilded = rebuilded; return this; } public PagineSql(String sql, long start, long end,long offset,int maxsize,boolean prepared) { super(); this.sql = sql; this.start = start; this.end = end; this.offset = offset; this.maxsize = maxsize; this.prepared = prepared; } public PagineSql(String sql,boolean prepared) { super(); this.sql = sql; this.prepared = prepared; } public String getSql() { return sql; } public long getStart() { return start; } public long getEnd() { return end; } public long getOffset() { return offset; } public int getMaxsize() { return maxsize; } public boolean isPrepared() { return prepared; } } /** * 获取受限制结果条数的sql语句,要求selectSql的语法,按oracle自定义受限语句语法,例如 * SELECT a.cpmc,a.ggxh,a.cjdd,a.ph,a.jgxs,a.dj,a.jldw,a.cd,a.cddm,a.flag,cjrq,a.pricepsj_id,b.user_name, * ROW_NUMBER() OVER ( ORDER BY cjrq ) aa * from td_price_pricepsj_jmrygypjg a,td_sm_user b * @param selectSql String * @param limit int * @param rownum 行号的别名 * @return String */ public String getOracleLimitSelect(String selectSql , int limit,String rownum) { // selectSql += " LIMIT " + limit; StringBuilder ret = new StringBuilder(); ret.append("select * from (") .append(selectSql) .append(") where ") .append(rownum) .append(" <=").append(limit); return ret.toString(); } // /** // * 获取高效的oracle分页语句,sql中已经写好ROW_NUMBER() OVER ( ORDER BY cjrq ) rownum // * 否则不能调用本方法生成oralce的分页语句 // */ // // public String getOracleDBPagineSql(String sql, long offset, int maxsize,String rownum) { // StringBuffer ret = new StringBuffer("select * from (") // .append(sql) // .append(") where ").append(rownum).append(" between ") // .append((offset + 1) + "") // .append(" and ") // .append((offset + maxsize) + ""); // return ret.toString(); // } /** * 获取高效的oracle分页语句,sql中已经写好ROW_NUMBER() OVER ( ORDER BY cjrq ) rownum * 否则不能调用本方法生成oralce的分页语句 */ public PagineSql getOracleDBPagineSql(String sql, long offset, int maxsize,String rownum,boolean prepared) { StringBuilder ret = null; if(prepared) ret = new StringBuilder().append("select * from (") .append(sql) .append(") where ").append(rownum).append(" between ? and ?"); else ret = new StringBuilder("select * from (") .append(sql) .append(") where ").append(rownum).append(" between ") .append((offset + 1) + "") .append(" and ") .append((offset + maxsize) + ""); return new PagineSql(ret.toString(),offset + 1,offset + maxsize,offset, maxsize,prepared); } public String getTableRemarks(Connection con,String tableName, String tableRemark) { // TODO Auto-generated method stub return tableRemark; } public String getColumnRemarks(Connection con,String tableName, String columnName, String remarks_c) { // TODO Auto-generated method stub return remarks_c; } public SchemaType getSchemaTypeFromSqlType(int sqltype,String typeName) { return this.platform.getSchemaTypeFromSqlType(sqltype, typeName); } // public int getSCROLLType(String dbdriver) // { // return ResultSet.TYPE_SCROLL_INSENSITIVE; // } // public int getCusorType(String dbdriver) // { // // return ResultSet.CONCUR_READ_ONLY; // } public int getSCROLLType(String dbdriver) { return ResultSet.TYPE_FORWARD_ONLY; } public int getCusorType(String dbdriver) { return ResultSet.CONCUR_READ_ONLY; } public String getDateFormat() { return this.date_format; } public String getJavaDateFormat() { return java_date_format; } public String to_char(String date,String format) { SimpleDateFormat f = new SimpleDateFormat(format); return f.format(SimpleStringUtil.stringToDate(date,format)); } public String to_char(String date) { return to_char(date,this.FORMART_ALL); } public java.sql.Date getDate(String date,DateFormateMeta dateFormateMeta) throws ParseException { String format = null; if(dateFormateMeta == null ) { format = this.getJavaDateFormat(); } else format = dateFormateMeta.getDateformat(); SimpleDateFormat f = dateFormateMeta == null?new SimpleDateFormat(format):new SimpleDateFormat(format,dateFormateMeta.getLocale()); Date _date = f.parse(date); java.sql.Date ret = new java.sql.Date(_date.getTime()); return ret; } public Timestamp getTimestamp(String timestamp,DateFormateMeta dateFormateMeta) throws ParseException { String format = null; if(dateFormateMeta == null ) { format = this.getJavaDateFormat(); } else format = dateFormateMeta.getDateformat(); SimpleDateFormat f = dateFormateMeta == null?new SimpleDateFormat(format):new SimpleDateFormat(format,dateFormateMeta.getLocale()); Date date = f.parse(timestamp); Timestamp timestamp_ = new Timestamp(date.getTime()); return timestamp_; } public Object getLONGVARBINARY(CallableStatement cstmt,int parameterIndex) throws SQLException { return cstmt.getObject(parameterIndex); } public Object getLONGVARCHAR(CallableStatement cstmt,int parameterIndex) throws SQLException { return cstmt.getObject(parameterIndex); } public Object getLONGVARCHAR(ResultSet res,int parameterIndex) throws SQLException { return res.getObject(parameterIndex); } public Object getLONGVARCHAR(ResultSet res,String colName) throws SQLException { return res.getObject(colName); } public Object getLONGVARBINARY(ResultSet res,int parameterIndex) throws SQLException { return res.getObject(parameterIndex); } public Object getLONGVARBINARY(ResultSet res,String colName) throws SQLException { return res.getObject(colName); } /** * @param dbtype the dbtype to set */ public void setDbtype(String dbtype) { this.dbtype = dbtype; } /** * @return the fORMART_DAY */ public String getFORMART_DAY() { return FORMART_DAY; } /** * @param fORMARTDAY the fORMART_DAY to set */ public void setFORMART_DAY(String fORMARTDAY) { FORMART_DAY = fORMARTDAY; } /** * @return the fORMART_YEAR */ public String getFORMART_YEAR() { return FORMART_YEAR; } /** * @return the fORMART_MONTH */ public String getFORMART_MONTH() { return FORMART_MONTH; } /** * @return the fORMART_HOUR */ public String getFORMART_HOUR() { return FORMART_HOUR; } /** * @return the fORMART_MINUTE */ public String getFORMART_MINUTE() { return FORMART_MINUTE; } /** * @return the fORMART_SECOND */ public String getFORMART_SECOND() { return FORMART_SECOND; } /** * @return the fORMART_ALL */ public String getFORMART_ALL() { return FORMART_ALL; } /** * @return the fORMART_HH_MM_SS */ public String getFORMART_HH_MM_SS() { return FORMART_HH_MM_SS; } /** * @return the fORMART_YEAR_MM_DD */ public String getFORMART_YEAR_MM_DD() { return FORMART_YEAR_MM_DD; } public String concat(String ... concatString) { if(concatString == null || concatString.length == 0) return ""; StringBuilder ret = new StringBuilder(); boolean i = false; for(String token : concatString) { if(!i) { ret.append(token); i = true; } else { ret.append( " || ").append(token); } } return ret.toString(); } public String disableFK(String table,String FKName) { StringBuilder ret = new StringBuilder(); ret.append("alter table ").append(table).append(" disable constraint ").append(FKName); return ret.toString(); } public String enableFK(String table,String FKName,String column,String FKTable,String FKColumn) { StringBuilder ret = new StringBuilder(); ret.append("alter table ").append(table).append(" enable constraint ").append(FKName); return ret.toString(); } public void updateClob(Object content, Connection conn, String table, String clobColumn, String keyColumn, String keyValue, String dbName) throws SQLException, IOException { } /** * * @param instream * @param conn * @param table * @param blobColumn * @param keyColumn * @param keyValue * @param dbName * @throws SQLException * @throws IOException * @deprecated */ public void updateBlob(InputStream instream, Connection conn, String table, String blobColumn, String keyColumn, String keyValue, String dbName) throws SQLException, IOException { } /** * 根据输入流更新 * * @param value * @param conn * @param table * @param blobColumn * @param keyColumn * @param keyValue * @throws SQLException * @throws IOException * @deprecated */ public void updateBlob(byte[] value, Connection conn, String table, String blobColumn, String keyColumn, String keyValue, String dbName) throws SQLException, IOException { } public void updateBLOB(Blob blob,File file) throws SQLException { } public void updateBLOB(Blob blob,InputStream instream) throws SQLException { } public void updateCLOB(Clob clob,Object content) throws SQLException { } /** * Returns the bytes from a result set * * @param res * The ResultSet to read from * @param columnName * The name of the column to read from * * @return The byte value from the column */ public byte[] getBytesFromResultset(ResultSet res, String columnName) throws SQLException { return res.getBytes(columnName); } /** * Returns the bytes from a result set * * @param res * The ResultSet to read from * @param columnName * The name of the column to read from * * @return The byte value from the column */ public byte[] getBytesFromBlob(Blob blob) throws SQLException { // read the bytes from an oracle blob // oracle.sql.BLOB blob = ((OracleResultSet) res).getBLOB(columnName); byte[] content = new byte[(int) blob.length()]; content = blob.getBytes(1, (int) blob.length()); return content; } /** * Returns the bytes from a result set * * @param res * The ResultSet to read from * @param columnName * The name of the column to read from * * @return The byte value from the column */ public byte[] getBytesFromClob(Clob clob) { // read the bytes from an oracle blob // oracle.sql.CLOB clob = ((OracleResultSet) res).getBLOB(columnName); try { return ValueExchange.getByteArrayFromClob(clob); } catch (SQLException e) { e.printStackTrace(); return null; } } /** * Returns the bytes from a result set * * @param res * The ResultSet to read from * @param columnName * The name of the column to read from * * @return The byte value from the column */ public String getStringFromClob(Clob clob) { // read the bytes from an oracle blob // oracle.sql.CLOB clob = ((OracleResultSet) res).getBLOB(columnName); try { return ValueExchange.getStringFromClob(clob); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } public boolean neadGetGenerateKeys() { return false; } public String getStringPagineSql(String sql) { return sql; } public void queryByNullRowHandler(NullRowHandler handler,String dbname,String pageinestatement,long offset,int pagesize) throws SQLException { SQLExecutor.queryWithDBNameByNullRowHandler(handler, dbname, pageinestatement,offset + pagesize,offset + 1); } public String getStringPagineSql(String schema,String tablename,String pkname ,String columns) { StringBuilder sqlbuilder = new StringBuilder(); sqlbuilder.append("select * from (SELECT "); if(columns != null && ! columns.equals("")) { sqlbuilder.append( columns); } else sqlbuilder.append("t.* "); sqlbuilder.append(",ROW_NUMBER() OVER ( ORDER BY ").append(pkname).append(") rownum__ from "); if(schema != null && !schema.equals("")) sqlbuilder.append(schema).append("."); sqlbuilder.append( tablename); if(columns != null && ! columns.equals("")) sqlbuilder.append( " ) bb where bb.rownum__ <=? and bb.rownum__ >=?"); else sqlbuilder.append( " t) bb where bb.rownum__ <=? and bb.rownum__ >=?"); return sqlbuilder.toString(); } public void setObject(PreparedDBUtil dbutil,int i, Object o) throws SQLException { dbutil._setObject(i, o); // if(o == null || o instanceof java.sql.Timestamp) // { // dbutil._setObject(i, o, Param.setObject_int_Object); // } // else if(o instanceof java.sql.Date) // { // o = new java.sql.Timestamp(((java.sql.Date)o).getTime()); // dbutil.addParam(i, o, Param.setObject_int_Object); // } // else if(o instanceof java.util.Date) // { // o = new java.sql.Timestamp(((java.util.Date)o).getTime()); // dbutil.addParam(i, o, Param.setObject_int_Object); // } // else // { // dbutil.addParam(i, o, Param.setObject_int_Object); // } } public PagineSql getDBPagineSql(String sql, long offset, int maxsize,boolean prepared,String orderby) { return new PagineSql(sql,-1L,-1L,offset,maxsize,prepared); } public String getStringPagineSql(String sql,String orderby) { return sql; } public String getStringPagineSql(String schema,String tablename,String pkname ,String columns,String orderby) { StringBuilder newsql = new StringBuilder(); newsql.append("SELECT "); if(columns != null && ! columns.equals("")) { newsql.append( columns); } else newsql.append("* "); newsql.append(" from "); if(schema != null && !schema.equals("")) newsql.append(schema).append("."); newsql.append( tablename) ; return newsql.toString(); } public boolean isSearchable(ResultSetMetaData other, int i) throws SQLException { // TODO Auto-generated method stub return other.isSearchable(i); } public boolean isSigned(ResultSetMetaData other, int rc) throws SQLException { // TODO Auto-generated method stub return other.isSigned(rc); } public boolean isDefinitelyWritable(ResultSetMetaData other, int rc) throws SQLException { // TODO Auto-generated method stub return other.isDefinitelyWritable(rc); } }