/*\r
- * This file is part of NeverNote \r
+ * This file is part of NixNote \r
* Copyright 2009 Randy Baumgarte\r
* \r
* This file may be licensed under the terms of of the\r
import java.util.HashMap;\r
import java.util.List;\r
\r
+import org.apache.commons.lang.StringEscapeUtils;\r
+\r
import com.evernote.edam.type.Note;\r
import com.evernote.edam.type.NoteAttributes;\r
import com.evernote.edam.type.Resource;\r
noteTagsTable = new NoteTagsTable(logger, db);\r
getQueryWithContent = null;\r
getQueryWithoutContent = null;\r
- \r
}\r
// Create the table\r
public void createTable() {\r
- getQueryWithContent = new NSqlQuery(db.getConnection());\r
- getQueryWithoutContent = new NSqlQuery(db.getConnection());\r
+ //getQueryWithContent = new NSqlQuery(db.getConnection());\r
+ //getQueryWithoutContent = new NSqlQuery(db.getConnection());\r
NSqlQuery query = new NSqlQuery(db.getConnection());\r
logger.log(logger.HIGH, "Creating table Note...");\r
if (!query.exec("Create table Note (guid varchar primary key, " +\r
if (!query.exec("CREATE INDEX unsynchronized_notes on note (isDirty desc, guid);"))\r
logger.log(logger.HIGH, "note unsynchronized_notes index creation FAILED!!!"); \r
noteTagsTable.createTable();\r
- noteResourceTable.createTable(); \r
+// noteResourceTable.createTable(); \r
}\r
// Drop the table\r
public void dropTable() {\r
if (isDirty) {\r
EnmlConverter enml = new EnmlConverter(logger);\r
query.bindValue(":content", enml.fixEnXMLCrap(enml.fixEnMediaCrap(n.getContent())));\r
- enml = null;\r
}\r
else\r
query.bindValue(":content", n.getContent());\r
for (int i=0; i<n.getTagGuids().size(); i++) \r
noteTagsTable.saveNoteTag(n.getGuid(), n.getTagGuids().get(i));\r
}\r
- created = null;\r
- updated = null;\r
- deleted = null;\r
- query = null;\r
- simple = null;\r
- \r
logger.log(logger.EXTREME, "Leaving addNote");\r
} \r
// Setup queries for get to save time later\r
private void prepareQueries() {\r
- getQueryWithContent = new NSqlQuery(db.getConnection());\r
- getQueryWithoutContent = new NSqlQuery(db.getConnection());\r
- getAllQueryWithoutContent = new NSqlQuery(db.getConnection());\r
- \r
- if (!getQueryWithContent.prepare("Select "\r
- +"guid, updateSequenceNumber, title, "\r
- +"created, updated, deleted, active, notebookGuid, "\r
- +"attributeSubjectDate, attributeLatitude, attributeLongitude, attributeAltitude, "\r
- +"attributeAuthor, attributeSource, attributeSourceUrl, attributeSourceApplication, "\r
- +"content, contentHash, contentLength"\r
- +" from Note where guid=:guid and isExpunged=false")) {\r
- logger.log(logger.EXTREME, "Note SQL select prepare with content has failed.");\r
- logger.log(logger.MEDIUM, getQueryWithContent.lastError());\r
+ if (getQueryWithContent == null) {\r
+ getQueryWithContent = new NSqlQuery(db.getConnection());\r
+ if (!getQueryWithContent.prepare("Select "\r
+ +"guid, updateSequenceNumber, title, "\r
+ +"created, updated, deleted, active, notebookGuid, "\r
+ +"attributeSubjectDate, attributeLatitude, attributeLongitude, attributeAltitude, "\r
+ +"attributeAuthor, attributeSource, attributeSourceUrl, attributeSourceApplication, "\r
+ +"content, contentHash, contentLength"\r
+ +" from Note where guid=:guid and isExpunged=false")) {\r
+ logger.log(logger.EXTREME, "Note SQL select prepare with content has failed.");\r
+ logger.log(logger.MEDIUM, getQueryWithContent.lastError());\r
+ }\r
}\r
\r
- if (!getQueryWithoutContent.prepare("Select "\r
- +"guid, updateSequenceNumber, title, "\r
- +"created, updated, deleted, active, notebookGuid, "\r
- +"attributeSubjectDate, attributeLatitude, attributeLongitude, attributeAltitude, "\r
- +"attributeAuthor, attributeSource, attributeSourceUrl, attributeSourceApplication "\r
- +" from Note where guid=:guid and isExpunged=false")) {\r
- logger.log(logger.EXTREME, "Note SQL select prepare without content has failed.");\r
- logger.log(logger.MEDIUM, getQueryWithoutContent.lastError());\r
+ if (getQueryWithoutContent == null) {\r
+ getQueryWithoutContent = new NSqlQuery(db.getConnection());\r
+ if (!getQueryWithoutContent.prepare("Select "\r
+ +"guid, updateSequenceNumber, title, "\r
+ +"created, updated, deleted, active, notebookGuid, "\r
+ +"attributeSubjectDate, attributeLatitude, attributeLongitude, attributeAltitude, "\r
+ +"attributeAuthor, attributeSource, attributeSourceUrl, attributeSourceApplication "\r
+ +" from Note where guid=:guid and isExpunged=false")) {\r
+ logger.log(logger.EXTREME, "Note SQL select prepare without content has failed.");\r
+ logger.log(logger.MEDIUM, getQueryWithoutContent.lastError());\r
+ }\r
}\r
- if (!getAllQueryWithoutContent.prepare("Select "\r
+ \r
+ if (getAllQueryWithoutContent == null) {\r
+ getAllQueryWithoutContent = new NSqlQuery(db.getConnection());\r
+ \r
+ if (!getAllQueryWithoutContent.prepare("Select "\r
+"guid, updateSequenceNumber, title, "\r
+"created, updated, deleted, active, notebookGuid, "\r
+"attributeSubjectDate, attributeLatitude, attributeLongitude, attributeAltitude, "\r
+"attributeAuthor, attributeSource, attributeSourceUrl, attributeSourceApplication "\r
+" from Note where isExpunged = false")) {\r
- logger.log(logger.EXTREME, "Note SQL select prepare without content has failed.");\r
+ logger.log(logger.EXTREME, "Note SQL select prepare without content has failed.");\r
logger.log(logger.MEDIUM, getQueryWithoutContent.lastError());\r
+ }\r
}\r
}\r
\r
DateFormat indfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
// indfm = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy");\r
\r
- \r
Note n = new Note();\r
NoteAttributes na = new NoteAttributes();\r
n.setAttributes(na);\r
if (loadTags) {\r
n.setTagGuids(noteTagsTable.getNoteTags(n.getGuid()));\r
List<String> tagNames = new ArrayList<String>();\r
- TagTable tagTable = new TagTable(logger, db);\r
+ TagTable tagTable = db.getTagTable();\r
for (int i=0; i<n.getTagGuids().size(); i++) {\r
String currentGuid = n.getTagGuids().get(i);\r
Tag tag = tagTable.getTag(currentGuid);\r
}\r
\r
if (loadContent) {\r
- \r
QTextCodec codec = QTextCodec.codecForLocale();\r
codec = QTextCodec.codecForName("UTF-8");\r
String unicode = codec.fromUnicode(query.valueString(16)).toString();\r
- n.setContent(unicode);\r
+\r
+ // This is a hack. Basically I need to convert HTML Entities to "normal" text, but if I\r
+ // convert the < character to < it will mess up the XML parsing. So, to get around this\r
+ // I am "bit stuffing" the < to &< so StringEscapeUtils doesn't unescape it. After\r
+ // I'm done I convert it back.\r
+ StringBuffer buffer = new StringBuffer(unicode);\r
+ if (Global.enableHTMLEntitiesFix && unicode.indexOf("&#") > 0) {\r
+ unicode = query.valueString(16);\r
+ //System.out.println(unicode);\r
+ //unicode = unicode.replace("<", "&_lt;");\r
+ //unicode = codec.fromUnicode(StringEscapeUtils.unescapeHtml(unicode)).toString();\r
+ //unicode = unicode.replace("&_lt;", "<");\r
+ //System.out.println("************************");\r
+ int j=1;\r
+ for (int i=buffer.indexOf("&#"); i != -1 && buffer.indexOf("&#", i)>0; i=buffer.indexOf("&#",i+1)) {\r
+ j = buffer.indexOf(";",i)+1;\r
+ if (i<j) {\r
+ String entity = buffer.substring(i,j).toString();\r
+ int len = entity.length()-1;\r
+ String tempEntity = entity.substring(2, len);\r
+ try {\r
+ Integer.parseInt(tempEntity);\r
+ entity = codec.fromUnicode(StringEscapeUtils.unescapeHtml(entity)).toString();\r
+ buffer.delete(i, j);\r
+ buffer.insert(i, entity);\r
+ } catch (Exception e){ }\r
+ \r
+ }\r
+ } \r
+ } \r
+ \r
+ n.setContent(unicode);\r
// n.setContent(query.valueString(16).toString());\r
\r
String contentHash = query.valueString(17);\r
\r
\r
NSqlQuery note = new NSqlQuery(db.getConnection());\r
- NSqlQuery resources = new NSqlQuery(db.getConnection());\r
+ NSqlQuery resources = new NSqlQuery(db.getResourceConnection());\r
NSqlQuery tags = new NSqlQuery(db.getConnection());\r
- NSqlQuery words = new NSqlQuery(db.getConnection());\r
+ NSqlQuery words = new NSqlQuery(db.getIndexConnection());\r
\r
note.prepare("Delete from Note where guid=:guid");\r
resources.prepare("Delete from NoteResources where noteGuid=:guid");\r
logger.log(logger.MEDIUM, "Note tags delete failed.");\r
logger.log(logger.MEDIUM, tags.lastError());\r
}\r
+\r
if (!words.exec()) {\r
logger.log(logger.MEDIUM, "Word delete failed.");\r
logger.log(logger.MEDIUM, words.lastError());\r
}\r
\r
}\r
+ // Purge a bunch of notes based upon the notebook\r
+ public void expungeNotesByNotebook(String notebookGuid, boolean permanentExpunge, boolean needsSync) {\r
+ List<String> notes = getNotesByNotebook(notebookGuid);\r
+ for (int i=0; i<notes.size(); i++) {\r
+ expungeNote(notes.get(i), permanentExpunge, needsSync);\r
+ }\r
+ }\r
+\r
// Purge a note (actually delete it instead of just marking it deleted)\r
public void hideExpungedNote(String guid, boolean needsSync) {\r
NSqlQuery note = new NSqlQuery(db.getConnection());\r
- NSqlQuery resources = new NSqlQuery(db.getConnection());\r
+ NSqlQuery resources = new NSqlQuery(db.getResourceConnection());\r
NSqlQuery tags = new NSqlQuery(db.getConnection());\r
- NSqlQuery words = new NSqlQuery(db.getConnection());\r
+ NSqlQuery words = new NSqlQuery(db.getIndexConnection());\r
\r
note.prepare("Update Note set isExpunged=true where guid=:guid");\r
resources.prepare("Delete from NoteResources where noteGuid=:guid");\r
tags.prepare("Delete from NoteTags where noteGuid=:guid");\r
- words.prepare("Delete from words where guid=:guid");\r
+// words.prepare("Delete from words where guid=:guid");\r
\r
note.bindValue(":guid", guid);\r
resources.bindValue(":guid", guid);\r
logger.log(logger.MEDIUM, "Note tags delete failed.");\r
logger.log(logger.MEDIUM, tags.lastError());\r
}\r
- if (!words.exec()) {\r
- logger.log(logger.MEDIUM, "Word delete failed.");\r
- logger.log(logger.MEDIUM, words.lastError());\r
- }\r
+// System.out.println("Hiding Note: Deleting words");\r
+// if (!words.exec()) {\r
+// logger.log(logger.MEDIUM, "Word delete failed.");\r
+// logger.log(logger.MEDIUM, words.lastError());\r
+// }\r
if (needsSync) {\r
DeletedTable deletedTable = new DeletedTable(logger, db);\r
deletedTable.addDeletedItem(guid, "Note");\r
public void expungeAllDeletedNotes() {\r
NSqlQuery query = new NSqlQuery(db.getConnection());\r
query.exec("select guid, updateSequenceNumber from note where active = false");\r
+ List<String> guids = new ArrayList<String>();\r
+ List<Integer> usns = new ArrayList<Integer>();\r
while (query.next()) {\r
- String guid = query.valueString(0);\r
+ guids.add(query.valueString(0));\r
Integer usn = new Integer(query.valueString(1));\r
+ usns.add(usn);\r
+ }\r
+ \r
+ for (int i=0; i<guids.size(); i++) {\r
+ Integer usn = usns.get(i);\r
+ String guid = guids.get(i);\r
if (usn == 0)\r
expungeNote(guid, true, false);\r
else\r
public void updateNoteGuid(String oldGuid, String newGuid) {\r
boolean check;\r
NSqlQuery query = new NSqlQuery(db.getConnection());\r
- query.prepare("Update Note set guid=:newGuid where guid=:oldGuid");\r
+ NSqlQuery resQuery = new NSqlQuery(db.getResourceConnection());\r
+ NSqlQuery wordQuery = new NSqlQuery(db.getIndexConnection());\r
+ query.prepare("Update Note set guid=:newGuid, original_guid=:original_guid where guid=:oldGuid");\r
\r
+ query.bindValue(":original_guid", oldGuid);\r
query.bindValue(":newGuid", newGuid);\r
query.bindValue(":oldGuid", oldGuid);\r
\r
logger.log(logger.MEDIUM, query.lastError());\r
}\r
\r
- query.prepare("Update words set guid=:newGuid where guid=:oldGuid");\r
- query.bindValue(":newGuid", newGuid);\r
- query.bindValue(":oldGuid", oldGuid);\r
- query.exec();\r
+ wordQuery.prepare("Update words set guid=:newGuid where guid=:oldGuid");\r
+ wordQuery.bindValue(":newGuid", newGuid);\r
+ wordQuery.bindValue(":oldGuid", oldGuid);\r
+ wordQuery.exec();\r
if (!check) {\r
logger.log(logger.MEDIUM, "Note guid update failed for Words.");\r
- logger.log(logger.MEDIUM, query.lastError());\r
+ logger.log(logger.MEDIUM, wordQuery.lastError());\r
}\r
- query.prepare("Update noteresources set noteguid=:newGuid where noteguid=:oldGuid");\r
- query.bindValue(":newGuid", newGuid);\r
- query.bindValue(":oldGuid", oldGuid);\r
- query.exec();\r
+ resQuery.prepare("Update noteresources set noteguid=:newGuid where noteguid=:oldGuid");\r
+ resQuery.bindValue(":newGuid", newGuid);\r
+ resQuery.bindValue(":oldGuid", oldGuid);\r
+ resQuery.exec();\r
if (!check) {\r
logger.log(logger.MEDIUM, "Note guid update failed for noteresources.");\r
- logger.log(logger.MEDIUM, query.lastError());\r
+ logger.log(logger.MEDIUM, resQuery.lastError());\r
}\r
}\r
// Update a note\r
public void updateNote(Note n, boolean isNew) {\r
- boolean isExpunged = isNoteExpunged(n.getGuid());\r
int titleColor = getNoteTitleColor(n.getGuid());\r
- expungeNote(n.getGuid(), !isExpunged, false);\r
+ String originalGuid = findAlternateGuid(n.getGuid());\r
+ expungeNote(n.getGuid(), true, false);\r
addNote(n, false);\r
if (titleColor != -1)\r
setNoteTitleColor(n.getGuid(), titleColor);\r
+ if (originalGuid != null) {\r
+ updateNoteGuid(n.getGuid(), originalGuid);\r
+ updateNoteGuid(originalGuid, n.getGuid());\r
+ }\r
}\r
// Does a note exist?\r
public boolean exists(String guid) {\r
public List<Note> getAllNotes() {\r
List<Note> notes = new ArrayList<Note>();\r
prepareQueries();\r
- boolean check; \r
+ boolean check; \r
+ if (getAllQueryWithoutContent == null) \r
+ prepareQueries();\r
NSqlQuery query = getAllQueryWithoutContent;\r
check = query.exec();\r
if (!check)\r
\r
// Update a note resource by the hash\r
public void updateNoteResourceGuidbyHash(String noteGuid, String resGuid, String hash) {\r
- NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ NSqlQuery query = new NSqlQuery(db.getResourceConnection());\r
/* query.prepare("Select guid from NoteResources where noteGuid=:noteGuid and datahash=:hex");\r
query.bindValue(":noteGuid", noteGuid);\r
query.bindValue(":hex", hash);\r
return 0; \r
}\r
\r
+ //***********************************************************************************\r
+ public String findAlternateGuid(String guid) {\r
+ boolean check;\r
+ NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ \r
+ check = query.prepare("select guid from note where original_guid=:guid");\r
+ query.bindValue(":guid", guid);\r
+ check = query.exec();\r
+ if (!check) \r
+ logger.log(logger.EXTREME, "Note SQL findAlternateguid query failed: " +query.lastError().toString());\r
+ \r
+ if (query.next()) {\r
+ return query.valueString(0); \r
+ }\r
+\r
+ return null; \r
+ }\r
+ \r
+ //* Check if a note guid exists\r
+ public boolean guidExists(String guid) {\r
+ boolean check;\r
+ NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ \r
+ check = query.prepare("select guid from note where guid=:guid");\r
+ query.bindValue(":guid", guid);\r
+ check = query.exec();\r
+ if (!check) \r
+ logger.log(logger.EXTREME, "Note SQL guidExists query failed: " +query.lastError().toString());\r
+ \r
+ if (query.next()) {\r
+ return true; \r
+ }\r
+\r
+ return false; \r
+ }\r
\r
// Update a note content's hash. This happens if a resource is edited outside of NN\r
public void updateResourceContentHash(String guid, String oldHash, String newHash) {\r
position = n.getContent().indexOf("<en-media", position+1);\r
}\r
}\r
+\r
} \r
+\r
+\r
+\r
+\r