package com.ibm.gaiandb.distributed; import java.io.File; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import com.ibm.db2j.GaianTable; import com.ibm.gaiandb.DataSourcesManager; import com.ibm.gaiandb.GaianDBConfig; import com.ibm.gaiandb.GaianDBProcedureUtils; import com.ibm.gaiandb.GaianNode; import com.ibm.gaiandb.Logger; import com.ibm.gaiandb.Util; import com.ibm.gaiandb.tools.SQLRunner; public class SampleProcedures extends GaianDBProcedureUtils { private static final Logger logger = new Logger( "SampleProcedure", 30 ); // static final String PROCEDURE_SQL = "" // + "!DROP PROCEDURE RUNSQL;!CREATE PROCEDURE RUNSQL(sql_expression "+Util.XSTR+", rdbmsConnectionID "+Util.XSTR+")" // + " PARAMETER STYLE JAVA LANGUAGE JAVA MODIFIES SQL DATA DYNAMIC RESULT SETS 1 EXTERNAL NAME 'com.ibm.gaiandb.GaianDBUtilityProcedures.runSQL'" // ; public static void runSQL( String sqlOrFile, String cid, ResultSet[] rs ) throws Exception { Connection c = null; try { if ( null == sqlOrFile || 1 > (sqlOrFile = sqlOrFile.trim()).length() ) return; if ( null != cid ) { cid = cid.trim(); if ( 1 > cid.length() || "LOCALDERBY".equals(cid) ) cid = null; } final String gdbWorkspace = GaianNode.getWorkspaceDir(); final String fPath = null == gdbWorkspace || Util.isAbsolutePath(sqlOrFile) ? sqlOrFile : gdbWorkspace+"/"+sqlOrFile; if ( 1 == Util.splitByTrimmedDelimiterNonNestedInCurvedBracketsOrQuotes(sqlOrFile, ';').length && false == new File(fPath).exists() ) { // Single SQL Statement if ( null==cid ) { Statement stmt = getDefaultDerbyConnection().createStatement(); rs[0] = stmt.execute( sqlOrFile ) ? stmt.getResultSet() : getResultSetFromQueryAgainstDefaultConnection( "SELECT " + stmt.getUpdateCount() + " UPDATE_COUNT FROM SYSIBM.SYSDUMMY1"); } else { // Use System.currentTimeMillis() so the query is always different - this avoids it being cached.. so we see Exceptions if they occur. rs[0] = getResultSetFromQueryAgainstDefaultConnection( "select * from new com.ibm.db2j.GaianQuery('"+Util.escapeSingleQuotes(sqlOrFile)+"','','SOURCELIST="+Util.escapeSingleQuotes(cid)+"') GQ"); // DataSourcesManager.clearSubQueryMetaData(sqlOrFile, cid+"falsefalse"); } } else { // SQL script, or multiple SQL statements if ( null == cid ) c = getDefaultDerbyConnection(); else { String connectionDetails = GaianDBConfig.getRDBConnectionDetailsAsString(cid); c = GaianDBConfig.getNewDBConnector( GaianDBConfig.getConnectionTokens(connectionDetails) ).getConnection(); // c = DataSourcesManager.getPooledJDBCConnection(connectionDetails, DataSourcesManager.getSourceHandlesPool(connectionDetails)); } SQLRunner sqlr = new SQLRunner(c); // Use SQLRunner to process a script file or a list of statements - then return summary sqlr.processSQLs( "-quiet" ); sqlr.processSQLs( "-t" ); // explicitly use semi-colon as delimiter String summaryInfo = sqlr.processSQLs( sqlOrFile ); rs[0] = getResultSetFromQueryAgainstDefaultConnection("SELECT " + summaryInfo + " FROM SYSIBM.SYSDUMMY1"); } } catch ( Throwable e ) { String msg = Util.getGaiandbInvocationTargetException(e); msg = null == msg ? Util.getStackTraceDigest(e) /*e.toString()*/ : msg.substring(msg.indexOf(GaianTable.IEX_PREFIX)+GaianTable.IEX_PREFIX.length()).trim(); rs[0] = getResultSetFromQueryAgainstDefaultConnection("SELECT '"+Util.escapeSingleQuotes(msg)+"' SQL_FAILURE FROM SYSIBM.SYSDUMMY1"); } finally { logger.logInfo("Closing connection"); rs[0].getStatement().getConnection().close(); // must be done for derby procedure to work if ( null != cid && null != c ) // Return connection to pool (may get closed immediately if not referenced by a data source or sourcelist) DataSourcesManager.getSourceHandlesPool( GaianDBConfig.getRDBConnectionDetailsAsString(cid) ).push(c); } } }