From: SVN by r. <sv...@ca...> - 2009-12-15 20:48:22
|
Author: roy Date: 2009-12-15 21:48:09 +0100 (Tue, 15 Dec 2009) New Revision: 434 Modified: src/main/java/nl/improved/sqlclient/commands/ReadCommand.java Log: some fixes in reading large files (threading issues) Modified: src/main/java/nl/improved/sqlclient/commands/ReadCommand.java =================================================================== --- src/main/java/nl/improved/sqlclient/commands/ReadCommand.java 2009-12-15 08:58:40 UTC (rev 433) +++ src/main/java/nl/improved/sqlclient/commands/ReadCommand.java 2009-12-15 20:48:09 UTC (rev 434) @@ -12,10 +12,12 @@ import java.sql.Types; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Vector; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; -import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; @@ -89,6 +91,7 @@ if (info.name.equals("row")) { if (!query.endsWith(")")) { query = query + values + ")"; + //output(query); pstmt = c.prepareStatement(query); } for (int i = 0; i < valuesList.size() ; i++) { @@ -106,20 +109,22 @@ if (rowCount % 100000 == 0) { if (autoCommit) { pstmt.getConnection().commit(); - output(Integer.toString(rowCount)+" rows comitted"); + //output(Integer.toString(rowCount)+" rows comitted"); } else { - output(Integer.toString(rowCount)+" rows inserted"); + //output(Integer.toString(rowCount)+" rows inserted"); } } } if (info.name.equals("col")) { if (!query.endsWith(")")) { if (values.endsWith("?")) { + query +=","; values+=","; } + query+= info.atts.get("name"); values += "?"; } - String typeString = info.atts.getValue("type"); + String typeString = info.atts.get("type"); if (typeString.equals("date")) { String nodeValue = content; if (nodeValue == null || nodeValue.equals("")) { @@ -127,9 +132,9 @@ } else { try { //pstmt.setDate(colNr + 1, new Date(formatter.parse(nodeValue).getTime())); - valuesList.add(new Date(formatter.parse(nodeValue).getTime())); + valuesList.add(new Date(formatter.parse(nodeValue.replace("\n", "").trim()).getTime())); } catch (ParseException ex) { - throw new IOException("Failed to parse date :"+ nodeValue); + throw new IOException("Row: "+ rowCount+" Failed to parse date :"+ nodeValue); } } } else if (typeString.equals("binary")) { @@ -164,21 +169,25 @@ valuesList.add(nodeValue); } } catch(Exception e) { - valuesList.add(nodeValue); + throw new IllegalArgumentException("Row :"+ rowCount +": Warning invalid type read: '" + typeString+"'"); } } } } }; - reader.setContentHandler(contentHandler); - //parser.parse(new File(fileName), new DefaultHandler()); - parser.parse(new File(fileName), (DefaultHandler)null); + //reader.setContentHandler(contentHandler); + parser.parse(new File(fileName), contentHandler); + int rowCount= contentHandler.rowCount; contentHandler = null; - return new SimpleCommandResult(true, "Read from " + fileName + " done. (" + contentHandler.rowCount + " rows imported)"); + return new SimpleCommandResult(true, "Read from " + fileName + " done. (" + rowCount + " rows imported)"); } catch (AbortException e) { - return new SimpleCommandResult(true, "Read from " + fileName + " aborted. (" + contentHandler.rowCount + " rows imported)"); + int rowCount= contentHandler.rowCount; + contentHandler = null; + return new SimpleCommandResult(true, "Read from " + fileName + " aborted. (" + rowCount + " rows imported)"); } catch (Exception e) { - throw new IllegalStateException("Failed to read dump (" + fileName + "): " + e.toString(), e); + int rowCount= contentHandler.rowCount; + contentHandler = null; + throw new IllegalStateException("Row: "+ rowCount+" Failed to read dump (" + fileName + "): " + e.toString(), e); } } @@ -215,13 +224,13 @@ @Override public boolean backgroundProcessSupported() { - return true; + return false; } - private static abstract class ReadCommandContentHandler implements ContentHandler { + private static abstract class ReadCommandContentHandler extends DefaultHandler { int rowCount = 0; - private List<ElementInfo> nameTree = new ArrayList<ElementInfo>(); + private List<ElementInfo> nameTree = new Vector<ElementInfo>(); private StringBuffer content; private boolean failed = false; private final String fileName; @@ -232,35 +241,43 @@ } + @Override public void setDocumentLocator(Locator locator) { } + @Override public void startDocument() throws SAXException { nameTree.clear(); content = new StringBuffer(); } + @Override public void endDocument() throws SAXException { nameTree.clear(); } + @Override public void startPrefixMapping(String prefix, String uri) throws SAXException { } + @Override public void endPrefixMapping(String prefix) throws SAXException { } + @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { nameTree.add(new ElementInfo(qName, atts)); + content = new StringBuffer(); if (abort) { throw new AbortException(); } } + @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (nameTree.get(nameTree.size()-1).name.equals(qName)) { try { - handleElement(nameTree.remove(nameTree.size() - 1), content.toString()); + handleElement(nameTree.remove(nameTree.size() - 1), "");//content.toString()); } catch (SQLException e) { throw new IllegalStateException("Failed to execute update query for dump(" + fileName + "): " + e.toString(), e); } catch (IOException e) { @@ -274,50 +291,44 @@ public abstract void handleElement(ElementInfo info, String content) throws SQLException, IOException; + @Override public void characters(char[] ch, int start, int length) throws SAXException { - content.append(ch, start, length); + if (nameTree.get(nameTree.size()-1).name.equals("col")) { + content.append(ch, start, length); + } } + @Override public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { - content.append(ch, start, length); + //content.append(ch, start, length); } + @Override public void processingInstruction(String target, String data) throws SAXException { - throw new UnsupportedOperationException("Not supported yet."); + System.err.println("Not supported yet."); } + @Override public void skippedEntity(String name) throws SAXException { - throw new UnsupportedOperationException("Not supported yet."); + System.err.println("Not supported yet."); } } private static class ElementInfo { private final String name; - private final Attributes atts; + private final Map<String, String> atts; - public ElementInfo(String name, Attributes atts) { + public ElementInfo(String name, Attributes attributes) { this.name = name; - this.atts = atts; + atts = new HashMap<String, String>(); + for (int i= 0; i < attributes.getLength(); i++) { + atts.put(attributes.getLocalName(i), attributes.getValue(i)); + } } } private static class AbortException extends RuntimeException { } - - public static void main(String[] args) throws Exception { - final String fileName = args[0]; - SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); - XMLReader reader = parser.getXMLReader(); - reader.setFeature("http://xml.org/sax/features/validation", false); - reader.setContentHandler(new ReadCommandContentHandler(fileName) { - @Override - public void handleElement(ElementInfo info, String content) throws SQLException, IOException { - System.out.println(info.name); - } - }); - //parser.parse(new File(fileName), new DefaultHandler()); - parser.parse(new File(fileName), (DefaultHandler)null); - } } |