001: /* Copyright 2004 The JA-SIG Collaborative. All rights reserved.
002: * See license distributed with this file and
003: * available online at http://www.uportal.org/license.html
004: */
005:
006: package org.jasig.portal.tools.dbloader;
007:
008: import java.io.PrintWriter;
009: import java.sql.DatabaseMetaData;
010: import java.sql.ResultSet;
011: import java.sql.SQLException;
012: import java.sql.Statement;
013: import java.sql.Types;
014: import java.util.Hashtable;
015: import java.util.Map;
016:
017: import org.jasig.portal.RDBMServices;
018:
019: /**
020: * Utility class for centralizing various functions performed on the database.
021: *
022: * @author Ken Weiner, kweiner@unicon.net
023: * @author Mark Boyd {@link <a href="mailto:mark.boyd@engineer.com">mark.boyd@engineer.com</a>}
024: * @version $Revision: 36814 $
025: */
026: class DbUtils {
027:
028: static void logDbInfo(Configuration config) throws SQLException {
029: PrintWriter out = config.getLog();
030: DatabaseMetaData dbMetaData = config.getConnection()
031: .getMetaData();
032: String dbName = dbMetaData.getDatabaseProductName();
033: String dbVersion = dbMetaData.getDatabaseProductVersion();
034: String driverName = dbMetaData.getDriverName();
035: String driverVersion = dbMetaData.getDriverVersion();
036: String driverClass = RDBMServices.getJdbcDriver();
037: String url = RDBMServices.getJdbcUrl();
038: String user = RDBMServices.getJdbcUser();
039: out.println("Starting DbLoader...");
040: out.println("Database name: '" + dbName + "'");
041: out.println("Database version: '" + dbVersion + "'");
042: out.println("Driver name: '" + driverName + "'");
043: out.println("Driver version: '" + driverVersion + "'");
044: out.println("Driver class: '" + driverClass + "'");
045: out.println("Connection URL: '" + url + "'");
046: out.println("User: '" + user + "'");
047: }
048:
049: static String getLocalDataTypeName(Configuration config,
050: String genericDataTypeName) {
051:
052: String localDataTypeName = null;
053:
054: try {
055: DatabaseMetaData dbmd = config.getConnection()
056: .getMetaData();
057: String dbName = dbmd.getDatabaseProductName();
058: String dbVersion = dbmd.getDatabaseProductVersion();
059: String driverName = dbmd.getDriverName();
060: String driverVersion = dbmd.getDriverVersion();
061:
062: // Check for a mapping in DbLoader.xml
063: localDataTypeName = config.getMappedDataTypeName(dbName,
064: dbVersion, driverName, driverVersion,
065: genericDataTypeName);
066:
067: // Find the type code for this generic type name
068: int dataTypeCode = DbUtils
069: .getJavaSqlType(genericDataTypeName);
070:
071: if (localDataTypeName != null)
072: return localDataTypeName;
073:
074: if (config.getLocalTypeMap() == null) {
075:
076: Map localTypeMap = new Hashtable();
077: config.setLocalTypeMap(localTypeMap);
078:
079: try {
080:
081: ResultSet rs = dbmd.getTypeInfo();
082: try {
083: while (rs.next()) {
084: Integer dbTypeCode = new Integer(rs
085: .getInt("DATA_TYPE"));
086: String dbTypeName = rs
087: .getString("TYPE_NAME");
088:
089: // Add only first occurence of each type code
090: // See Bugzilla for a detailed explanation
091: if (!localTypeMap.containsKey(dbTypeCode)) {
092: localTypeMap
093: .put(dbTypeCode, dbTypeName);
094: }
095: }
096: } finally {
097: rs.close();
098: }
099: } catch (Exception e) {
100: config.getLog().println(
101: "Problem loading Database Meta Data. "
102: + e.getMessage());
103: e.printStackTrace(config.getLog());
104: DbLoader.exit(config);
105: }
106: }
107:
108: Integer dataTypeCodeObj = new Integer(dataTypeCode);
109: localDataTypeName = (String) config.getLocalTypeMap().get(
110: dataTypeCodeObj);
111:
112: if (localDataTypeName != null) {
113: return localDataTypeName;
114: }
115:
116: // No matching type found, report an error
117: config
118: .getLog()
119: .println(
120: "Your database driver, '"
121: + driverName
122: + "', version '"
123: + driverVersion
124: + "', was unable to find a local type name that matches the generic type name, '"
125: + genericDataTypeName + "'.");
126: config.getLog().println(
127: "Please add a mapped type for database '" + dbName
128: + "', version '" + dbVersion + "' inside '"
129: + config.getPropertiesURL()
130: + "' and run this program again.");
131: config.getLog().println("Exiting...");
132: DbLoader.exit(config);
133: } catch (Exception e) {
134: e.printStackTrace(config.getLog());
135: DbLoader.exit(config);
136: }
137:
138: return null;
139: }
140:
141: static void dumpTableAction(Configuration config,
142: String tableStatement) {
143: if (config.getScriptWriter() != null)
144: config.getScriptWriter().println(
145: tableStatement + config.getStatementTerminator());
146: }
147:
148: static void dropTable(Configuration config,
149: String dropTableStatement) {
150: Statement stmt = null;
151:
152: try {
153: stmt = config.getConnection().createStatement();
154: try {
155: stmt.executeUpdate(dropTableStatement);
156: } catch (SQLException sqle) {/*Table didn't exist*/
157: }
158: } catch (Exception e) {
159: config.getLog().println(dropTableStatement);
160: e.printStackTrace(config.getLog());
161: } finally {
162: try {
163: if (stmt != null)
164: stmt.close();
165: } catch (Exception e) {
166: }
167: }
168: }
169:
170: static int getJavaSqlType(String genericDataTypeName) {
171: // Find the type code for this generic type name
172: int dataTypeCode = 0;
173:
174: if (genericDataTypeName.equalsIgnoreCase("BIT"))
175: dataTypeCode = Types.BIT; // -7
176: else if (genericDataTypeName.equalsIgnoreCase("TINYINT"))
177: dataTypeCode = Types.TINYINT; // -6
178: else if (genericDataTypeName.equalsIgnoreCase("SMALLINT"))
179: dataTypeCode = Types.SMALLINT; // 5
180: else if (genericDataTypeName.equalsIgnoreCase("INTEGER"))
181: dataTypeCode = Types.INTEGER; // 4
182: else if (genericDataTypeName.equalsIgnoreCase("BIGINT")
183: || genericDataTypeName.equalsIgnoreCase("BIGINTEGER"))
184: dataTypeCode = Types.BIGINT; // -5
185: else if (genericDataTypeName.equalsIgnoreCase("FLOAT"))
186: dataTypeCode = Types.FLOAT; // 6
187: else if (genericDataTypeName.equalsIgnoreCase("REAL"))
188: dataTypeCode = Types.REAL; // 7
189: else if (genericDataTypeName.equalsIgnoreCase("DOUBLE"))
190: dataTypeCode = Types.DOUBLE; // 8
191: else if (genericDataTypeName.equalsIgnoreCase("NUMERIC"))
192: dataTypeCode = Types.NUMERIC; // 2
193: else if (genericDataTypeName.equalsIgnoreCase("DECIMAL"))
194: dataTypeCode = Types.DECIMAL; // 3
195:
196: else if (genericDataTypeName.equalsIgnoreCase("CHAR"))
197: dataTypeCode = Types.CHAR; // 1
198: else if (genericDataTypeName.equalsIgnoreCase("VARCHAR"))
199: dataTypeCode = Types.VARCHAR; // 12
200: else if (genericDataTypeName.equalsIgnoreCase("LONGVARCHAR"))
201: dataTypeCode = Types.LONGVARCHAR; // -1
202:
203: else if (genericDataTypeName.equalsIgnoreCase("DATE"))
204: dataTypeCode = Types.DATE; // 91
205: else if (genericDataTypeName.equalsIgnoreCase("TIME"))
206: dataTypeCode = Types.TIME; // 92
207: else if (genericDataTypeName.equalsIgnoreCase("TIMESTAMP"))
208: dataTypeCode = Types.TIMESTAMP; // 93
209:
210: else if (genericDataTypeName.equalsIgnoreCase("BINARY"))
211: dataTypeCode = Types.BINARY; // -2
212: else if (genericDataTypeName.equalsIgnoreCase("VARBINARY"))
213: dataTypeCode = Types.VARBINARY; // -3
214: else if (genericDataTypeName.equalsIgnoreCase("LONGVARBINARY"))
215: dataTypeCode = Types.LONGVARBINARY; // -4
216:
217: else if (genericDataTypeName.equalsIgnoreCase("NULL"))
218: dataTypeCode = Types.NULL; // 0
219:
220: else if (genericDataTypeName.equalsIgnoreCase("OTHER"))
221: dataTypeCode = Types.OTHER; // 1111
222:
223: else if (genericDataTypeName.equalsIgnoreCase("JAVA_OBJECT"))
224: dataTypeCode = Types.JAVA_OBJECT; // 2000
225: else if (genericDataTypeName.equalsIgnoreCase("DISTINCT"))
226: dataTypeCode = Types.DISTINCT; // 2001
227: else if (genericDataTypeName.equalsIgnoreCase("STRUCT"))
228: dataTypeCode = Types.STRUCT; // 2002
229:
230: else if (genericDataTypeName.equalsIgnoreCase("ARRAY"))
231: dataTypeCode = Types.ARRAY; // 2003
232: else if (genericDataTypeName.equalsIgnoreCase("BLOB"))
233: dataTypeCode = Types.BLOB; // 2004
234: else if (genericDataTypeName.equalsIgnoreCase("CLOB"))
235: dataTypeCode = Types.CLOB; // 2005
236: else if (genericDataTypeName.equalsIgnoreCase("REF"))
237: dataTypeCode = Types.REF; // 2006
238:
239: else if (genericDataTypeName.equalsIgnoreCase("DATALINK"))
240: dataTypeCode = 70; // Use Types.DATALINK when JDK 1.3 support is no longer needed
241: else if (genericDataTypeName.equalsIgnoreCase("BOOLEAN"))
242: dataTypeCode = 16; // Use Types.BOOLEAN when JDK 1.3 support is no longer needed
243:
244: return dataTypeCode;
245: }
246:
247: static void createTable(Configuration config,
248: String createTableStatement) {
249: Statement stmt = null;
250:
251: try {
252: stmt = config.getConnection().createStatement();
253: stmt.executeUpdate(createTableStatement);
254: } catch (Exception e) {
255: config.getLog().println(createTableStatement);
256: e.printStackTrace(config.getLog());
257: } finally {
258: try {
259: if (stmt != null)
260: stmt.close();
261: } catch (Exception e) {
262: }
263: }
264: }
265:
266: }
|