|
From: SVN by r. <sv...@ca...> - 2008-08-03 12:15:28
|
Author: roy
Date: 2008-08-03 14:15:17 +0200 (Sun, 03 Aug 2008)
New Revision: 279
Modified:
src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
Log:
added support for encoding..
TODO add support for 'blob' binaries
Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
===================================================================
--- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-08-03 11:37:34 UTC (rev 278)
+++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-08-03 12:15:17 UTC (rev 279)
@@ -20,6 +20,7 @@
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
+import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -46,12 +47,20 @@
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamResult;
import nl.improved.sqlclient.commands.*;
import nl.improved.sqlclient.util.LimitedArrayList;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
/**
* The SQLShell abstract main class.
@@ -1380,7 +1389,6 @@
*/
private class DumpCommand implements Command {
private String fileName;
- private FileWriter dumpWriter;
@Override
public CharSequence execute(SQLCommand cmd) {
@@ -1393,51 +1401,80 @@
dumpFileName = nextPart;
}
int rowCount = 0;
+ PrintWriter out = null;
try {
File f = new File(toFileName(dumpFileName +".dmp"));
fileName = f.getAbsolutePath();
if ((f.exists() && !f.canWrite()) || (!f.exists() && !f.createNewFile())) {
throw new IllegalStateException("Failed to create spool to file: '"+fileName+"'");
}
- dumpWriter = new FileWriter(fileName);
- dumpWriter.write("<dump tablename=\"" + dumpFileName+"\">\n");
+ out = new PrintWriter(new FileWriter(fileName));
+ StreamResult streamResult = new StreamResult(out);
+ SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
+ // SAX2.0 ContentHandler.
+ TransformerHandler hd = tf.newTransformerHandler();
+ Transformer serializer = hd.getTransformer();
+ serializer.setOutputProperty(OutputKeys.ENCODING,"ISO-8859-1");
+ serializer.setOutputProperty(OutputKeys.INDENT,"yes");
+ hd.setResult(streamResult);
+ hd.startDocument();
+ AttributesImpl atts = new AttributesImpl();
+ atts.addAttribute("", "", "tablename", "", dumpFileName);
+ // USERS tag.
+ hd.startElement("","","dump",atts);
+
String query = "select * from " + nextPart;
Connection c = DBConnector.getInstance().getConnection();
Statement stmt = c.createStatement();
ResultSet rs = stmt.executeQuery(query);
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
while (rs.next()) {
- dumpWriter.write(" <row>\n");
+ atts.clear();
+ hd.startElement("","","row",atts);
ResultSetMetaData metaData = rs.getMetaData();
for (int col = 1; col <= metaData.getColumnCount(); col++) {
- dumpWriter.write(" <col name=\""+metaData.getColumnName(col)+"\"");
+ atts.addAttribute("","","name","",metaData.getColumnName(col));
if (metaData.getColumnType(col) == Types.DATE) {
- dumpWriter.write(" type=\"date\">");
+ atts.addAttribute("","","type","","date");
+ hd.startElement("","","col",atts);
Date date = rs.getDate(col);
if (date != null) {
- dumpWriter.write(formatter.format(date));
+ String dateString = formatter.format(date);
+ hd.characters(dateString.toCharArray(), 0, dateString.length());
}
+ } else if (metaData.getColumnType(col) == Types.BINARY ||
+ metaData.getColumnType(col) == Types.BLOB ||
+ metaData.getColumnType(col) == Types.CLOB ||
+ metaData.getColumnType(col) == Types.LONGNVARCHAR) {
+ InputStream valueStream = rs.getBinaryStream(col);
+ //Base64
+ atts.addAttribute("","","type","","binary");
+ hd.startElement("","","col",atts);
} else {
- dumpWriter.write(">");
- if (rs.getString(col) != null) {
- dumpWriter.write(rs.getString(col)); // TODO fix xml
+ hd.startElement("","","col",atts);
+ String value= rs.getString(col);
+ if (value != null) {
+ hd.characters(value.toCharArray(), 0, value.length());
}
}
- dumpWriter.write("</col>\n");
+ hd.endElement("","","col");
}
- dumpWriter.write(" </row>\n");
+ hd.endElement("","","row");
rowCount++;
}
- dumpWriter.write("</dump>");
+ hd.endElement("","","dump");
+ hd.endDocument();
+ } catch (SAXException ex) {
+ Logger.getLogger(AbstractSQLShellWindow.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (TransformerConfigurationException e) {
+ throw new IllegalStateException("Failed to create xml handler: " + e.toString(), e);
} catch (SQLException e) {
throw new IllegalStateException("Failed to execute query for dump("+fileName+"): " + e.toString(), e);
} catch (IOException e) {
throw new IllegalStateException("Failed to create dump ("+fileName+"): " + e.toString(), e);
} finally {
- try {
- dumpWriter.close();
- } catch (IOException ex) {
- Logger.getLogger(AbstractSQLShellWindow.class.getName()).log(Level.SEVERE, null, ex);
+ if (out != null) {
+ out.close();
}
}
return "Dump to "+fileName+" done. ("+ rowCount+" rows written)";
|