// Copyright (c) 2005 Dustin Sallings <dustin@spy.net> package net.spy.db; import java.sql.Connection; import java.sql.SQLException; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import net.spy.SpyObject; /** * Query selection by database product name. * * This implementation of QuerySelector works by finding the best match for * the given Connection by DatabaseMetaData's getDatabaseProductName(). * * <p> * * The following product names are mapped to their respective names in * this implementation: * * <table border="1"> * <tr> * <th>Driver driver name</th><th>Query Name</th> * </tr> * <tr> * <td>PostgreSQL</td><td>pgsql</td> * </tr> * <tr> * <td>Oracle</td><td>oracle</td> * </tr> * <tr> * <td>Microsoft SQL Server</td><td>mssql</td> * </tr> * <tr> * <td>MySQL</td><td>mysql</td> * </tr> * <tr> * <td>DB2 UDB for AS/400</td><td>db2</td> * </tr> * <tr> * <td>Informix Dynamic Server</td><td>informix</td> * </tr> * <tr> * <td>INFORMIX-OnLine</td><td>informix</td> * </tr> * </table> * * </p> * * @see SpyDB */ public class DatabaseMetaDataQuerySelector extends SpyObject implements QuerySelector { private final SortedMap<String, String> nameMap; /** * Get an instance of DatabaseMetaDataQuerySelector. * This should really only be called from QuerySelectorFactory */ public DatabaseMetaDataQuerySelector() { super(); nameMap=new TreeMap<String, String>(); initNameMap(); } /** * Initialize the prefix to name map. */ protected void initNameMap() { registerNameMapping("PostgreSQL", "pgsql"); registerNameMapping("Oracle", "oracle"); registerNameMapping("Microsoft SQL Server", "mssql"); registerNameMapping("MySQL", "mysql"); registerNameMapping("DB2 UDB for AS/400", "db2"); registerNameMapping("Informix Dynamic Server", "informix"); registerNameMapping("INFORMIX-OnLine", "informix"); } /** * Register a prefix -> name mapping. * * @param prefix the prefix to match for a name * @param name the name */ protected void registerNameMapping(String prefix, String name) { nameMap.put(prefix, name); } /** * @see QuerySelector */ public String getQuery(Connection conn, Map<String, String> queryMap) throws SQLException { return(getQuery(conn.getMetaData().getDatabaseProductName(), queryMap)); } /** * Attempt to get a query in the given map by a name. * * @param name the name against which to search * @param queryMap the map containing the queries * @return the query, or null if one cannot be found */ protected String getQuery(String name, Map<String, String> queryMap) { String rv=null; // First, check to see if the named query is in the map rv=queryMap.get(name); if(rv == null) { // Next, check to see if the name is in our translation map String tmp=nameMap.get(name); // If we don't have a key, use the default key if(tmp == null) { getLogger().debug("Unknown driver: %s", name); tmp=DEFAULT_QUERY; } rv=queryMap.get(tmp); // If there wasn't a match, try default if(rv == null) { tmp=DEFAULT_QUERY; rv=queryMap.get(tmp); } } // not in query Map return (rv); } }