1 17 18 package com.finalist.jaggenerator; 19 20 import org.apache.commons.logging.Log; 21 import org.apache.commons.logging.LogFactory; 22 23 import java.util.ArrayList ; 24 import java.util.HashMap ; 25 import java.util.List ; 26 import java.util.Collections ; 27 import java.sql.Connection ; 28 import java.sql.ResultSet ; 29 import java.sql.SQLException ; 30 import java.sql.DatabaseMetaData ; 31 32 38 public class DatabaseUtils { 39 static Log log = LogFactory.getLog(DatabaseUtils.class); 40 41 private static final HashMap columnsCache = new HashMap (); 43 44 private static ArrayList tablesCache; 46 47 private static final HashMap pkCache = new HashMap (); 49 private static final String TABLE_NAME = "TABLE_NAME"; 50 private static final String [] DEFAULT_TABLE_TYPES = new String []{"TABLE"}; 51 52 53 60 public static ArrayList getColumns(String tablename) { 61 return getColumns(tablename, true); 62 } 63 64 74 public static ArrayList getColumns(String tablename, boolean forceConnection) { 75 if (columnsCache.get(tablename) != null) { 76 return (ArrayList ) columnsCache.get(tablename); 77 } 78 79 if (!forceConnection && JagGenerator.getConManager() == null) { 80 return null; 81 } 82 ArrayList pkeys = getPrimaryKeys(tablename); 83 GenericJdbcManager conManager = JagGenerator.getConManager(); 84 Connection con = null; 85 ArrayList list = new ArrayList (); 86 try { 87 con = conManager.connect(); 88 DatabaseMetaData meta = con.getMetaData(); 89 ResultSet columns = meta.getColumns(null, conManager.getSchema(), tablename, "%"); 90 Column c = null; 91 while (columns.next()) { 92 c = new Column(); 93 switch (columns.getInt("NULLABLE")) { 94 case DatabaseMetaData.columnNullable: 95 c.setNullable(true); 96 break; 97 case DatabaseMetaData.columnNoNulls: 98 c.setNullable(false); 99 break; 100 case DatabaseMetaData.columnNullableUnknown: 101 c.setNullable(false); 102 default: 103 c.setNullable(true); 104 } 105 106 c.setName(columns.getString("COLUMN_NAME")); 107 if (pkeys.contains(columns.getString("COLUMN_NAME"))) { 108 c.setPrimaryKey(true); 109 } else { 110 c.setPrimaryKey(false); 111 } 112 113 c.setLength(columns.getInt("COLUMN_SIZE")); 114 c.setPrecision(columns.getInt("COLUMN_SIZE")); 115 c.setScale(columns.getInt("DECIMAL_DIGITS")); 116 c.setSqlType(columns.getString("TYPE_NAME")); 117 list.add(c); 118 } 119 columns.close(); 120 121 } catch (Exception e) { 122 e.printStackTrace(); 123 } finally { 124 if (con != null) { 125 try { 126 con.close(); 127 } catch (SQLException e) { 128 } 129 } 130 } 131 132 columnsCache.put(tablename, list); 133 return list; 134 } 135 136 142 public static List getForeignKeys(String tablename) { 143 log.debug("Get the foreign keys for table: " + tablename); 144 ArrayList fkeys = new ArrayList (); 145 GenericJdbcManager conManager = JagGenerator.getConManager(); 146 if (conManager == null) { 147 JagGenerator.logToConsole("Can't retrieve foreign keys - no database connection!"); 148 } else { 149 Connection con = null; 150 try { 151 con = conManager.connect(); 152 ResultSet foreignKeys = con.getMetaData().getImportedKeys("", conManager.getSchema(), tablename); 153 154 while (foreignKeys.next()) { 155 ForeignKey fk = new ForeignKey(); 156 try { 157 fk.setPkTableCat(foreignKeys.getString("PKTABLE_CAT")); 158 } catch (Exception e) { 159 } 161 try { 162 fk.setPkTableSchem(foreignKeys.getString("PKTABLE_SCHEM")); 163 } catch (Exception e) { 164 } 166 try { 167 fk.setPkTableName(foreignKeys.getString("PKTABLE_NAME")); 168 } catch (Exception e) { 169 } 171 try { 172 173 fk.setPkColumnName(foreignKeys.getString("PKCOLUMN_NAME")); 174 } catch (Exception e) { 175 } 177 try { 178 fk.setFkTableCat(foreignKeys.getString("FKTABLE_CAT")); 179 } catch (Exception e) { 180 } 182 try { 183 184 fk.setFkTableSchem(foreignKeys.getString("FKTABLE_SCHEM")); 185 } catch (Exception e) { 186 } 188 try { 189 190 fk.setFkTableName(foreignKeys.getString("FKTABLE_NAME")); 191 } catch (Exception e) { 192 } 194 try { 195 196 fk.setFkColumnName(foreignKeys.getString("FKCOLUMN_NAME")); 197 } catch (Exception e) { 198 } 200 try { 201 202 fk.setKeySeq(foreignKeys.getShort("KEY_SEQ")); 203 } catch (Exception e) { 204 } 206 try { 207 fk.setUpdateRule(foreignKeys.getShort("UPDATE_RULE")); 208 } catch (Exception e) { 209 } 211 try { 212 213 fk.setDeleteRule(foreignKeys.getShort("DELETE_RULE")); 214 } catch (Exception e) { 215 } 217 try { 218 219 fk.setPkName(foreignKeys.getString("PK_NAME")); 220 } catch (Exception e) { 221 } 223 try { 224 225 fk.setDeferrability(foreignKeys.getShort("DEFERRABILITY")); 226 } catch (Exception e) { 227 } 229 log.debug("Foreign key table and column name: " + fk.getFkTableName() + " - " + fk.getFkColumnName()); 231 log.debug("foreign table and pk column name: " + fk.getPkTableName() + " - " + fk.getPkColumnName()); 232 233 fk.setFkName(Utils.format(fk.getFkColumnName())); 235 fkeys.add(fk); 236 } 237 } catch (Exception e) { 238 e.printStackTrace(); 239 } finally { 240 if (con != null) { 241 try { 242 con.close(); 243 } catch (SQLException e) { 244 } 245 } 246 } 247 } 248 249 return fkeys; 250 } 251 252 259 public static ArrayList getPrimaryKeys(String tablename) { 260 if (pkCache.get(tablename) != null) { 261 return (ArrayList ) pkCache.get(tablename); 262 } 263 GenericJdbcManager conManager = JagGenerator.getConManager(); 264 Connection con = null; 265 ArrayList pkeys = new ArrayList (); 266 try { 267 con = conManager.connect(); 268 ResultSet r = con.getMetaData().getPrimaryKeys(null, conManager.getSchema(), tablename); 269 while (r.next()) { 270 pkeys.add(r.getString("COLUMN_NAME")); 271 } 272 } catch (Exception e) { 273 e.printStackTrace(); 274 } finally { 275 if (con != null) { 276 try { 277 con.close(); 278 } catch (SQLException e) { 279 } 280 } 281 } 282 283 pkCache.put(tablename, pkeys); 284 return pkeys; 285 } 286 287 292 public static ArrayList getTables() { 293 if (tablesCache == null) { 294 tablesCache = new ArrayList (); 295 GenericJdbcManager conManager = JagGenerator.getConManager(); 296 String [] displayTableTypes = conManager.getDisplayTableTypes(); 297 if (displayTableTypes == null) { 298 displayTableTypes = DEFAULT_TABLE_TYPES; 299 } 300 ResultSet tables = null; 301 Connection con = null; 302 try { 303 con = conManager.connect(); 304 ResultSet schemas = con.getMetaData().getSchemas(); 306 while (schemas.next()) { 307 } 309 tables = con.getMetaData().getTables(null, conManager.getSchema(), "%", displayTableTypes); 310 while (tables.next()) { 311 String tableName = tables.getString(TABLE_NAME); 313 if (tableName != null) { 314 tablesCache.add(tableName); 315 } 316 } 317 } catch (Exception e) { 318 e.printStackTrace(); 319 JagGenerator.logToConsole("Error getting tables list: " + e.toString()); 320 } finally { 321 if (tables != null) 322 try { 323 tables.close(); 324 } catch (Exception e) { 325 } 326 327 if (con != null) 328 try { 329 con.close(); 330 } catch (SQLException e) { 331 } 332 } 333 } 334 if (tablesCache != null) 335 Collections.sort(tablesCache); 336 return tablesCache; 337 } 338 339 342 public static void clearCache() { 343 tablesCache = null; 344 } 345 346 351 public static void clearColumnsCacheForTable(String tableName) { 352 columnsCache.remove(tableName); 353 } 354 355 } 356 | Popular Tags |