1 23 24 25 package com.sun.jdo.spi.persistence.utility.database; 26 27 import com.sun.jdo.spi.persistence.utility.LogHelperUtility; 28 import com.sun.jdo.spi.persistence.utility.PropertyHelper; 29 import com.sun.jdo.spi.persistence.utility.logging.Logger; 30 31 import java.io.IOException ; 32 import java.sql.DatabaseMetaData ; 33 import java.sql.SQLException ; 34 import java.util.Iterator ; 35 import java.util.Map ; 36 import java.util.Properties ; 37 import java.util.regex.Pattern ; 38 import java.util.regex.PatternSyntaxException ; 39 40 45 public class DBVendorTypeHelper { 46 public final static int OTHER_ENUM = -1; 48 49 public final static int DEFAULT_DB_ENUM = 0; 51 public final static int ORACLE_ENUM = 1; 52 public final static int POINTBASE_ENUM = 2; 53 public final static int MSSQL_ENUM = 3; 54 public final static int SYBASE_ENUM = 4; 55 public final static int DB2_ENUM = 5; 56 public final static int MYSQL_ENUM = 6; 57 public final static int INFORMIX_ENUM = 7; 58 public final static int INGRES_ENUM = 8; 59 public final static int DERBY_ENUM = 9; 60 61 public final static int MAX_KNOWN_DB = 10; 63 64 68 private final static String enumToStringMapping[] = 69 {"SQL92", "ORACLE", "POINTBASE", "MSSQL", "SYBASE", "DB2", "MYSQL", 70 "INFORMIX", "INGRES", "DERBY"}; 72 public final static String DEFAULT_DB = enumToStringMapping[DEFAULT_DB_ENUM]; 73 public final static String ORACLE = enumToStringMapping[ORACLE_ENUM]; 74 public final static String POINTBASE = enumToStringMapping[POINTBASE_ENUM]; 75 public final static String MSSQL = enumToStringMapping[MSSQL_ENUM]; 76 public final static String SYBASE = enumToStringMapping[SYBASE_ENUM]; 77 public final static String DB2 = enumToStringMapping[DB2_ENUM]; 78 public final static String MYSQL = enumToStringMapping[MYSQL_ENUM]; 79 public final static String INFORMIX = enumToStringMapping[INFORMIX_ENUM]; 80 public final static String INGRES = enumToStringMapping[INGRES_ENUM]; 81 public final static String DERBY = enumToStringMapping[DERBY_ENUM]; 82 83 private final static String PROPERTY_PATH = "com/sun/jdo/spi/persistence/utility/database/"; 85 private final static String VENDOR_NAME_TO_TYPE_PROPERTY = 86 "com.sun.jdo.spi.persistence.utility.database.VENDOR_NAME_TO_TYPE"; private final static String VENDOR_NAME_TO_TYPE_RESOURCE_PROPERTY = 88 "com.sun.jdo.spi.persistence.utility.database.VENDOR_NAME_TO_TYPE_RESOURCE"; private final static String VENDOR_NAME_TO_TYPE_RESOURCE_DEFAULT_NAME = 90 PROPERTY_PATH + "VendorNameToTypeMapping.properties"; 92 95 private static final Logger logger = LogHelperUtility.getLogger(); 96 97 101 private static Properties _nameToVendorType = initializeNameToVendorType();; 102 103 118 public static String getDBType(String vendorName) { 119 boolean debug = logger.isLoggable(); 120 if(debug) { 121 logger.fine("utility.database.DBVendorTypeHelper.inputVendorName", vendorName); 123 } 124 String detectedDbType = DEFAULT_DB; 125 if(vendorName != null) { 126 detectedDbType = matchVendorNameInProperties(vendorName, _nameToVendorType); 127 if(detectedDbType == null) { 130 detectedDbType = vendorName.toUpperCase(); 131 int i = detectedDbType.indexOf('/'); 132 if (i > -1) { 133 detectedDbType = detectedDbType.substring(0, i); 134 } 135 } 136 } 137 if(debug) 138 logger.fine("utility.database.DBVendorTypeHelper.detectedVendorType",detectedDbType); return detectedDbType; 140 } 141 142 147 public static int getEnumDBType(DatabaseMetaData metaData) 148 throws SQLException { 149 String dbType = getDBType(metaData.getDatabaseProductName()); 150 return getEnumDBType(dbType); 151 } 152 153 159 public static int getEnumDBType(String dbType) { 160 int enumDBType = OTHER_ENUM; 161 for(int i = 0; i < MAX_KNOWN_DB - 1 && enumDBType == OTHER_ENUM; i++) { 163 if(enumToStringMapping[i].equals(dbType) ) 164 enumDBType = i; 165 } 166 return enumDBType; 167 } 168 169 175 public static boolean requireUpperCaseSchema(DatabaseMetaData dmd) 176 throws SQLException { 177 int vendorTypeEnum = getEnumDBType(dmd); 178 return ORACLE_ENUM == vendorTypeEnum || 179 POINTBASE_ENUM == vendorTypeEnum; 180 } 181 182 185 private static Properties initializeNameToVendorType() { 186 synchronized(DBVendorTypeHelper.class) { 187 if(_nameToVendorType == null) { 188 _nameToVendorType = new Properties (); 189 String resourceName = System.getProperty(VENDOR_NAME_TO_TYPE_RESOURCE_PROPERTY, 190 VENDOR_NAME_TO_TYPE_RESOURCE_DEFAULT_NAME); 191 try { 192 PropertyHelper.loadFromResource(_nameToVendorType,resourceName, 193 DBVendorTypeHelper.class.getClassLoader() ); 194 } catch (IOException e) { 195 if(logger.isLoggable() ) { 196 logger.fine("utility.database.DBVendorTypeHelper.couldNotLoadResource", resourceName,e); 198 } 199 } 200 overrideWithSystemProperties(_nameToVendorType); 201 } 202 } 203 204 return _nameToVendorType; 205 } 206 207 210 private static String matchVendorNameInProperties(String vendorName, Properties nameToVendorType) { 211 String dbType = null; 212 for( Iterator iterator = nameToVendorType.entrySet().iterator(); 214 dbType == null && iterator.hasNext();) { 215 Map.Entry entry = (Map.Entry ) iterator.next(); 216 String regExpr = (String ) entry.getKey(); 217 String value = (String ) entry.getValue(); 218 if(logger.isLoggable(Logger.FINEST) ) 219 logger.finest("utility.database.DBVendorTypeHelper.regExprDbType",regExpr,value); if( matchPattern(regExpr,vendorName) ) { 221 dbType = value; 222 } 223 } 224 return dbType; 225 } 226 227 234 private static boolean matchPattern(String regExp, String target) { 235 boolean matches = false; 236 try { 237 matches = Pattern.matches(regExp,target); 238 } catch (PatternSyntaxException e){ 239 logger.fine("utility.database.DBVendorTypeHelper.patternSyntaxException",e); } 241 return matches; 242 } 243 244 247 private static void overrideWithSystemProperties(Properties nameToVendorType) { 248 String vendorNameToType = null; 249 boolean debug = logger.isLoggable(); 250 251 int counter = 1; 252 do { 253 String vendorNameToTypeProperty = VENDOR_NAME_TO_TYPE_PROPERTY + counter++; 254 vendorNameToType = System.getProperty(vendorNameToTypeProperty); 255 if(vendorNameToType != null) { 256 String [] parsedProperty = vendorNameToType.split("=",2); if( parsedProperty.length >= 2) { 259 String suggestedDbType = parsedProperty[0]; 260 String regExp = parsedProperty[1]; 261 if(debug) { 262 logger.fine("utility.database.DBVendorTypeHelper.traceVendorNameToTypeProperty", vendorNameToTypeProperty,regExp,suggestedDbType); 264 } 265 nameToVendorType.put(regExp,suggestedDbType); 266 } 267 else { 268 if(debug) 269 logger.fine("utility.database.DBVendorTypeHelper.errorParsingVendorNameToTypeProperty", vendorNameToTypeProperty,vendorNameToType); 271 } 272 } 273 } while (vendorNameToType != null); 274 } 275 276 277 } 278 | Popular Tags |