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
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
StringBuilder updated = new StringBuilder(simple.format(n.getUpdated())); \r
StringBuilder deleted = new StringBuilder(simple.format(n.getDeleted()));\r
\r
- EnmlConverter enml = new EnmlConverter(logger);\r
+ \r
\r
query.bindValue(":guid", n.getGuid());\r
query.bindValue(":updateSequenceNumber", n.getUpdateSequenceNum());\r
query.bindValue(":title", n.getTitle());\r
- query.bindValue(":content", enml.fixEnXMLCrap(enml.fixEnMediaCrap(n.getContent())));\r
+ if (isDirty) {\r
+ EnmlConverter enml = new EnmlConverter(logger);\r
+ query.bindValue(":content", enml.fixEnXMLCrap(enml.fixEnMediaCrap(n.getContent())));\r
+ }\r
+ else\r
+ query.bindValue(":content", n.getContent());\r
query.bindValue(":contentHash", n.getContentHash());\r
query.bindValue(":contentLength", n.getContentLength());\r
query.bindValue(":created", created.toString());\r
for (int i=0; i<n.getTagGuids().size(); i++) \r
noteTagsTable.saveNoteTag(n.getGuid(), n.getTagGuids().get(i));\r
}\r
+ \r
logger.log(logger.EXTREME, "Leaving addNote");\r
} \r
// Setup queries for get to save time later\r
private void prepareQueries() {\r
+ if (getQueryWithContent != null)\r
+ return;\r
getQueryWithContent = new NSqlQuery(db.getConnection());\r
getQueryWithoutContent = new NSqlQuery(db.getConnection());\r
getAllQueryWithoutContent = new NSqlQuery(db.getConnection());\r
query.next();\r
return query.valueString(0);\r
}\r
+ // Get a note's content in blob format for index.\r
+ public String getNoteContentNoUTFConversion(String guid) {\r
+ NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ query.prepare("Select content from note where guid=:guid");\r
+ query.bindValue(":guid", guid);\r
+ query.exec(); \r
+ query.next();\r
+ return query.valueString(0);\r
+ }\r
// Get a note by Guid\r
public Note getNote(String noteGuid, boolean loadContent, boolean loadResources, boolean loadRecognition, boolean loadBinary, boolean loadTags) {\r
if (noteGuid == null)\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
+ if (Global.enableHTMLEntitiesFix)\r
+ unicode = codec.fromUnicode(StringEscapeUtils.unescapeXml(query.valueString(16).toString())).toString();\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
// 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
public void updateNoteGuid(String oldGuid, String newGuid) {\r
boolean check;\r
NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ NSqlQuery resQuery = new NSqlQuery(db.getResourceConnection());\r
+ NSqlQuery wordQuery = new NSqlQuery(db.getIndexConnection());\r
query.prepare("Update Note set guid=:newGuid where guid=:oldGuid");\r
\r
query.bindValue(":newGuid", newGuid);\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
+ expungeNote(n.getGuid(), true, false);\r
addNote(n, false);\r
if (titleColor != -1)\r
setNoteTitleColor(n.getGuid(), titleColor);\r
boolean check; \r
NSqlQuery query = new NSqlQuery(db.getConnection());\r
\r
- check = query.exec("Select guid from Note where isDirty = true and isExpunged = false and notebookGuid not in (select guid from notebook where local = true)");\r
+ check = query.exec("Select guid from Note where isDirty = true and isExpunged = false and notebookGuid not in (select guid from notebook where local = true or linked = true)");\r
+ if (!check) \r
+ logger.log(logger.EXTREME, "Note SQL retrieve has failed: " +query.lastError().toString());\r
+ \r
+ // Get a list of the notes\r
+ while (query.next()) {\r
+ guid = new String();\r
+ guid = query.valueString(0);\r
+ index.add(guid); \r
+ } \r
+ \r
+ // Start getting notes\r
+ for (int i=0; i<index.size(); i++) {\r
+ tempNote = getNote(index.get(i), true,true,false,true,true);\r
+ notes.add(tempNote);\r
+ }\r
+ return notes; \r
+ }\r
+ // Get a list of notes that need to be updated\r
+ public List <Note> getDirtyLinkedNotes() {\r
+ String guid;\r
+ Note tempNote;\r
+ List<Note> notes = new ArrayList<Note>();\r
+ List<String> index = new ArrayList<String>();\r
+ \r
+ boolean check; \r
+ NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ \r
+ check = query.exec("Select guid from Note where isDirty = true and isExpunged = false and notebookGuid in (select guid from notebook where linked = true)");\r
if (!check) \r
logger.log(logger.EXTREME, "Note SQL retrieve has failed: " +query.lastError().toString());\r
\r
return notes; \r
}\r
// Get a list of notes that need to be updated\r
+ public List <Note> getDirtyLinked(String notebookGuid) {\r
+ String guid;\r
+ Note tempNote;\r
+ List<Note> notes = new ArrayList<Note>();\r
+ List<String> index = new ArrayList<String>();\r
+ \r
+ boolean check; \r
+ NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ \r
+ query.prepare("Select guid from Note where isDirty = true and isExpunged = false and notebookGuid=:notebookGuid");\r
+ query.bindValue(":notebookGuid", notebookGuid);\r
+ check = query.exec();\r
+ if (!check) \r
+ logger.log(logger.EXTREME, "Note SQL retrieve has failed getting dirty linked notes: " +query.lastError().toString());\r
+ \r
+ // Get a list of the notes\r
+ while (query.next()) {\r
+ guid = new String();\r
+ guid = query.valueString(0);\r
+ index.add(guid); \r
+ } \r
+ \r
+ // Start getting notes\r
+ for (int i=0; i<index.size(); i++) {\r
+ tempNote = getNote(index.get(i), true,true,false,true,true);\r
+ notes.add(tempNote);\r
+ }\r
+ return notes; \r
+ }\r
+ // Get a list of notes that need to be updated\r
+ public List <String> getNotesByNotebook(String notebookGuid) {\r
+ List<String> notes = new ArrayList<String>();\r
+ List<String> index = new ArrayList<String>();\r
+ \r
+ boolean check; \r
+ NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ \r
+ check = query.prepare("Select guid from Note where notebookguid=:notebookguid");\r
+ if (!check) \r
+ logger.log(logger.EXTREME, "Note SQL retrieve has failed: " +query.lastError().toString());\r
+ query.bindValue(":notebookguid", notebookGuid);\r
+ query. exec();\r
+ \r
+ // Get a list of the notes\r
+ while (query.next()) {\r
+ index.add(query.valueString(0)); \r
+ } \r
+ \r
+ return notes; \r
+ }\r
+ // Get a list of notes that need to be updated\r
public boolean isNoteDirty(String guid) {\r
\r
boolean check; \r
boolean check; \r
NSqlQuery query = new NSqlQuery(db.getConnection());\r
\r
- check = query.exec("Select guid from Note where isDirty = true");\r
+ check = query.exec("Select guid from Note where isDirty=true");\r
if (!check) \r
logger.log(logger.EXTREME, "Note SQL retrieve has failed: " +query.lastError().toString());\r
\r
// Count unsynchronized notes\r
public int getDirtyCount() {\r
NSqlQuery query = new NSqlQuery(db.getConnection());\r
- query.exec("select count(*) from note where isDirty=true and isExpunged = false");\r
+ query.exec("select count(guid) from note where isDirty=true and isExpunged = false");\r
query.next(); \r
int returnValue = new Integer(query.valueString(0));\r
return returnValue;\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 note.replace("<div/>", "<div> </div>");\r
}\r
\r
+ // Expunge notes that we don't want to synchronize\r
+ public List<String> expungeIgnoreSynchronizedNotes(List<String> notebooks, List<String>tags, List<String> linked) {\r
+ \r
+ List<String> noteGuids = new ArrayList<String>();\r
+ for (int i=0; i<notebooks.size(); i++) {\r
+ List<String> notes = findNotesByNotebook(notebooks.get(i));\r
+ for (int j=0; j<notes.size(); j++) {\r
+ if (!isNoteDirty(notes.get(j))) {\r
+ expungeNote(notes.get(j), true, false);\r
+ noteGuids.add(notes.get(j));\r
+ }\r
+ }\r
+ }\r
+ \r
+ for (int i=0; i<tags.size(); i++) {\r
+ List<String> notes = findNotesByTag(tags.get(i));\r
+ for (int j=0; j<notes.size(); j++) {\r
+ if (!isNoteDirty(notes.get(j))) {\r
+ expungeNote(notes.get(j), true, false);\r
+ noteGuids.add(notes.get(j));\r
+ }\r
+ }\r
+ }\r
+ \r
+ for (int i=0; i<linked.size(); i++) {\r
+ String notebookGuid = db.getLinkedNotebookTable().getNotebookGuid(linked.get(i));\r
+ if (notebookGuid != null && !notebookGuid.trim().equals("")) {\r
+ List<Tag> linkedTags = db.getTagTable().getTagsForNotebook(notebookGuid);\r
+ for (int j=0; j<linkedTags.size(); j++)\r
+ db.getTagTable().expungeTag(linkedTags.get(j).getGuid(), false);\r
+ \r
+ List<String> notes = findNotesByNotebook(notebookGuid);\r
+ for (int j=0; j<notes.size(); j++) {\r
+ if (!isNoteDirty(notes.get(j))) {\r
+ expungeNote(notes.get(j), true, false);\r
+ noteGuids.add(notes.get(j));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return noteGuids;\r
+ }\r
+ \r
+ // Find a note by its notebook\r
+ // Expunge notes that we don't want to synchronize\r
+ public List<String> findNotesByNotebook(String notebook) {\r
+ List<String> values = new ArrayList<String>();\r
+ NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ query.prepare("Select guid from note where notebookguid=:notebook");\r
+\r
+ query.bindValue(":notebook", notebook);\r
+ query.exec();\r
+ while (query.next()) {\r
+ values.add(query.valueString(0));\r
+ }\r
+ return values;\r
+ }\r
+ \r
+ public List<String> findNotesByTag(String tag) {\r
+ List<String> values = new ArrayList<String>();\r
+ NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ query.prepare("Select distinct noteguid from notetags where tagguid=:tag");\r
+\r
+ query.bindValue(":tag", tag);\r
+ query.exec();\r
+ while (query.next()) {\r
+ values.add(query.valueString(0));\r
+ }\r
+ return values;\r
+ }\r
+ \r
\r
\r
//********************************************************************************\r
logger.log(logger.MEDIUM, "Note indexNeeded update failed.");\r
logger.log(logger.MEDIUM, query.lastError());\r
} \r
+ List<Resource> r = noteResourceTable.getNoteResources(guid, false);\r
+ for (int i=0; r!= null && i<r.size(); i++) {\r
+ noteResourceTable.setIndexNeeded(r.get(i).getGuid(), true);\r
+ }\r
}\r
// Set all notes to be reindexed\r
public void reindexAllNotes() {\r
\r
return values; \r
}\r
+ // Get a count of thumbnails needed\r
+ public int getThumbnailNeededCount() {\r
+ \r
+ boolean check;\r
+ NSqlQuery query = new NSqlQuery(db.getConnection());\r
+ \r
+ check = query.prepare("select count(guid) from note where thumbnailneeded=true and isExpunged=false and DATEDIFF('MINUTE',updated,CURRENT_TIMESTAMP)>5 limit 2");\r
+ check = query.exec();\r
+ if (!check) \r
+ logger.log(logger.EXTREME, "Note SQL findThumbnailNeededCount query failed: " +query.lastError().toString());\r
+ \r
+ if (query.next()) {\r
+ return query.valueInteger(0); \r
+ }\r
+\r
+ return 0; \r
+ }\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