1 5 package com.teamkonzept.db; 6 7 import java.sql.*; 8 import java.util.*; 9 10 import com.teamkonzept.lib.*; 11 import com.teamkonzept.lib.templates.*; 12 13 22 public abstract class TKUnprepQuery extends TKQuery 23 { 24 44 private class QueryListIterator implements TKListIterator { 45 46 48 String name; 49 51 Object [] items; 52 53 55 int idx = -1; 56 57 62 QueryListIterator( final String name, final Object [] items ) 63 { 64 this.name = name; 65 this.items = items; 66 } 67 68 81 final public boolean apply( final TKTemplate template, final int idx, final String type ) 82 { 83 final QueryListIterator list = (QueryListIterator) listIterators.get( type ); 84 85 if ( list == null && foreignIterator != null ) { 86 return foreignIterator.apply( template, idx, type ); 87 } else { 88 list.idx++; 89 return list.doSubstitutions( template ); 90 } 91 } 92 93 104 public boolean doSubstitutions( final TKTemplate tmpl ) 105 { 106 if ( idx < items.length ) { 107 try { 108 tmpl.add( "VALUE", convert( name, items[idx] ) ); 109 } catch ( final SQLException sqle ) { 110 printSqlException( sqle, "parameter conversion in QueryListIterator " + name ); 111 } 112 113 tmpl.add( "KOMMA", idx < ( items.length - 1 ) ? "," : "" ); 114 115 return true; 116 } else { 117 idx = -1; 118 return false; 119 } 120 } 121 122 126 final public int hashCode() 127 { 128 return name.hashCode(); 129 } 130 } 131 132 134 TKHashtable listIterators = new TKHashtable(); 135 137 TKListIterator foreignIterator = null; 138 140 TKTemplateSyntax sqlTmplSyntax; 141 143 TKSQLTypeConverter typeConverter; 144 145 156 public void initQuery( final TKSQLTypeConverter conv, final TKDBConnection tkConn , Object queryID ) 157 { 158 this.aTKDBConnection = tkConn; 159 this.typeConverter = conv; 160 initQuery( tkConn.getConnection() ); 161 } 162 163 174 public void initQuery( final Connection conn, 175 final Object [][] paramTypes, 176 final boolean[] setRelevants, 177 final TKTemplateSyntax sqlTmplSyntax ) 178 { 179 super.initQuery( conn, paramTypes, setRelevants ); 180 181 try { 182 this.stmt = conn.createStatement(); 183 } catch ( SQLException sqle ) { 184 printSqlException(sqle, "Create Statement"); 185 } 186 this.sqlTmplSyntax = sqlTmplSyntax; 187 this.sqlString = sqlTmplSyntax.getSource(); 188 } 189 190 199 public boolean execute() throws SQLException, TKIllegalConversionException 200 { 201 202 deregisterIndex = registerQuery(); 203 final TKTemplate sqlTmpl = sqlTmplSyntax.getNewTemplate(); 204 final Enumeration param_keys = queryParams.keys(); 205 206 while ( param_keys.hasMoreElements() ) { 207 final String key = (String ) param_keys.nextElement(); 208 final Object val = queryParams.get( key ); 209 210 sqlTmpl.add( key, convert( key, val ) ); 211 } 212 213 if ( ! listIterators.isEmpty() ) { 214 sqlTmpl.setListIterator( (TKListIterator) listIterators.elements().nextElement() ); 215 } else if ( foreignIterator != null ) { 216 sqlTmpl.setListIterator( foreignIterator ); 217 } 218 219 try { 220 sqlTmpl.doTagSubstitution(); 221 } catch ( TKTemplateSyntaxException tse ) { 222 throw new TKTemplateSyntaxError( tse.what, tse.type, tse.info ); 223 } 224 225 sqlString = sqlTmpl.getText(); 226 227 try { 228 currIsResultSet = stmt.execute( sqlString ); 229 } catch (SQLException sqle) { 230 printSqlException(sqle, "Execute Unprepared Statement"); 231 } 232 233 queryParams.clear(); 234 listIterators.clear(); 235 sqlString = sqlTmplSyntax.getSource(); 236 foreignIterator = null; 237 currPos = 0; 238 239 return currIsResultSet; 240 } 241 242 243 249 public void specClose() 250 throws SQLException 251 { 252 deregisterQuery(); 253 if ( stmt != null ) { 254 throwawayResults(); 255 stmt.close(); 256 } 258 } 259 260 261 271 final public String convert( final String key, final Object val ) 272 throws SQLException, TKIllegalConversionException 273 { 274 if ( paramTypes == null ) { 275 return typeConverter.convert( Types.INTEGER, val ); 276 } else { 277 final Integer type = (Integer ) paramTypes.get( key ); 278 279 if ( type == null ) { 280 return typeConverter.convert( Types.INTEGER, val ); 281 } else { 282 return typeConverter.convert( type.intValue(), val ); 283 } 284 } 285 } 286 287 293 public void setQueryParams( final String param, final Object val) 294 { 295 if ( val instanceof Object [] ) { 296 listIterators.put( param, new QueryListIterator( param, (Object []) val ) ); 297 } else { 298 super.setQueryParams( param, val ); 299 } 300 } 301 302 309 public void setListIterator( final TKListIterator iter ) 310 { 311 foreignIterator = iter; 312 } 313 314 } 315 316 | Popular Tags |