📄 jdbcadapter.java
字号:
package org.trinet.util.graphics.table;
/**
* An adaptor, transforming the JDBC interface to the TableModel interface.
* @version 1.0 09/15/98
* @author Philip Milne original SUNSOFT version
* @author highly modified by AWalter USGS 9/98
*/
import java.math.*;
import java.util.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import org.trinet.jdbc.*;
import org.trinet.util.*;
public class JDBCAdapter extends AbstractTableModel {
private static final String DEFAULT_SCHEMA = "TRINETDB";
private int maxRows = 100;
private Connection conn;
private Statement stmt;
private Statement lockstmt;
private Statement updstmt;
private ResultSet queryResultSet;
private ResultSet resultSet;
private ResultSetMetaData rsMD;
private DatabaseMetaData dbMD;
private int connID = -1;
private int updateCount = -1;
private static final String strLock1 = "LOCK TABLE ";
private static final String strLock2 = " IN ROW EXCLUSIVE MODE NOWAIT";
private String [] dbTableNames;
private ColumnData [] columnDataArray;
private String[] queryTables;
private String[] colNames;
private String[] colTbls;
private String[] colLabel;
private int[] colTypes;
private int[] colWidth;
private int[] colPrecision;
private int[] colScale;
private boolean[] colAKey;
private boolean updateDBflag = false;
private boolean insertDBflag = false;
private int insertedRowIndex = -1;
private ArrayList rows = new ArrayList();
private String lastUpdateQuery = "";
private static final String catalog = null;
private static String schemaLogin = "";
public JDBCAdapter() {}
public int connect(String url, String driverName,
String user, String passwd) {
schemaLogin = user.toString().toUpperCase();
System.out.println("JDBCAdapter: Table connect() username/schemaLogin: " + schemaLogin);
try {
conn = JDBConnect.getConnection(url, driverName, user, passwd);
if (conn != null) {
stmt = conn.createStatement();
updstmt = conn.createStatement();
lockstmt = conn.createStatement();
conn.setAutoCommit(false);
dbMD = conn.getMetaData();
connID = JDBConnect.getConnectionId(url, driverName, user, passwd);
}
}
catch (SQLException ex) {
System.err.println("JDBCAdapter: Connect failure; SQLException");
SQLExceptionHandler.prtSQLException(ex);
connID = -1;
}
return connID;
}
public int connect(int id) {
conn = JDBConnect.getConnection(id);
connID = -1;
if (conn != null) {
try {
stmt = conn.createStatement();
updstmt = conn.createStatement();
lockstmt = conn.createStatement();
dbMD = conn.getMetaData();
conn.setAutoCommit(false);
queryResultSet = null;
rsMD = null;
connID = id;
}
catch (SQLException ex) {
System.err.println("JDBCAdapter: Connect with integer id failure; SQLException");
SQLExceptionHandler.prtSQLException(ex);
}
}
else {
System.err.println("JDBCAdapter: Connect invalid connection id");
}
return connID;
}
public boolean execute(String query) {
boolean rval = false;
resultSet = null;
updateCount = -1;
try {
if(stmt == null) stmt = conn.createStatement();
System.out.println("JDBCAdapter: execute SQL statement:\n" + query);
rval = stmt.execute(query);
if (rval) resultSet = stmt.getResultSet();
else updateCount = stmt.getUpdateCount();
}
catch (SQLException ex) {
System.err.println("JDBCAdapter: execute statement failure.");
ex.printStackTrace();
}
return rval;
}
public int executeQuery(String query) {
return executeQuery(query, maxRows);
}
public int executeQuery(String query, int maxRows) {
System.out.println("JDBCAdapter: executeQuery SQL statement:\n" + query);
if (conn == null) {
System.err.println("JDBCAdapter: executeQuery null connection failure; must connect to database to execute query.");
return 0;
}
String schema;
try {
if(stmt == null) stmt = conn.createStatement();
int idx = query.indexOf("FROM");
int idx2 = query.indexOf("WHERE");
String tblString = null;
if (idx > 0 && idx2 > 0) {
if (idx+5 < idx2-2) {
tblString = query.substring(idx+5,idx2-1);
findQueryTables(tblString);
}
}
else if (idx > 0) {
int ifor = query.indexOf("FOR UPDATE");
String tmp = null;
if (ifor >= 0) tblString = query.substring(idx+5,ifor);
else tblString = query.substring(idx+5);
// Debug.println("JDBCAdapter tblString: " + tblString);
findQueryTables(tblString);
}
if (queryTables.length == 0 || idx == -1) {
// Debug.println("JDBCAdapter: QUERY TABLES LENGTH = 0 " );
return 0;
}
else {
if (query.indexOf("UPDATE") >= 0) updateDBflag = true;
else updateDBflag = false;
First: for (int i=0; i<queryTables.length; i++) {
int indexSchema = queryTables[i].indexOf('.');
if (indexSchema >= 0) schema = queryTables[i].substring(0, indexSchema);
else schema = schemaLogin;
dbTableNames = getTableNames(schema);
for (int j=0; j<dbTableNames.length; j++) {
// Debug.println("dbTableNames:" + dbTableNames[j]);
if(queryTables[i].substring(indexSchema+1).equals(dbTableNames[j])) {
// Debug.println("JDBCAdapter: Found table: " + queryTables[i]);
columnDataArray = getColumnData(queryTables[i]);
/*
for (int k = 0 ; k < columnDataArray.length ; k++) {
Debug.println(k + " " + columnDataArray[k].toString());
}
*/
continue First;
}
}
System.out.println("JDBCAdapter: executeQuery requested table: " + queryTables[i] + " not in schemaLogin");
continue First;
// return 0;
}
}
if (maxRows > 0) {
stmt.setMaxRows(maxRows);
}
else {
System.out.println("JDBCAdapter: No MAXROWS specified ... truncating table to 100 rows");
stmt.setMaxRows(100); // temporary limit set here
// java.awt.Toolkit.getDefaultToolkit().beep();
}
// Debug.println("EXECUTING QUERY");
queryResultSet = stmt.executeQuery(query);
rsMD = queryResultSet.getMetaData();
int numberOfColumns = rsMD.getColumnCount();
// Debug.println("JDBCAdapter: Table column count:" + numberOfColumns);
// Get the column names and types; cache them for later use.
colNames = new String[numberOfColumns];
colTypes = new int[numberOfColumns];
colWidth = new int[numberOfColumns];
colPrecision = new int[numberOfColumns];
colScale = new int[numberOfColumns];
colTbls = new String[numberOfColumns];
colLabel = new String[numberOfColumns];
colAKey = new boolean[numberOfColumns];
//aww String keys[] = getPrimaryKeys(queryTables[0]);
findColumnTables(query);
for(int colIndex = 0; colIndex < numberOfColumns; colIndex++) {
colNames[colIndex] = rsMD.getColumnName(colIndex+1);
colLabel[colIndex] = rsMD.getColumnLabel(colIndex+1);
colTypes[colIndex] = rsMD.getColumnType(colIndex+1);
colWidth[colIndex] = rsMD.getColumnDisplaySize(colIndex+1);
colPrecision[colIndex] = rsMD.getPrecision(colIndex+1);
colScale[colIndex] = rsMD.getScale(colIndex+1);
if (colTbls[colIndex] == null) {
colTbls[colIndex] = rsMD.getTableName(colIndex+1);
}
if(colTbls[colIndex].equals("")) {
if(queryTables.length == 1) colTbls[colIndex] = queryTables[0]; // rsMD.getTableName(colIndex+1);
}
String keys[] = getPrimaryKeys(colTbls[colIndex]);
// Debug.println("JDBCAdapter: table keys:" + keys.length);
colAKey[colIndex] = false;
for ( int i = 0; i<keys.length; i++) {
if (colNames[colIndex].equals(keys[i])) colAKey[colIndex] = true;
}
/* comment out the print
Debug.print(" ColumnName:" + colNames[colIndex]);
// Debug.print("\n");
Debug.print(" Label:" + colLabel[colIndex]);
// Debug.print("\n");
Debug.print(" Type:" + colTypes[colIndex]);
// Debug.print("\n");
Debug.print(" Width:" + colWidth[colIndex]);
// Debug.print("\n");
Debug.print(" Precision:" + colPrecision[colIndex]);
// Debug.print("\n");
Debug.print(" Scale:" + colScale[colIndex]);
// Debug.print("\n");
Debug.print(" Table:" + colTbls[colIndex]);
// Debug.print("\n");
Debug.print(" AKey:" + colAKey[colIndex]);
Debug.print("\n");
// end of comment */
}
// Get all rows.
rows = new ArrayList(128);
int j = 0;
// Object obj;
while (queryResultSet.next()) {
j++;
// Debug.println("JDBCAdapter: executeQuery row count:" + j);
ArrayList newRow = new ArrayList(64);
for (int i = 1; i <= numberOfColumns; i++) {
// obj = queryResultSet.getObject(i);
// if (obj == null) Debug.println("JDBCAdapter: executequery object null");
// else Debug.println("JDBCAdapter: execute query Objectname:" + obj.getClass().getName());
// newRow.add(obj);
newRow.add(queryResultSet.getObject(i));
}
rows.add(newRow);
}
// Debug.println("JDBCAdapter: Found table.");
// for (int i = 0; i < queryTables.length; i++) { Debug.println( queryTables[i] + " "); }
// Debug.println(" column count: " + numberOfColumns);
// Debug.println("JDBCAdapter: row count: " + rows.size());
fireTableChanged(null); // Tell the listeners a new table has arrived.
return rows.size();
}
catch (SQLException ex) {
System.err.println("JDBCAdapter: executeQuery failure.");
SQLExceptionHandler.prtSQLException(ex);
return -1;
}
}
private void findColumnTables(String queryString) {
int iend = queryString.indexOf("FROM");
String colNames = queryString.substring(7,iend);
StringTokenizer st = new StringTokenizer(colNames, ", \t\n\r\f");
int itoke = st.countTokens();
if (itoke != getColumnCount()) {
if (queryString.indexOf('*') < 0) {
System.out.println("JDBCAdapter: findColumnTables: column count token mismatch");
return;
}
else return;
}
String colname;
for (int i = 0; i<itoke; i++) {
colname = st.nextToken();
if (colname.indexOf('.') > 0) colTbls[i] = colname.substring(0,colname.indexOf('.'));
else colTbls[i] = null;
// Debug.println("JDBCAdapter: findColumnTables:" + colname + " Table: " + colTbls[i]);
}
}
private void findQueryTables(String str) {
StringTokenizer st = new StringTokenizer(str, ", \t\n\r\f");
int itoke = st.countTokens();
queryTables = new String[itoke];
for (int i = 0; i<itoke; i++) {
queryTables[i] = st.nextToken();
// Debug.println("JDBCAdapter: findQueryTables:" + queryTables[i]);
}
}
public void resetStatement() {
try {
stmt.cancel();
stmt = null;
}
catch (SQLException ex) {
System.err.println("SQLException for JDBCAdapter resetStatement()");
System.err.println(ex.getMessage());
ex.printStackTrace();
}
}
public void close() throws SQLException {
System.out.println("JDBCAdapter: Closing database connection");
if (queryResultSet != null) {
queryResultSet.close();
queryResultSet = null;
}
if (resultSet != null) {
resultSet.close();
resultSet = null;
}
if (stmt != null) {
stmt.close();
stmt = null;
}
if (updstmt != null) {
updstmt.close();
updstmt = null;
}
if (lockstmt != null) {
lockstmt.close();
lockstmt = null;
}
if (conn != null) {
JDBConnect.close(connID);
conn = null;
connID = -1;
}
rsMD = null;
dbMD = null;
}
protected void finalize() throws Throwable {
System.out.println("JDBCAdapter: Finalize JDBCAdapter");
// close();
super.finalize();
}
// Begin added methods - AWW
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -