/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.sys.dataaccess; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import javax.sql.DataSource; import org.apache.log4j.Logger; import org.kuali.kfs.sys.ConfigureContext; import org.kuali.kfs.sys.context.KualiTestBase; import org.kuali.kfs.sys.context.SpringContext; @ConfigureContext public class DatabaseConsistencyTest extends KualiTestBase { private static final Logger LOG = Logger.getLogger(DatabaseConsistencyTest.class); private Connection dbCon = null; private Statement dbAsk; private StringBuffer queryString; private ResultSet dbAnswer; private String dbType; private ArrayList<HashMap> tableData; public void setUp() throws Exception { super.setUp(); DataSource mySource = SpringContext.getBean(DataSource.class); String userName = mySource.getConnection().getMetaData().getUserName(); try { dbCon = mySource.getConnection(); dbType = dbCon.getMetaData().getDatabaseProductName().toLowerCase(); } catch (Exception e) { LOG.error( "Unable to establish connection to database.", e ); throw e; } dbAsk = dbCon.createStatement(); queryString = new StringBuffer(""); if ( dbType.contains("oracle") ) { System.err.println( "Running Oracle Test" ); queryString.append("select table_name, column_name,\n"); queryString.append(" data_type ,data_precision, data_scale, data_length\n"); queryString.append(" from user_tab_columns\n"); queryString.append(" where 1=1\n"); }else{ System.err.println("Running mySQL Test "); queryString.append("select table_name, column_name,\n"); queryString.append(" data_type, numeric_precision, numeric_scale,\n"); queryString.append(" character_maximum_length from information_schema.columns\n"); queryString.append(" where table_schema='"+userName+"'\n"); } queryString.append(" and table_name NOT LIKE 'KCB%'\n"); queryString.append(" and table_name NOT LIKE 'NOTIFICATION%'\n"); dbAnswer = dbAsk.executeQuery(queryString.toString()); tableData = new ArrayList(); while (dbAnswer.next()){ HashMap<String, String> tempList = new HashMap(); tempList.put("Table", dbAnswer.getString(1)); tempList.put("Column", dbAnswer.getString(2)); tempList.put("Type", dbAnswer.getString(3)); tempList.put("Precision", (null == dbAnswer.getString(4))?"null":dbAnswer.getString(4)); tempList.put("Scale", (null == dbAnswer.getString(5))?"null":dbAnswer.getString(5)); tempList.put("Length", (null == dbAnswer.getString(6))?"null":dbAnswer.getString(6)); tableData.add(tempList); } } public void tearDown() throws Exception { try { dbCon.close(); } catch (SQLException e) { LOG.error( "Unable to establish close to database.", e ); } } public void testNumber() throws Exception { System.err.println( "dbType: " + dbType ); boolean testFailed=false; String tempString=""; for (HashMap resultList:tableData){ if (resultList.get("Type").equals("NUMBER")&&resultList.get("Column").equals("VER_NBR")&& !(resultList.get("Precision").equals("8")||resultList.get("Scale").equals("0"))){ tempString=tempString+"Bad VER_NBR field in "+resultList.get("Table")+"\n"; testFailed=true; } } assertFalse(tempString,testFailed); } public void testOBJ_ID() throws Exception { System.err.println( "dbType: " + dbType ); boolean testFailed=false; String tempString=""; for (HashMap resultList:tableData){ if (resultList.get("Column").equals("OBJ_ID")&&!resultList.get("Type").equals("VARCHAR2")&&!resultList.get("Length").equals("36")){ tempString=tempString+"Bad OBJ_ID field in "+resultList.get("Table")+"\n"; testFailed=true; } } } }