From f81c9baa2dbb869fbce1e7ee5fadd03c3ffe2a2c Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Thu, 9 Jul 2009 10:15:17 +0000 Subject: [PATCH] fixed XML parser git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@995 6a642e6f-84f6-412e-ac94-c4a38d5a04b0 --- VERSION | 2 +- data/formats/fb2/FBReaderVersion.ent | 2 +- platform/android/AndroidManifest.xml | 2 +- .../android/fbreader/SQLiteBooksDatabase.java | 36 +++++++++++++++++- .../formats/fb2/FB2MetaInfoReader.java | 12 +++++- .../zlibrary/core/xml/ZLXMLParser.java | 38 +++++++++++++++---- 6 files changed, 77 insertions(+), 15 deletions(-) diff --git a/VERSION b/VERSION index 69626fb92..9d6c1754e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.11 +0.5.12 diff --git a/data/formats/fb2/FBReaderVersion.ent b/data/formats/fb2/FBReaderVersion.ent index 564e957e3..8f6014f72 100644 --- a/data/formats/fb2/FBReaderVersion.ent +++ b/data/formats/fb2/FBReaderVersion.ent @@ -1 +1 @@ - + diff --git a/platform/android/AndroidManifest.xml b/platform/android/AndroidManifest.xml index a3d484267..032ce5e7e 100644 --- a/platform/android/AndroidManifest.xml +++ b/platform/android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/platform/android/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java b/platform/android/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java index 9a7c9fac8..599cc2cdd 100644 --- a/platform/android/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java +++ b/platform/android/src/org/geometerplus/android/fbreader/SQLiteBooksDatabase.java @@ -58,7 +58,7 @@ final class SQLiteBooksDatabase extends BooksDatabase { private void migrate() { final int version = myDatabase.getVersion(); - if (version >= 7) { + if (version >= 8) { return; } ZLDialogManager.Instance().wait((version == 0) ? "creatingBooksDatabase" : "updatingBooksDatabase", new Runnable() { @@ -87,7 +87,7 @@ final class SQLiteBooksDatabase extends BooksDatabase { myDatabase.endTransaction(); myDatabase.execSQL("VACUUM"); - myDatabase.setVersion(7); + myDatabase.setVersion(8); } }); } @@ -981,5 +981,37 @@ final class SQLiteBooksDatabase extends BooksDatabase { } private void updateTables7() { + final ArrayList seriesIDs = new ArrayList(); + Cursor cursor = myDatabase.rawQuery( + "SELECT series_id,name FROM Series", null + ); + while (cursor.moveToNext()) { + if (cursor.getString(1).length() > 200) { + seriesIDs.add(cursor.getLong(0)); + } + } + cursor.close(); + if (seriesIDs.isEmpty()) { + return; + } + + final ArrayList bookIDs = new ArrayList(); + for (Long id : seriesIDs) { + cursor = myDatabase.rawQuery( + "SELECT book_id FROM BookSeries WHERE series_id=" + id, null + ); + while (cursor.moveToNext()) { + bookIDs.add(cursor.getLong(0)); + } + cursor.close(); + myDatabase.execSQL("DELETE FROM BookSeries WHERE series_id=" + id); + myDatabase.execSQL("DELETE FROM Series WHERE series_id=" + id); + } + + for (Long id : bookIDs) { + myDatabase.execSQL("DELETE FROM Books WHERE book_id=" + id); + myDatabase.execSQL("DELETE FROM BookAuthor WHERE book_id=" + id); + myDatabase.execSQL("DELETE FROM BookTag WHERE book_id=" + id); + } } } diff --git a/src/org/geometerplus/fbreader/formats/fb2/FB2MetaInfoReader.java b/src/org/geometerplus/fbreader/formats/fb2/FB2MetaInfoReader.java index cbb6631ae..1620ad7c0 100644 --- a/src/org/geometerplus/fbreader/formats/fb2/FB2MetaInfoReader.java +++ b/src/org/geometerplus/fbreader/formats/fb2/FB2MetaInfoReader.java @@ -111,8 +111,16 @@ public class FB2MetaInfoReader extends ZLXMLReaderAdapter { if (name != null) { name.trim(); if (name.length() != 0) { - String index = attributes.getValue("number"); - myBook.setSeriesInfo(name, (index != null) ? Integer.parseInt(index) : 0); + int index = 0; + try { + System.err.println("hello"); + final String sIndex = attributes.getValue("number"); + if (sIndex != null) { + index = Integer.parseInt(sIndex); + } + } catch (NumberFormatException e) { + } + myBook.setSeriesInfo(name, index); } } } diff --git a/src/org/geometerplus/zlibrary/core/xml/ZLXMLParser.java b/src/org/geometerplus/zlibrary/core/xml/ZLXMLParser.java index 2a8a5b5bc..56e80a912 100644 --- a/src/org/geometerplus/zlibrary/core/xml/ZLXMLParser.java +++ b/src/org/geometerplus/zlibrary/core/xml/ZLXMLParser.java @@ -51,8 +51,9 @@ final class ZLXMLParser { private static final byte WAIT_ATTRIBUTE_VALUE = 18; private static final byte SLASH = 19; private static final byte ATTRIBUTE_NAME = 20; - private static final byte ATTRIBUTE_VALUE = 21; - private static final byte ENTITY_REF = 22; + private static final byte ATTRIBUTE_VALUE_QUOT = 21; + private static final byte ATTRIBUTE_VALUE_APOS = 22; + private static final byte ENTITY_REF = 23; private static String convertToString(HashMap strings, ZLMutableString container) { String s = strings.get(container); @@ -452,7 +453,11 @@ mainSwitchLabel: while (true) { switch (buffer[++i]) { case '"': - state = ATTRIBUTE_VALUE; + state = ATTRIBUTE_VALUE_QUOT; + startPosition = i + 1; + break mainSwitchLabel; + case '\'': + state = ATTRIBUTE_VALUE_APOS; startPosition = i + 1; break mainSwitchLabel; } @@ -479,7 +484,7 @@ mainSwitchLabel: } break mainSwitchLabel; default: - state = ATTRIBUTE_VALUE; + state = ATTRIBUTE_NAME; break mainSwitchLabel; } final String aName = convertToString(strings, attributeName); @@ -496,7 +501,7 @@ mainSwitchLabel: attributes.put(aName, convertToString(strings, attributeValue)); } break; - case ATTRIBUTE_VALUE: + case ATTRIBUTE_VALUE_QUOT: while (true) { switch (buffer[++i]) { case '"': @@ -505,7 +510,22 @@ mainSwitchLabel: break mainSwitchLabel; case '&': attributeValue.append(buffer, startPosition, i - startPosition); - savedState = ATTRIBUTE_VALUE; + savedState = ATTRIBUTE_VALUE_QUOT; + state = ENTITY_REF; + startPosition = i + 1; + break mainSwitchLabel; + } + } + case ATTRIBUTE_VALUE_APOS: + while (true) { + switch (buffer[++i]) { + case '\'': + attributeValue.append(buffer, startPosition, i - startPosition); + state = WS_AFTER_ATTRIBUTE_VALUE; + break mainSwitchLabel; + case '&': + attributeValue.append(buffer, startPosition, i - startPosition); + savedState = ATTRIBUTE_VALUE_APOS; state = ENTITY_REF; startPosition = i + 1; break mainSwitchLabel; @@ -521,7 +541,8 @@ mainSwitchLabel: final char[] value = getEntityValue(entityMap, convertToString(strings, entityName)); if ((value != null) && (value.length != 0)) { switch (state) { - case ATTRIBUTE_VALUE: + case ATTRIBUTE_VALUE_QUOT: + case ATTRIBUTE_VALUE_APOS: attributeValue.append(value, 0, value.length); break; case ATTRIBUTE_NAME: @@ -639,7 +660,8 @@ mainSwitchLabel: case ATTRIBUTE_NAME: attributeName.append(buffer, startPosition, count - startPosition); break; - case ATTRIBUTE_VALUE: + case ATTRIBUTE_VALUE_QUOT: + case ATTRIBUTE_VALUE_APOS: attributeValue.append(buffer, startPosition, count - startPosition); break; case ENTITY_REF: