OSDN Git Service

Rework some database logic to try and reduce the overhead with indexing & thumbnail...
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / threads / SyncRunner.java
index 57fb0fb..b565d24 100644 (file)
@@ -29,8 +29,8 @@ import java.util.ArrayList;
 import java.util.Calendar;\r
 import java.util.Date;\r
 import java.util.GregorianCalendar;\r
-import java.util.HashMap;\r
 import java.util.List;\r
+import java.util.TreeSet;\r
 import java.util.Vector;\r
 import java.util.concurrent.LinkedBlockingQueue;\r
 \r
@@ -138,8 +138,9 @@ public class SyncRunner extends QObject implements Runnable {
                String dburl;\r
                String dbpswd;\r
                String dbcpswd;\r
-               private final HashMap<String,String> ignoreTags;\r
-               private final HashMap<String,String> ignoreNotebooks;\r
+               private final TreeSet<String> ignoreTags;\r
+               private final TreeSet<String> ignoreNotebooks;\r
+               private final TreeSet<String> ignoreLinkedNotebooks;\r
        \r
                \r
                \r
@@ -166,12 +167,10 @@ public class SyncRunner extends QObject implements Runnable {
                authRefreshNeeded = false;\r
                keepRunning = true;\r
                idle = true;\r
-               noteStore = null;\r
-               userStore = null;\r
-               authToken = null;\r
                disableUploads = false;\r
-               ignoreTags = new HashMap<String,String>();\r
-               ignoreNotebooks = new HashMap<String,String>();\r
+               ignoreTags = new TreeSet<String>();\r
+               ignoreNotebooks = new TreeSet<String>();\r
+               ignoreLinkedNotebooks = new TreeSet<String>();\r
                \r
 //             setAutoDelete(false);\r
                workQueue=new LinkedBlockingQueue<String>(MAX_QUEUED_WAITING);\r
@@ -180,7 +179,7 @@ public class SyncRunner extends QObject implements Runnable {
        public void run() {\r
                try {\r
                        logger.log(logger.EXTREME, "Starting thread");\r
-                       conn = new DatabaseConnection(logger, dburl, dbuid, dbpswd, dbcpswd);\r
+                       conn = new DatabaseConnection(logger, dburl, dbuid, dbpswd, dbcpswd, 200);\r
                        while(keepRunning) {\r
                                String work = workQueue.take();\r
                                logger.log(logger.EXTREME, "Work found: " +work);\r
@@ -205,7 +204,6 @@ public class SyncRunner extends QObject implements Runnable {
                                                status.message.emit(e.getMessage());\r
                                        }\r
                                }\r
-                               dirtyNoteGuids = null;\r
                                idle=true;\r
                                logger.log(logger.EXTREME, "Signaling refresh finished.  refreshNeeded=" +refreshNeeded);\r
                                syncSignal.finished.emit(refreshNeeded);\r
@@ -266,12 +264,17 @@ public class SyncRunner extends QObject implements Runnable {
                ignoreNotebooks.clear();\r
                List<String> ignore = conn.getSyncTable().getIgnoreRecords("NOTEBOOK");\r
                for (int i=0; i<ignore.size(); i++) \r
-                       ignoreNotebooks.put(ignore.get(i),"");\r
+                       ignoreNotebooks.add(ignore.get(i));\r
+               \r
+               ignore.clear();\r
+               ignore = conn.getSyncTable().getIgnoreRecords("LINKEDNOTEBOOK");\r
+               for (int i=0; i<ignore.size(); i++) \r
+                       ignoreLinkedNotebooks.add(ignore.get(i));\r
                \r
                ignoreTags.clear();\r
                ignore = conn.getSyncTable().getIgnoreRecords("TAG");\r
                for (int i=0; i<ignore.size(); i++) \r
-                       ignoreTags.put(ignore.get(i),"");\r
+                       ignoreTags.add(ignore.get(i));\r
 \r
                // Make sure we are connected & should keep running\r
                if (isConnected && keepRunning) {\r
@@ -412,7 +415,8 @@ public class SyncRunner extends QObject implements Runnable {
                        }\r
                        \r
                        status.message.emit(tr("Cleaning up"));\r
-                       List<String> notes = conn.getNoteTable().expungeIgnoreSynchronizedNotes(conn.getSyncTable().getIgnoreRecords("NOTEBOOK"), conn.getSyncTable().getIgnoreRecords("TAG"));\r
+                       List<String> notes = conn.getNoteTable().expungeIgnoreSynchronizedNotes(conn.getSyncTable().getIgnoreRecords("NOTEBOOK"), \r
+                                       conn.getSyncTable().getIgnoreRecords("TAG"), conn.getSyncTable().getIgnoreRecords("LINKEDNOTEBOOK"));\r
                        if (notes.size() > 0)\r
                                syncSignal.refreshLists.emit();\r
                        \r
@@ -952,6 +956,7 @@ public class SyncRunner extends QObject implements Runnable {
                                error = true;\r
                        }               \r
                }\r
+\r
                logger.log(logger.HIGH, "Entering SyncRunner.syncLocalSavedSearches");\r
        }       \r
 \r
@@ -981,9 +986,9 @@ public class SyncRunner extends QObject implements Runnable {
                                if (!refreshConnection())\r
                                        return;\r
                        \r
-                       chunk = null;\r
                        int sequence = updateSequenceNumber;\r
                        try {\r
+                               conn.beginTransaction();\r
                                logger.log(logger.EXTREME, "Getting chunk from Evernote");\r
                                chunk = noteStore.getSyncChunk(authToken, sequence, chunkSize, fullSync);\r
                        } catch (EDAMUserException e) {\r
@@ -1022,11 +1027,12 @@ public class SyncRunner extends QObject implements Runnable {
 \r
                        \r
                        // Save the chunk sequence number\r
-                       if (!error && chunk.getChunkHighUSN() > 0) {\r
+                       if (!error && chunk.getChunkHighUSN() > 0 && keepRunning) {\r
                                logger.log(logger.EXTREME, "emitting sequence number to main thread");\r
                                updateSequenceNumber = chunk.getChunkHighUSN();\r
                                conn.getSyncTable().setLastSequenceDate(chunk.getCurrentTime());\r
                                conn.getSyncTable().setUpdateSequenceNumber(updateSequenceNumber);\r
+                               conn.commitTransaction();\r
                        }\r
                        \r
                        \r
@@ -1036,8 +1042,8 @@ public class SyncRunner extends QObject implements Runnable {
                                pct = pct/evernoteUpdateCount;\r
                                status.message.emit(tr("Downloading ") +new Long(pct).toString()+tr("% complete."));\r
                        }\r
+                       conn.commitTransaction();\r
                }\r
-\r
                logger.log(logger.HIGH, "Leaving SyncRunner.syncRemoteToLocal");\r
        }\r
        // Sync expunged notes\r
@@ -1228,10 +1234,10 @@ public class SyncRunner extends QObject implements Runnable {
                                        moveConflictingNote(n.getGuid());\r
                        }\r
                        boolean ignoreNote = false;\r
-                       if (ignoreNotebooks.containsKey(n.getNotebookGuid()))\r
+                       if (ignoreNotebooks.contains(n.getNotebookGuid()))\r
                                ignoreNote = true;\r
                        for (int i=0; i<n.getTagGuidsSize(); i++) {\r
-                               if (ignoreTags.containsKey(n.getTagGuids().get(i))) {\r
+                               if (ignoreTags.contains(n.getTagGuids().get(i))) {\r
                                        ignoreNote = true;\r
                                        i=n.getTagGuidsSize();\r
                                }\r
@@ -1356,7 +1362,9 @@ public class SyncRunner extends QObject implements Runnable {
                        newBook.setPublished(false);\r
                        \r
                        conn.getNotebookTable().addNotebook(newBook, false, true);\r
+                       notebookSignal.listChanged.emit();\r
                        notebookGuid = newBook.getGuid();\r
+                       refreshNeeded = true;\r
                }\r
                \r
                // Now that we have a good notebook guid, we need to move the conflicting note\r
@@ -1384,7 +1392,8 @@ public class SyncRunner extends QObject implements Runnable {
                conn.getNoteTable().updateNoteGuid(guid, newGuid);\r
                conn.getNoteTable().updateNoteNotebook(newGuid, notebookGuid, true);\r
                \r
-               \r
+               noteSignal.notebookChanged.emit(newGuid, notebookGuid);\r
+               refreshNeeded = true;\r
                noteSignal.guidChanged.emit(guid,newGuid);\r
        }\r
        \r
@@ -1782,19 +1791,20 @@ public class SyncRunner extends QObject implements Runnable {
        logger.log(logger.MEDIUM, "Authenticating Shared Notebooks");\r
        status.message.emit(tr("Synchronizing shared notebooks."));\r
        List<LinkedNotebook> books = conn.getLinkedNotebookTable().getAll();\r
+\r
        for (int i=0; i<books.size(); i++) {\r
                try {\r
-                       long lastSyncDate = conn.getLinkedNotebookTable().getLastSequenceDate(books.get(i).getGuid());\r
-                       int lastSequenceNumber = conn.getLinkedNotebookTable().getLastSequenceNumber(books.get(i).getGuid());\r
-                       linkedAuthResult = noteStore.authenticateToSharedNotebook(books.get(i).getShareKey(), authToken);\r
-                       SyncState linkedSyncState = \r
-                               noteStore.getLinkedNotebookSyncState(linkedAuthResult.getAuthenticationToken(), books.get(i));\r
-                       if (linkedSyncState.getUpdateCount() > lastSequenceNumber) {\r
-                               if (lastSyncDate < linkedSyncState.getFullSyncBefore()) {\r
-                                       lastSequenceNumber = 0;\r
-                               }\r
+                               long lastSyncDate = conn.getLinkedNotebookTable().getLastSequenceDate(books.get(i).getGuid());\r
+                               int lastSequenceNumber = conn.getLinkedNotebookTable().getLastSequenceNumber(books.get(i).getGuid());\r
+                               linkedAuthResult = noteStore.authenticateToSharedNotebook(books.get(i).getShareKey(), authToken);\r
+                               SyncState linkedSyncState = \r
+                                       noteStore.getLinkedNotebookSyncState(linkedAuthResult.getAuthenticationToken(), books.get(i));\r
+                               if (linkedSyncState.getUpdateCount() > lastSequenceNumber) {\r
+                                       if (lastSyncDate < linkedSyncState.getFullSyncBefore()) {\r
+                                               lastSequenceNumber = 0;\r
+                                       } \r
                                        syncLinkedNotebook(books.get(i), lastSequenceNumber, linkedSyncState.getUpdateCount());\r
-                       }\r
+                               }\r
                        \r
                        // Synchronize local changes\r
                        syncLocalLinkedNoteChanges(books.get(i));\r
@@ -1827,6 +1837,14 @@ public class SyncRunner extends QObject implements Runnable {
     //* Linked notebook contents (from someone else's account)\r
     //*************************************************************\r
        private void syncLinkedNotebook(LinkedNotebook book, int usn, int highSequence) {\r
+               \r
+               List<Note> dirtyNotes = conn.getNoteTable().getDirtyLinkedNotes();\r
+               if (dirtyNoteGuids == null) \r
+                       dirtyNoteGuids = new Vector<String>();\r
+\r
+               for (int i=0; i<dirtyNotes.size() && keepRunning; i++) {\r
+                       dirtyNoteGuids.add(dirtyNotes.get(i).getGuid());\r
+               }\r
                boolean fullSync = false;\r
                if (usn == 0)\r
                        fullSync = true;\r
@@ -1834,15 +1852,14 @@ public class SyncRunner extends QObject implements Runnable {
                        try {\r
                                SyncChunk chunk = \r
                                        noteStore.getLinkedNotebookSyncChunk(authToken, book, usn, 10, fullSync);\r
-//                                     noteStore.getLinkedNotebookSyncChunk(linkedAuthResult.getAuthenticationToken(), book, usn, 10, fullSync);\r
 \r
-                               syncRemoteNotes(chunk.getNotes(), fullSync, linkedAuthResult.getAuthenticationToken());\r
+                               if (!ignoreLinkedNotebooks.contains(book.getGuid()))\r
+                                       syncRemoteNotes(chunk.getNotes(), fullSync, linkedAuthResult.getAuthenticationToken());\r
                                findNewLinkedTags(chunk.getNotes(), linkedAuthResult.getAuthenticationToken());\r
                                for (int i=0; i<chunk.getResourcesSize(); i++) {\r
                                        syncRemoteResource(chunk.getResources().get(i), linkedAuthResult.getAuthenticationToken());\r
                                }\r
                                syncRemoteLinkedNotebooks(chunk.getNotebooks(), false, book);\r
-//                             String notebookGuid = conn.getLinkedNotebookTable().getNotebookGuid(book.getGuid());\r
                                SharedNotebook s = noteStore.getSharedNotebookByAuth(linkedAuthResult.getAuthenticationToken());\r
                                syncLinkedTags(chunk.getTags(), s.getNotebookGuid());\r
                                \r