From: <one...@us...> - 2002-10-31 14:00:59
|
Update of /cvsroot/hibernate/Hibernate/cirrus/hibernate/loader In directory usw-pr-cvs1:/tmp/cvs-serv519/cirrus/hibernate/loader Modified Files: Loader.java OuterJoinLoader.java Log Message: support for SQL quoted identifiers Index: Loader.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/loader/Loader.java,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** Loader.java 29 Oct 2002 02:45:42 -0000 1.22 --- Loader.java 31 Oct 2002 14:00:26 -0000 1.23 *************** *** 87,91 **** final Map namedParams ) throws SQLException, HibernateException { ! returnProxies = returnProxies && Environment.jvmSupportsProxies(); --- 87,91 ---- final Map namedParams ) throws SQLException, HibernateException { ! returnProxies = returnProxies && Environment.jvmSupportsProxies(); *************** *** 95,104 **** final boolean twoPhaseLoad = allowTwoPhaseLoad() && cols > 0; final String[] suffixes = getSuffixes(); ! final ArrayList hydratedObjects = twoPhaseLoad ? new ArrayList() : null; final Key optionalObjectKey; //boolean success; ! if (optionalObject!=null) { optionalObjectKey = new Key( optionalID, session.getPersister(optionalObject) ); --- 95,104 ---- final boolean twoPhaseLoad = allowTwoPhaseLoad() && cols > 0; final String[] suffixes = getSuffixes(); ! final ArrayList hydratedObjects = twoPhaseLoad ? new ArrayList() : null; final Key optionalObjectKey; //boolean success; ! if (optionalObject!=null) { optionalObjectKey = new Key( optionalID, session.getPersister(optionalObject) ); *************** *** 109,127 **** //success = true; } ! final List results = new ArrayList(); //new cirrus.hibernate.collections.List(this); final PreparedStatement st = prepareQueryStatement( getSQLString(), values, types, selection, false, session ); final ResultSet rs = getResultSet(st, namedParams, selection, session); ! try { ! final Key[] keys = new Key[cols]; //we can reuse it each time final boolean[] hydrate = new boolean[cols]; //we can reuse it each time ! while ( rs.next() ) { for ( int i=0; i<cols; i++ ) { ! keys[i] = getKeyFromResultSet(persisters[i], suffixes[i], rs, session); } --- 109,127 ---- //success = true; } ! final List results = new ArrayList(); //new cirrus.hibernate.collections.List(this); final PreparedStatement st = prepareQueryStatement( getSQLString(), values, types, selection, false, session ); final ResultSet rs = getResultSet(st, namedParams, selection, session); ! try { ! final Key[] keys = new Key[cols]; //we can reuse it each time final boolean[] hydrate = new boolean[cols]; //we can reuse it each time ! while ( rs.next() ) { for ( int i=0; i<cols; i++ ) { ! keys[i] = getKeyFromResultSet( persisters[i], suffixes[i], rs, session ); } *************** *** 150,157 **** } results.add( ( cols==1 ) ? row[0] : row ); ! if (collection) optionalCollection.readFrom( rs, getCollectionPersister() ); } ! } catch (SQLException sqle) { --- 150,157 ---- } results.add( ( cols==1 ) ? row[0] : row ); ! if (collection) optionalCollection.readFrom( rs, getCollectionPersister() ); } ! } catch (SQLException sqle) { *************** *** 174,178 **** return results; ! } --- 174,178 ---- return results; ! } *************** *** 183,190 **** private Key getKeyFromResultSet(Loadable persister, String suffix, ResultSet rs, SessionImplementor session) throws HibernateException, SQLException { ! ! Serializable id = (Serializable) persister.getIdentifierType().nullSafeGet( ! rs, StringHelper.suffix( persister.getIdentifierColumnNames(), suffix ), session, null ! ); return ( id==null ) ? null : new Key( id, persister ); } --- 183,192 ---- private Key getKeyFromResultSet(Loadable persister, String suffix, ResultSet rs, SessionImplementor session) throws HibernateException, SQLException { ! ! //TODO: we can cache these on this object, from the constructor ! String[] keyColNames = StringHelper.suffix( persister.getIdentifierColumnNames(), suffix ); ! StringHelper.unQuoteInPlace(keyColNames); ! ! Serializable id = (Serializable) persister.getIdentifierType().nullSafeGet(rs, keyColNames, session, null); return ( id==null ) ? null : new Key( id, persister ); } *************** *** 294,303 **** if ( persister.hasSubclasses() ) { ! // Code to handle subclasses of topClass ! String discr = persister.getDiscriminatorColumnName(); ! ! Object discriminatorValue = persister.getDiscriminatorType().nullSafeGet( ! rs, (suffix==null) ? discr : discr + suffix, session, null ); Class result = persister.getSubclassForDiscriminatorValue(discriminatorValue); --- 296,306 ---- if ( persister.hasSubclasses() ) { ! ! String col = StringHelper.unQuote( ! StringHelper.suffix( persister.getDiscriminatorColumnName(), suffix ) ); + + // Code to handle subclasses of topClass + Object discriminatorValue = persister.getDiscriminatorType().nullSafeGet(rs, col, session, null); Class result = persister.getSubclassForDiscriminatorValue(discriminatorValue); *************** *** 323,330 **** Type[] types = persister.getPropertyTypes(); Object[] values = new Object[ types.length ]; for (int i=0; i<types.length; i++) { ! values[i] = types[i].hydrate( rs, StringHelper.suffix( persister.getPropertyColumnNames(i), suffix ), session, object ); } - //persister.setPropertyValues(object, values); return values; } --- 326,337 ---- Type[] types = persister.getPropertyTypes(); Object[] values = new Object[ types.length ]; + for (int i=0; i<types.length; i++) { ! //TODO: we can cache these on this object, from the constructor ! String[] cols = StringHelper.suffix( persister.getPropertyColumnNames(i), suffix ); ! StringHelper.unQuoteInPlace(cols); ! ! values[i] = types[i].hydrate( rs, cols, session, object ); } return values; } Index: OuterJoinLoader.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/loader/OuterJoinLoader.java,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** OuterJoinLoader.java 22 Oct 2002 14:05:10 -0000 1.9 --- OuterJoinLoader.java 31 Oct 2002 14:00:26 -0000 1.10 *************** *** 208,213 **** .append( keyCols[j] ) .append(" AS ") ! .append( keyCols[j] ) ! .append(suffix); if ( j != keyCols.length-1 ) buf.append(", "); } --- 208,212 ---- .append( keyCols[j] ) .append(" AS ") ! .append( aliasColumn(keyCols[j], suffix )); if ( j != keyCols.length-1 ) buf.append(", "); } *************** *** 218,223 **** .append( persister.getDiscriminatorColumnName() ) .append(" AS ") ! .append( persister.getDiscriminatorColumnName() ) ! .append(suffix); String[] cols = persister.getSubclassColumnClosure(); for ( int j=0; j<cols.length; j++ ) { --- 217,221 ---- .append( persister.getDiscriminatorColumnName() ) .append(" AS ") ! .append( aliasColumn(persister.getDiscriminatorColumnName(), suffix )); String[] cols = persister.getSubclassColumnClosure(); for ( int j=0; j<cols.length; j++ ) { *************** *** 227,232 **** .append( cols[j] ) .append(" AS ") ! .append( cols[j] ) ! .append(suffix); } --- 225,229 ---- .append( cols[j] ) .append(" AS ") ! .append( aliasColumn(cols[j], suffix )); } *************** *** 275,287 **** return suffixes; } ! protected static String alias(String tableName, int n) { ! return ( ! tableName.length() <=5 ? ! tableName : ! StringHelper.unqualify(tableName).substring(0, 5) ! ) + n; } } --- 272,306 ---- return suffixes; } + + protected static String alias(String tableName, int n) { ! return aliasCore(tableName.length() <=5 ? ! tableName : ! StringHelper.unqualify(tableName).substring(0, 5), ! Integer.toString(n) ! ); } + protected static String aliasColumn(String columnName, String suffix) { + return aliasCore(columnName, suffix); + } + + //TODO: refactor! this is a duplicate of a method in the Loader heirarchy + private static String aliasCore(String name, String suffix) { + + char quote = name.charAt(0); + boolean nameEscaped = Dialect.QUOTE.indexOf(quote) > -1; + + if (nameEscaped) name = name.substring(1, name.length()-1); + + StringBuffer aliasBuilder = new StringBuffer(name.length()); + + if (nameEscaped) aliasBuilder.append(quote); + aliasBuilder.append(name); + aliasBuilder.append(suffix); + if (nameEscaped) aliasBuilder.append(quote); + + return aliasBuilder.toString(); + } } |