SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

297 lines
11 KiB

package de.superx.bin;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.StringTokenizer;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import de.superx.bin.Doschema.Format;
/**
* @author Daniel Quathamer Projektgruppe SuperX
* doquery.java
* @
* Dieses Javaprogramm führt einen SQL-Ausdruck aus und gibt das Ergebnis aus.<br>
* Gebrauch:<br> java doquery <Pfad zu logger-properties> <pfad zu db.properties> <sql-Ausdruck> <Ausgabeformat (txt | html | xml)>(optional) <delimiter> <mit Spaltenüberschriften (true | false)>(optional) <Ausgabedatei>(optional)
*
*/
//Änderungen
/*
* 16.4.04 Wenn kein outfile angegeben, werden alle select results auf die Console geloggt
* 19.1.2006 dq: Unload großer Tabellen unter Postgres ermöglicht.
*/
public class Doquery {
private static Connection myDb;
private static Statement st; // Our statement to run queries with
private static DatabaseMetaData dbmd;
// This defines the structure of the database
private static boolean done = false; // Added by CWJ to permit \q command
private static String delim = "^";
private static String header = "false";
private static Format outFormat = Format.txt;
private static String logfile = "../conf/logging.properties";
private static String tabelle = "";
private static String dbpropfile = "../conf/db.properties";
private static SxConnection myConnection = null;
private static String db_driver;
private static String outfile = "";
private static Logger logger = (Logger) Logger.getLogger(Doquery.class.toString());
private static String usage = "-------------------------------------\nGebrauch: java de.superx.SimpleTransform -logger=<<Pfad zu logging.properties>> -IN=<<xml-Datei>> -XSL=<<xsl-Datei>> -method=<<xml |html|text>>(optional) -param=<<Parameter>>(optional) -OUT=<<Ausgabedatei>>(optional) \n---------------------------------------------------";
public static void go(String args[]) throws ClassNotFoundException, FileNotFoundException, IOException, SQLException, IllegalArgumentException {
if (args.length > 0) {
logfile = args[0].trim();
} else {
throw new IllegalArgumentException("Mindestens drei Parameter (Pfad zu den logger.properties, Pfad zu den db.properties, sql-String) erfoderlich");
}
File f = new File(logfile);
if (!f.exists()) {
throw new IOException("Datei nicht gefunden: " + logfile);
}
FileInputStream ins = new FileInputStream(logfile);
LogManager MyLogManager = java.util.logging.LogManager.getLogManager();
MyLogManager.readConfiguration(ins);
logfile = MyLogManager.getProperty(".level");
logger.info("Using Loggging-Level " + logfile);
String _sql = "";
if (args.length > 1) {
dbpropfile = args[1].trim();
} else {
logger.severe("Mindestens drei Parameter (Pfad zu den logger.properties, Pfad zu den db.properties, sql-String) erfoderlich");
System.exit(1);
}
if (args.length > 2) {
_sql = args[2].trim();
//DOS produces unnecessary ".." around the stmt
if (_sql.length() > 0) {
if (_sql.startsWith("\"")) _sql = _sql.substring(1, _sql.length());
if (_sql.endsWith("\"")) _sql = _sql.substring(0, _sql.length() - 1);
}
} else {
logger.severe("Mindestens drei Parameter (Pfad zu den logger.properties, Pfad zu den db.properties, sql-String) erfoderlich");
System.exit(1);
}
if (args.length > 3) {
//outFormat = args[3].trim();
outFormat = Format.valueOf(args[3].trim().toLowerCase());
}
if (args.length > 4) {
delim = args[4].trim();
}
if (args.length > 5) {
header = args[5].trim();
}
if (args.length > 6) {
outfile = args[6].trim();
}
if (delim.equals("")) delim = "^"; //default Delimiter
if (!outfile.equals("")) {
try {
FileWriter f1 = new FileWriter(outfile);
f1.write("");
f1.close();
} catch (IOException e) {
logger.severe("Fehler beim Erstellen der Datei " + outfile);
}
}
getConnection(logger, dbpropfile);
SxTransformer myTransformer = null;
if (myConnection.m_DriverClass == SxConnection.DriverClass.dc_postgre && !outfile.equals("") && outFormat == Format.txt && !header.equals("true")) {
//Postgres-Boost-Mode
logger.info("Unload with Postgres Boost mode");
PreparedStatement l_stmt = null;
PreparedStatement l_stmtFetch = null;
PreparedStatement l_stmtClose = null;
ResultSet l_rset = null;
ResultSetMetaData l_mdat = null;
int l_rows;
try { //exception
st = myDb.createStatement();
if (_sql.indexOf(";") > 0) {
String einzelsql = "";
//mehrere Statements hintereinander
StringTokenizer tk = new StringTokenizer(_sql, ";");
for (; tk.hasMoreTokens();) {
einzelsql = tk.nextToken();
if (tk.hasMoreTokens())
//das letzte SQL wird unten ausgeführt:
st.execute(einzelsql);
}
_sql = einzelsql;
}
logger.info("Print Result of: " + _sql);
st.execute("Begin;");
try { //finally
//open the cursor
l_stmt = myConnection.prepareStatement("DECLARE FOO CURSOR FOR " + _sql);
l_stmt.execute();
l_stmtFetch = myConnection.prepareStatement("FETCH FORWARD 10000 FROM FOO");
l_rset = l_stmtFetch.executeQuery();
l_mdat = l_rset.getMetaData();
while (true) {
//perform a fetch from the cursor (possibly multiple fetches will be done)
if (l_rset.next() == false) break;
//l_rset.beforeFirst() ;
if (outfile.equals("")) {
myTransformer = new SxTransformer(logger, System.out);
//myClient.setLogAllResultSetsToConsole(true);
} else
myTransformer = new SxTransformer(logger, new FileWriter(outfile, true));
myTransformer.setDelim(delim);
myTransformer.setHeader(header);
myTransformer.setOutrs(l_rset);
myTransformer.setOutrsmd(l_mdat);
myTransformer.printResult(outFormat.name());
l_rset = l_stmtFetch.executeQuery();
}
//don't forget to close the cursor
l_stmtClose = myConnection.prepareStatement("CLOSE FOO");
l_stmtClose.execute();
} finally {
if (l_rset != null) {
l_rset.close();
}
if (l_stmt != null) {
l_stmt.close();
}
if (l_stmtFetch != null) {
l_stmtFetch.close();
}
if (l_stmtClose != null) {
l_stmtClose.close();
}
}
} catch (SQLException l_se) {
//do something useful here
logger.severe("Fehler beim SQL " + _sql);
l_se.printStackTrace();
}
st = myDb.createStatement();
//if (myConnection.m_DriverClass.equals("org.postgresql.Driver"))
st.execute("commit;");
myConnection.close();
} else {
//normaler Modus für IDS, Access und andere Exportformate ausser txt
SxJdbcClient myClient = new SxJdbcClient(logger, dbpropfile, _sql);
//logger.info("Executing sql: " + _sql);
myClient.Rs_executeALL();
logger.info("Getting resultset");
ResultSet myrs = myClient.getRs();
//logger.info("Starting output for: " + _sql);
if (myrs != null && myrs.next()) {
if (outfile.equals("")) {
myTransformer = new SxTransformer(logger, System.out);
myClient.setLogAllResultSetsToConsole(true);
} else
myTransformer = new SxTransformer(logger, new FileWriter(outfile));
myTransformer.setDelim(delim);
myTransformer.setHeader(header);
myTransformer.setOutrs(myrs);
myTransformer.setOutrsmd(myClient.getRsmd());
logger.info("Print Result of: " + _sql);
myTransformer.printResult(outFormat.name());
}
//else
// logger.info("Keine Rückgabewerte aus SQL-Script");
myClient.close();
}
logger.info("doquery erfolgreich beendet");
}
/*
* Display some instructions on how to run the example
*/
public static void instructions() {
System.out.println("SuperX @version@\n");
System.out.println("\nDieses Java-Programm führt einen SQL-Ausdruck aus und gibt das Ergebnis aus.\n");
System.out.println("Gebrauch:\n java doquery <Pfad zu logger-properties> <pfad zu db.properties> <sql-Ausdruck> <Ausgabeformat (txt | html | xml)>(optional) <delimiter> <mit Spaltenüberschriften (true | false)>(optional) <Ausgabedatei>(optional)\n");
System.exit(1);
}
public static void main(String args[]) {
try {
go(args);
} catch (Exception ex) {
System.err.println("Doquery Aufruf fehlgeschlagen.\n" + ex);
ex.printStackTrace();
System.exit(1);
}
}
public static void getConnection(Logger logger, String propFile) throws SQLException {
myConnection = new SxConnection();
myConnection.setPropfile(propFile);
logger.config("Starting Connection...");
try {
myDb = myConnection.getConnection();
st = myDb.createStatement();
//st = myDb.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
// java.sql.ResultSet.CONCUR_READ_ONLY);
//st.setFetchSize(100);
dbmd = myDb.getMetaData();
//st = myDb.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
//ResultSet.CONCUR_UPDATABLE);
} catch (Exception e) {
e.printStackTrace();
logger.severe("Keine DB-Verbindung: " + e.toString());
throw new SQLException("Keine DB-Verbindung: " + e.toString());
}
db_driver = myConnection.m_DriverClass.stringValue();
}
}