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)"; |