OSDN Git Service

There are multiple changes with this commit.
authorRandy Baumgarte <randy@fbn.cx>
Fri, 23 Jul 2010 16:49:41 +0000 (12:49 -0400)
committerRandy Baumgarte <randy@fbn.cx>
Fri, 23 Jul 2010 16:49:41 +0000 (12:49 -0400)
- Added the ability to do basic GeoTag handling.  Tags can be added, removed, or launched in a separate browser to bring up Google Earth.

- Removed the DBRunner thread and changed all existing threads to have dedicated connections to the database.  This allows for the removal of a lot of the classes underneath cx.fbn.nevernote.sql.* since they are no longer needed.

57 files changed:
src/cx/fbn/nevernote/Global.java
src/cx/fbn/nevernote/NeverNote.java
src/cx/fbn/nevernote/dialog/GeoDialog.java [new file with mode: 0644]
src/cx/fbn/nevernote/dialog/WatchFolder.java
src/cx/fbn/nevernote/dialog/WatchFolderAdd.java
src/cx/fbn/nevernote/filters/EnSearch.java
src/cx/fbn/nevernote/gui/BrowserWindow.java
src/cx/fbn/nevernote/icons/globe.png [new file with mode: 0644]
src/cx/fbn/nevernote/icons/splash_logo.png
src/cx/fbn/nevernote/sql/DatabaseConnection.java
src/cx/fbn/nevernote/sql/DeletedItemRecord.java [moved from src/cx/fbn/nevernote/sql/runners/DeletedItemRecord.java with 92% similarity]
src/cx/fbn/nevernote/sql/DeletedTable.java
src/cx/fbn/nevernote/sql/InvalidXMLTable.java
src/cx/fbn/nevernote/sql/NoteResourceTable.java
src/cx/fbn/nevernote/sql/NoteTable.java
src/cx/fbn/nevernote/sql/NoteTagsRecord.java [moved from src/cx/fbn/nevernote/sql/runners/NoteTagsRecord.java with 92% similarity]
src/cx/fbn/nevernote/sql/NoteTagsTable.java
src/cx/fbn/nevernote/sql/NotebookTable.java
src/cx/fbn/nevernote/sql/REnSearch.java [moved from src/cx/fbn/nevernote/sql/runners/REnSearch.java with 95% similarity]
src/cx/fbn/nevernote/sql/SavedSearchTable.java
src/cx/fbn/nevernote/sql/SyncTable.java
src/cx/fbn/nevernote/sql/TagTable.java
src/cx/fbn/nevernote/sql/WatchFolderRecord.java [moved from src/cx/fbn/nevernote/sql/runners/WatchFolderRecord.java with 92% similarity]
src/cx/fbn/nevernote/sql/WatchFolderTable.java
src/cx/fbn/nevernote/sql/WordsTable.java
src/cx/fbn/nevernote/sql/requests/DBRunnerRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/DatabaseRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/DeletedItemRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/EnSearchRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/InvalidXMLRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/NoteRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/NoteTagsRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/NotebookRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/ResourceRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/SavedSearchRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/SyncRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/TagRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/WatchFolderRequest.java [deleted file]
src/cx/fbn/nevernote/sql/requests/WordRequest.java [deleted file]
src/cx/fbn/nevernote/sql/runners/RDatabaseConnection.java [deleted file]
src/cx/fbn/nevernote/sql/runners/RDeletedTable.java [deleted file]
src/cx/fbn/nevernote/sql/runners/RInvalidXMLTable.java [deleted file]
src/cx/fbn/nevernote/sql/runners/RNoteResourceTable.java [deleted file]
src/cx/fbn/nevernote/sql/runners/RNoteTable.java [deleted file]
src/cx/fbn/nevernote/sql/runners/RNoteTagsTable.java [deleted file]
src/cx/fbn/nevernote/sql/runners/RNotebookTable.java [deleted file]
src/cx/fbn/nevernote/sql/runners/RSavedSearchTable.java [deleted file]
src/cx/fbn/nevernote/sql/runners/RSyncTable.java [deleted file]
src/cx/fbn/nevernote/sql/runners/RTagTable.java [deleted file]
src/cx/fbn/nevernote/sql/runners/RWatchFolderTable.java [deleted file]
src/cx/fbn/nevernote/sql/runners/RWordsTable.java [deleted file]
src/cx/fbn/nevernote/threads/CounterRunner.java
src/cx/fbn/nevernote/threads/DBRunner.java [deleted file]
src/cx/fbn/nevernote/threads/IndexRunner.java
src/cx/fbn/nevernote/threads/SaveRunner.java
src/cx/fbn/nevernote/threads/SyncRunner.java
src/cx/fbn/nevernote/utilities/ListManager.java

index 7bb54a4..3a124b5 100644 (file)
@@ -21,6 +21,7 @@ package cx.fbn.nevernote;
 \r
 \r
 //import java.io.ByteArrayOutputStream;\r
 \r
 \r
 //import java.io.ByteArrayOutputStream;\r
+\r
 import java.io.PrintStream;\r
 import java.text.SimpleDateFormat;\r
 import java.util.ArrayList;\r
 import java.io.PrintStream;\r
 import java.text.SimpleDateFormat;\r
 import java.util.ArrayList;\r
@@ -34,7 +35,6 @@ import com.evernote.edam.type.PrivilegeLevel;
 import com.evernote.edam.type.User;\r
 import com.evernote.edam.type.UserAttributes;\r
 import com.trolltech.qt.core.QByteArray;\r
 import com.evernote.edam.type.User;\r
 import com.evernote.edam.type.UserAttributes;\r
 import com.trolltech.qt.core.QByteArray;\r
-import com.trolltech.qt.core.QMutex;\r
 import com.trolltech.qt.core.QSettings;\r
 import com.trolltech.qt.gui.QPalette;\r
 \r
 import com.trolltech.qt.core.QSettings;\r
 import com.trolltech.qt.gui.QPalette;\r
 \r
@@ -44,20 +44,13 @@ import cx.fbn.nevernote.config.StartupConfig;
 import cx.fbn.nevernote.gui.ContainsAttributeFilterTable;\r
 import cx.fbn.nevernote.gui.DateAttributeFilterTable;\r
 import cx.fbn.nevernote.gui.ShortcutKeys;\r
 import cx.fbn.nevernote.gui.ContainsAttributeFilterTable;\r
 import cx.fbn.nevernote.gui.DateAttributeFilterTable;\r
 import cx.fbn.nevernote.gui.ShortcutKeys;\r
-import cx.fbn.nevernote.signals.DBRunnerSignal;\r
-import cx.fbn.nevernote.threads.DBRunner;\r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 \r
 public class Global {\r
        public static String version = "0.88";\r
     public static String username = ""; \r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 \r
 public class Global {\r
        public static String version = "0.88";\r
     public static String username = ""; \r
-    public static String password = ""; \r
-\r
-    public static DBRunner                             dbRunner;                       // Database thread\r
-    public static DBRunnerSignal               dbRunnerSignal;         // Signals to the database runner\r
-    public static QMutex                               dbrunnerWorkLock;       // mutex lock for work queue\r
+    public static String password = "";     \r
     \r
     \r
-\r
     public static int mainThreadId=0;\r
     private static ArrayBlockingQueue<Boolean> mainThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
     \r
     public static int mainThreadId=0;\r
     private static ArrayBlockingQueue<Boolean> mainThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
     \r
@@ -86,7 +79,7 @@ public class Global {
     private static ArrayBlockingQueue<Boolean> indexThread04ThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
     \r
     public static int dbThreadId=9;   // This should always be the highest thread ID\r
     private static ArrayBlockingQueue<Boolean> indexThread04ThreadWaiter = new ArrayBlockingQueue<Boolean>(1);\r
     \r
     public static int dbThreadId=9;   // This should always be the highest thread ID\r
-    \r
+\r
     \r
     public static HashMap<String,String> passwordSafe = new HashMap<String, String>();\r
     public static List<String> passwordRemember = new ArrayList<String>();\r
     \r
     public static HashMap<String,String> passwordSafe = new HashMap<String, String>();\r
     public static List<String> passwordRemember = new ArrayList<String>();\r
@@ -118,6 +111,7 @@ public class Global {
     private static String wordRegex;\r
     public static boolean enableCarriageReturnFix = false;\r
     \r
     private static String wordRegex;\r
     public static boolean enableCarriageReturnFix = false;\r
     \r
+    public static String name = null;\r
     public static QSettings    settings;\r
     public static boolean isConnected;\r
     public static boolean showDeleted = false;\r
     public static QSettings    settings;\r
     public static boolean isConnected;\r
     public static boolean showDeleted = false;\r
@@ -139,7 +133,7 @@ public class Global {
        PrintStream stdoutStream;\r
        public static QPalette                          originalPalette;\r
        public static ShortcutKeys                      shortcutKeys;\r
        PrintStream stdoutStream;\r
        public static QPalette                          originalPalette;\r
        public static ShortcutKeys                      shortcutKeys;\r
-       private static boolean                          disableViewing;\r
+       public static boolean                           disableViewing;\r
        \r
        public static List<String>                              invalidElements = new ArrayList<String>();\r
        public static HashMap<String, ArrayList<String>>        invalidAttributes = new HashMap<String, ArrayList<String>>();\r
        \r
        public static List<String>                              invalidElements = new ArrayList<String>();\r
        public static HashMap<String, ArrayList<String>>        invalidAttributes = new HashMap<String, ArrayList<String>>();\r
@@ -151,7 +145,7 @@ public class Global {
        static Calendar intervalTraceTime;\r
 \r
        private static FileManager fileManager;\r
        static Calendar intervalTraceTime;\r
 \r
        private static FileManager fileManager;\r
-\r
+       \r
     // Do initial setup \r
     public static void setup(StartupConfig startupConfig) throws InitializationException  {\r
         settings = new QSettings("fbn.cx", startupConfig.getName());\r
     // Do initial setup \r
     public static void setup(StartupConfig startupConfig) throws InitializationException  {\r
         settings = new QSettings("fbn.cx", startupConfig.getName());\r
@@ -159,6 +153,7 @@ public class Global {
 \r
         fileManager = new FileManager(startupConfig.getHomeDirPath());\r
 \r
 \r
         fileManager = new FileManager(startupConfig.getHomeDirPath());\r
 \r
+\r
                        getServer();\r
                        settings.beginGroup("General");\r
                        String regex = (String) settings.value("regex", "[,\\s]+");\r
                        getServer();\r
                        settings.beginGroup("General");\r
                        String regex = (String) settings.value("regex", "[,\\s]+");\r
@@ -179,7 +174,6 @@ public class Global {
 //                     indexLock = new DBLock();\r
                        logger = new ApplicationLogger("global.log");\r
                        shortcutKeys = new ShortcutKeys();\r
 //                     indexLock = new DBLock();\r
                        logger = new ApplicationLogger("global.log");\r
                        shortcutKeys = new ShortcutKeys();\r
-                       dbrunnerWorkLock = new QMutex();\r
                        mimicEvernoteInterface = getMimicEvernoteInterface();\r
                        resourceMap = new HashMap<String,String>();\r
                                \r
                        mimicEvernoteInterface = getMimicEvernoteInterface();\r
                        resourceMap = new HashMap<String,String>();\r
                                \r
@@ -910,6 +904,7 @@ public class Global {
     public static void dbContinue() {\r
 //     Global.dbThreadWait.wakeAll();\r
     }\r
     public static void dbContinue() {\r
 //     Global.dbThreadWait.wakeAll();\r
     }\r
+       \r
     public static synchronized void dbClientWait(int id) {\r
        if (id == mainThreadId) {\r
                        try {mainThreadWaiter.take(); } catch (InterruptedException e) {e.printStackTrace();}\r
     public static synchronized void dbClientWait(int id) {\r
        if (id == mainThreadId) {\r
                        try {mainThreadWaiter.take(); } catch (InterruptedException e) {e.printStackTrace();}\r
@@ -1116,12 +1111,14 @@ public class Global {
                startTraceTime = null;\r
        }\r
 \r
                startTraceTime = null;\r
        }\r
 \r
+\r
     public static FileManager getFileManager() {\r
         return fileManager;\r
     }\r
     public static FileManager getFileManager() {\r
         return fileManager;\r
     }\r
-\r
     public static boolean getDisableViewing() {\r
         return disableViewing;\r
     }\r
     public static boolean getDisableViewing() {\r
         return disableViewing;\r
     }\r
+    \r
+\r
 }\r
 \r
 }\r
 \r
index c9a95b3..5897cf1 100644 (file)
@@ -63,6 +63,7 @@ import com.trolltech.qt.core.QFile;
 import com.trolltech.qt.core.QFileInfo;
 import com.trolltech.qt.core.QFileSystemWatcher;
 import com.trolltech.qt.core.QIODevice;
 import com.trolltech.qt.core.QFileInfo;
 import com.trolltech.qt.core.QFileSystemWatcher;
 import com.trolltech.qt.core.QIODevice;
+import com.trolltech.qt.core.QIODevice.OpenModeFlag;
 import com.trolltech.qt.core.QModelIndex;
 import com.trolltech.qt.core.QSize;
 import com.trolltech.qt.core.QTemporaryFile;
 import com.trolltech.qt.core.QModelIndex;
 import com.trolltech.qt.core.QSize;
 import com.trolltech.qt.core.QTemporaryFile;
@@ -71,19 +72,22 @@ import com.trolltech.qt.core.QThreadPool;
 import com.trolltech.qt.core.QTimer;
 import com.trolltech.qt.core.QUrl;
 import com.trolltech.qt.core.Qt;
 import com.trolltech.qt.core.QTimer;
 import com.trolltech.qt.core.QUrl;
 import com.trolltech.qt.core.Qt;
-import com.trolltech.qt.core.QIODevice.OpenModeFlag;
 import com.trolltech.qt.core.Qt.SortOrder;
 import com.trolltech.qt.core.Qt.WidgetAttribute;
 import com.trolltech.qt.gui.QAbstractItemView;
 import com.trolltech.qt.core.Qt.SortOrder;
 import com.trolltech.qt.core.Qt.WidgetAttribute;
 import com.trolltech.qt.gui.QAbstractItemView;
+import com.trolltech.qt.gui.QAbstractItemView.ScrollHint;
 import com.trolltech.qt.gui.QAction;
 import com.trolltech.qt.gui.QApplication;
 import com.trolltech.qt.gui.QCloseEvent;
 import com.trolltech.qt.gui.QColor;
 import com.trolltech.qt.gui.QComboBox;
 import com.trolltech.qt.gui.QAction;
 import com.trolltech.qt.gui.QApplication;
 import com.trolltech.qt.gui.QCloseEvent;
 import com.trolltech.qt.gui.QColor;
 import com.trolltech.qt.gui.QComboBox;
+import com.trolltech.qt.gui.QComboBox.InsertPolicy;
 import com.trolltech.qt.gui.QCursor;
 import com.trolltech.qt.gui.QDesktopServices;
 import com.trolltech.qt.gui.QDialog;
 import com.trolltech.qt.gui.QFileDialog;
 import com.trolltech.qt.gui.QCursor;
 import com.trolltech.qt.gui.QDesktopServices;
 import com.trolltech.qt.gui.QDialog;
 import com.trolltech.qt.gui.QFileDialog;
+import com.trolltech.qt.gui.QFileDialog.AcceptMode;
+import com.trolltech.qt.gui.QFileDialog.FileMode;
 import com.trolltech.qt.gui.QGridLayout;
 import com.trolltech.qt.gui.QHBoxLayout;
 import com.trolltech.qt.gui.QIcon;
 import com.trolltech.qt.gui.QGridLayout;
 import com.trolltech.qt.gui.QHBoxLayout;
 import com.trolltech.qt.gui.QIcon;
@@ -93,11 +97,13 @@ import com.trolltech.qt.gui.QListWidget;
 import com.trolltech.qt.gui.QMainWindow;
 import com.trolltech.qt.gui.QMenu;
 import com.trolltech.qt.gui.QMessageBox;
 import com.trolltech.qt.gui.QMainWindow;
 import com.trolltech.qt.gui.QMenu;
 import com.trolltech.qt.gui.QMessageBox;
+import com.trolltech.qt.gui.QMessageBox.StandardButton;
 import com.trolltech.qt.gui.QPixmap;
 import com.trolltech.qt.gui.QPrintDialog;
 import com.trolltech.qt.gui.QPrinter;
 import com.trolltech.qt.gui.QProgressBar;
 import com.trolltech.qt.gui.QSizePolicy;
 import com.trolltech.qt.gui.QPixmap;
 import com.trolltech.qt.gui.QPrintDialog;
 import com.trolltech.qt.gui.QPrinter;
 import com.trolltech.qt.gui.QProgressBar;
 import com.trolltech.qt.gui.QSizePolicy;
+import com.trolltech.qt.gui.QSizePolicy.Policy;
 import com.trolltech.qt.gui.QSpinBox;
 import com.trolltech.qt.gui.QSplashScreen;
 import com.trolltech.qt.gui.QSplitter;
 import com.trolltech.qt.gui.QSpinBox;
 import com.trolltech.qt.gui.QSplashScreen;
 import com.trolltech.qt.gui.QSplitter;
@@ -107,14 +113,8 @@ import com.trolltech.qt.gui.QTableWidgetItem;
 import com.trolltech.qt.gui.QTextEdit;
 import com.trolltech.qt.gui.QToolBar;
 import com.trolltech.qt.gui.QTreeWidgetItem;
 import com.trolltech.qt.gui.QTextEdit;
 import com.trolltech.qt.gui.QToolBar;
 import com.trolltech.qt.gui.QTreeWidgetItem;
-import com.trolltech.qt.gui.QAbstractItemView.ScrollHint;
-import com.trolltech.qt.gui.QComboBox.InsertPolicy;
-import com.trolltech.qt.gui.QFileDialog.AcceptMode;
-import com.trolltech.qt.gui.QFileDialog.FileMode;
-import com.trolltech.qt.gui.QMessageBox.StandardButton;
-import com.trolltech.qt.gui.QSizePolicy.Policy;
-import com.trolltech.qt.webkit.QWebSettings;
 import com.trolltech.qt.webkit.QWebPage.WebAction;
 import com.trolltech.qt.webkit.QWebPage.WebAction;
+import com.trolltech.qt.webkit.QWebSettings;
 import com.trolltech.qt.xml.QDomAttr;
 import com.trolltech.qt.xml.QDomDocument;
 import com.trolltech.qt.xml.QDomElement;
 import com.trolltech.qt.xml.QDomAttr;
 import com.trolltech.qt.xml.QDomDocument;
 import com.trolltech.qt.xml.QDomElement;
@@ -148,10 +148,8 @@ import cx.fbn.nevernote.gui.TableView;
 import cx.fbn.nevernote.gui.TagTreeWidget;
 import cx.fbn.nevernote.gui.Thumbnailer;
 import cx.fbn.nevernote.gui.TrashTreeWidget;
 import cx.fbn.nevernote.gui.TagTreeWidget;
 import cx.fbn.nevernote.gui.Thumbnailer;
 import cx.fbn.nevernote.gui.TrashTreeWidget;
-import cx.fbn.nevernote.signals.DBRunnerSignal;
 import cx.fbn.nevernote.sql.DatabaseConnection;
 import cx.fbn.nevernote.sql.DatabaseConnection;
-import cx.fbn.nevernote.sql.runners.WatchFolderRecord;
-import cx.fbn.nevernote.threads.DBRunner;
+import cx.fbn.nevernote.sql.WatchFolderRecord;
 import cx.fbn.nevernote.threads.IndexRunner;
 import cx.fbn.nevernote.threads.SyncRunner;
 import cx.fbn.nevernote.utilities.AESEncrypter;
 import cx.fbn.nevernote.threads.IndexRunner;
 import cx.fbn.nevernote.threads.SyncRunner;
 import cx.fbn.nevernote.utilities.AESEncrypter;
@@ -206,7 +204,6 @@ public class NeverNote extends QMainWindow{
     boolean                                    noteDirty;                                      // Has the note been changed?
     boolean                            inkNote;                    // if this is an ink note, it is read only
   
     boolean                                    noteDirty;                                      // Has the note been changed?
     boolean                            inkNote;                    // if this is an ink note, it is read only
   
-    QThread                                    dbThread;                                       // Thread to handle DB communication
     ListManager                                listManager;                                    // DB runnable task
     
     List<QTemporaryFile>       tempFiles;                                      // Array of temporary files;
     ListManager                                listManager;                                    // DB runnable task
     
     List<QTemporaryFile>       tempFiles;                                      // Array of temporary files;
@@ -291,21 +288,14 @@ public class NeverNote extends QMainWindow{
     //***************************************************************
     //***************************************************************
     // Application Constructor 
     //***************************************************************
     //***************************************************************
     // Application Constructor 
-       private NeverNote(DatabaseConnection dbConn)  {
-               conn = dbConn;
+       public NeverNote(DatabaseConnection dbConn)  {
+               conn = dbConn;          
 
                thread().setPriority(Thread.MAX_PRIORITY);
                
                logger = new ApplicationLogger("nevernote.log");
                logger.log(logger.HIGH, tr("Starting Application"));
 
 
                thread().setPriority(Thread.MAX_PRIORITY);
                
                logger = new ApplicationLogger("nevernote.log");
                logger.log(logger.HIGH, tr("Starting Application"));
 
-               logger.log(logger.EXTREME, tr("Starting DB thread"));
-               dbThread = new QThread(Global.dbRunner, "Database Thread");
-               dbThread.start();
-               logger.log(logger.EXTREME, tr("DB Thread has started"));
-               Global.dbRunnerSignal.start.emit();
-               logger.log(logger.EXTREME, tr("Setting main thread DB connection"));
-               logger.log(logger.EXTREME, tr("main DB thread setup complete."));
                conn.checkDatabaseVersion();
                
                // Start building the invalid XML tables
                conn.checkDatabaseVersion();
                
                // Start building the invalid XML tables
@@ -340,7 +330,7 @@ public class NeverNote extends QMainWindow{
         listManager = new ListManager(conn, logger, Global.mainThreadId);
         
                logger.log(logger.EXTREME, tr("Building index runners & timers"));
         listManager = new ListManager(conn, logger, Global.mainThreadId);
         
                logger.log(logger.EXTREME, tr("Building index runners & timers"));
-        indexRunner = new IndexRunner("indexRunner.log");
+        indexRunner = new IndexRunner("indexRunner.log", Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);
                indexThread = new QThread(indexRunner, "Index Thread");
                indexThread.start();
                
                indexThread = new QThread(indexRunner, "Index Thread");
                indexThread.start();
                
@@ -357,7 +347,7 @@ public class NeverNote extends QMainWindow{
                                
                logger.log(logger.EXTREME, tr("Setting sync thread & timers"));
                syncThreadsReady=1;
                                
                logger.log(logger.EXTREME, tr("Setting sync thread & timers"));
                syncThreadsReady=1;
-               syncRunner = new SyncRunner("syncRunner.log");
+               syncRunner = new SyncRunner("syncRunner.log", Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);
                syncTime = new SyncTimes().timeValue(Global.getSyncInterval());
                syncTimer = new QTimer();
                syncTimer.timeout.connect(this, "syncTimer()");
                syncTime = new SyncTimes().timeValue(Global.getSyncInterval());
                syncTimer = new QTimer();
                syncTimer.timeout.connect(this, "syncTimer()");
@@ -600,8 +590,8 @@ public class NeverNote extends QMainWindow{
                QApplication.initialize(args);
                QPixmap pixmap = new QPixmap("classpath:cx/fbn/nevernote/icons/splash_logo.png");
                QSplashScreen splash = new QSplashScreen(pixmap);
                QApplication.initialize(args);
                QPixmap pixmap = new QPixmap("classpath:cx/fbn/nevernote/icons/splash_logo.png");
                QSplashScreen splash = new QSplashScreen(pixmap);
-
                boolean showSplash;
                boolean showSplash;
+               
                DatabaseConnection dbConn;
 
         try {
                DatabaseConnection dbConn;
 
         try {
@@ -624,6 +614,7 @@ public class NeverNote extends QMainWindow{
         }
 
         NeverNote application = new NeverNote(dbConn);
         }
 
         NeverNote application = new NeverNote(dbConn);
+
                application.setAttribute(WidgetAttribute.WA_DeleteOnClose, true);
                if (Global.wasWindowMaximized())
                        application.showMaximized();
                application.setAttribute(WidgetAttribute.WA_DeleteOnClose, true);
                if (Global.wasWindowMaximized())
                        application.showMaximized();
@@ -642,10 +633,9 @@ public class NeverNote extends QMainWindow{
      * @throws InitializationException when opening the database fails, e.g. because another process has it locked
      */
     private static DatabaseConnection setupDatabaseConnection() throws InitializationException {
      * @throws InitializationException when opening the database fails, e.g. because another process has it locked
      */
     private static DatabaseConnection setupDatabaseConnection() throws InitializationException {
-        DatabaseConnection dbConn = new DatabaseConnection(Global.mainThreadId);
-        dbConn.dbSetup();
+       ApplicationLogger logger = new ApplicationLogger("nevernote-database.log");
+       DatabaseConnection dbConn = new DatabaseConnection(logger,Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);
 
 
-        Global.dbRunnerSignal = new DBRunnerSignal();
         if (Global.getDatabaseUrl().toUpperCase().indexOf("CIPHER=") > -1) {
             boolean goodCheck = false;
             while (!goodCheck) {
         if (Global.getDatabaseUrl().toUpperCase().indexOf("CIPHER=") > -1) {
             boolean goodCheck = false;
             while (!goodCheck) {
@@ -658,8 +648,6 @@ public class NeverNote extends QMainWindow{
                         Global.getDatabaseUserPassword(), Global.cipherPassword);
             }
         }
                         Global.getDatabaseUserPassword(), Global.cipherPassword);
             }
         }
-        Global.dbRunner = new DBRunner(Global.getDatabaseUrl(), Global.getDatabaseUserid(),
-                Global.getDatabaseUserPassword(), Global.cipherPassword);
         return dbConn;
     }
 
         return dbConn;
     }
 
@@ -775,15 +763,6 @@ public class NeverNote extends QMainWindow{
                        }
                }
 
                        }
                }
 
-               logger.log(logger.EXTREME, "Shutting down database");
-               conn.dbShutdown();
-               logger.log(logger.EXTREME, "Waiting for DB thread to terminate");
-               try {
-                       dbThread.join();
-               } catch (InterruptedException e) {
-                       e.printStackTrace();
-               }
-               logger.log(logger.EXTREME, "DB Thread has terminated");
                logger.log(logger.HIGH, "Leaving NeverNote.closeEvent");
        }
 
                logger.log(logger.HIGH, "Leaving NeverNote.closeEvent");
        }
 
@@ -844,7 +823,9 @@ public class NeverNote extends QMainWindow{
            browserWindow.noteSignal.subjectDateChanged.connect(listManager, "updateNoteSubjectDate(String, QDateTime)");
            browserWindow.noteSignal.subjectDateChanged.connect(this, "updateListDateSubject(String, QDateTime)");
            browserWindow.noteSignal.authorChanged.connect(listManager, "updateNoteAuthor(String, String)");
            browserWindow.noteSignal.subjectDateChanged.connect(listManager, "updateNoteSubjectDate(String, QDateTime)");
            browserWindow.noteSignal.subjectDateChanged.connect(this, "updateListDateSubject(String, QDateTime)");
            browserWindow.noteSignal.authorChanged.connect(listManager, "updateNoteAuthor(String, String)");
+           browserWindow.noteSignal.geoChanged.connect(listManager, "updateNoteGeoTag(String, Double,Double,Double)");
            browserWindow.noteSignal.authorChanged.connect(this, "updateListAuthor(String, String)");
            browserWindow.noteSignal.authorChanged.connect(this, "updateListAuthor(String, String)");
+           browserWindow.noteSignal.geoChanged.connect(this, "setNoteDirty()");
            browserWindow.noteSignal.sourceUrlChanged.connect(listManager, "updateNoteSourceUrl(String, String)");
            browserWindow.noteSignal.sourceUrlChanged.connect(this, "updateListSourceUrl(String, String)");
            browserWindow.focusLost.connect(this, "saveNote()");
            browserWindow.noteSignal.sourceUrlChanged.connect(listManager, "updateNoteSourceUrl(String, String)");
            browserWindow.noteSignal.sourceUrlChanged.connect(this, "updateListSourceUrl(String, String)");
            browserWindow.focusLost.connect(this, "saveNote()");
@@ -852,6 +833,8 @@ public class NeverNote extends QMainWindow{
 //         browserWindow.resourceSignal.externalFileEdit.connect(this, "saveResourceLater(String, String)");
        }
 
 //         browserWindow.resourceSignal.externalFileEdit.connect(this, "saveResourceLater(String, String)");
        }
 
+       
+
        //***************************************************************
        //***************************************************************
        //* Settings and look & feel
        //***************************************************************
        //***************************************************************
        //* Settings and look & feel
@@ -2626,7 +2609,7 @@ public class NeverNote extends QMainWindow{
        logger.log(logger.HIGH, "Leaving NeverNote.updateListAuthor");
     }
        private void updateListNoteNotebook(String guid, String notebook) {
        logger.log(logger.HIGH, "Leaving NeverNote.updateListAuthor");
     }
        private void updateListNoteNotebook(String guid, String notebook) {
-       logger.log(logger.HIGH, "Entering NeverNote.updateListAuthor");
+       logger.log(logger.HIGH, "Entering NeverNote.updateListNoteNotebook");
 
        for (int i=0; i<noteTableView.model.rowCount(); i++) {
                //QModelIndex modelIndex =  noteTableView.proxyModel.index(i, Global.noteTableGuidPosition);
 
        for (int i=0; i<noteTableView.model.rowCount(); i++) {
                //QModelIndex modelIndex =  noteTableView.proxyModel.index(i, Global.noteTableGuidPosition);
@@ -2642,7 +2625,7 @@ public class NeverNote extends QMainWindow{
                        }       
                }
        }
                        }       
                }
        }
-       logger.log(logger.HIGH, "Leaving NeverNote.updateListAuthor");
+       logger.log(logger.HIGH, "Leaving NeverNote.updateListNoteNotebook");
     }
     // Update a title for a specific note in the list
     @SuppressWarnings("unused")
     }
     // Update a title for a specific note in the list
     @SuppressWarnings("unused")
@@ -2978,7 +2961,7 @@ public class NeverNote extends QMainWindow{
     // Get a note from Evernote (and put it in the browser)
        private void refreshEvernoteNote(boolean reload) {
                logger.log(logger.HIGH, "Entering NeverNote.refreshEvernoteNote");
     // Get a note from Evernote (and put it in the browser)
        private void refreshEvernoteNote(boolean reload) {
                logger.log(logger.HIGH, "Entering NeverNote.refreshEvernoteNote");
-               if (Global.getDisableViewing()) {
+               if (Global.disableViewing) {
                        browserWindow.setEnabled(false);
                        return;
                }
                        browserWindow.setEnabled(false);
                        return;
                }
@@ -3747,6 +3730,8 @@ public class NeverNote extends QMainWindow{
         if (f.exists()) {
             return relativePath;
         }
         if (f.exists()) {
             return relativePath;
         }
+       if (f.exists())
+               return appl+".png";
        logger.log(logger.HIGH, "Leaving NeverNote.findIcon");
        return "attachment.png";
     }
        logger.log(logger.HIGH, "Leaving NeverNote.findIcon");
        return "attachment.png";
     }
@@ -3778,7 +3763,7 @@ public class NeverNote extends QMainWindow{
                                        fileDetails = r.getAttributes().getFileName();
                                String contextFileName;
                                FileManager fileManager = Global.getFileManager();
                                        fileDetails = r.getAttributes().getFileName();
                                String contextFileName;
                                FileManager fileManager = Global.getFileManager();
-                                if (fileDetails != null && !fileDetails.equals("")) {
+                if (fileDetails != null && !fileDetails.equals("")) {
                                        enmedia.setAttribute("href", "nnres://" +r.getGuid() +Global.attachmentNameDelimeter +fileDetails);
                                        contextFileName = fileManager.getResDirPath(r.getGuid() + Global.attachmentNameDelimeter + fileDetails);
                                } else { 
                                        enmedia.setAttribute("href", "nnres://" +r.getGuid() +Global.attachmentNameDelimeter +fileDetails);
                                        contextFileName = fileManager.getResDirPath(r.getGuid() + Global.attachmentNameDelimeter + fileDetails);
                                } else { 
@@ -3849,7 +3834,7 @@ public class NeverNote extends QMainWindow{
                                // NFC TODO: should this be a 'file://' URL?
                                newText.setAttribute("src", Global.getFileManager().getImageDirPath(icon));
                                if (goodPreview) {
                                // NFC TODO: should this be a 'file://' URL?
                                newText.setAttribute("src", Global.getFileManager().getImageDirPath(icon));
                                if (goodPreview) {
-                                       // NFC TODO: should this be a 'file://' URL?
+                               // NFC TODO: should this be a 'file://' URL?
                                        newText.setAttribute("src", fileManager.getResDirPath(filePath));
                                        newText.setAttribute("style", "border-style:solid; border-color:green; padding:0.5mm 0.5mm 0.5mm 0.5mm;");
                                }
                                        newText.setAttribute("src", fileManager.getResDirPath(filePath));
                                        newText.setAttribute("style", "border-style:solid; border-color:green; padding:0.5mm 0.5mm 0.5mm 0.5mm;");
                                }
@@ -4124,9 +4109,6 @@ public class NeverNote extends QMainWindow{
 //             noteTableView.selectionModel().selectionChanged.connect(this, "noteTableSelection()");
 //             indexRunner.setKeepRunning(Global.keepRunning);
                
 //             noteTableView.selectionModel().selectionChanged.connect(this, "noteTableSelection()");
 //             indexRunner.setKeepRunning(Global.keepRunning);
                
-               // Reload the unindexed table  If the dbthread is dead, we are probably shutting down.
-               if (!dbThread.isAlive())
-                       return;
                listManager.setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());
                for (int i=0; i<noteTableView.model.rowCount(); i++) {
                        QModelIndex modelIndex =  noteTableView.model.index(i, Global.noteTableGuidPosition);
                listManager.setUnsynchronizedNotes(conn.getNoteTable().getUnsynchronizedGUIDs());
                for (int i=0; i<noteTableView.model.rowCount(); i++) {
                        QModelIndex modelIndex =  noteTableView.model.index(i, Global.noteTableGuidPosition);
@@ -4332,13 +4314,6 @@ public class NeverNote extends QMainWindow{
                } else
                        saveThreadDeadCount=0;
 
                } else
                        saveThreadDeadCount=0;
 
-               if (!dbThread.isAlive()) {
-                       dbThreadDeadCount++;
-                       QMessageBox.information(this, "A thread his died.", "It appears as the database thread has died.  I recommend "+
-                       "checking stopping NeverNote, saving the logs for later viewing, and restarting.  Sorry.");
-               } else
-                       dbThreadDeadCount=0;
-
                if (!syncThread.isAlive()) {
                        syncThreadDeadCount++;
                        QMessageBox.information(this, "A thread his died.", "It appears as the synchronization thread has died.  I recommend "+
                if (!syncThread.isAlive()) {
                        syncThreadDeadCount++;
                        QMessageBox.information(this, "A thread his died.", "It appears as the synchronization thread has died.  I recommend "+
@@ -4706,7 +4681,6 @@ public class NeverNote extends QMainWindow{
                // Strip URL prefix and base dir path
                String dPath = FileUtils.toForwardSlashedPath(Global.getFileManager().getResDirPath());
                String name = fileName.replace(dPath, "");
                // Strip URL prefix and base dir path
                String dPath = FileUtils.toForwardSlashedPath(Global.getFileManager().getResDirPath());
                String name = fileName.replace(dPath, "");
-
                int pos = name.lastIndexOf('.');
                String guid = name;
                if (pos > -1) {
                int pos = name.lastIndexOf('.');
                String guid = name;
                if (pos > -1) {
@@ -4813,6 +4787,9 @@ public class NeverNote extends QMainWindow{
                }
        }
 
                }
        }
 
+
+       
+       
        //*************************************************
        //* Check database userid & passwords
        //*************************************************
        //*************************************************
        //* Check database userid & passwords
        //*************************************************
diff --git a/src/cx/fbn/nevernote/dialog/GeoDialog.java b/src/cx/fbn/nevernote/dialog/GeoDialog.java
new file mode 100644 (file)
index 0000000..eb03e73
--- /dev/null
@@ -0,0 +1,144 @@
+/*\r
+ * This file is part of NeverNote \r
+ * Copyright 2009 Randy Baumgarte\r
+ * \r
+ * This file may be licensed under the terms of of the\r
+ * GNU General Public License Version 2 (the ``GPL'').\r
+ *\r
+ * Software distributed under the License is distributed\r
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
+ * express or implied. See the GPL for the specific language\r
+ * governing rights and limitations.\r
+ *\r
+ * You should have received a copy of the GPL along with this\r
+ * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
+ * or write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
+ *\r
+*/\r
+\r
+package cx.fbn.nevernote.dialog;\r
+\r
+import com.trolltech.qt.gui.QDialog;\r
+import com.trolltech.qt.gui.QDoubleValidator;\r
+import com.trolltech.qt.gui.QDoubleValidator.Notation;\r
+import com.trolltech.qt.gui.QGridLayout;\r
+import com.trolltech.qt.gui.QLabel;\r
+import com.trolltech.qt.gui.QLineEdit;\r
+import com.trolltech.qt.gui.QPushButton;\r
+\r
+public class GeoDialog extends QDialog {\r
+\r
+       private boolean         okPressed;\r
+       private final QLineEdit altitude;\r
+       private final QLineEdit latitude;\r
+       private final QLineEdit longitude;\r
+       private final QPushButton ok;\r
+       \r
+       \r
+       // Constructor\r
+       public GeoDialog() {\r
+               okPressed = false;\r
+               setWindowTitle("NeverNote Login");\r
+               QGridLayout grid = new QGridLayout();\r
+               setLayout(grid);\r
+               QGridLayout passwordGrid = new QGridLayout();\r
+               QGridLayout buttonGrid = new QGridLayout();\r
+               \r
+               \r
+               longitude = new QLineEdit();\r
+               QDoubleValidator longVal = new QDoubleValidator(-180.0,180.0,4,longitude);\r
+               longVal.setNotation(Notation.StandardNotation);\r
+               longitude.setValidator(longVal);\r
+               \r
+               latitude = new QLineEdit();\r
+               QDoubleValidator latVal = new QDoubleValidator(-90.0,90.0,4,latitude);\r
+               latVal.setNotation(Notation.StandardNotation);\r
+               latitude.setValidator(latVal);\r
+               \r
+               altitude = new QLineEdit();\r
+               QDoubleValidator altVal = new QDoubleValidator(-9999.0,9999.0,4,altitude);\r
+               altVal.setNotation(Notation.StandardNotation);\r
+               altitude.setValidator(altVal);\r
+\r
+               \r
+               passwordGrid.addWidget(new QLabel("Longitude"), 1,1);\r
+               passwordGrid.addWidget(longitude, 1, 2);\r
+               passwordGrid.addWidget(new QLabel("Latitude"), 2,1);\r
+               passwordGrid.addWidget(latitude, 2, 2);\r
+               passwordGrid.addWidget(new QLabel("Altitude"), 3,1);\r
+               passwordGrid.addWidget(altitude, 3, 2);\r
+               passwordGrid.setContentsMargins(10, 10,  -10, -10);\r
+               grid.addLayout(passwordGrid,1,1);\r
+               \r
+               ok = new QPushButton("OK");\r
+               ok.clicked.connect(this, "okButtonPressed()");\r
+               QPushButton cancel = new QPushButton("Cancel");\r
+               cancel.clicked.connect(this, "cancelButtonPressed()");\r
+               buttonGrid.addWidget(ok, 1, 1);\r
+               buttonGrid.addWidget(cancel, 1,2);\r
+               grid.addLayout(buttonGrid,2,1);\r
+       }\r
+       \r
+       // The OK button was pressed\r
+       @SuppressWarnings("unused")\r
+       private void okButtonPressed() {\r
+               okPressed = true;\r
+               close();\r
+       }\r
+       \r
+       // The CANCEL button was pressed\r
+       @SuppressWarnings("unused")\r
+       private void cancelButtonPressed() {\r
+               okPressed = false;\r
+               close();\r
+       }\r
+       \r
+       // Get the longitude\r
+       public double getLongitude() {\r
+               try {\r
+                       return new Double(longitude.text());\r
+               } catch (java.lang.NumberFormatException e) {\r
+                       return 0.0;\r
+               }\r
+       }\r
+       \r
+       // Get the latitude\r
+       public double getLatitude() {\r
+               try {\r
+                       return new Double(latitude.text());\r
+               } catch (java.lang.NumberFormatException e) {\r
+                       return 0.0;\r
+               }\r
+       }\r
+       \r
+       // Get the altitude\r
+       public double getAltitude() {\r
+               try {\r
+                       return new Double(altitude.text()); \r
+               } catch (java.lang.NumberFormatException e) {\r
+                       return 0.0;\r
+               }\r
+       }\r
+       \r
+       \r
+       public void setLongitude(double value) {\r
+               longitude.setText(new Float(value).toString());\r
+       }\r
+\r
+       public void setLatitude(double value) {\r
+               latitude.setText(new Float(value).toString());\r
+       }\r
+\r
+       public void setAltitude(double value) {\r
+               altitude.setText(new Float(value).toString());\r
+       }\r
+\r
+       \r
+       // Check if the OK button was pressed\r
+       public boolean okPressed() {\r
+               return okPressed;\r
+       }\r
+\r
+       \r
+}\r
index 3bec89b..3a86b39 100644 (file)
@@ -24,6 +24,8 @@ import java.util.List;
 \r
 import com.evernote.edam.type.Notebook;\r
 import com.trolltech.qt.core.QModelIndex;\r
 \r
 import com.evernote.edam.type.Notebook;\r
 import com.trolltech.qt.core.QModelIndex;\r
+import com.trolltech.qt.gui.QAbstractItemView.SelectionBehavior;\r
+import com.trolltech.qt.gui.QAbstractItemView.SelectionMode;\r
 import com.trolltech.qt.gui.QApplication;\r
 import com.trolltech.qt.gui.QDialog;\r
 import com.trolltech.qt.gui.QFontMetrics;\r
 import com.trolltech.qt.gui.QApplication;\r
 import com.trolltech.qt.gui.QDialog;\r
 import com.trolltech.qt.gui.QFontMetrics;\r
@@ -32,10 +34,8 @@ import com.trolltech.qt.gui.QPushButton;
 import com.trolltech.qt.gui.QTableWidget;\r
 import com.trolltech.qt.gui.QTableWidgetItem;\r
 import com.trolltech.qt.gui.QVBoxLayout;\r
 import com.trolltech.qt.gui.QTableWidget;\r
 import com.trolltech.qt.gui.QTableWidgetItem;\r
 import com.trolltech.qt.gui.QVBoxLayout;\r
-import com.trolltech.qt.gui.QAbstractItemView.SelectionBehavior;\r
-import com.trolltech.qt.gui.QAbstractItemView.SelectionMode;\r
 \r
 \r
-import cx.fbn.nevernote.sql.runners.WatchFolderRecord;\r
+import cx.fbn.nevernote.sql.WatchFolderRecord;\r
 \r
 public class WatchFolder extends QDialog {\r
        private final QPushButton               okButton;\r
 \r
 public class WatchFolder extends QDialog {\r
        private final QPushButton               okButton;\r
index 0186976..0e7fa53 100644 (file)
@@ -25,14 +25,14 @@ import com.evernote.edam.type.Notebook;
 import com.trolltech.qt.gui.QComboBox;\r
 import com.trolltech.qt.gui.QDialog;\r
 import com.trolltech.qt.gui.QFileDialog;\r
 import com.trolltech.qt.gui.QComboBox;\r
 import com.trolltech.qt.gui.QDialog;\r
 import com.trolltech.qt.gui.QFileDialog;\r
+import com.trolltech.qt.gui.QFileDialog.FileMode;\r
 import com.trolltech.qt.gui.QGridLayout;\r
 import com.trolltech.qt.gui.QHBoxLayout;\r
 import com.trolltech.qt.gui.QLabel;\r
 import com.trolltech.qt.gui.QPushButton;\r
 import com.trolltech.qt.gui.QVBoxLayout;\r
 import com.trolltech.qt.gui.QGridLayout;\r
 import com.trolltech.qt.gui.QHBoxLayout;\r
 import com.trolltech.qt.gui.QLabel;\r
 import com.trolltech.qt.gui.QPushButton;\r
 import com.trolltech.qt.gui.QVBoxLayout;\r
-import com.trolltech.qt.gui.QFileDialog.FileMode;\r
 \r
 \r
-import cx.fbn.nevernote.sql.runners.WatchFolderRecord;\r
+import cx.fbn.nevernote.sql.WatchFolderRecord;\r
 \r
 public class WatchFolderAdd extends QDialog {\r
        private final QPushButton               okButton;\r
 \r
 public class WatchFolderAdd extends QDialog {\r
        private final QPushButton               okButton;\r
index 5265b1d..0a91692 100644 (file)
 \r
 package cx.fbn.nevernote.filters;\r
 \r
 \r
 package cx.fbn.nevernote.filters;\r
 \r
-import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import com.evernote.edam.type.Note;\r
 import com.evernote.edam.type.Tag;\r
 \r
 import java.util.List;\r
 \r
 import com.evernote.edam.type.Note;\r
 import com.evernote.edam.type.Tag;\r
 \r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.sql.requests.EnSearchRequest;\r
+import cx.fbn.nevernote.sql.DatabaseConnection;\r
+import cx.fbn.nevernote.sql.REnSearch;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 \r
 public class EnSearch {\r
        \r
 \r
        private List<Note>                      matches;\r
        public List<String>                     hilightWords;\r
 \r
 public class EnSearch {\r
        \r
 \r
        private List<Note>                      matches;\r
        public List<String>                     hilightWords;\r
-       int id;\r
        \r
        \r
-       public EnSearch(int i, String s, List<Tag> t, int len, int weight) {\r
-               id = i;\r
+       public EnSearch(DatabaseConnection conn, ApplicationLogger logger, String s, List<Tag> t, int len, int weight) {\r
                if (s == null) \r
                        return;\r
                if (s.trim().equals(""))\r
                        return;\r
                \r
                matches = null;\r
                if (s == null) \r
                        return;\r
                if (s.trim().equals(""))\r
                        return;\r
                \r
                matches = null;\r
-               EnSearchRequest request = new EnSearchRequest();\r
-               request.requestor_id = id;\r
-//             request.type = DeletedItemRequest.Get_All;\r
-               request.string1 = s;\r
-               if (t!=null) {\r
-                       request.tags = new ArrayList<Tag>();\r
-                       for (int k=0; k<t.size(); k++) {\r
-                               request.tags.add(t.get(k).deepCopy());\r
-                       }\r
-               }\r
-               request.int1 = len;\r
-               request.int2 = weight;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               EnSearchRequest req = Global.dbRunner.enSearchResponse.get(id);\r
-               hilightWords = req.responseStrings;\r
-               matches = req.responseNotes;\r
+               REnSearch request = new REnSearch(conn, logger, s, t, len, weight);\r
+               matches = request.matchWords();\r
+               hilightWords = request.getWords();\r
        }\r
                \r
        public List<Note> matchWords() {\r
        }\r
                \r
        public List<Note> matchWords() {\r
index ca12e3a..50bdccf 100644 (file)
@@ -57,6 +57,8 @@ import com.trolltech.qt.gui.QComboBox;
 import com.trolltech.qt.gui.QDateEdit;\r
 import com.trolltech.qt.gui.QDesktopServices;\r
 import com.trolltech.qt.gui.QFileDialog;\r
 import com.trolltech.qt.gui.QDateEdit;\r
 import com.trolltech.qt.gui.QDesktopServices;\r
 import com.trolltech.qt.gui.QFileDialog;\r
+import com.trolltech.qt.gui.QFileDialog.AcceptMode;\r
+import com.trolltech.qt.gui.QFileDialog.FileMode;\r
 import com.trolltech.qt.gui.QFontDatabase;\r
 import com.trolltech.qt.gui.QFormLayout;\r
 import com.trolltech.qt.gui.QGridLayout;\r
 import com.trolltech.qt.gui.QFontDatabase;\r
 import com.trolltech.qt.gui.QFormLayout;\r
 import com.trolltech.qt.gui.QGridLayout;\r
@@ -74,17 +76,16 @@ import com.trolltech.qt.gui.QShortcut;
 import com.trolltech.qt.gui.QTimeEdit;\r
 import com.trolltech.qt.gui.QVBoxLayout;\r
 import com.trolltech.qt.gui.QWidget;\r
 import com.trolltech.qt.gui.QTimeEdit;\r
 import com.trolltech.qt.gui.QVBoxLayout;\r
 import com.trolltech.qt.gui.QWidget;\r
-import com.trolltech.qt.gui.QFileDialog.AcceptMode;\r
-import com.trolltech.qt.gui.QFileDialog.FileMode;\r
 import com.trolltech.qt.network.QNetworkRequest;\r
 import com.trolltech.qt.webkit.QWebPage;\r
 import com.trolltech.qt.network.QNetworkRequest;\r
 import com.trolltech.qt.webkit.QWebPage;\r
+import com.trolltech.qt.webkit.QWebPage.WebAction;\r
 import com.trolltech.qt.webkit.QWebSettings;\r
 import com.trolltech.qt.webkit.QWebView;\r
 import com.trolltech.qt.webkit.QWebSettings;\r
 import com.trolltech.qt.webkit.QWebView;\r
-import com.trolltech.qt.webkit.QWebPage.WebAction;\r
 \r
 import cx.fbn.nevernote.Global;\r
 import cx.fbn.nevernote.dialog.EnCryptDialog;\r
 import cx.fbn.nevernote.dialog.EnDecryptDialog;\r
 \r
 import cx.fbn.nevernote.Global;\r
 import cx.fbn.nevernote.dialog.EnCryptDialog;\r
 import cx.fbn.nevernote.dialog.EnDecryptDialog;\r
+import cx.fbn.nevernote.dialog.GeoDialog;\r
 import cx.fbn.nevernote.dialog.InsertLinkDialog;\r
 import cx.fbn.nevernote.dialog.TableDialog;\r
 import cx.fbn.nevernote.dialog.TagAssign;\r
 import cx.fbn.nevernote.dialog.InsertLinkDialog;\r
 import cx.fbn.nevernote.dialog.TableDialog;\r
 import cx.fbn.nevernote.dialog.TagAssign;\r
@@ -101,6 +102,7 @@ public class BrowserWindow extends QWidget {
        private final QLineEdit urlText;\r
        private final QLabel authorLabel;\r
        private final QLineEdit authorText;\r
        private final QLineEdit urlText;\r
        private final QLabel authorLabel;\r
        private final QLineEdit authorText;\r
+       private final QComboBox geoBox;\r
        public final TagLineEdit tagEdit;\r
        public final QLabel tagLabel;\r
        private final QLabel urlLabel;\r
        public final TagLineEdit tagEdit;\r
        public final QLabel tagLabel;\r
        private final QLabel urlLabel;\r
@@ -190,6 +192,7 @@ public class BrowserWindow extends QWidget {
                titleLabel.setMaxLength(Constants.EDAM_NOTE_TITLE_LEN_MAX);\r
                urlText = new QLineEdit();\r
                authorText = new QLineEdit();\r
                titleLabel.setMaxLength(Constants.EDAM_NOTE_TITLE_LEN_MAX);\r
                urlText = new QLineEdit();\r
                authorText = new QLineEdit();\r
+               geoBox = new QComboBox();\r
                urlLabel = new QLabel();\r
                authorLabel = new QLabel();\r
                conn = c;\r
                urlLabel = new QLabel();\r
                authorLabel = new QLabel();\r
                conn = c;\r
@@ -239,6 +242,14 @@ public class BrowserWindow extends QWidget {
                urlLabel.setVisible(false);\r
                urlText.setVisible(false);\r
                authorLabel.setVisible(false);\r
                urlLabel.setVisible(false);\r
                urlText.setVisible(false);\r
                authorLabel.setVisible(false);\r
+               \r
+               geoBox.setVisible(false);\r
+               geoBox.addItem(new QIcon(iconPath+"globe.png"), "");\r
+               geoBox.addItem(new String("Set"));\r
+               geoBox.addItem(new String("Clear"));\r
+               geoBox.addItem(new String("View On Map"));\r
+               geoBox.activated.connect(this, "geoBoxChanged()");\r
+               \r
                authorText.setVisible(false);\r
                createdDate.setVisible(false);\r
                alteredLabel.setVisible(false);\r
                authorText.setVisible(false);\r
                createdDate.setVisible(false);\r
                alteredLabel.setVisible(false);\r
@@ -291,6 +302,7 @@ public class BrowserWindow extends QWidget {
                QHBoxLayout authorLayout = new QHBoxLayout();\r
                authorLayout.addWidget(authorLabel, 0);\r
                authorLayout.addWidget(authorText, 0);\r
                QHBoxLayout authorLayout = new QHBoxLayout();\r
                authorLayout.addWidget(authorLabel, 0);\r
                authorLayout.addWidget(authorText, 0);\r
+               authorLayout.addWidget(geoBox);\r
                v.addLayout(authorLayout);\r
 \r
                dateLayout.addWidget(createdLabel, 0, 0);\r
                v.addLayout(authorLayout);\r
 \r
                dateLayout.addWidget(createdLabel, 0, 0);\r
@@ -469,6 +481,7 @@ public class BrowserWindow extends QWidget {
                notebookBox.setEnabled(!v);\r
                tagEdit.setEnabled(!v);\r
                authorLabel.setEnabled(!v);\r
                notebookBox.setEnabled(!v);\r
                tagEdit.setEnabled(!v);\r
                authorLabel.setEnabled(!v);\r
+               geoBox.setEnabled(!v);\r
                urlText.setEnabled(!v);\r
                createdDate.setEnabled(!v);\r
                subjectDate.setEnabled(!v);\r
                urlText.setEnabled(!v);\r
                createdDate.setEnabled(!v);\r
                subjectDate.setEnabled(!v);\r
@@ -599,6 +612,7 @@ public class BrowserWindow extends QWidget {
                urlLabel.setVisible(extendedOn);\r
                urlText.setVisible(extendedOn);\r
                authorText.setVisible(extendedOn);\r
                urlLabel.setVisible(extendedOn);\r
                urlText.setVisible(extendedOn);\r
                authorText.setVisible(extendedOn);\r
+               geoBox.setVisible(extendedOn);\r
                authorLabel.setVisible(extendedOn);\r
                createdDate.setVisible(extendedOn);\r
                createdTime.setVisible(extendedOn);\r
                authorLabel.setVisible(extendedOn);\r
                createdDate.setVisible(extendedOn);\r
                createdTime.setVisible(extendedOn);\r
@@ -1617,6 +1631,7 @@ public class BrowserWindow extends QWidget {
                                icon = findIcon(type[0]);\r
                        if (icon.equals("attachment.png"))\r
                                icon = findIcon(url.substring(url.lastIndexOf(".")+1));\r
                                icon = findIcon(type[0]);\r
                        if (icon.equals("attachment.png"))\r
                                icon = findIcon(url.substring(url.lastIndexOf(".")+1));\r
+                       StringBuffer imageBuffer = new StringBuffer();\r
                        String imageURL = FileUtils.toFileURLString(Global.getFileManager().getImageDirFile(icon));\r
 \r
                        logger.log(logger.EXTREME, "Creating resource ");\r
                        String imageURL = FileUtils.toFileURLString(Global.getFileManager().getImageDirFile(icon));\r
 \r
                        logger.log(logger.EXTREME, "Creating resource ");\r
@@ -1650,17 +1665,16 @@ public class BrowserWindow extends QWidget {
 \r
                                PDFPreview pdfPreview = new PDFPreview();\r
                                if (pdfPreview.setupPreview(Global.getFileManager().getResDirPath(fileName), "pdf",0)) {\r
 \r
                                PDFPreview pdfPreview = new PDFPreview();\r
                                if (pdfPreview.setupPreview(Global.getFileManager().getResDirPath(fileName), "pdf",0)) {\r
-                                       // NFC TODO: should this be a 'file://' url like the ones above?\r
-                                       imageURL = file.fileName() + ".png";\r
+                               // NFC TODO: should this be a 'file://' url like the ones above?\r
+                               imageURL = file.fileName() + ".png";\r
                                }\r
                        }\r
                                                \r
                        logger.log(logger.EXTREME, "Generating link tags");\r
                        buffer.append("<a en-tag=\"en-media\" guid=\"" +newRes.getGuid()+"\" ");\r
                        buffer.append(" onContextMenu=\"window.jambi.imageContextMenu(&apos;")\r
                                }\r
                        }\r
                                                \r
                        logger.log(logger.EXTREME, "Generating link tags");\r
                        buffer.append("<a en-tag=\"en-media\" guid=\"" +newRes.getGuid()+"\" ");\r
                        buffer.append(" onContextMenu=\"window.jambi.imageContextMenu(&apos;")\r
-                             .append(Global.getFileManager().getResDirPath(fileName))\r
-                             .append("&apos;);\" ");\r
-                       buffer.append("type=\"" + mimeType + "\" href=\"nnres://" + fileName +"\" hash=\""+Global.byteArrayToHexString(newRes.getData().getBodyHash()) +"\" >");\r
+                     .append(Global.getFileManager().getResDirPath(fileName))\r
+                     .append("&apos;);\" ");                   buffer.append("type=\"" + mimeType + "\" href=\"nnres://" + fileName +"\" hash=\""+Global.byteArrayToHexString(newRes.getData().getBodyHash()) +"\" >");\r
                        buffer.append("<img src=\"" + imageURL + "\" title=\"" +newRes.getAttributes().getFileName());\r
                        buffer.append("\"></img>");\r
                        buffer.append("</a>");\r
                        buffer.append("<img src=\"" + imageURL + "\" title=\"" +newRes.getAttributes().getFileName());\r
                        buffer.append("\"></img>");\r
                        buffer.append("</a>");\r
@@ -1835,6 +1849,42 @@ public class BrowserWindow extends QWidget {
        private void authorChanged() {\r
                noteSignal.authorChanged.emit(currentNote.getGuid(), authorText.text());\r
        }\r
        private void authorChanged() {\r
                noteSignal.authorChanged.emit(currentNote.getGuid(), authorText.text());\r
        }\r
+       \r
+       private void geoBoxChanged() {\r
+               int index = geoBox.currentIndex();\r
+               geoBox.setCurrentIndex(0);\r
+               if (index == 1) {\r
+                       GeoDialog box = new GeoDialog();\r
+                       box.setLongitude(currentNote.getAttributes().getLongitude());\r
+                       box.setLatitude(currentNote.getAttributes().getLatitude());\r
+                       box.setAltitude(currentNote.getAttributes().getAltitude());\r
+                       box.exec();\r
+                       if (!box.okPressed())\r
+                               return;\r
+                       double alt = box.getAltitude();\r
+                       double lat = box.getLatitude();\r
+                       double lon = box.getLongitude();\r
+                       if (alt != currentNote.getAttributes().getAltitude() ||\r
+                               lon != currentNote.getAttributes().getLongitude() ||\r
+                               lat != currentNote.getAttributes().getLatitude()) {\r
+                                       noteSignal.geoChanged.emit(currentNote.getGuid(), lon, lat, alt);\r
+                                       currentNote.getAttributes().setAltitude(alt);\r
+                                       currentNote.getAttributes().setLongitude(lon);\r
+                                       currentNote.getAttributes().setLatitude(lat);\r
+                       }\r
+               }\r
+               \r
+               if (index == 2) {\r
+                       noteSignal.geoChanged.emit(currentNote.getGuid(), 0.0, 0.0, 0.0);\r
+                       currentNote.getAttributes().setAltitude(0.0);\r
+                       currentNote.getAttributes().setLongitude(0.0);\r
+                       currentNote.getAttributes().setLatitude(0.0);\r
+               }\r
+               \r
+               if (index == 3 || index == 0) {\r
+                       QDesktopServices.openUrl(new QUrl("http://maps.google.com/maps?z=6&q="+currentNote.getAttributes().getLatitude() +"," +currentNote.getAttributes().getLongitude()));\r
+               }\r
+       }\r
 \r
        // ************************************************************\r
        // * User chose to save an attachment. Pares out the request *\r
 \r
        // ************************************************************\r
        // * User chose to save an attachment. Pares out the request *\r
@@ -1901,12 +1951,9 @@ public class BrowserWindow extends QWidget {
                fd.setAcceptMode(AcceptMode.AcceptSave);\r
                fd.setDirectory(System.getProperty("user.home"));\r
                String name = request.url().toString();\r
                fd.setAcceptMode(AcceptMode.AcceptSave);\r
                fd.setDirectory(System.getProperty("user.home"));\r
                String name = request.url().toString();\r
-\r
-               // Strip URL prefix and base dir path\r
                name = name.replace("nnres://", "");\r
                String dPath = FileUtils.toForwardSlashedPath(Global.getFileManager().getResDirPath());\r
                name = name.replace(dPath, "");\r
                name = name.replace("nnres://", "");\r
                String dPath = FileUtils.toForwardSlashedPath(Global.getFileManager().getResDirPath());\r
                name = name.replace(dPath, "");\r
-\r
                int pos = name.lastIndexOf('.');\r
                String guid = name;\r
                if (pos > -1) {\r
                int pos = name.lastIndexOf('.');\r
                String guid = name;\r
                if (pos > -1) {\r
@@ -2244,8 +2291,8 @@ public class BrowserWindow extends QWidget {
                                String source; \r
                                if (locTag.startsWith("src")) {\r
                                         source = newSegment.substring(startSrcPos+locTag.length(),endSrcPos);\r
                                String source; \r
                                if (locTag.startsWith("src")) {\r
                                         source = newSegment.substring(startSrcPos+locTag.length(),endSrcPos);\r
-                                       newSegment = newSegment.replace(source,\r
-                                               FileUtils.toForwardSlashedPath(Global.getFileManager().getResDirPath(newFile)));\r
+                                               newSegment = newSegment.replace(source,\r
+                                                       FileUtils.toForwardSlashedPath(Global.getFileManager().getResDirPath(newFile)));\r
                                } else {\r
                                        source = newSegment.substring(startSrcPos+locTag.length(),endSrcPos);\r
                                        newSegment = newSegment.replace(source, newFile);\r
                                } else {\r
                                        source = newSegment.substring(startSrcPos+locTag.length(),endSrcPos);\r
                                        newSegment = newSegment.replace(source, newFile);\r
diff --git a/src/cx/fbn/nevernote/icons/globe.png b/src/cx/fbn/nevernote/icons/globe.png
new file mode 100644 (file)
index 0000000..5413db7
Binary files /dev/null and b/src/cx/fbn/nevernote/icons/globe.png differ
index 6206ea7..dd130be 100644 (file)
Binary files a/src/cx/fbn/nevernote/icons/splash_logo.png and b/src/cx/fbn/nevernote/icons/splash_logo.png differ
index b754828..c046b2a 100644 (file)
 package cx.fbn.nevernote.sql;
 
 import java.io.File;
 package cx.fbn.nevernote.sql;
 
 import java.io.File;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+import com.trolltech.qt.sql.QJdbc;
 
 import cx.fbn.nevernote.Global;
 
 import cx.fbn.nevernote.Global;
-import cx.fbn.nevernote.sql.requests.DatabaseRequest;
+import cx.fbn.nevernote.sql.driver.NSqlQuery;
+import cx.fbn.nevernote.utilities.ApplicationLogger;
 
 
 public class DatabaseConnection {
        // Table helpers
 
 
 public class DatabaseConnection {
        // Table helpers
-       private final WordsTable                                wordsTable;
-       private final TagTable                                  tagTable;
-       private final NotebookTable                             notebookTable;
-       private final NoteTable                                 noteTable;
-       private final DeletedTable                              deletedTable;
-       private final SavedSearchTable                  searchTable;
-       private final WatchFolderTable                  watchFolderTable;
-       private final InvalidXMLTable                   invalidXMLTable;
-       private final SyncTable                                 syncTable;
+       private WordsTable                                      wordsTable;
+       private TagTable                                        tagTable;
+       private NotebookTable                           notebookTable;
+       private NoteTable                                       noteTable;
+       private DeletedTable                            deletedTable;
+       private SavedSearchTable                        searchTable;
+       private WatchFolderTable                        watchFolderTable;
+       private InvalidXMLTable                         invalidXMLTable;
+       private SyncTable                                       syncTable;
+       private final ApplicationLogger         logger;
+       private Connection                                      conn;
        int id;
 
        
        int id;
 
        
-       public DatabaseConnection(int i) {
-               id = i;
-               tagTable = new TagTable(id);
-               notebookTable = new NotebookTable(id);
-               noteTable = new NoteTable(id);
-               deletedTable = new DeletedTable(id);
-               searchTable = new SavedSearchTable(id);
-               watchFolderTable = new WatchFolderTable(id);
-               wordsTable = new WordsTable(id);
-               invalidXMLTable = new InvalidXMLTable(id);
-               syncTable = new SyncTable(id);
+       public DatabaseConnection(ApplicationLogger l, String url, String userid, String password, String cypherPassword) {
+               logger = l;
+               dbSetup(url, userid, password, cypherPassword);
+       }
+       
+       private void setupTables() {
+               tagTable = new TagTable(logger, this);
+               notebookTable = new NotebookTable(logger, this);
+               noteTable = new NoteTable(logger, this);
+               deletedTable = new DeletedTable(logger, this);
+               searchTable = new SavedSearchTable(logger, this);       
+               watchFolderTable = new WatchFolderTable(logger, this);
+               invalidXMLTable = new InvalidXMLTable(logger, this);
+               wordsTable = new WordsTable(logger, this);
+               syncTable = new SyncTable(logger, this);
        }
        
        
        }
        
        
+       // Compact the database
+       public void compactDatabase() {
+               
+       }
+       
        // Initialize the database connection
        // Initialize the database connection
-       public void dbSetup() {
-               // NFC FIXME: should be parameterized with databaseName like in RDatabaseConnection?
-               File f = Global.getFileManager().getDbDirFile("NeverNote.h2.db");
+       public void dbSetup(String url,String userid, String userPassword, String cypherPassword) {
+               logger.log(logger.HIGH, "Entering DatabaseConnection.dbSetup " +id);
+
+               
+               try {
+                       Class.forName("org.h2.Driver");
+               } catch (ClassNotFoundException e1) {
+                       e1.printStackTrace();
+                       System.exit(16);
+               }
+               
+               QJdbc.initialize();
+               
+               File f = Global.getFileManager().getDbDirFile(Global.databaseName + ".h2.db");
                boolean dbExists = f.exists(); 
                
                // If it doesn't exist and we are the main thread, then we need to create stuff.
                boolean dbExists = f.exists(); 
                
                // If it doesn't exist and we are the main thread, then we need to create stuff.
-               if (!dbExists && id  == 0)  {
+               if (!dbExists)  {
                        createTables();
                        Global.setAutomaticLogin(false);
                }
                        createTables();
                        Global.setAutomaticLogin(false);
                }
+               setupTables();
+               
+               logger.log(logger.HIGH, "Entering RDatabaseConnection.dbSetup");
+               
+
+               try {
+                       String passwordString = null;
+                       if (cypherPassword==null || cypherPassword.trim().equals(""))
+                               passwordString = userPassword;
+                       else
+                               passwordString = cypherPassword+" "+userPassword;
+                       conn = DriverManager.getConnection(url,userid,passwordString);
+//                     conn = DriverManager.getConnection(url+";AUTO_SERVER=TRUE",userid,passwordString);
+               } catch (SQLException e) {
+                       e.printStackTrace();
+                       return;
+               }
+               
+               logger.log(logger.HIGH, "Leaving RDatabaseConnection.dbSetup");
+               
+               
+               
+               logger.log(logger.HIGH, "Leaving DatabaseConnection.dbSetup" +id);
        }
        
        
        public void dbShutdown() {
        }
        
        
        public void dbShutdown() {
-               DatabaseRequest req = new DatabaseRequest();
-               req.type = DatabaseRequest.Shutdown;
-               Global.dbRunner.addWork(req);
+               logger.log(logger.HIGH, "Entering RDatabaseConnection.dbShutdown");
+               try {
+                       conn.close();
+               } catch (SQLException e) {
+                       e.printStackTrace();
+               }
+               logger.log(logger.HIGH, "Leaving RDatabaseConnection.dbShutdown");
        }
        
        public void upgradeDb(String version) {
                if (version.equals("0.85")) {
        }
        
        public void upgradeDb(String version) {
                if (version.equals("0.85")) {
-                       DatabaseRequest req = new DatabaseRequest();
-                       req.type = DatabaseRequest.Execute_Sql;
-                       req.string1 = new String("alter table note add column titleColor integer");
-                       Global.dbRunner.addWork(req);
-                       Global.dbClientWait(id);
-                       req.type = DatabaseRequest.Execute_Sql;
-                       req.string1 = new String("update note set titlecolor=-1");
-                       Global.dbRunner.addWork(req);
-                       Global.dbClientWait(id);
-                       req.type = DatabaseRequest.Execute_Sql;
-                       req.string1 = new String("alter table note add column thumbnail blob");
-                       Global.dbRunner.addWork(req);
-                       Global.dbClientWait(id);
-                       req.string1 = new String("alter table note add column thumbnailneeded boolean");
-                       Global.dbRunner.addWork(req);
-                       Global.dbClientWait(id);
-                       req.string1 = new String("Update note set thumbnailneeded = true;");
-                       Global.dbRunner.addWork(req);
-                       Global.dbClientWait(id);
-                       req.string1 = new String("create index NOTE_NOTEBOOK_INDEX on note (notebookguid, guid);");
-                       Global.dbRunner.addWork(req);
-                       Global.dbClientWait(id);
-                       req.string1 = new String("create index NOTETAGS_TAG_INDEX on notetags (tagguid, noteguid);");
-                       Global.dbRunner.addWork(req);
-                       Global.dbClientWait(id);
+                       executeSql("alter table note add column titleColor integer");
+                       executeSql("alter table note add column thumbnail blob");
+                       executeSql("alter table note add column thumbnailneeded boolean");
+                       executeSql("Update note set thumbnailneeded = true;");
+                       executeSql("create index NOTE_NOTEBOOK_INDEX on note (notebookguid, guid);");
+                       executeSql("create index NOTETAGS_TAG_INDEX on notetags (tagguid, noteguid);");
                        version = "0.86";
                        Global.setDatabaseVersion(version);
                } 
        }
        
                        version = "0.86";
                        Global.setDatabaseVersion(version);
                } 
        }
        
+       public void executeSql(String sql) {
+               NSqlQuery query = new NSqlQuery(conn);
+               query.exec(sql);        
+       }
+       
        public void checkDatabaseVersion() {
        public void checkDatabaseVersion() {
-               // NFC FIXME: this needs to read the existing version number from a table in the DB
                if (!Global.getDatabaseVersion().equals("0.86")) {
                        upgradeDb(Global.getDatabaseVersion());
                }
        }
        
                if (!Global.getDatabaseVersion().equals("0.86")) {
                        upgradeDb(Global.getDatabaseVersion());
                }
        }
        
-       public void compactDatabase() {
-               DatabaseRequest request = new DatabaseRequest();
-               request.requestor_id = id;
-               request.type = DatabaseRequest.Compact;
-               Global.dbRunner.addWork(request);
-               Global.dbClientWait(id);
-       }
 
        public void backupDatabase(int highSequence, long date) {
 
        public void backupDatabase(int highSequence, long date) {
-               DatabaseRequest request = new DatabaseRequest();
-               request.requestor_id = id;
-               request.int1 = highSequence;
-               request.long1 = date;
-               request.type = DatabaseRequest.Backup_Database;
-               Global.dbRunner.addWork(request);
-               Global.dbClientWait(id);
+               
        }
        
        
        }
        
        
-       private void createTables() {
+       public void createTables() {
                Global.setDatabaseVersion("0.85");
                Global.setDatabaseVersion("0.85");
-//             Global.setUpdateSequenceNumber(0);
                Global.setAutomaticLogin(false);
                Global.saveCurrentNoteGuid("");
                Global.saveUploadAmount(0);
                
                Global.setAutomaticLogin(false);
                Global.saveCurrentNoteGuid("");
                Global.saveUploadAmount(0);
                
+               getTagTable().createTable();
+               notebookTable.createTable();
+               noteTable.createTable();
+               deletedTable.createTable();             
+               searchTable.createTable();
+               watchFolderTable.createTable();
+               invalidXMLTable.createTable();
+               wordsTable.createTable();
+               syncTable.createTable();
+               
+       }
+       
+       public Connection getConnection() {
+               return conn;
        }
        
        //***************************************************************
        }
        
        //***************************************************************
@@ -17,7 +17,7 @@
  *\r
 */\r
 \r
  *\r
 */\r
 \r
-package cx.fbn.nevernote.sql.runners;\r
+package cx.fbn.nevernote.sql;\r
 \r
 public class DeletedItemRecord {\r
        public String guid;\r
 \r
 public class DeletedItemRecord {\r
        public String guid;\r
index 897590e..ea6610a 100644 (file)
 \r
 package cx.fbn.nevernote.sql;\r
 \r
 \r
 package cx.fbn.nevernote.sql;\r
 \r
+import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import java.util.List;\r
 \r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.sql.requests.DeletedItemRequest;\r
-import cx.fbn.nevernote.sql.runners.DeletedItemRecord;\r
+import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 import cx.fbn.nevernote.utilities.ListManager;\r
 \r
 public class DeletedTable {\r
        ListManager parent;\r
 import cx.fbn.nevernote.utilities.ListManager;\r
 \r
 public class DeletedTable {\r
        ListManager parent;\r
-       int id;\r
+       private final ApplicationLogger                 logger;\r
+       private final DatabaseConnection                db;\r
+\r
        \r
        // Constructor\r
        \r
        // Constructor\r
-       public DeletedTable(int i) {\r
-               id = i;\r
+       public DeletedTable(ApplicationLogger l,DatabaseConnection d) {\r
+               logger = l;\r
+               db = d;\r
        }\r
        // Create the table\r
        public void createTable() {\r
        }\r
        // Create the table\r
        public void createTable() {\r
-               DeletedItemRequest request = new DeletedItemRequest();\r
-               request.requestor_id = id;\r
-               request.type = DeletedItemRequest.Create_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               logger.log(logger.HIGH, "Creating table DeletedItems...");\r
+        if (!query.exec("Create table DeletedItems (guid varchar primary key, type varchar)"))\r
+               logger.log(logger.HIGH, "Table DeletedItems creation FAILED!!!"); \r
        }\r
        // Drop the table\r
        public void dropTable() {\r
        }\r
        // Drop the table\r
        public void dropTable() {\r
-               DeletedItemRequest request = new DeletedItemRequest();\r
-               request.requestor_id = id;\r
-               request.type = DeletedItemRequest.Drop_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("Drop table DeletedItems");\r
        }\r
        // Add an item to the deleted table\r
        public void addDeletedItem(String guid, String type) {\r
        }\r
        // Add an item to the deleted table\r
        public void addDeletedItem(String guid, String type) {\r
-               DeletedItemRequest request = new DeletedItemRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = guid;\r
-               request.string2 = type;\r
-               request.type = DeletedItemRequest.Add_Deleted_Item;\r
-               Global.dbRunner.addWork(request);\r
-       }\r
-       public List<DeletedItemRecord> getAllDeleted() {\r
-               DeletedItemRequest request = new DeletedItemRequest();\r
-               request.requestor_id = id;\r
-               request.type = DeletedItemRequest.Get_All;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               DeletedItemRequest req = Global.dbRunner.deletedItemResponse.get(id).copy();\r
-               return req.responseDeletedRecords;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Insert Into DeletedItems (guid, type) Values(:guid, :type)");\r
+               query.bindValue(":guid", guid);\r
+               query.bindValue(":type", type);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Insert into deleted items failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        }\r
+       // Add an item to the deleted table\r
        public void expungeDeletedItem(String guid, String type) {\r
        public void expungeDeletedItem(String guid, String type) {\r
-               DeletedItemRequest request = new DeletedItemRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = guid;\r
-               request.string2 = type;\r
-               request.type = DeletedItemRequest.Expunge_Record;\r
-               Global.dbRunner.addWork(request);\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("delete from DeletedItems where guid=:guid and type=:type");\r
+               query.bindValue(":guid", guid);\r
+               query.bindValue(":type", type);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Expunge deleted items failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+       }\r
+       public List<DeletedItemRecord> getAllDeleted() {\r
+               logger.log(logger.HIGH, "Entering DeletedTable.getAllDeleted");\r
+               List<DeletedItemRecord> list = new ArrayList<DeletedItemRecord>();\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("Select guid, type from DeletedItems");\r
+               while (query.next()) {\r
+                       DeletedItemRecord record = new DeletedItemRecord();\r
+                       record.guid = query.valueString(0);\r
+                       record.type = query.valueString(1);\r
+                       list.add(record);\r
+               }\r
+               logger.log(logger.HIGH, "Leaving DeletedTable.getAllDeleted");\r
+               return list;\r
+\r
        }\r
        public void expungeAllDeletedRecords() {\r
        }\r
        public void expungeAllDeletedRecords() {\r
-               DeletedItemRequest request = new DeletedItemRequest();\r
-               request.requestor_id = id;\r
-               request.type = DeletedItemRequest.Expunge_All;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("delete from DeletedItems");\r
        }\r
 \r
 }\r
        }\r
 \r
 }\r
index 9d504e8..6bc373a 100644 (file)
@@ -23,81 +23,199 @@ package cx.fbn.nevernote.sql;
 import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import java.util.ArrayList;\r
 import java.util.List;\r
 \r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.sql.requests.InvalidXMLRequest;\r
+import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 import cx.fbn.nevernote.utilities.ListManager;\r
 \r
 public class InvalidXMLTable {\r
        ListManager parent;\r
 import cx.fbn.nevernote.utilities.ListManager;\r
 \r
 public class InvalidXMLTable {\r
        ListManager parent;\r
-       int id;\r
+       private final ApplicationLogger                 logger;\r
+       private final DatabaseConnection                db;\r
+\r
        \r
        // Constructor\r
        \r
        // Constructor\r
-       public InvalidXMLTable(int i) {\r
-               id = i;\r
+       public InvalidXMLTable(ApplicationLogger l, DatabaseConnection d) {\r
+               logger = l;\r
+               db = d;\r
        }\r
        // Create the table\r
        public void createTable() {\r
        }\r
        // Create the table\r
        public void createTable() {\r
-               InvalidXMLRequest request = new InvalidXMLRequest();\r
-               request.requestor_id = id;\r
-               request.type = InvalidXMLRequest.Create_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+//             query.exec("drop table InvalidXML");\r
+               logger.log(logger.HIGH, "Creating table InvalidXML...");\r
+        if (!query.exec("Create table InvalidXML (type varchar, element varchar, attribute varchar,primary key(type, element,attribute) );"))\r
+               logger.log(logger.HIGH, "Table InvalidXML creation FAILED!!!"); \r
+//        query.clear();\r
+        \r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'button', '');");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'embed', '');");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'fieldset', '');");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'form', '');");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'input', '');");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'label', '');");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'legend', '');");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'o:p', '')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'option', '')");        \r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'script', '')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'select', '')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'wbr', '')");\r
+        \r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'a', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'a', 'done')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'a', 'id')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'a', 'onclick')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'a', 'onmousedown')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'div', 'id')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'dl', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'dl', 'id')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'dt', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'h1', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'h2', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'h3', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'h4', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'h5', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'img', 'gptag')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'li', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'ol', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'ol', 'id')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'p', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'p', 'id')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'p', 'span')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'accesskey')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'action')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'alt')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'bgcolor')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'checked')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'flashvars')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'for')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'height')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'id')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'maxlength')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'method')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'name')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'onblur')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'onchange')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'aclick')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'onsubmit')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'quality')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'selected')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'src')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'target')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'type')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'value')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'width')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'wmode')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'table', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'td', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'tr', 'class')");\r
+        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'ul', 'class')");\r
+\r
        }\r
        // Drop the table\r
        public void dropTable() {\r
        }\r
        // Drop the table\r
        public void dropTable() {\r
-               InvalidXMLRequest request = new InvalidXMLRequest();\r
-               request.requestor_id = id;\r
-               request.type = InvalidXMLRequest.Drop_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("Drop table InvalidXML");\r
        }\r
        }\r
-       // Add an invalid XML element to the table\r
-       public void addInvalidElement(String element) {\r
-               InvalidXMLRequest request = new InvalidXMLRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = element;\r
-               request.type = InvalidXMLRequest.Add_Invalid_Element;\r
-               Global.dbRunner.addWork(request);\r
+       // Add an item to the table\r
+       public void addAttribute(String element, String attribute) {\r
+               if (attributeExists(element,attribute))\r
+                       return;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Insert Into InvalidXML (type, element, attribute) Values('ATTRIBUTE', :element, :attribute)");\r
+               query.bindValue(":element", element);\r
+               query.bindValue(":attribute", attribute);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Insert Attribute into invalidXML failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        }\r
-       // Add an invalid XML attribute to the table\r
-       public void addInvalidAttribute(String element, String attribute) {\r
-               InvalidXMLRequest request = new InvalidXMLRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = element;\r
-               request.string2 = attribute;\r
-               request.type = InvalidXMLRequest.Add_Invalid_Attribute;\r
-               Global.dbRunner.addWork(request);\r
+       // Add an item to the table\r
+       public void addElement(String element) {\r
+               if (elementExists(element))\r
+                       return;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Insert Into InvalidXML (type, element) Values('ELEMENT', :element)");\r
+               query.bindValue(":element", element);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Insert Element into invalidXML failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        }\r
-       // Get invalid attributes for a given element\r
+       // get invalid elements\r
+       public List<String> getInvalidElements() {\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               if (!query.exec("Select element from InvalidXML where type = 'ELEMENT'")) {\r
+                       logger.log(logger.MEDIUM, "getInvalidElement from invalidXML failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               List<String> elements = new ArrayList<String>();\r
+               while (query.next()) {\r
+                       elements.add(query.valueString(0));\r
+               }\r
+               return elements;\r
+       }\r
+       \r
+       // get invalid elements\r
        public List<String> getInvalidAttributeElements() {\r
        public List<String> getInvalidAttributeElements() {\r
-               InvalidXMLRequest request = new InvalidXMLRequest();\r
-               request.requestor_id = id;\r
-               request.type = InvalidXMLRequest.Get_Invalid_Attribute_Elements;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               InvalidXMLRequest req = Global.dbRunner.invalidXMLResponse.get(id).copy();\r
-               return req.responseList;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               if (!query.exec("Select distinct element from InvalidXML where type = 'ATTRIBUTE'")) {\r
+                       logger.log(logger.MEDIUM, "getInvalidElement from invalidXML failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               List<String> elements = new ArrayList<String>();\r
+               while (query.next()) {\r
+                       elements.add(query.valueString(0));\r
+               }\r
+               return elements;\r
        }\r
        }\r
-       // Get the list of elements which we have invalid attributes for\r
+       // get invalid attributes for a given element\r
        public ArrayList<String> getInvalidAttributes(String element) {\r
        public ArrayList<String> getInvalidAttributes(String element) {\r
-               InvalidXMLRequest request = new InvalidXMLRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = element;\r
-               request.type = InvalidXMLRequest.Get_Invalid_Attributes;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               InvalidXMLRequest req = Global.dbRunner.invalidXMLResponse.get(id).copy();\r
-               return req.responseArrayList;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Select attribute from InvalidXML where type = 'ATTRIBUTE' and element = :element");\r
+               query.bindValue(":element", element);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "getInvalidElement from invalidXML failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               ArrayList<String> elements = new ArrayList<String>();\r
+               while (query.next()) {\r
+                       elements.add(query.valueString(0));\r
+               }\r
+               return elements;\r
        }\r
        }\r
-       // Add an invalid XML attribute to the table\r
-       public List<String> getInvalidElements() {\r
-               InvalidXMLRequest request = new InvalidXMLRequest();\r
-               request.requestor_id = id;\r
-               request.type = InvalidXMLRequest.Get_Invalid_Elements;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               InvalidXMLRequest req = Global.dbRunner.invalidXMLResponse.get(id).copy();\r
-               return req.responseList;\r
+\r
+       // Determine if an element already is in the table\r
+       public boolean elementExists(String element) {\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Select element from InvalidXML where type='ELEMENT' and element=:element");\r
+               query.bindValue(":element", element);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "elementExists in invalidXML failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               if (query.next())\r
+                       return true;\r
+               else\r
+                       return false;\r
        }\r
        \r
        }\r
        \r
-       \r
-\r
+       // Determine if an element already is in the table\r
+       public boolean attributeExists(String element, String attribute) {\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Select element from InvalidXML where type='ATTRIBUTE' and element=:element and attribute=:attribute");\r
+               query.bindValue(":element", element);\r
+               query.bindValue(":attribute", attribute);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "attributeExists in invalidXML failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               if (query.next())\r
+                       return true;\r
+               else\r
+                       return false;\r
+       }\r
 }\r
 }\r
index a0461e7..25bd0d5 100644 (file)
 \r
 \r
 package cx.fbn.nevernote.sql;\r
 \r
 \r
 package cx.fbn.nevernote.sql;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import java.util.List;\r
 \r
+import com.evernote.edam.type.Data;\r
 import com.evernote.edam.type.Resource;\r
 import com.evernote.edam.type.Resource;\r
+import com.evernote.edam.type.ResourceAttributes;\r
+import com.trolltech.qt.core.QByteArray;\r
 \r
 \r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.sql.requests.ResourceRequest;\r
+import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 \r
 \r
 \r
 \r
-public class NoteResourceTable {\r
-       private final int id;\r
+\r
+public class NoteResourceTable  {\r
+       /**\r
+        * \r
+        */\r
+       private static final long serialVersionUID = 1L;\r
+       private final ApplicationLogger                 logger;\r
+       private final DatabaseConnection                db;     \r
        \r
        // Constructor\r
        \r
        // Constructor\r
-       public NoteResourceTable(int i) {\r
-               id = i;\r
+       public NoteResourceTable(ApplicationLogger l, DatabaseConnection d) {\r
+               logger = l;\r
+               db = d;\r
        }\r
        // Create the table\r
        public void createTable() {\r
        }\r
        // Create the table\r
        public void createTable() {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Create_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+        // Create the NoteResource table\r
+        logger.log(logger.HIGH, "Creating table NoteResource...");\r
+        if (!query.exec("Create table NoteResources (guid varchar primary key, " +\r
+                       "noteGuid varchar, updateSequenceNumber integer, dataHash varchar, "+\r
+                       "dataSize integer, dataBinary blob, "+\r
+                       "mime varchar, width integer, height integer, duration integer, "+\r
+                       "active integer, recognitionHash varchar, recognitionSize integer, " +\r
+                       "recognitionBinary varchar, attributeSourceUrl varchar, attributeTimestamp timestamp, " +\r
+                       "attributeLatitude double, attributeLongitude double, "+\r
+                       "attributeAltitude double, attributeCameraMake varchar, attributeCameraModel varchar, "\r
+                       +"attributeClientWillIndex varchar, attributeRecoType varchar, attributeFileName varchar,"+\r
+                       "attributeAttachment boolean, isDirty boolean, indexNeeded boolean)"))\r
+               logger.log(logger.HIGH, "Table NoteResource creation FAILED!!!"); \r
+        if (!query.exec("CREATE INDEX unindexed_resources on noteresources (indexneeded desc, guid);"))\r
+               logger.log(logger.HIGH, "Noteresources unindexed_resources index creation FAILED!!!");\r
+        if (!query.exec("CREATE INDEX resources_dataheshhex on noteresources (datahash, guid);"))\r
+               logger.log(logger.HIGH, "Noteresources resources_datahash index creation FAILED!!!");  \r
+        \r
        }\r
        // Drop the table\r
        public void dropTable() {               \r
        }\r
        // Drop the table\r
        public void dropTable() {               \r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Drop_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("Drop table NoteResources");\r
        }\r
        // Reset the dirty flag\r
        public void  resetDirtyFlag(String guid) {\r
        }\r
        // Reset the dirty flag\r
        public void  resetDirtyFlag(String guid) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Reset_Dirty_Flag;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Update noteresources set isdirty=false where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Error resetting noteresource dirty field. " +query.lastError());\r
        }\r
        // Set if the resource should be indexed\r
        public void  setIndexNeeded(String guid, Boolean indexNeeded) {\r
        }\r
        // Set if the resource should be indexed\r
        public void  setIndexNeeded(String guid, Boolean indexNeeded) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Set_Index_Needed;\r
-               request.string1 = new String(guid);\r
-               request.bool1 = indexNeeded;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());            \r
+               query.prepare("Update noteresources set indexNeeded=:needed where guid=:guid");\r
+               query.bindValue(":needed", indexNeeded);\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Error setting noteresource indexneeded field: " +query.lastError());\r
        }\r
        // get any unindexed resource\r
        public List<String> getNextUnindexed(int limit) {\r
        }\r
        // get any unindexed resource\r
        public List<String> getNextUnindexed(int limit) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Get_Next_Unindexed;\r
-               request.int1 = limit;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               ResourceRequest req = Global.dbRunner.resourceResponse.get(id).copy();\r
-               return req.responseStrings;\r
+               List<String> guids = new ArrayList<String>();\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               if (!query.exec("Select guid from NoteResources where indexNeeded = true limit " +limit))\r
+                       logger.log(logger.EXTREME, "NoteResources SQL retrieve has failed on getNextUnindexed(): " +query.lastError());\r
+\r
+               // Get a list of the notes\r
+               String guid;\r
+               while (query.next()) {\r
+                       guid = new String();\r
+                       guid = query.valueString(0);\r
+                       guids.add(guid);\r
+               }       \r
+               return guids;   \r
        }\r
        }\r
+\r
+\r
+       \r
        public void saveNoteResource(Resource r, boolean isDirty) {\r
        public void saveNoteResource(Resource r, boolean isDirty) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Save_Note_Resource;\r
-               request.resource = r.deepCopy();\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
-//             Global.dbClientWait(id);\r
+               logger.log(logger.HIGH, "Entering DBRunner.saveNoteResources");\r
+               boolean check;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");\r
+               \r
+               check = query.prepare("Insert Into NoteResources ("\r
+                               +"guid, noteGuid, dataHash, dataSize, dataBinary, updateSequenceNumber, "\r
+                               +"mime, width, height, duration, active, recognitionHash, "                             \r
+                               +"recognitionSize, recognitionBinary, attributeSourceUrl, attributeTimestamp, "\r
+                               +"attributeLatitude, attributeLongitude, attributeAltitude, attributeCameraMake, "\r
+                               +"attributeCameraModel, "\r
+                               +"attributeClientWillIndex, attributeRecoType, attributeFileName, attributeAttachment, isDirty, "\r
+                               +"indexNeeded) Values("\r
+                               +":guid, :noteGuid, :dataHash,:dataSize, :dataBody, :updateSequenceNumber, "\r
+                               +":mime, :width, :height, :duration, :active, :recognitionHash, "                               \r
+                               +":recognitionSize, :recognitionBody, :attributeSourceUrl, :attributeTimestamp, "\r
+                               +":attributeLatitude, :attributeLongitude, :attributeAltitude, :attributeCameraMake, "\r
+                               +":attributeCameraModel, "\r
+                               +":attributeClientWillIndex, :attributeRecoType, :attributeFileName, :attributeAttachment, "\r
+                               +":isDirty, true)");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "NoteResource SQL insert prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+       \r
+                       query.bindValue(":guid", r.getGuid());\r
+                       query.bindValue(":noteGuid", r.getNoteGuid());\r
+                       if (r.getData() != null) {\r
+//                             query.bindValue(":dataHash", new QByteArray(r.getData().getBodyHash()).toHex());\r
+//                             query.bindValue(":dataHash", "");\r
+                               query.bindValue(":dataHash", byteArrayToHexString(r.getData().getBodyHash()));\r
+                               query.bindValue(":dataSize", r.getData().getSize());\r
+                               query.bindBlob(":dataBody", r.getData().getBody());\r
+                       }\r
+                       query.bindValue(":updateSequenceNumber", r.getUpdateSequenceNum());\r
+                       query.bindValue(":mime", r.getMime());\r
+                       query.bindValue(":width", new Integer(r.getWidth()));\r
+                       query.bindValue(":height", new Integer(r.getHeight()));\r
+                       query.bindValue(":duration", new Integer(r.getDuration()));\r
+                       query.bindValue(":active", r.isActive());\r
+                       if (r.getRecognition() != null) {\r
+                               query.bindValue(":recognitionHash", r.getRecognition().getBodyHash());\r
+                               query.bindValue(":recognitionSize", r.getRecognition().getSize());\r
+                               if (r.getRecognition().getBody() != null)\r
+                                       query.bindValue(":recognitionBody", new String(r.getRecognition().getBody()));\r
+                               else\r
+                                       query.bindValue(":recognitionBody", "");\r
+                       } else {\r
+                               query.bindValue(":recognitionHash", "");\r
+                               query.bindValue(":recognitionSize", 0);\r
+                               query.bindValue(":recognitionBody", "");\r
+                       }\r
+                       if (r.getAttributes() != null) {\r
+                               query.bindValue(":attributeSourceUrl", r.getAttributes().getSourceURL());\r
+                               StringBuilder ts = new StringBuilder(simple.format(r.getAttributes().getTimestamp()));\r
+                               query.bindValue(":attributeTimestamp", ts.toString());\r
+                               query.bindValue(":attributeLatitude", r.getAttributes().getLatitude());\r
+                               query.bindValue(":attributeLongitude", r.getAttributes().getLongitude());\r
+                               query.bindValue(":attributeAltitude", r.getAttributes().getAltitude());\r
+                               query.bindValue(":attributeCameraMake", r.getAttributes().getCameraMake());\r
+                               query.bindValue(":attributeCameraModel", r.getAttributes().getCameraModel());\r
+                               query.bindValue(":attributeClientWillIndex", r.getAttributes().isClientWillIndex());\r
+                               query.bindValue(":attributeRecoType", r.getAttributes().getRecoType());\r
+                               query.bindValue(":attributeFileName", r.getAttributes().getFileName());\r
+                               query.bindValue(":attributeAttachment", r.getAttributes().isAttachment());                      \r
+                       }\r
+                       query.bindValue(":isDirty", isDirty);\r
+                                               \r
+                       check = query.exec();\r
+                       if (!check) {\r
+                               logger.log(logger.MEDIUM, "*** NoteResource Table insert failed.");             \r
+                               logger.log(logger.MEDIUM, query.lastError());\r
+                       }\r
+                       \r
+                                               \r
+                       logger.log(logger.HIGH, "Leaving DBRunner.saveNoteResources");\r
        }\r
        // delete an old resource\r
        public void expungeNoteResource(String guid) {\r
        }\r
        // delete an old resource\r
        public void expungeNoteResource(String guid) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Expunge_Note_Resource;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("delete from NoteResources where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               query.exec();\r
        }\r
 \r
        }\r
 \r
+       \r
        // Get a note resource from the database by it's hash value\r
        public String getNoteResourceGuidByHashHex(String noteGuid, String hash) {\r
        // Get a note resource from the database by it's hash value\r
        public String getNoteResourceGuidByHashHex(String noteGuid, String hash) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Get_Note_Resource_Guid_By_Hash_Hex;\r
-               request.string1 = new String(noteGuid);\r
-               request.string2 = new String(hash);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               ResourceRequest req = Global.dbRunner.resourceResponse.get(id).copy();\r
-               return req.responseString;      \r
+               logger.log(logger.HIGH, "Entering DBRunner.getNoteResourceGuidByHashHex");\r
+\r
+               boolean check;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               check = query.prepare("Select guid from NoteResources " +\r
+                                       "where noteGuid=:noteGuid and dataHash=:hash");\r
+               if (check)\r
+                       logger.log(logger.EXTREME, "NoteResource SQL select prepare was successful.");\r
+               else {\r
+                       logger.log(logger.EXTREME, "NoteResource SQL select prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               query.bindValue(":noteGuid", noteGuid);\r
+               query.bindValue(":hash", hash);\r
+       \r
+               check = query.exec();\r
+               if (!check)      {\r
+                       logger.log(logger.MEDIUM, "dbRunner.getNoteResourceGuidByHashHex Select failed." +\r
+                                       "Note Guid:" +noteGuid+\r
+                                       "Data Body Hash:" +hash);               \r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               if (!query.next()) {\r
+                       logger.log(logger.MEDIUM, "Note Resource not found.");\r
+                       return null;\r
+               }\r
+               return query.valueString(0);\r
        }\r
        }\r
+\r
        // Get a note resource from the database by it's hash value\r
        public Resource getNoteResourceDataBodyByHashHex(String noteGuid, String hash) {\r
        // Get a note resource from the database by it's hash value\r
        public Resource getNoteResourceDataBodyByHashHex(String noteGuid, String hash) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Get_Note_Resource_Data_Body_By_Hash_Hex;\r
-               request.string1 = new String(noteGuid);\r
-               request.string2 = new String(hash);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               ResourceRequest req = Global.dbRunner.resourceResponse.get(id).copy();\r
-               return req.responseResource;\r
-       }\r
-\r
-       // Update a note resource guid\r
-       public void updateNoteResourceGuid(String oldGuid, String newGuid, boolean isDirty) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Update_Note_Resource_Guid;\r
-               request.string1 = new String(oldGuid);\r
-               request.string2 = new String(newGuid);\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
-//             Global.dbClientWait(id);\r
-       }\r
-       \r
+               logger.log(logger.HIGH, "Entering DBRunner.getNoteResourceDataBodyByHash");\r
 \r
 \r
-       // Reset update sequence number to zero\r
-       public void resetUpdateSequenceNumber(String guid, boolean isDirty) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Reset_Update_Sequence_Number;\r
-               request.string1 = new String(guid);\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               check = query.prepare("Select guid, mime, from NoteResources " +\r
+                                       "where noteGuid=:noteGuid and dataHash=:hash");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "NoteResource SQL select prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               query.bindValue(":noteGuid", noteGuid);\r
+               query.bindValue(":hash", hash);\r
+       \r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "NoteResource Select failed." +\r
+                                       "Note Guid:" +noteGuid+\r
+                                       "Data Body Hash:" +hash);               \r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               if (!query.next()) {\r
+                       logger.log(logger.MEDIUM, "Note Resource not found.");\r
+                       return null;\r
+               }\r
+               \r
+               Resource r = new Resource();\r
+               r.setGuid(query.valueString(0));\r
+               r.setMime(query.valueString(1));\r
+               \r
+               NSqlQuery binary = new NSqlQuery(db.getConnection());\r
+               if (!binary.prepare("Select databinary from NoteResources " +\r
+                                       "where guid=:guid")) {\r
+                       logger.log(logger.MEDIUM, "Prepare for NoteResources Binary failed");\r
+                       logger.log(logger.MEDIUM, binary.lastError());\r
+               }\r
+               \r
+               if (!binary.exec()) {\r
+                       logger.log(logger.MEDIUM, "NoteResources Binary Select failed." +\r
+                                       "Note Guid:" +noteGuid+\r
+                                       "Data Body Hash:" +hash);               \r
+                       logger.log(logger.MEDIUM, binary.lastError());\r
+               }\r
+               if (!binary.next()) {\r
+                       logger.log(logger.MEDIUM, "Note Resource Binary not found.");\r
+                       return null;\r
+               }\r
+               \r
+               Data d = new Data();\r
+               r.setData(d);\r
+               d.setBody(binary.valueString(0).getBytes());\r
+               logger.log(logger.HIGH, "Leaving DBRunner.getNoteResourceDataBodyByHash");\r
+               return r;\r
        }\r
        }\r
+\r
        \r
        // Get a note's resourcesby Guid\r
        public Resource getNoteResource(String guid, boolean withBinary) {\r
        \r
        // Get a note's resourcesby Guid\r
        public Resource getNoteResource(String guid, boolean withBinary) {\r
-               if (guid == null) \r
+               if (guid == null)\r
+                       return null;\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               String queryString;\r
+               queryString = new String("Select guid, noteGuid, mime, width, height, duration, "\r
+                               +"active, updateSequenceNumber, dataHash, dataSize, "\r
+                               +"recognitionHash, recognitionSize, "\r
+                               +"attributeLatitude, attributeLongitude, attributeAltitude, "\r
+                               +"attributeCameraMake, attributeCameraModel, attributeClientWillIndex, "\r
+                               +"attributeRecoType, attributeFileName, attributeAttachment, recognitionBinary "\r
+                               +" from NoteResources where guid=:guid");\r
+\r
+               \r
+               query.prepare(queryString);\r
+               \r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.EXTREME, "NoteResources SQL select has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
                        return null;\r
                        return null;\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Get_Note_Resource;\r
-               request.string1 = new String(guid);\r
-               request.bool1 = withBinary;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               ResourceRequest req = Global.dbRunner.resourceResponse.get(id).copy();\r
-               return req.responseResource;\r
+               }\r
+               Resource r = null;\r
+               if (query.next()) {\r
+                                                                       \r
+                       r = new Resource();\r
+                       r.setGuid(query.valueString(0));        // Resource Guid\r
+                       r.setNoteGuid(query.valueString(1));   // note Guid\r
+                       r.setMime(query.valueString(2));       // Mime Type\r
+                       r.setWidth(new Short(query.valueString(3)));  // Width\r
+                       r.setHeight(new Short(query.valueString(4)));  // Height\r
+                       r.setDuration(new Short(query.valueString(5)));  // Duration\r
+                       r.setActive(new Boolean(query.valueString(6)));  // active\r
+                       r.setUpdateSequenceNum(new Integer(query.valueString(7)));  // update sequence number\r
+                       \r
+                       Data d = new Data();\r
+                       byte[] h = query.valueString(8).getBytes();    // data hash\r
+                       QByteArray hData = new QByteArray(h);\r
+                       QByteArray bData = new QByteArray(QByteArray.fromHex(hData));\r
+                       d.setBodyHash(bData.toByteArray());\r
+                       d.setSize(new Integer(query.valueString(9)));\r
+                       r.setData(d);\r
+                       \r
+                       Data rec = new Data();\r
+                       if (query.valueObject(10) != null)\r
+                               rec.setBodyHash(query.valueString(10).getBytes());   // Recognition Hash\r
+                       if (query.valueObject(11) != null)\r
+                               rec.setSize(new Integer(query.valueString(11)));\r
+                       else\r
+                               rec.setSize(0);\r
+                       r.setRecognition(rec);\r
+\r
+                       ResourceAttributes a = new ResourceAttributes();\r
+                       if (!query.valueString(12).equals(""))              // Latitude\r
+                               a.setLatitude(new Float(query.valueString(12)));\r
+                       if (!query.valueString(13).equals(""))              // Longitude\r
+                               a.setLongitude(new Float(query.valueString(13)));\r
+                       if (!query.valueString(14).equals(""))              // Altitude\r
+                               a.setAltitude(new Float(query.valueString(14)));\r
+                       a.setCameraMake(stringValue(query.valueString(15)));              // Camera Make\r
+                       a.setCameraModel(stringValue(query.valueString(16)));\r
+                       a.setClientWillIndex(booleanValue(query.valueString(17).toString(),false));  // Camera Model\r
+                       a.setRecoType(stringValue(query.valueString(18)));                 // Recognition Type\r
+                       a.setFileName(stringValue(query.valueString(19)));                  // File Name\r
+                       a.setAttachment(booleanValue(query.valueString(20).toString(),false));\r
+                       r.setAttributes(a);\r
+               \r
+                       if (withBinary) {\r
+                           \r
+                               query.prepare("Select dataBinary from NoteResources where guid=:guid");\r
+                               query.bindValue(":guid", r.getGuid());\r
+                               query.exec();\r
+                               if (query.next()) {\r
+                                       byte[] b = query.getBlob(0);\r
+                                       r.getData().setBody(b);\r
+                               }\r
+                       } \r
+               }\r
+               return r;\r
        }\r
        \r
        \r
        // Get a note's resourcesby Guid\r
        public List<Resource> getNoteResources(String noteGuid, boolean withBinary) {\r
        }\r
        \r
        \r
        // Get a note's resourcesby Guid\r
        public List<Resource> getNoteResources(String noteGuid, boolean withBinary) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Get_Note_Resources;\r
-               request.string1 = new String(noteGuid);\r
-               request.bool1 = withBinary;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               ResourceRequest req = Global.dbRunner.resourceResponse.get(id).copy();\r
-               return req.responseResources;\r
+               if (noteGuid == null)\r
+                       return null;\r
+               List<Resource> res = new ArrayList<Resource>();\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Select guid"\r
+                               +" from NoteResources where noteGuid = :noteGuid");\r
+               query.bindValue(":noteGuid", noteGuid);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.EXTREME, "NoteResources SQL select has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               while (query.next()) {\r
+                       String guid = (query.valueString(0));\r
+                       res.add(getNoteResource(guid, withBinary));\r
+               }       \r
+               return res;\r
        }\r
        }\r
-       \r
-       \r
        // Get all of a note's recognition data by the note guid\r
        public List<Resource> getNoteResourcesRecognition(String noteGuid) {\r
        // Get all of a note's recognition data by the note guid\r
        public List<Resource> getNoteResourcesRecognition(String noteGuid) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Get_Note_Resources_Recognition;\r
-               request.string1 = new String(noteGuid);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               ResourceRequest req = Global.dbRunner.resourceResponse.get(id).copy();\r
-               return req.responseResources;\r
+               if (noteGuid == null)\r
+                       return null;\r
+               boolean check;\r
+               List<Resource> res = new ArrayList<Resource>();\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Select "\r
+                               +"recognitionHash, recognitionSize, recognitionBinary "\r
+                               +" from NoteResources where noteGuid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "NoteTable.getNoteRecognition SQL prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               query.bindValue(":guid", noteGuid);\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "NoteTable.getNoteRecognition exec has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               while (query.next()) {  \r
+                       Resource r = new Resource();            \r
+                       res.add(r);\r
+                       Data rec = new Data();\r
+                       rec.setBodyHash(query.valueString(0).getBytes());\r
+                       String x = new String(query.valueString(1));\r
+                       if (!x.equals("")) {\r
+                               rec.setSize(new Integer(x));\r
+                               rec.setBody(query.valueString(2).getBytes());\r
+                       } else\r
+                               rec.setSize(0);\r
+                       r.setRecognition(rec);\r
+               }       \r
+               return res;\r
        }\r
        \r
        }\r
        \r
+       \r
        // Get a note's recognition data by it's guid.\r
        public Resource getNoteResourceRecognition(String guid) {\r
        // Get a note's recognition data by it's guid.\r
        public Resource getNoteResourceRecognition(String guid) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Get_Note_Resource_Recognition;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);       \r
-               Global.dbClientWait(id);\r
-               ResourceRequest req = Global.dbRunner.resourceResponse.get(id).copy();\r
-               return req.responseResource;\r
+               if (guid == null)\r
+                       return null;\r
+               boolean check;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Select "\r
+                               +"recognitionHash, recognitionSize, recognitionBinary, noteGuid "\r
+                               +" from NoteResources where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "NoteTable.getNoteRecognition SQL prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               query.bindValue(":guid", guid);\r
+               query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "NoteTable.getNoteRecognition exec has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               Resource r = null;\r
+               while (query.next()) {\r
+                                                                       \r
+                       r = new Resource();             \r
+                       Data rec = new Data();\r
+                       rec.setBodyHash(query.valueString(0).getBytes());\r
+                       String x = new String(query.valueString(1));\r
+                       if (!x.equals("")) {\r
+                               rec.setSize(new Integer(x));\r
+                               rec.setBody(query.valueString(2).getBytes());\r
+                       } else\r
+                               rec.setSize(0);\r
+                       r.setRecognition(rec);\r
+                       r.setNoteGuid(query.valueString(3));\r
+               }       \r
+               return r;\r
        }\r
        }\r
+\r
        // Save Note Resource\r
        public void updateNoteResource(Resource r, boolean isDirty) {\r
        // Save Note Resource\r
        public void updateNoteResource(Resource r, boolean isDirty) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Update_Note_Resource;\r
-               request.resource = r.deepCopy();\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
+               logger.log(logger.HIGH, "Entering ListManager.updateNoteResource");\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("delete from NoteResources where guid=:recGuid");\r
+               query.bindValue(":recGuid", r.getGuid());\r
+               query.exec();\r
+               saveNoteResource(r, isDirty);\r
+               logger.log(logger.HIGH, "Leaving RNoteResourceTable.updateNoteResource");\r
+       }\r
+       // Update note resource GUID\r
+       public void updateNoteResourceGuid(String oldGuid, String newGuid, boolean isDirty) {\r
+               logger.log(logger.HIGH, "Entering RNoteResourceTable.updateNoteResourceGuid");\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("update NoteResources set guid=:newGuid, isDirty=:isDirty where guid=:oldGuid");\r
+               query.bindValue(":newGuid", newGuid);\r
+               query.bindValue(":isDirty", isDirty);\r
+               query.bindValue(":oldGuid", oldGuid);\r
+               query.exec();\r
+               logger.log(logger.HIGH, "Leaving RNoteResourceTable.updateNoteResourceGuid");\r
+       }\r
+       // Update note resource GUID\r
+       public void resetUpdateSequenceNumber(String guid, boolean isDirty) {\r
+               logger.log(logger.HIGH, "Entering RNoteResourceTable.updateNoteResourceGuid");\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("update NoteResources set updateSequenceNumber=0, isDirty=:isDirty where guid=:guid");\r
+               query.bindValue(":isDirty", isDirty);\r
+               query.bindValue(":guid", guid);\r
+               query.exec();\r
+               logger.log(logger.HIGH, "Leaving RNoteResourceTable.updateNoteResourceGuid");\r
        }\r
        \r
        // Drop the table\r
        public void reindexAll() {              \r
        }\r
        \r
        // Drop the table\r
        public void reindexAll() {              \r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Reindex_All;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("Update NoteResources set indexneeded=true");\r
        }\r
        // Count unindexed notes\r
        public int getResourceCount() {\r
        }\r
        // Count unindexed notes\r
        public int getResourceCount() {\r
-               ResourceRequest request = new ResourceRequest();\r
-               request.requestor_id = id;\r
-               request.type = ResourceRequest.Get_Resource_Count;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               ResourceRequest req = Global.dbRunner.resourceResponse.get(id).copy();\r
-               return req.responseInteger;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("select count(*) from noteresources");\r
+               query.next(); \r
+               int returnValue = new Integer(query.valueString(0));\r
+               return returnValue;\r
+       }\r
+\r
+       //********************************************\r
+       //** Utility Functions\r
+       //********************************************\r
+       // Convert a byte array to a hex string\r
+       private static String byteArrayToHexString(byte data[]) {\r
+               StringBuffer buf = new StringBuffer();\r
+           for (byte element : data) {\r
+               int halfbyte = (element >>> 4) & 0x0F;\r
+               int two_halfs = 0;\r
+               do {\r
+                       if ((0 <= halfbyte) && (halfbyte <= 9))\r
+                              buf.append((char) ('0' + halfbyte));\r
+                          else\r
+                               buf.append((char) ('a' + (halfbyte - 10)));\r
+                       halfbyte = element & 0x0F;\r
+               } while(two_halfs++ < 1);\r
+           }\r
+           return buf.toString();              \r
        }\r
        }\r
+\r
+       \r
+       private String stringValue(Object value) {\r
+               if (value != null && value.toString() != null) \r
+                       return value.toString();\r
+               else\r
+                       return null;\r
+       }\r
+       \r
+       private  boolean booleanValue(Object value, boolean unknown) {\r
+               if (value != null && value.toString() != null) {\r
+                       try {\r
+                               if ((Integer)value > 0)\r
+                                       return true;\r
+                               else\r
+                                       return false;\r
+                       } catch (java.lang.ClassCastException e) {\r
+                               try {\r
+                                       String stringValue = (String)value;\r
+                                       if (stringValue.equalsIgnoreCase("true"))\r
+                                               return true;\r
+                                       else \r
+                                               return false;\r
+                               } catch (java.lang.ClassCastException e1) { \r
+                                       return unknown;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+                       return unknown;\r
+       }\r
+\r
 }\r
 }\r
index fa89e40..945e7e3 100644 (file)
 \r
 package cx.fbn.nevernote.sql;\r
 \r
 \r
 package cx.fbn.nevernote.sql;\r
 \r
+import java.text.DateFormat;\r
+import java.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import com.evernote.edam.type.Note;\r
 import java.util.List;\r
 \r
 import com.evernote.edam.type.Note;\r
+import com.evernote.edam.type.NoteAttributes;\r
+import com.evernote.edam.type.Resource;\r
+import com.evernote.edam.type.Tag;\r
 import com.trolltech.qt.core.QByteArray;\r
 import com.trolltech.qt.core.QDateTime;\r
 import com.trolltech.qt.core.QByteArray;\r
 import com.trolltech.qt.core.QDateTime;\r
+import com.trolltech.qt.core.QTextCodec;\r
 \r
 import cx.fbn.nevernote.Global;\r
 \r
 import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.sql.requests.NoteRequest;\r
+import cx.fbn.nevernote.evernote.EnmlConverter;\r
+import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 import cx.fbn.nevernote.utilities.Pair;\r
 \r
 public class NoteTable {\r
 import cx.fbn.nevernote.utilities.Pair;\r
 \r
 public class NoteTable {\r
+       private final ApplicationLogger                 logger;\r
+       public final NoteTagsTable                              noteTagsTable;\r
        public NoteResourceTable                                noteResourceTable;\r
        public NoteResourceTable                                noteResourceTable;\r
-       public NoteTagsTable                                    noteTagsTable;\r
-       \r
+       private final DatabaseConnection                db;\r
        int id;\r
        int id;\r
+\r
+       // Prepared Queries to improve speed\r
+       private NSqlQuery                                               getQueryWithContent;\r
+       private NSqlQuery                                               getQueryWithoutContent;\r
+       private NSqlQuery                                               getAllQueryWithoutContent;\r
        \r
        // Constructor\r
        \r
        // Constructor\r
-       public NoteTable(int i) {\r
-               id = i;\r
-               noteTagsTable = new NoteTagsTable(id);\r
-               noteResourceTable = new NoteResourceTable(id);\r
+       public NoteTable(ApplicationLogger l, DatabaseConnection d) {\r
+               logger = l;\r
+               db = d;\r
+               id = 0;\r
+               noteResourceTable = new NoteResourceTable(logger, db);\r
+               noteTagsTable = new NoteTagsTable(logger, db);\r
+               getQueryWithContent = null;\r
+               getQueryWithoutContent = null;\r
+               \r
        }\r
        // Create the table\r
        public void createTable() {\r
        }\r
        // Create the table\r
        public void createTable() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Create_Table;\r
-               Global.dbRunner.addWork(request);\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
+                       "updateSequenceNumber integer, title varchar, content varchar, contentHash varchar, "+\r
+                       "contentLength integer, created timestamp, updated timestamp, deleted timestamp, " \r
+                       +"active integer, notebookGuid varchar, attributeSubjectDate timestamp, "+\r
+                       "attributeLatitude double, attributeLongitude double, attributeAltitude double,"+\r
+                       "attributeAuthor varchar, attributeSource varchar, attributeSourceUrl varchar, "+\r
+                       "attributeSourceApplication varchar, indexNeeded boolean, isExpunged boolean, " +\r
+                       "isDirty boolean)"))                    \r
+               logger.log(logger.HIGH, "Table Note creation FAILED!!!");    \r
+        if (!query.exec("CREATE INDEX unindexed_notess on note (indexneeded desc, guid);"))\r
+               logger.log(logger.HIGH, "Note unindexed_notes index creation FAILED!!!");\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
        }\r
        // Drop the table\r
        public void dropTable() {\r
        }\r
        // Drop the table\r
        public void dropTable() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Drop_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("Drop table Note");\r
+               noteTagsTable.dropTable();\r
+               noteResourceTable.dropTable();\r
        }\r
        // Save Note List from Evernote \r
        public void addNote(Note n, boolean isDirty) {\r
        }\r
        // Save Note List from Evernote \r
        public void addNote(Note n, boolean isDirty) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.note = n.deepCopy();\r
-               request.bool1 = isDirty;\r
-               request.type = NoteRequest.Add_Note;\r
-               Global.dbRunner.addWork(request);\r
+               logger.log(logger.EXTREME, "Inside addNote");\r
+               if (n == null)\r
+                       return;\r
+               \r
+               SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");\r
+\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());                    \r
+               query.prepare("Insert Into Note ("\r
+                               +"guid, updateSequenceNumber, title, content, "\r
+                               +"contentHash, contentLength, created, updated, deleted, active, notebookGuid, "\r
+                               +"attributeSubjectDate, attributeLatitude, attributeLongitude, attributeAltitude, "\r
+                               +"attributeAuthor, attributeSource, attributeSourceUrl, attributeSourceApplication, "\r
+                               +"indexNeeded, isExpunged, isDirty, titlecolor, thumbnailneeded" \r
+                               +") Values("\r
+                               +":guid, :updateSequenceNumber, :title, :content, "\r
+                               +":contentHash, :contentLength, :created, :updated, :deleted, :active, :notebookGuid, "\r
+                               +":attributeSubjectDate, :attributeLatitude, :attributeLongitude, :attributeAltitude, "\r
+                               +":attributeAuthor, :attributeSource, :attributeSourceUrl, :attributeSourceApplication, "\r
+                               +":indexNeeded, :isExpunged, :isDirty, -1, true) ");\r
+\r
+               StringBuilder created = new StringBuilder(simple.format(n.getCreated()));                       \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
+               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
+               query.bindValue(":contentHash", n.getContentHash());\r
+               query.bindValue(":contentLength", n.getContentLength());\r
+               query.bindValue(":created", created.toString());\r
+               query.bindValue(":updated", updated.toString());\r
+               query.bindValue(":deleted", deleted.toString());\r
+               query.bindValue(":active", n.isActive());\r
+               query.bindValue(":notebookGuid", n.getNotebookGuid());\r
+               \r
+               if (n.getAttributes() != null) {\r
+                       created = new StringBuilder(simple.format(n.getAttributes().getSubjectDate()));\r
+                       query.bindValue(":attributeSubjectDate", created.toString());\r
+                       query.bindValue(":attributeLatitude", n.getAttributes().getLatitude());\r
+                       query.bindValue(":attributeLongitude", n.getAttributes().getLongitude());\r
+                       query.bindValue(":attributeAltitude", n.getAttributes().getAltitude());\r
+                       query.bindValue(":attributeAuthor", n.getAttributes().getAuthor());\r
+                       query.bindValue(":attributeSource", n.getAttributes().getSource());\r
+                       query.bindValue(":attributeSourceUrl", n.getAttributes().getSourceURL());\r
+                       query.bindValue(":attributeSourceApplication", n.getAttributes().getSourceApplication());\r
+               }\r
+               query.bindValue(":indexNeeded", true);\r
+               query.bindValue(":isExpunged", false);\r
+               query.bindValue(":isDirty", isDirty);\r
+\r
+               \r
+               if (!query.exec())\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               \r
+               // Save the note tags\r
+               if (n.getTagGuids() != null) {\r
+                       for (int i=0; i<n.getTagGuids().size(); i++) \r
+                               noteTagsTable.saveNoteTag(n.getGuid(), n.getTagGuids().get(i));\r
+               }\r
+               logger.log(logger.EXTREME, "Leaving addNote");\r
        } \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
+               }\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
+               }\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.MEDIUM, getQueryWithoutContent.lastError());\r
+               }\r
+       }\r
+\r
+       // Get a note's content in raw, binary format for the sync.\r
+       public String getNoteContentBinary(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
        // Get a note by Guid\r
        public Note getNote(String noteGuid, boolean loadContent, boolean loadResources, boolean loadRecognition, boolean loadBinary, boolean loadTags) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_Note;\r
-               request.string1 = new String(noteGuid);\r
-               request.bool1 = loadContent;\r
-               request.bool2 = loadResources;\r
-               request.bool3 = loadRecognition;\r
-               request.bool4 = loadBinary;\r
-               request.bool5 = loadTags;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseNote;\r
+               if (noteGuid == null)\r
+                       return null;\r
+               if (noteGuid.trim().equals(""))\r
+                       return null;\r
+\r
+               prepareQueries();\r
+               NSqlQuery query;\r
+               if (loadContent) {\r
+                       query = getQueryWithContent;\r
+               } else {\r
+                       query = getQueryWithoutContent;\r
+               }\r
+               \r
+               query.bindValue(":guid", noteGuid);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.EXTREME, "Note SQL select exec has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               if (!query.next()) {\r
+                       logger.log(logger.EXTREME, "SQL Retrieve failed for note guid " +noteGuid + " in getNote()");\r
+                       logger.log(logger.EXTREME, " -> " +query.lastError().toString());\r
+                       logger.log(logger.EXTREME, " -> " +query.lastError());\r
+                       return null;\r
+               }\r
+               Note n = mapNoteFromQuery(query, loadContent, loadResources, loadRecognition, loadBinary, loadTags);\r
+               n.setContent(fixCarriageReturn(n.getContent()));\r
+               return n;\r
+       }\r
+       // Get a note by Guid\r
+       public Note mapNoteFromQuery(NSqlQuery query, boolean loadContent, boolean loadResources, boolean loadRecognition, boolean loadBinary, boolean loadTags) {\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
+               \r
+               n.setGuid(query.valueString(0));\r
+               n.setUpdateSequenceNum(new Integer(query.valueString(1)));\r
+               n.setTitle(query.valueString(2));\r
+\r
+               try {\r
+                       n.setCreated(indfm.parse(query.valueString(3)).getTime());\r
+                       n.setUpdated(indfm.parse(query.valueString(4)).getTime());\r
+                       n.setDeleted(indfm.parse(query.valueString(5)).getTime());\r
+               } catch (ParseException e) {\r
+                       e.printStackTrace();\r
+               }\r
+\r
+               n.setActive(query.valueBoolean(6,true));\r
+               n.setNotebookGuid(query.valueString(7));\r
+               \r
+               try {\r
+                       String attributeSubjectDate = query.valueString(8);\r
+                       if (!attributeSubjectDate.equals(""))\r
+                               na.setSubjectDate(indfm.parse(attributeSubjectDate).getTime());\r
+               } catch (ParseException e) {\r
+                       e.printStackTrace();\r
+               }\r
+               na.setLatitude(new Float(query.valueString(9)));\r
+               na.setLongitude(new Float(query.valueString(10)));\r
+               na.setAltitude(new Float(query.valueString(11)));\r
+               na.setAuthor(query.valueString(12));\r
+               na.setSource(query.valueString(13));\r
+               na.setSourceURL(query.valueString(14));\r
+               na.setSourceApplication(query.valueString(15));\r
+               \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
+                       for (int i=0; i<n.getTagGuids().size(); i++) {\r
+                               String currentGuid = n.getTagGuids().get(i);\r
+                               Tag tag = tagTable.getTag(currentGuid);\r
+                               tagNames.add(tag.getName());\r
+                       }\r
+                       n.setTagNames(tagNames);\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
+//                     n.setContent(query.valueString(16).toString());\r
+                       \r
+                       String contentHash = query.valueString(17);\r
+                       if (contentHash != null)\r
+                               n.setContentHash(contentHash.getBytes());\r
+                       n.setContentLength(new Integer(query.valueString(18)));\r
+               }\r
+               if (loadResources)\r
+                       n.setResources(noteResourceTable.getNoteResources(n.getGuid(), loadBinary));\r
+               if (loadRecognition) {\r
+                       if (n.getResources() == null) {\r
+                               List<Resource> resources = noteResourceTable.getNoteResourcesRecognition(n.getGuid());\r
+                               n.setResources(resources);\r
+                       } else {\r
+                               // We need to merge the recognition resources with the note resources retrieved earlier\r
+                               for (int i=0; i<n.getResources().size(); i++) {\r
+                                       Resource r = noteResourceTable.getNoteResourceRecognition(n.getResources().get(i).getGuid());\r
+                                       n.getResources().get(i).setRecognition(r.getRecognition());\r
+                               }\r
+                       }\r
+               }\r
+               n.setContent(fixCarriageReturn(n.getContent()));\r
+               return n;\r
        }\r
        // Update a note's title\r
        public void updateNoteTitle(String guid, String title) {\r
        }\r
        // Update a note's title\r
        public void updateNoteTitle(String guid, String title) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Note_Title;\r
-               request.string1 = new String(guid);\r
-               request.string2 = new String(title);\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               boolean check = query.prepare("Update Note set title=:title, isDirty=true where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note title sql prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               query.bindValue(":title", title);\r
+               query.bindValue(":guid", guid);\r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note title has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        // Update a note's creation date\r
        public void updateNoteCreatedDate(String guid, QDateTime date) {\r
        }\r
        // Update a note's creation date\r
        public void updateNoteCreatedDate(String guid, QDateTime date) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Note_Creation_Date;\r
-               request.string1 = new String(guid);\r
-               request.date = new QDateTime(date);\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               boolean check = query.prepare("Update Note set created=:created, isDirty=true where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note creation update sql prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               \r
+               query.bindValue(":created", date.toString("yyyy-MM-dd HH:mm:ss"));\r
+               query.bindValue(":guid", guid);\r
+               \r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note creation date has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        // Update a note's creation date\r
        public void updateNoteAlteredDate(String guid, QDateTime date) {\r
        }\r
        // Update a note's creation date\r
        public void updateNoteAlteredDate(String guid, QDateTime date) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Note_Altered_Date;\r
-               request.string1 = new String(guid);\r
-               request.date = new QDateTime(date);\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               boolean check = query.prepare("Update Note set updated=:altered, isDirty=true where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note altered sql prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               \r
+               query.bindValue(":altered", date.toString("yyyy-MM-dd HH:mm:ss"));\r
+               query.bindValue(":guid", guid);\r
+               \r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note altered date has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        // Update a note's creation date\r
        public void updateNoteSubjectDate(String guid, QDateTime date) {\r
        }\r
        // Update a note's creation date\r
        public void updateNoteSubjectDate(String guid, QDateTime date) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Note_Subject_Date;\r
-               request.string1 = new String(guid);\r
-               request.date = new QDateTime(date);\r
-               Global.dbRunner.addWork(request);\r
-       }\r
-       // Update a note's author\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               boolean check = query.prepare("Update Note set attributeSubjectDate=:altered, isDirty=true where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note subject date sql prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+       \r
+               query.bindValue(":altered", date.toString("yyyy-MM-dd HH:mm:ss"));\r
+               query.bindValue(":guid", guid);\r
+               \r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note subject date date has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+       }\r
+       // Update a note's creation date\r
        public void updateNoteAuthor(String guid, String author) {\r
        public void updateNoteAuthor(String guid, String author) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Note_Author;\r
-               request.string1 = new String(guid);\r
-               request.string2 = new String(author);\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               boolean check = query.prepare("Update Note set attributeAuthor=:author, isDirty=true where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note author sql prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+\r
+               query.bindValue(":author", author);\r
+               query.bindValue(":guid", guid);\r
+\r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note author has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               \r
+       }\r
+       // Update a note's geo tags\r
+       public void updateNoteGeoTags(String guid, Double lon, Double lat, Double alt) {\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               boolean check = query.prepare("Update Note set attributeLongitude=:longitude, "+\r
+                               "attributeLatitude=:latitude, attributeAltitude=:altitude, isDirty=true where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note author sql prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+\r
+               query.bindValue(":longitude", lon);\r
+               query.bindValue(":latitude", lat);\r
+               query.bindValue(":altitude", alt);\r
+               query.bindValue(":guid", guid);\r
+\r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note geo tag has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               \r
        }\r
        // Update a note's creation date\r
        public void updateNoteSourceUrl(String guid, String url) {\r
        }\r
        // Update a note's creation date\r
        public void updateNoteSourceUrl(String guid, String url) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Note_Source_Url;\r
-               request.string1 = new String(guid);\r
-               request.string2 = new String(url);\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               boolean check = query.prepare("Update Note set attributeSourceUrl=:url, isDirty=true where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note url sql prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               \r
+               query.bindValue(":url", url);\r
+               query.bindValue(":guid", guid);\r
+\r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note url has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               \r
        }\r
        // Update the notebook that a note is assigned to\r
        public void updateNoteNotebook(String guid, String notebookGuid, boolean expungeFromRemote) {\r
        }\r
        // Update the notebook that a note is assigned to\r
        public void updateNoteNotebook(String guid, String notebookGuid, boolean expungeFromRemote) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Note_Notebook;\r
-               request.string1 = new String(guid);\r
-               request.string2 = new String(notebookGuid);\r
-               request.bool1 = expungeFromRemote;\r
-               Global.dbRunner.addWork(request);\r
-       }\r
-       // Update a note's content\r
+               String currentNotebookGuid = new String("");\r
+               \r
+               \r
+               // If we are going from a synchronized notebook to a local notebook, we\r
+               // need to tell Evernote to purge the note online.  However, if this is  \r
+               // conflicting change we move it to the local notebook without deleting it \r
+               // or it would then delete the copy on the remote server.\r
+               NotebookTable notebookTable = new NotebookTable(logger, db);\r
+               DeletedTable deletedTable = new DeletedTable(logger, db);\r
+               if (expungeFromRemote) {\r
+                       if (!notebookTable.isNotebookLocal(currentNotebookGuid) & notebookTable.isNotebookLocal(notebookGuid)) {\r
+                               deletedTable.addDeletedItem(guid, "NOTE");\r
+                       }\r
+               }\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               boolean check = query.prepare("Update Note set notebookGuid=:notebook, isDirty=true where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note notebook sql prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               query.bindValue(":notebook", notebookGuid);\r
+               query.bindValue(":guid", guid);\r
+               \r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note notebook has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               };\r
+       }\r
+       // Update a note's title\r
        public void updateNoteContent(String guid, String content) {\r
        public void updateNoteContent(String guid, String content) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Note_Content;\r
-               request.string1 = new String(guid);\r
-               request.string2 = new String(content);\r
-               Global.dbRunner.addWork(request);\r
-       }\r
-       // Get a note's contents as a binary string (useful for unicode on sync)\r
-       public String getNoteContentBinary(String guid) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_Note_Content_Binary;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseString;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               boolean check = query.prepare("Update Note set content=:content, updated=CURRENT_TIMESTAMP(), isDirty=true, indexNeeded=true " +\r
+                               " where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note content sql prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               \r
+               query.bindValue(":content", content);\r
+               query.bindValue(":guid", guid);\r
+\r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note content has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        }\r
+\r
+       \r
        // Check a note to see if it passes the attribute selection criteria\r
        public boolean checkAttributeSelection(Note n) {\r
                if (Global.createdSinceFilter.check(n) &&\r
                        Global.createdBeforeFilter.check(n) && \r
                        Global.changedSinceFilter.check(n) &&\r
        // Check a note to see if it passes the attribute selection criteria\r
        public boolean checkAttributeSelection(Note n) {\r
                if (Global.createdSinceFilter.check(n) &&\r
                        Global.createdBeforeFilter.check(n) && \r
                        Global.changedSinceFilter.check(n) &&\r
-                       Global.changedBeforeFilter.check(n) &&\r
-                       Global.containsFilter.check(this, n))\r
+                       Global.changedBeforeFilter.check(n) )\r
                                return true;\r
                \r
                return false;\r
        }\r
        // Delete a note\r
        public void deleteNote(String guid) {\r
                                return true;\r
                \r
                return false;\r
        }\r
        // Delete a note\r
        public void deleteNote(String guid) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Delete_Note;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+        query.prepare("Update Note set deleted=CURRENT_TIMESTAMP(), active=false, isDirty=true where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Note delete failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        public void restoreNote(String guid) {\r
        }\r
        public void restoreNote(String guid) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Restore_Note;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Update Note set deleted='1969-12-31 19.00.00', active=true, isDirty=true where guid=:guid");\r
+//             query.prepare("Update Note set deleted=0, active=true, isDirty=true where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Note restore failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        // Purge a note (actually delete it instead of just marking it deleted)\r
        public void expungeNote(String guid, boolean permanentExpunge, boolean needsSync) {\r
        }\r
        // Purge a note (actually delete it instead of just marking it deleted)\r
        public void expungeNote(String guid, boolean permanentExpunge, boolean needsSync) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Expunge_Note;\r
-               request.string1 = new String(guid);\r
-               request.bool1 = permanentExpunge;\r
-               request.bool2 = needsSync;\r
-               Global.dbRunner.addWork(request);\r
+               \r
+               if (!permanentExpunge) {\r
+                       hideExpungedNote(guid, needsSync);\r
+                       return;\r
+               }\r
+               \r
+               \r
+        NSqlQuery note = new NSqlQuery(db.getConnection());\r
+        NSqlQuery resources = new NSqlQuery(db.getConnection());\r
+        NSqlQuery tags = new NSqlQuery(db.getConnection());\r
+        NSqlQuery words = new NSqlQuery(db.getConnection());\r
+        \r
+               note.prepare("Delete from Note 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
+\r
+               note.bindValue(":guid", guid);\r
+               resources.bindValue(":guid", guid);\r
+               tags.bindValue(":guid", guid);\r
+               words.bindValue(":guid", guid);\r
+       \r
+               // Start purging notes.\r
+               if (!note.exec()) {\r
+                       logger.log(logger.MEDIUM, "Purge from note failed.");\r
+                       logger.log(logger.MEDIUM, note.lastError());\r
+               }\r
+               if (!resources.exec()) {\r
+                               logger.log(logger.MEDIUM, "Purge from resources failed.");\r
+                       logger.log(logger.MEDIUM, resources.lastError());\r
+               }\r
+               if (!tags.exec()) {\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
+               if (needsSync) {\r
+                       DeletedTable deletedTable = new DeletedTable(logger, db);\r
+                       deletedTable.addDeletedItem(guid, "Note");\r
+               }\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 tags = new NSqlQuery(db.getConnection());\r
+        NSqlQuery words = new NSqlQuery(db.getConnection());\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
+\r
+               note.bindValue(":guid", guid);\r
+               resources.bindValue(":guid", guid);\r
+               tags.bindValue(":guid", guid);\r
+               words.bindValue(":guid", guid);\r
+\r
+               // Start purging notes.\r
+               if (!note.exec()) {\r
+                       logger.log(logger.MEDIUM, "Purge from note failed.");\r
+                       logger.log(logger.MEDIUM, note.lastError());\r
+               }\r
+               if (!resources.exec()) {\r
+                               logger.log(logger.MEDIUM, "Purge from resources failed.");\r
+                       logger.log(logger.MEDIUM, resources.lastError());\r
+               }\r
+               if (!tags.exec()) {\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
+               if (needsSync) {\r
+                       DeletedTable deletedTable = new DeletedTable(logger, db);\r
+                       deletedTable.addDeletedItem(guid, "Note");\r
+               }\r
+       }\r
+\r
+               \r
        // Purge all deleted notes;\r
        public void expungeAllDeletedNotes() {\r
        // Purge all deleted notes;\r
        public void expungeAllDeletedNotes() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Expunge_All_Deleted_Notes;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("select guid, updateSequenceNumber from note where active = false");\r
+               while (query.next()) {\r
+                       String guid = query.valueString(0);\r
+                       Integer usn = new Integer(query.valueString(1));\r
+                       if (usn == 0)\r
+                               expungeNote(guid, true, false);\r
+                       else\r
+                               expungeNote(guid, false, true);\r
+               }\r
        }\r
        // Update the note sequence number\r
        public void updateNoteSequence(String guid, int sequence) {\r
        }\r
        // Update the note sequence number\r
        public void updateNoteSequence(String guid, int sequence) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Note_Sequence;\r
-               request.string1 = new String(guid);\r
-               request.int1 = sequence;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Update Note set updateSequenceNumber=:sequence where guid=:guid");\r
+\r
+               query.bindValue(":sequence", sequence);\r
+               query.bindValue(":guid", guid);\r
+               \r
+               query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Note sequence update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               } \r
        }\r
        // Update the note Guid\r
        public void updateNoteGuid(String oldGuid, String newGuid) {\r
        }\r
        // Update the note Guid\r
        public void updateNoteGuid(String oldGuid, String newGuid) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Note_Guid;\r
-               request.string1 = new String(oldGuid);\r
-               request.string2 = new String(newGuid);\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Update Note set guid=:newGuid where guid=:oldGuid");\r
+\r
+               query.bindValue(":newGuid", newGuid);\r
+               query.bindValue(":oldGuid", oldGuid);\r
+\r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Note Guid update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               } \r
+               \r
+               query.prepare("Update NoteTags set noteGuid=:newGuid where noteGuid=:oldGuid");\r
+               query.bindValue(":newGuid", newGuid);\r
+               query.bindValue(":oldGuid", oldGuid);\r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Note guid update failed for NoteTags.");\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
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Note guid update failed for Words.");\r
+                       logger.log(logger.MEDIUM, query.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
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Note guid update failed for noteresources.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        // Update a note\r
        public void updateNote(Note n, boolean isNew) {\r
        }\r
        // Update a note\r
        public void updateNote(Note n, boolean isNew) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Note;\r
-               request.note = n.deepCopy();\r
-               request.bool1 = isNew;\r
-               Global.dbRunner.addWork(request);\r
+               boolean isExpunged = isNoteExpunged(n.getGuid());\r
+               \r
+               expungeNote(n.getGuid(), !isExpunged, false);\r
+               addNote(n, false);\r
        }\r
        // Does a note exist?\r
        public boolean exists(String guid) {\r
        }\r
        // Does a note exist?\r
        public boolean exists(String guid) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Exists;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseBoolean;\r
+               if (guid == null)\r
+                       return false;\r
+               if (guid.trim().equals(""))\r
+                       return false;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Select guid from note where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "note.exists SQL retrieve has failed.");\r
+               boolean retVal = query.next();\r
+               return retVal;\r
+       }\r
+       // Does a note exist?\r
+       public boolean isNoteExpunged(String guid) {\r
+               if (guid == null)\r
+                       return false;\r
+               if (guid.trim().equals(""))\r
+                       return false;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Select isExpunged from note where guid=:guid and isExpunged = true");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "note.isNoteExpunged SQL retrieve has failed.");\r
+               boolean retVal = query.next();\r
+               return retVal;\r
        }\r
        // This is a convience method to check if a tag exists & update/create based upon it\r
        }\r
        // This is a convience method to check if a tag exists & update/create based upon it\r
-       public void syncNote(Note note, boolean isDirty) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Sync_Note;\r
-               request.note = note.deepCopy();\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
+       public void syncNote(Note tag, boolean isDirty) {\r
+               if (exists(tag.getGuid()))\r
+                       updateNote(tag, isDirty);\r
+               else\r
+                       addNote(tag, isDirty);\r
        }\r
        // Get a list of notes that need to be updated\r
        public List <Note> getDirty() {\r
        }\r
        // Get a list of notes that need to be updated\r
        public List <Note> getDirty() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_Dirty;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseNotes;\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 not in (select guid from notebook where local = 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
        }\r
        // Get a list of notes that need to be updated\r
-       public List <String> getUnsynchronizedGUIDs() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_Unsynchronized_Guids;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseStrings;\r
-       }\r
        public boolean isNoteDirty(String guid) {\r
        public boolean isNoteDirty(String guid) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Is_Note_Dirty;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseBoolean;\r
+               \r
+               boolean check;                  \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.prepare("Select guid from Note where isDirty = true and guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               check = query.exec();\r
+               if (!check) \r
+                       logger.log(logger.EXTREME, "Note SQL retrieve has failed: " +query.lastError().toString());\r
+               \r
+               boolean returnValue;\r
+               // Get a list of the notes\r
+               if (query.next()) \r
+                       returnValue = true; \r
+               else\r
+                       returnValue = false;\r
+\r
+               return returnValue;     \r
+       }\r
+       // Get a list of notes that need to be updated\r
+       public List <String> getUnsynchronizedGUIDs() {\r
+               String guid;\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");\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
+               return index;   \r
        }\r
        // Reset the dirty bit\r
        public void  resetDirtyFlag(String guid) {\r
        }\r
        // Reset the dirty bit\r
        public void  resetDirtyFlag(String guid) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Reset_Dirty_Flag;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Update note set isdirty=false where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Error resetting note dirty field.");\r
        }\r
        // Get all notes\r
        public List<String> getAllGuids() {\r
        }\r
        // Get all notes\r
        public List<String> getAllGuids() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_All_Guids;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseStrings;\r
+               List<String> notes = new ArrayList<String>();\r
+               \r
+               boolean check;                                  \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.exec("Select guid from Note");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed: "+query.lastError());\r
+\r
+               // Get a list of the notes\r
+               while (query.next()) {\r
+                       notes.add(new String(query.valueString(0))); \r
+               }\r
+               return notes;\r
        }\r
        // Get all notes\r
        public List<Note> getAllNotes() {\r
        }\r
        // Get all notes\r
        public List<Note> getAllNotes() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_All_Notes;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseNotes;\r
+               List<Note> notes = new ArrayList<Note>();\r
+               prepareQueries();\r
+               boolean check;                                  \r
+        NSqlQuery query = getAllQueryWithoutContent;\r
+               check = query.exec();\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed: "+query.lastError());\r
+               // Get a list of the notes\r
+               while (query.next()) {\r
+                       notes.add(mapNoteFromQuery(query, false, false, false, false, true));\r
+               }\r
+               return notes;\r
        }\r
        // Count unindexed notes\r
        public int getUnindexedCount() {\r
        }\r
        // Count unindexed notes\r
        public int getUnindexedCount() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_Unindexed_Count;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseInt;\r
-       }\r
-       // Count unsynchronized count\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("select count(*) from note where indexneeded=true and isExpunged = false");\r
+               query.next(); \r
+               int returnValue = new Integer(query.valueString(0));\r
+               return returnValue;\r
+       }\r
+       // Count unsynchronized notes\r
        public int getDirtyCount() {\r
        public int getDirtyCount() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_Dirty_Count;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseInt;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("select count(*) from note where isDirty=true and isExpunged = false");\r
+               query.next(); \r
+               int returnValue = new Integer(query.valueString(0));\r
+               return returnValue;\r
        }\r
        }\r
-       // Count unindexed notes\r
+       // Count notes\r
        public int getNoteCount() {\r
        public int getNoteCount() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_Note_Count;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseInt;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("select count(*) from note where isExpunged = false");\r
+               query.next(); \r
+               int returnValue = new Integer(query.valueString(0));\r
+               return returnValue;\r
        }\r
        // Count deleted notes\r
        public int getDeletedCount() {\r
        }\r
        // Count deleted notes\r
        public int getDeletedCount() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_Deleted_Count;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseInt;\r
-       }\r
-       // Reset a note's sequence count to zero.  This is useful when moving a conflicting note\r
-       public void resetSequenceNumber(String guid) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = new String(guid);\r
-               request.type = NoteRequest.Reset_Note_Sequence;\r
-               Global.dbRunner.addWork(request);\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("select count(*) from note where isExpunged = false and active = false");\r
+               if (!query.next()) \r
+                       return 0;\r
+               int returnValue = new Integer(query.valueString(0));\r
+               return returnValue;\r
+       }\r
+       // Reset a note sequence number to zero.  This is useful for moving conflicting notes\r
+       public void resetNoteSequence(String guid) {\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               boolean check = query.prepare("Update Note set updateSequenceNumber=0, isDirty=true where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note ResetSequence sql prepare has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               query.bindValue(":guid", guid);\r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Update note sequence number has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        \r
        }\r
        \r
+       \r
        // Update a note resource by the hash\r
        public void updateNoteResourceGuidbyHash(String noteGuid, String resGuid, String hash) {\r
        // Update a note resource by the hash\r
        public void updateNoteResourceGuidbyHash(String noteGuid, String resGuid, String hash) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Resource_Guid_By_Hash;\r
-               request.string1 = new String(noteGuid);\r
-               request.string2 = new String(resGuid);\r
-               request.string3 = new String(hash);\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+/*             query.prepare("Select guid from NoteResources where noteGuid=:noteGuid and datahash=:hex");\r
+               query.bindValue(":noteGuid", noteGuid);\r
+               query.bindValue(":hex", hash);\r
+               query.exec();\r
+               if (!query.next()) {\r
+                       logger.log(logger.LOW, "Error finding note resource in RNoteTable.updateNoteResourceGuidbyHash.  GUID="+noteGuid +" resGuid="+ resGuid+" hash="+hash);\r
+                       return;\r
+               }\r
+               String guid = query.valueString(0);\r
+*/             \r
+               query.prepare("update noteresources set guid=:guid where noteGuid=:noteGuid and datahash=:hex");\r
+               query.bindValue(":guid", resGuid);\r
+               query.bindValue(":noteGuid", noteGuid);\r
+               query.bindValue(":hex", hash);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.EXTREME, "Note Resource Update by Hash failed");\r
+                       logger.log(logger.EXTREME, query.lastError().toString());\r
+               }\r
        }\r
        }\r
-       \r
-       // Get the title color of notes\r
-       public List<Pair<String,Integer>> getNoteTitleColors() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_Title_Colors;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responsePair;\r
+\r
+       // Fix CRLF problem that is on some notes\r
+       private String fixCarriageReturn(String note) {\r
+               if (note == null || !Global.enableCarriageReturnFix)\r
+                       return note;\r
+               QByteArray a0Hex = new QByteArray("a0");\r
+               String a0 = QByteArray.fromHex(a0Hex).toString();\r
+               note = note.replace("<div>"+a0+"</div>", "<div>&nbsp;</div>");\r
+               return note.replace("<div/>", "<div>&nbsp;</div>");\r
        }\r
        \r
        }\r
        \r
-       // Get the title color of notes\r
-       public void setNoteTitleColor(String guid, int color) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = new String(guid);\r
-               request.int1 = color;\r
-               request.type = NoteRequest.Set_Title_Colors;\r
-               Global.dbRunner.addWork(request);       \r
-       }\r
        \r
        \r
        //********************************************************************************\r
        \r
        \r
        //********************************************************************************\r
@@ -402,96 +931,201 @@ public class NoteTable {
        //********************************************************************************\r
        // set/unset a note to be reindexed\r
        public void setIndexNeeded(String guid, Boolean flag) {\r
        //********************************************************************************\r
        // set/unset a note to be reindexed\r
        public void setIndexNeeded(String guid, Boolean flag) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Set_Index_Needed;\r
-               request.string1 = new String(guid);\r
-               request.bool1 = flag;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Update Note set indexNeeded=:flag where guid=:guid");\r
+\r
+               if (flag)\r
+                       query.bindValue(":flag", 1);\r
+               else\r
+                       query.bindValue(":flag", 0);\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Note indexNeeded update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               } \r
        }\r
        // Set all notes to be reindexed\r
        public void reindexAllNotes() {\r
        }\r
        // Set all notes to be reindexed\r
        public void reindexAllNotes() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Reindex_All_Notes;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               if (!query.exec("Update Note set indexNeeded=true")) {\r
+                       logger.log(logger.MEDIUM, "Note reindexAllNotes update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               } \r
        }\r
        }\r
+\r
        // Get all unindexed notes\r
        public List <String> getUnindexed() {\r
        // Get all unindexed notes\r
        public List <String> getUnindexed() {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_Unindexed;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseStrings;\r
+               String guid;\r
+               List<String> index = new ArrayList<String>();\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               if (!query.exec("Select guid from Note where isExpunged = false and indexNeeded = true and DATEDIFF('MINUTE',updated,CURRENT_TIMESTAMP)>5"))\r
+                       logger.log(logger.EXTREME, "Note SQL retrieve has failed on getUnindexed().");\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
+               return index;   \r
        }\r
        public List<String> getNextUnindexed(int limit) {\r
        }\r
        public List<String> getNextUnindexed(int limit) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_Next_Unindexed;\r
-               request.int1 = limit;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseStrings;\r
+               List<String> guids = new ArrayList<String>();\r
+                       \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               if (!query.exec("Select guid from Note where isExpunged = false and indexNeeded = true and DATEDIFF('MINUTE',Updated,CURRENT_TIMESTAMP)>5 limit " +limit))\r
+                       logger.log(logger.EXTREME, "Note SQL retrieve has failed on getUnindexed().");\r
+               \r
+               // Get a list of the notes\r
+               String guid;\r
+               while (query.next()) {\r
+                       guid = new String();\r
+                       guid = query.valueString(0);\r
+                       guids.add(guid);\r
+               }       \r
+               return guids;   \r
+       }\r
+       \r
+       \r
+       //**********************************************************************************\r
+       //* Title color functions\r
+       //**********************************************************************************\r
+       // Get the title color of all notes\r
+       public List<Pair<String, Integer>> getNoteTitleColors() {\r
+               List<Pair<String,Integer>> returnValue = new ArrayList<Pair<String,Integer>>();\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               if (!query.exec("Select guid,titleColor from Note where titleColor != -1"))\r
+                       logger.log(logger.EXTREME, "Note SQL retrieve has failed on getUnindexed().");\r
+\r
+               String guid;\r
+               Integer color;\r
+               \r
+               // Get a list of the notes\r
+               while (query.next()) {\r
+                       Pair<String, Integer> pair = new Pair<String,Integer>();\r
+                       guid = query.valueString(0);\r
+                       color = query.valueInteger(1);\r
+                       pair.setFirst(guid);\r
+                       pair.setSecond(color);\r
+                       returnValue.add(pair); \r
+               }       \r
+\r
+               \r
+               \r
+               return returnValue;\r
+       }\r
+       // Set a title color\r
+       // Reset the dirty bit\r
+       public void  setNoteTitleColor(String guid, int color) {\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Update note set titlecolor=:color where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               query.bindValue(":color", color);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Error updating title color.");\r
        }\r
        }\r
+\r
        \r
        \r
        \r
        \r
-       //*********************************************************************************\r
-       //* Thumbnail Functions\r
-       //*********************************************************************************\r
+       //**********************************************************************************\r
+       //* Thumbnail functions\r
+       //**********************************************************************************\r
        // Set if a new thumbnail is needed\r
        public void setThumbnailNeeded(String guid, boolean needed) {\r
        // Set if a new thumbnail is needed\r
        public void setThumbnailNeeded(String guid, boolean needed) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Set_Thumbnail_Needed;\r
-               request.string1 = new String(guid);\r
-               request.bool1 = needed;\r
-               Global.dbRunner.addWork(request);\r
+               \r
+               boolean check;                  \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.prepare("Update note set thumbnailneeded = :needed where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               query.bindValue(":needed", needed);\r
+               check = query.exec();\r
+               if (!check) \r
+                       logger.log(logger.EXTREME, "Note SQL set thumbail needed failed: " +query.lastError().toString());\r
+\r
        }\r
        // Is a thumbail needed for this guid?\r
        public boolean isThumbnailNeeded(String guid) {\r
        }\r
        // Is a thumbail needed for this guid?\r
        public boolean isThumbnailNeeded(String guid) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Is_Thumbail_Needed;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseBoolean;\r
+               \r
+               boolean check;                  \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.prepare("select thumbnailneeded from note where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               check = query.exec();\r
+               if (!check) \r
+                       logger.log(logger.EXTREME, "Note SQL isThumbnailNeeded query failed: " +query.lastError().toString());\r
+               \r
+               boolean returnValue;\r
+               // Get a list of the notes\r
+               if (query.next()) \r
+                       returnValue = query.valueBoolean(0, false); \r
+               else\r
+                       returnValue = false;\r
+\r
+               return returnValue;     \r
        }\r
        // Set if a new thumbnail is needed\r
        public void setThumbnail(String guid, QByteArray thumbnail) {\r
        }\r
        // Set if a new thumbnail is needed\r
        public void setThumbnail(String guid, QByteArray thumbnail) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Set_Thumbnail;\r
-               request.string1 = new String(guid);\r
-               request.bytes = thumbnail;\r
-               Global.dbRunner.addWork(request);\r
+               \r
+               boolean check;                  \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.prepare("Update note set thumbnail = :thumbnail where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               query.bindValue(":thumbnail", thumbnail.toByteArray());\r
+               check = query.exec();\r
+               if (!check) \r
+                       logger.log(logger.EXTREME, "Note SQL set thumbail failed: " +query.lastError().toString());\r
+\r
        }\r
        // Set if a new thumbnail is needed\r
        public QByteArray getThumbnail(String guid) {\r
        }\r
        // Set if a new thumbnail is needed\r
        public QByteArray getThumbnail(String guid) {\r
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Get_Thumbnail;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteRequest req = Global.dbRunner.noteResponse.get(id).copy();\r
-               return req.responseBytes;\r
+               \r
+               boolean check;                  \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.prepare("Select thumbnail from note where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               check = query.exec();\r
+               if (!check) \r
+                       logger.log(logger.EXTREME, "Note SQL get thumbail failed: " +query.lastError().toString());\r
+               // Get a list of the notes\r
+               if (query.next()) \r
+                       if (query.getBlob(0) != null)\r
+                               return new QByteArray(query.getBlob(0)); \r
+               return null;\r
        }\r
        \r
        }\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
        \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
-               NoteRequest request = new NoteRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteRequest.Update_Resource_Content_Hash;\r
-               request.string1 = new String(guid);\r
-               request.string2 = new String(oldHash);\r
-               request.string3 = new String(newHash);\r
-               Global.dbRunner.addWork(request);\r
+               Note n = getNote(guid, true, false, false, false,false);\r
+               int position = n.getContent().indexOf("<en-media");\r
+               int endPos;\r
+               for (;position>-1;) {\r
+                       endPos = n.getContent().indexOf(">", position+1);\r
+                       String oldSegment = n.getContent().substring(position,endPos);\r
+                       int hashPos = oldSegment.indexOf("hash=\"");\r
+                       int hashEnd = oldSegment.indexOf("\"", hashPos+7);\r
+                       String hash = oldSegment.substring(hashPos+6, hashEnd);\r
+                       if (hash.equalsIgnoreCase(oldHash)) {\r
+                               String newSegment = oldSegment.replace(oldHash, newHash);\r
+                               String content = n.getContent().substring(0,position) +\r
+                                                newSegment +\r
+                                                n.getContent().substring(endPos);\r
+                               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                               query.prepare("update note set isdirty=true, content=:content where guid=:guid");\r
+                               query.bindValue(":content", content);\r
+                               query.bindValue(":guid", n.getGuid());\r
+                               query.exec();\r
+                       }\r
+                       \r
+                       position = n.getContent().indexOf("<en-media", position+1);\r
+               }\r
        }\r
 }      \r
        }\r
 }      \r
@@ -17,7 +17,7 @@
  *\r
 */\r
 \r
  *\r
 */\r
 \r
-package cx.fbn.nevernote.sql.runners;\r
+package cx.fbn.nevernote.sql;\r
 \r
 public class NoteTagsRecord {\r
        public String noteGuid;\r
 \r
 public class NoteTagsRecord {\r
        public String noteGuid;\r
index 8cc57a8..2b71bb4 100644 (file)
 \r
 package cx.fbn.nevernote.sql;\r
 \r
 \r
 package cx.fbn.nevernote.sql;\r
 \r
+import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import java.util.List;\r
 \r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.sql.requests.NoteTagsRequest;\r
-import cx.fbn.nevernote.sql.runners.NoteTagsRecord;\r
+import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 import cx.fbn.nevernote.utilities.Pair;\r
 \r
 public class NoteTagsTable {\r
 import cx.fbn.nevernote.utilities.Pair;\r
 \r
 public class NoteTagsTable {\r
-       private final int id;\r
+       private final ApplicationLogger                 logger;\r
+       DatabaseConnection                                              db;\r
+\r
        \r
        // Constructor\r
        \r
        // Constructor\r
-       public NoteTagsTable(int i) {\r
-               id = i;\r
+       public NoteTagsTable(ApplicationLogger l,DatabaseConnection d) {\r
+               logger = l;\r
+               db = d;\r
        }\r
        // Create the table\r
        public void createTable() {\r
        }\r
        // Create the table\r
        public void createTable() {\r
-               NoteTagsRequest request = new NoteTagsRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteTagsRequest.Create_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+        // Create the NoteTag table\r
+        logger.log(logger.HIGH, "Creating table NoteTags...");\r
+        if (!query.exec("Create table NoteTags (noteGuid varchar, " +\r
+                       "tagGuid varchar, primary key(noteGuid, tagGuid))"))\r
+               logger.log(logger.HIGH, "Table NoteTags creation FAILED!!!"); \r
        }\r
        // Drop the table\r
        public void dropTable() {\r
        }\r
        // Drop the table\r
        public void dropTable() {\r
-               NoteTagsRequest request = new NoteTagsRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteTagsRequest.Drop_Table;\r
-               Global.dbRunner.addWork(request);       }\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("drop table NoteTags");\r
+       }\r
        // Get a note tags by the note's Guid\r
        public List<String> getNoteTags(String noteGuid) {\r
        // Get a note tags by the note's Guid\r
        public List<String> getNoteTags(String noteGuid) {\r
-               NoteTagsRequest request = new NoteTagsRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteTagsRequest.Get_Note_Tags;\r
-               request.string1 = new String(noteGuid);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteTagsRequest req = Global.dbRunner.noteTagsResponse.get(id).copy();\r
-               return req.responseStrings;\r
+               if (noteGuid == null)\r
+                       return null;\r
+               boolean check;\r
+               List<String> tags = new ArrayList<String>();\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.exec("Select "\r
+                               +"TagGuid from NoteTags where noteGuid = '" +noteGuid +"'");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "NoteTags SQL select has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               while (query.next()) {\r
+                       tags.add(query.valueString(0));\r
+               }       \r
+               return tags;\r
        }\r
        // Get a note tags by the note's Guid\r
        public List<NoteTagsRecord> getAllNoteTags() {\r
        }\r
        // Get a note tags by the note's Guid\r
        public List<NoteTagsRecord> getAllNoteTags() {\r
-               NoteTagsRequest request = new NoteTagsRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteTagsRequest.Get_All_Note_Tags;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteTagsRequest req = Global.dbRunner.noteTagsResponse.get(id).copy();\r
-               return req.responseNoteTagsRecord;\r
+               List<NoteTagsRecord> tags = new ArrayList<NoteTagsRecord>();\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               if (!query.exec("Select TagGuid, NoteGuid from NoteTags")) {\r
+                       logger.log(logger.EXTREME, "NoteTags SQL select has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               while (query.next()) {\r
+                       NoteTagsRecord record = new NoteTagsRecord();\r
+                       record.tagGuid = query.valueString(0);\r
+                       record.noteGuid = query.valueString(1);\r
+                       tags.add(record);\r
+               }       \r
+               return tags;\r
        }\r
        // Check if a note has a specific tag already\r
        public boolean checkNoteNoteTags(String noteGuid, String tagGuid) {\r
        }\r
        // Check if a note has a specific tag already\r
        public boolean checkNoteNoteTags(String noteGuid, String tagGuid) {\r
-               NoteTagsRequest request = new NoteTagsRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteTagsRequest.Check_Note_Note_Tags;\r
-               request.string1 = new String(noteGuid);\r
-               request.string2 = new String(tagGuid);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteTagsRequest req = Global.dbRunner.noteTagsResponse.get(id).copy();\r
-               return req.responseBoolean;\r
+               if (noteGuid == null || tagGuid == null)\r
+                       return false;\r
+               boolean check;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Select "\r
+                               +"NoteGuid, TagGuid from NoteTags where noteGuid = :noteGuid and tagGuid = :tagGuid");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "checkNoteTags SQL prepare has failed.");\r
+               \r
+               query.bindValue(":noteGuid", noteGuid);\r
+               query.bindValue(":tagGuid", tagGuid);\r
+               query.exec();\r
+               \r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "checkNoteTags SQL select has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return false;\r
+               }\r
+               \r
+               if (query.next()) {\r
+                       return true;\r
+               }       \r
+               return false;\r
        }\r
        // Save Note Tags\r
        public void saveNoteTag(String noteGuid, String tagGuid) {\r
        }\r
        // Save Note Tags\r
        public void saveNoteTag(String noteGuid, String tagGuid) {\r
-               NoteTagsRequest request = new NoteTagsRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteTagsRequest.Save_Note_Tag;\r
-               request.string1 = new String(noteGuid);\r
-               request.string2 = new String(tagGuid);\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+\r
+               check = query.prepare("Insert Into NoteTags (noteGuid, tagGuid) "\r
+                               +"Values("\r
+                               +":noteGuid, :tagGuid)");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "Note SQL insert prepare has failed.");\r
+       \r
+               query.bindValue(":noteGuid", noteGuid);\r
+               query.bindValue(":tagGuid", tagGuid);\r
+                                               \r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "NoteTags Table insert failed.");             \r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               check = query.prepare("Update Note set isDirty=1 where guid=:guid");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "RNoteTagsTable.saveNoteTag prepare has failed.");\r
+               query.bindValue(":guid", noteGuid);\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "RNoteTagsTable.saveNoteTag has failed to set note as dirty.");               \r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        // Delete a note's tags\r
        public void deleteNoteTag(String noteGuid) {\r
        }\r
        // Delete a note's tags\r
        public void deleteNoteTag(String noteGuid) {\r
-               NoteTagsRequest request = new NoteTagsRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteTagsRequest.Delete_Note_Tag;\r
-               request.string1 = new String(noteGuid);\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Delete from NoteTags where noteGuid = :noteGuid");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "Note SQL delete prepare has failed.");\r
+       \r
+               query.bindValue(":noteGuid", noteGuid);\r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "NoteTags Table delete failed.");             \r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+\r
        }\r
        }\r
-       // Get tag counts\r
+       // Get a note tag counts\r
        public List<Pair<String,Integer>> getTagCounts() {\r
        public List<Pair<String,Integer>> getTagCounts() {\r
-               NoteTagsRequest request = new NoteTagsRequest();\r
-               request.requestor_id = id;\r
-               request.type = NoteTagsRequest.Tag_Counts;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NoteTagsRequest req = Global.dbRunner.noteTagsResponse.get(id).copy();\r
-               return req.responseCounts;\r
-               \r
+               List<Pair<String,Integer>> counts = new ArrayList<Pair<String,Integer>>();              \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               if (!query.exec("select tagguid, count(noteguid) from notetags group by tagguid;")) {\r
+                       logger.log(logger.EXTREME, "NoteTags SQL getTagCounts has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               while (query.next()) {\r
+                       Pair<String,Integer> newCount = new Pair<String,Integer>();\r
+                       newCount.setFirst(query.valueString(0));\r
+                       newCount.setSecond(query.valueInteger(1));\r
+                       counts.add(newCount);\r
+               }       \r
+               return counts;\r
        }\r
 }\r
        }\r
 }\r
index c872d53..70c884e 100644 (file)
 \r
 package cx.fbn.nevernote.sql;\r
 \r
 \r
 package cx.fbn.nevernote.sql;\r
 \r
+import java.text.DateFormat;\r
+import java.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import com.evernote.edam.type.Notebook;\r
 \r
 import java.util.List;\r
 \r
 import com.evernote.edam.type.Notebook;\r
 \r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.sql.requests.NotebookRequest;\r
+import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 import cx.fbn.nevernote.utilities.Pair;\r
 \r
 public class NotebookTable {\r
 import cx.fbn.nevernote.utilities.Pair;\r
 \r
 public class NotebookTable {\r
-       int id;\r
        \r
        \r
-       public NotebookTable(int i) {\r
-               id = i;\r
-       }\r
+       private final ApplicationLogger                 logger;\r
+       DatabaseConnection                                                      db;\r
        \r
        \r
+       // Constructor\r
+       public NotebookTable(ApplicationLogger l, DatabaseConnection d) {\r
+               logger = l;\r
+               db = d;\r
+       }\r
        // Create the table\r
        public void createTable() {\r
        // Create the table\r
        public void createTable() {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Create_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+        logger.log(logger.HIGH, "Creating table Notebook...");\r
+        if (!query.exec("Create table Notebook (guid varchar primary key, " +\r
+                       "sequence integer, name varchar, defaultNotebook varchar, "+\r
+                       "serviceCreated timestamp, serviceUpdated timestamp, published boolean, isDirty boolean, "+\r
+                       "autoEncrypt boolean, local boolean, archived boolean)"))                               \r
+               logger.log(logger.HIGH, "Table Notebook creation FAILED!!!");   \r
+        Notebook newnote = new Notebook();\r
+        newnote.setDefaultNotebook(true);\r
+        newnote.setName("My Notebook");\r
+        newnote.setPublished(false);\r
+        newnote.setGuid("1");\r
+        addNotebook(newnote, true, false);\r
+               \r
        }\r
        // Drop the table\r
        public void dropTable() {\r
        }\r
        // Drop the table\r
        public void dropTable() {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Drop_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("Drop table Notebook");\r
        }\r
        // Save an individual notebook\r
        public void addNotebook(Notebook tempNotebook, boolean isDirty, boolean local) {\r
        }\r
        // Save an individual notebook\r
        public void addNotebook(Notebook tempNotebook, boolean isDirty, boolean local) {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Add_Notebook;\r
-               request.notebook = tempNotebook;\r
-               request.bool1 = isDirty;\r
-               request.bool2 = local;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+               \r
+               SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Insert Into Notebook (guid, sequence, name, defaultNotebook, "\r
+                               +"serviceCreated, serviceUpdated, published, "   \r
+                               + "isDirty, autoEncrypt," \r
+                               + "local, archived) Values("\r
+                               +":guid, :sequence, :name, :defaultNotebook,  "\r
+                               +":serviceCreated, :serviceUpdated, :published, "\r
+                               +":isDirty, :autoEncrypt, "\r
+                               +":local, false)");\r
+               query.bindValue(":guid", tempNotebook.getGuid());\r
+               query.bindValue(":sequence", tempNotebook.getUpdateSequenceNum());\r
+               query.bindValue(":name", tempNotebook.getName());\r
+               query.bindValue(":defaultNotebook", tempNotebook.isDefaultNotebook());\r
+               \r
+               StringBuilder serviceCreated = new StringBuilder(simple.format(tempNotebook.getServiceCreated()));                      \r
+               StringBuilder serviceUpdated = new StringBuilder(simple.format(tempNotebook.getServiceUpdated()));\r
+               if (serviceUpdated.toString() == null)\r
+                       serviceUpdated = serviceCreated;\r
+               query.bindValue(":serviceCreated", serviceCreated.toString());\r
+               query.bindValue(":serviceUpdated", serviceCreated.toString());\r
+               query.bindValue(":published",tempNotebook.isPublished());\r
+               \r
+               if (isDirty)\r
+                       query.bindValue(":isDirty", true);\r
+               else\r
+                       query.bindValue(":isDirty", false);\r
+               query.bindValue(":autoEncrypt", false);\r
+               query.bindValue(":local", local);\r
+\r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Notebook Table insert failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError().toString());\r
+               }\r
        }\r
        // Delete the notebook based on a guid\r
        public void expungeNotebook(String guid, boolean needsSync) {\r
        }\r
        // Delete the notebook based on a guid\r
        public void expungeNotebook(String guid, boolean needsSync) {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Expunge_Notebook;\r
-               request.string1 = guid;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+\r
+               check = query.prepare("delete from Notebook "\r
+                               +"where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Notebook SQL delete prepare has failed.");\r
+                       logger.log(logger.EXTREME, query.lastError().toString());\r
+               }\r
+               query.bindValue(":guid", guid);\r
+               check = query.exec();\r
+               if (!check) \r
+                       logger.log(logger.MEDIUM, "Notebook delete failed.");\r
+               \r
+               // Signal the parent that work needs to be done\r
+               if  (needsSync) {\r
+                       DeletedTable deletedTable = new DeletedTable(logger, db);\r
+                       deletedTable.addDeletedItem(guid, "Notebook");\r
+               }\r
        }\r
        // Update a notebook\r
        public void updateNotebook(Notebook tempNotebook, boolean isDirty) {\r
        }\r
        // Update a notebook\r
        public void updateNotebook(Notebook tempNotebook, boolean isDirty) {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Update_Notebook;\r
-               request.notebook = tempNotebook;\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+               \r
+               SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
+               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Update Notebook set sequence=:sequence, name=:name, defaultNotebook=:defaultNotebook, " +\r
+                               "serviceCreated=:serviceCreated, serviceUpdated=:serviceUpdated, "+\r
+                               "published=:published, isDirty=:isDirty where guid=:guid ");\r
+               query.bindValue(":sequence", tempNotebook.getUpdateSequenceNum());\r
+               query.bindValue(":name", tempNotebook.getName());\r
+               query.bindValue(":defaultNotebook", tempNotebook.isDefaultNotebook());\r
+\r
+               StringBuilder serviceCreated = new StringBuilder(simple.format(tempNotebook.getServiceCreated()));                      \r
+               StringBuilder serviceUpdated = new StringBuilder(simple.format(tempNotebook.getServiceUpdated()));                      \r
+               query.bindValue(":serviceCreated", serviceCreated.toString());\r
+               query.bindValue(":serviceUpdated", serviceUpdated.toString());\r
+               \r
+               query.bindValue(":published", tempNotebook.isPublished());\r
+               query.bindValue(":isDirty", isDirty);\r
+               query.bindValue(":guid", tempNotebook.getGuid());\r
+               \r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Notebook Table update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError().toString());\r
+               }\r
        }\r
        // Load notebooks from the database\r
        public List<Notebook> getAll() {\r
        }\r
        // Load notebooks from the database\r
        public List<Notebook> getAll() {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Get_All;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NotebookRequest req = Global.dbRunner.notebookResponse.get(id).copy();\r
-               return req.responseNotebooks;\r
-               \r
+               Notebook tempNotebook;\r
+               List<Notebook> index = new ArrayList<Notebook>();\r
+               boolean check;\r
+                                       \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
+                               "serviceCreated, "+\r
+                               "serviceUpdated, "+\r
+                               "published, defaultNotebook from Notebook order by name");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
+               while (query.next()) {\r
+                       tempNotebook = new Notebook();\r
+                       tempNotebook.setGuid(query.valueString(0));\r
+                       int sequence = new Integer(query.valueString(1)).intValue();\r
+                       tempNotebook.setUpdateSequenceNum(sequence);\r
+                       tempNotebook.setName(query.valueString(2));\r
+                       DateFormat indfm = null;\r
+                       try {\r
+                               indfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
+//                             indfm = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy");\r
+                       } catch (Exception e) { }\r
+                       try {\r
+                               tempNotebook.setServiceCreated(indfm.parse(query.valueString(4)).getTime());\r
+                               tempNotebook.setServiceUpdated(indfm.parse(query.valueString(5)).getTime());\r
+                       } catch (ParseException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+                       tempNotebook.setPublished(new Boolean(query.valueString(6)));\r
+                       tempNotebook.setDefaultNotebook(new Boolean(query.valueString(7)));\r
+                       index.add(tempNotebook); \r
+               }       \r
+               return index;\r
        }       \r
        public List<Notebook> getAllLocal() {\r
        }       \r
        public List<Notebook> getAllLocal() {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Get_All_Local;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NotebookRequest req = Global.dbRunner.notebookResponse.get(id).copy();\r
-               return req.responseNotebooks;\r
+               Notebook tempNotebook;\r
+               List<Notebook> index = new ArrayList<Notebook>();\r
+               boolean check;\r
+\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
+                               "serviceCreated, serviceUpdated, published from Notebook where local=true order by name");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
+               while (query.next()) {\r
+                       tempNotebook = new Notebook();\r
+                       tempNotebook.setGuid(query.valueString(0));\r
+                       int sequence = new Integer(query.valueString(1)).intValue();\r
+                       tempNotebook.setUpdateSequenceNum(sequence);\r
+                       tempNotebook.setName(query.valueString(2));\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
+                       try {\r
+                               tempNotebook.setServiceCreated(indfm.parse(query.valueString(4)).getTime());\r
+                               tempNotebook.setServiceUpdated(indfm.parse(query.valueString(5)).getTime());\r
+                       } catch (ParseException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+                       index.add(tempNotebook); \r
+               }       \r
+               return index;\r
        }\r
        // Archive or un-archive a notebook\r
        }\r
        // Archive or un-archive a notebook\r
-       public void setArchived(String guid, boolean isDirty) {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Set_Archived;\r
-               request.string1 = guid;\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
+       public void setArchived(String guid, boolean val) {\r
+               boolean check;                  \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());                                   \r
+               check = query.prepare("Update notebook set archived=:archived where guid=:guid");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "Notebook SQL archive update has failed.");\r
+               query.bindValue(":guid", guid);\r
+               query.bindValue(":archived", val);\r
+               query.exec();\r
        }\r
        // Load non-archived notebooks from the database\r
        public List<Notebook> getAllArchived() {\r
        }\r
        // Load non-archived notebooks from the database\r
        public List<Notebook> getAllArchived() {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Get_All_Archived;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NotebookRequest req = Global.dbRunner.notebookResponse.get(id).copy();\r
-               return req.responseNotebooks;\r
+               Notebook tempNotebook;\r
+               List<Notebook> index = new ArrayList<Notebook>();\r
+               boolean check;\r
+                                               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
+                               "serviceCreated, serviceUpdated, published from Notebook where archived=true order by name");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
+               while (query.next()) {\r
+                       tempNotebook = new Notebook();\r
+                       tempNotebook.setGuid(query.valueString(0));\r
+                       int sequence = new Integer(query.valueString(1)).intValue();\r
+                       tempNotebook.setUpdateSequenceNum(sequence);\r
+                       tempNotebook.setName(query.valueString(2));\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
+                       try {\r
+                               tempNotebook.setServiceCreated(indfm.parse(query.valueString(4)).getTime());\r
+                               tempNotebook.setServiceUpdated(indfm.parse(query.valueString(5)).getTime());\r
+                       } catch (ParseException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+                       tempNotebook.setPublished(new Boolean(query.valueString(6)));\r
+                       index.add(tempNotebook); \r
+               }       \r
+               return index;\r
        }       \r
        // Check for a local/remote notebook\r
        public boolean isNotebookLocal(String guid) {\r
        }       \r
        // Check for a local/remote notebook\r
        public boolean isNotebookLocal(String guid) {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Is_Notebook_Local;\r
-               request.string1 = guid;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NotebookRequest req =(Global.dbRunner.notebookResponse.get(id)).copy();\r
-               return req.responseBoolean;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Select local from Notebook where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               query.exec();\r
+               if (!query.next()) {\r
+                       return false;\r
+               }\r
+               boolean returnValue = false;\r
+               String returnVal = query.valueString(0);\r
+               if (returnVal.equals("false"))\r
+                       returnValue = false;\r
+               else\r
+                       returnValue = true;\r
+               return returnValue;\r
        }\r
        // Update a notebook sequence number\r
        public void updateNotebookSequence(String guid, int sequence) {\r
        }\r
        // Update a notebook sequence number\r
        public void updateNotebookSequence(String guid, int sequence) {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Update_Notebook_Sequence;\r
-               request.int1 = sequence;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Update Notebook set sequence=:sequence where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               query.bindValue(":sequence", sequence);\r
+               query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Notebook sequence update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               } \r
        }\r
        // Update a notebook GUID number\r
        public void updateNotebookGuid(String oldGuid, String newGuid) {\r
        }\r
        // Update a notebook GUID number\r
        public void updateNotebookGuid(String oldGuid, String newGuid) {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Update_Notebook_Guid;\r
-               request.string1 = oldGuid;\r
-               request.string2 = newGuid;\r
-               Global.dbRunner.addWork(request);\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Update Notebook set guid=:newGuid where guid=:oldGuid");\r
+               query.bindValue(":oldGuid", oldGuid);\r
+               query.bindValue(":newGuid", newGuid);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Notebook guid update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               } \r
+               \r
+               // Update any notes containing the notebook guid\r
+               query.prepare("Update Note set notebookGuid=:newGuid where notebookGuid=:oldGuid");\r
+               query.bindValue(":oldGuid", oldGuid);\r
+               query.bindValue(":newGuid", newGuid);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Notebook guid update for note failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               } \r
+               \r
+               // Update any watch folders with the new guid\r
+               query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Update WatchFolders set notebook=:newGuid where notebook=:oldGuid");\r
+               query.bindValue(":oldGuid", oldGuid);\r
+               query.bindValue(":newGuid", newGuid);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Update WatchFolder notebook failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError().toString());\r
+               }               \r
        }\r
        // Get a list of notes that need to be updated\r
        public List <Notebook> getDirty() {\r
        }\r
        // Get a list of notes that need to be updated\r
        public List <Notebook> getDirty() {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Get_Dirty;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NotebookRequest req = Global.dbRunner.notebookResponse.get(id).copy();\r
-               return req.responseNotebooks;\r
+               Notebook tempNotebook;\r
+               List<Notebook> index = new ArrayList<Notebook>();\r
+               boolean check;\r
+                                               \r
+               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
+                               "serviceCreated, serviceUpdated, published from Notebook where isDirty = true and local=false");\r
+               if (!check) \r
+                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
+               while (query.next()) {\r
+                       tempNotebook = new Notebook();\r
+                       tempNotebook.setGuid(query.valueString(0));\r
+                       int sequence = new Integer(query.valueString(1)).intValue();\r
+                       tempNotebook.setUpdateSequenceNum(sequence);\r
+                       tempNotebook.setName(query.valueString(2));\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
+                       try {\r
+                               tempNotebook.setServiceCreated(indfm.parse(query.valueString(4)).getTime());\r
+                               tempNotebook.setServiceUpdated(indfm.parse(query.valueString(5)).getTime());\r
+                       } catch (ParseException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+                       tempNotebook.setPublished(new Boolean(query.valueString(6)));\r
+                       index.add(tempNotebook); \r
+               }       \r
+               return index;   \r
        }\r
        }\r
-\r
        // This is a convience method to check if a tag exists & update/create based upon it\r
        public void syncNotebook(Notebook notebook, boolean isDirty) {\r
        // This is a convience method to check if a tag exists & update/create based upon it\r
        public void syncNotebook(Notebook notebook, boolean isDirty) {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Sync_Notebook;\r
-               request.notebook = notebook;\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
+               if (!exists(notebook.getGuid())) {\r
+                       addNotebook(notebook, isDirty, isDirty);\r
+                       return;\r
+               }\r
+               updateNotebook(notebook, isDirty);\r
+       }\r
+       // does a record exist?\r
+       private boolean exists(String guid) {\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Select guid from notebook where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "notebook SQL retrieve has failed.");\r
+               boolean retval = query.next();\r
+               return retval;\r
        }\r
        // Reset the dirty flag.  Typically done after a sync.\r
        public void  resetDirtyFlag(String guid) {\r
        }\r
        // Reset the dirty flag.  Typically done after a sync.\r
        public void  resetDirtyFlag(String guid) {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Reset_Dirty;\r
-               request.string1 = guid;\r
-               Global.dbRunner.addWork(request);\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Update notebook set isdirty='false' where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Error resetting notebook dirty field.");\r
        }\r
        }\r
+       \r
+       \r
+       \r
+\r
        // does a record exist?\r
        public String findNotebookByName(String newname) {\r
        // does a record exist?\r
        public String findNotebookByName(String newname) {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Find_Note_By_Name;\r
-               request.string1 = newname;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NotebookRequest req = Global.dbRunner.notebookResponse.get(id).copy();\r
-               return req.responseString;\r
-       }\r
-       // Get Notebook counts\r
-       public List<Pair<String,Integer>> getNotebookCounts() {\r
-               NotebookRequest request = new NotebookRequest();\r
-               request.requestor_id = id;\r
-               request.type = NotebookRequest.Notebook_Counts;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               NotebookRequest req = Global.dbRunner.notebookResponse.get(id).copy();\r
-               return req.responseCounts;\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
                \r
                \r
+               query.prepare("Select guid from notebook where name=:newname");\r
+               query.bindValue(":newname", newname);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "notebook SQL retrieve has failed.");\r
+               String val = null;\r
+               if (query.next())\r
+                       val = query.valueString(0);\r
+               return val;\r
        }\r
        }\r
+       // Get a note tag counts\r
+       public List<Pair<String,Integer>> getNotebookCounts() {\r
+               List<Pair<String,Integer>> counts = new ArrayList<Pair<String,Integer>>();              \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               if (!query.exec("select notebookGuid, count(guid) from note where active=1 group by notebookguid;")) {\r
+                       logger.log(logger.EXTREME, "NoteTags SQL getTagCounts has failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               while (query.next()) {\r
+                       Pair<String,Integer> newCount = new Pair<String,Integer>();\r
+                       newCount.setFirst(query.valueString(0));\r
+                       newCount.setSecond(query.valueInteger(1));\r
+                       counts.add(newCount);\r
+               }       \r
+               return counts;\r
+       }\r
+\r
 }\r
 \r
 }\r
 \r
similarity index 95%
rename from src/cx/fbn/nevernote/sql/runners/REnSearch.java
rename to src/cx/fbn/nevernote/sql/REnSearch.java
index 73e2725..b45a3cb 100644 (file)
@@ -18,7 +18,7 @@
 */\r
 \r
 \r
 */\r
 \r
 \r
-package cx.fbn.nevernote.sql.runners;\r
+package cx.fbn.nevernote.sql;\r
 \r
 import java.text.SimpleDateFormat;\r
 import java.util.ArrayList;\r
 \r
 import java.text.SimpleDateFormat;\r
 import java.util.ArrayList;\r
@@ -54,14 +54,13 @@ public class REnSearch {
        private final List<String>      todo;\r
        private final List<Tag>         tagIndex;\r
        private final ApplicationLogger logger;\r
        private final List<String>      todo;\r
        private final List<Tag>         tagIndex;\r
        private final ApplicationLogger logger;\r
-       private final RDatabaseConnection db;\r
+//     private final DatabaseConnection db;\r
        private boolean any;\r
        private int     minimumWordLength = 3;\r
        private int minimumRecognitionWeight = 80;\r
        private boolean any;\r
        private int     minimumWordLength = 3;\r
        private int minimumRecognitionWeight = 80;\r
-       private final RDatabaseConnection conn;\r
+       private final DatabaseConnection conn;\r
        \r
        \r
-       public REnSearch(RDatabaseConnection c, ApplicationLogger l, RDatabaseConnection d, String s, List<Tag> t, int m, int r) {\r
-               db = d;\r
+       public REnSearch(DatabaseConnection c, ApplicationLogger l, String s, List<Tag> t, int m, int r) {\r
                logger = l;\r
                conn = c;\r
                tagIndex = t;\r
                logger = l;\r
                conn = c;\r
                tagIndex = t;\r
@@ -176,7 +175,7 @@ public class REnSearch {
        private boolean matchNotebook(String guid) {\r
                if (getNotebooks().size() == 0)\r
                        return true;\r
        private boolean matchNotebook(String guid) {\r
                if (getNotebooks().size() == 0)\r
                        return true;\r
-               RNotebookTable bookTable = new RNotebookTable(logger, conn);\r
+               NotebookTable bookTable = new NotebookTable(logger, conn);\r
                List<Notebook> books = bookTable.getAll();\r
 \r
                String name = new String("");\r
                List<Notebook> books = bookTable.getAll();\r
 \r
                String name = new String("");\r
@@ -635,7 +634,7 @@ public class REnSearch {
                        }\r
                }\r
                \r
                        }\r
                }\r
                \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               NSqlQuery query = new NSqlQuery(conn.getConnection());\r
                \r
                if (!query.prepare(buffer.toString()))\r
                        logger.log(logger.HIGH, "EnSearch Sql Prepare Failed:" +query.lastError());\r
                \r
                if (!query.prepare(buffer.toString()))\r
                        logger.log(logger.HIGH, "EnSearch Sql Prepare Failed:" +query.lastError());\r
@@ -653,7 +652,7 @@ public class REnSearch {
                }\r
 \r
                List<Note> guids = new ArrayList<Note>();\r
                }\r
 \r
                List<Note> guids = new ArrayList<Note>();\r
-               RNoteTable noteTable = new RNoteTable(logger, conn);  \r
+               NoteTable noteTable = new NoteTable(logger, conn);  \r
                if (!query.exec()) \r
                        logger.log(logger.EXTREME, "EnSearch.matchWords query failed: " +query.lastError());\r
                List<String> validGuids = new ArrayList<String>();\r
                if (!query.exec()) \r
                        logger.log(logger.EXTREME, "EnSearch.matchWords query failed: " +query.lastError());\r
                List<String> validGuids = new ArrayList<String>();\r
index aaf5d54..fe26133 100644 (file)
 \r
 package cx.fbn.nevernote.sql;\r
 \r
 \r
 package cx.fbn.nevernote.sql;\r
 \r
+import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import java.util.List;\r
 \r
+import com.evernote.edam.type.QueryFormat;\r
 import com.evernote.edam.type.SavedSearch;\r
 \r
 import com.evernote.edam.type.SavedSearch;\r
 \r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.sql.requests.SavedSearchRequest;\r
+import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 \r
 public class SavedSearchTable {\r
 \r
 public class SavedSearchTable {\r
-       int id;\r
+       private final ApplicationLogger                 logger;\r
+       private final DatabaseConnection                db;\r
+\r
        \r
        // Constructor\r
        \r
        // Constructor\r
-       public SavedSearchTable(int i) {\r
-               id = i;\r
+       public SavedSearchTable(ApplicationLogger l, DatabaseConnection d) {\r
+               logger = l;\r
+               db = d;\r
        }\r
        // Create the table\r
        public void createTable() {\r
        }\r
        // Create the table\r
        public void createTable() {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Create_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+        logger.log(logger.HIGH, "Creating table SavedSearch...");\r
+        if (!query.exec("Create table SavedSearch (guid varchar primary key, " +\r
+                       "name varchar, query varchar, format integer, sequence integer, isDirty boolean)"))\r
+               logger.log(logger.HIGH, "Table SavedSearch creation FAILED!!!"); \r
        }\r
        // Drop the table\r
        public void dropTable() {\r
        }\r
        // Drop the table\r
        public void dropTable() {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Drop_Table;\r
-               Global.dbRunner.addWork(request);\r
-       }\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("Drop table SavedSearch");\r
+       }\r
        // get all tags\r
        public List<SavedSearch> getAll() {\r
        // get all tags\r
        public List<SavedSearch> getAll() {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Get_All;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               SavedSearchRequest req = Global.dbRunner.savedSearchResponse.get(id).copy();\r
-               return req.responseSavedSearches;\r
+               SavedSearch tempSearch;\r
+               List<SavedSearch> index = new ArrayList<SavedSearch>();\r
+               boolean check;\r
+                                               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                               \r
+               check = query.exec("Select guid, name, query, format, sequence"\r
+                               +" from SavedSearch");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "SavedSearch SQL retrieve has failed in getAll().");\r
+               while (query.next()) {\r
+                       tempSearch = new SavedSearch();\r
+                       tempSearch.setGuid(query.valueString(0));\r
+                       tempSearch.setName(query.valueString(1));\r
+                       tempSearch.setQuery(query.valueString(2));\r
+                       int fmt = new Integer(query.valueString(3));\r
+                       if (fmt == 1)\r
+                               tempSearch.setFormat(QueryFormat.USER);\r
+                       else\r
+                               tempSearch.setFormat(QueryFormat.SEXP);\r
+                       int sequence = new Integer(query.valueString(4)).intValue();\r
+                       tempSearch.setUpdateSequenceNum(sequence);\r
+                       index.add(tempSearch); \r
+               }       \r
+               return index;\r
        }\r
        public SavedSearch getSavedSearch(String guid) {\r
        }\r
        public SavedSearch getSavedSearch(String guid) {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Get_Saved_Search;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               SavedSearchRequest req = Global.dbRunner.savedSearchResponse.get(id).copy();\r
-               return req.responseSavedSearch;\r
+               SavedSearch tempSearch = null;\r
+               boolean check;\r
+                       \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                               \r
+               check = query.prepare("Select guid, name, query, format, sequence"\r
+                               +" from SavedSearch where guid=:guid");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "SavedSearch SQL prepare has failed in getSavedSearch.");\r
+               query.bindValue(":guid", guid);\r
+               query.exec();\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "SavedSearch SQL retrieve has failed in getSavedSearch.");\r
+               if (query.next()) {\r
+                       tempSearch = new SavedSearch();\r
+                       tempSearch.setGuid(query.valueString(0));\r
+                       tempSearch.setName(query.valueString(1));\r
+                       tempSearch.setQuery(query.valueString(2));\r
+                       int fmt = new Integer(query.valueString(3));\r
+                       if (fmt == 1)\r
+                               tempSearch.setFormat(QueryFormat.USER);\r
+                       else\r
+                               tempSearch.setFormat(QueryFormat.SEXP);\r
+                       int sequence = new Integer(query.valueString(4)).intValue();\r
+                       tempSearch.setUpdateSequenceNum(sequence);\r
+               }\r
+               return tempSearch;\r
        }\r
        }\r
-       // Update a saved search\r
+       // Update a tag\r
        public void updateSavedSearch(SavedSearch search, boolean isDirty) {\r
        public void updateSavedSearch(SavedSearch search, boolean isDirty) {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Update_Saved_Search;\r
-               request.savedSearch = search.deepCopy();\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Update SavedSearch set sequence=:sequence, "+\r
+                       "name=:name, isDirty=:isDirty, query=:query, format=:format "\r
+                       +"where guid=:guid");\r
+       \r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "SavedSearch SQL update prepare has failed.");\r
+                       logger.log(logger.EXTREME, query.lastError().toString());\r
+               }\r
+               query.bindValue(":sequence", search.getUpdateSequenceNum());\r
+               query.bindValue(":name", search.getName());\r
+               query.bindValue(":isDirty", isDirty);\r
+               query.bindValue(":query", search.getQuery());\r
+               if (search.getFormat() == QueryFormat.USER)\r
+                       query.bindValue(":format", 1);\r
+               else\r
+                       query.bindValue(":format", 2);\r
+               \r
+               query.bindValue(":guid", search.getGuid());\r
+               \r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Tag Table update failed.");\r
+                       logger.log(logger.EXTREME, query.lastError().toString());\r
+               }\r
        }\r
        }\r
-       // Delete a saved search\r
+       // Delete a tag\r
        public void expungeSavedSearch(String guid, boolean needsSync) {\r
        public void expungeSavedSearch(String guid, boolean needsSync) {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Expunge_Saved_Search;\r
-               request.string1 = new String(guid);\r
-               request.bool1 = needsSync;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+\r
+               check = query.prepare("delete from SavedSearch "\r
+                               +"where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "SavedSearch SQL delete prepare has failed.");\r
+                       logger.log(logger.EXTREME, query.lastError().toString());\r
+               }\r
+               query.bindValue(":guid", guid);\r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Saved Search delete failed.");\r
+                       logger.log(logger.EXTREME, query.lastError().toString());\r
+               }\r
+\r
+               // Add the work to the parent queue\r
+               if (needsSync) {\r
+                       DeletedTable del = new DeletedTable(logger, db);\r
+                       del.addDeletedItem(guid, "SavedSearch");\r
+               }\r
        }\r
        }\r
-       // Save a saved search\r
+       // Save a tag\r
        public void addSavedSearch(SavedSearch search, boolean isDirty) {\r
        public void addSavedSearch(SavedSearch search, boolean isDirty) {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Add_Saved_Search;\r
-               request.savedSearch = search.deepCopy();\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Insert Into SavedSearch (guid, query, sequence, format, name, isDirty)"\r
+                               +" Values(:guid, :query, :sequence, :format, :name, :isDirty)");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Search SQL insert prepare has failed.");\r
+                       logger.log(logger.EXTREME, query.lastError().toString());\r
+               }\r
+               query.bindValue(":guid", search.getGuid());\r
+               query.bindValue(":query", search.getQuery());\r
+               query.bindValue(":sequence", search.getUpdateSequenceNum());\r
+               if (search.getFormat() == QueryFormat.USER)\r
+                       query.bindValue(":format", 1);\r
+               else\r
+                       query.bindValue(":format", 2);\r
+               query.bindValue(":name", search.getName());\r
+               query.bindValue(":isDirty", isDirty);\r
+       \r
+               check = query.exec();\r
+               if  (!check) {\r
+                       logger.log(logger.MEDIUM, "Search Table insert failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError().toString());\r
+               }\r
        }\r
        }\r
-       // Update sequence number\r
+       // Update a tag sequence number\r
        public void updateSavedSearchSequence(String guid, int sequence) {\r
        public void updateSavedSearchSequence(String guid, int sequence) {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Update_Saved_Search_Sequence;\r
-               request.string1 = new String(guid);\r
-               request.int1 = sequence;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+               ;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Update SavedSearch set sequence=:sequence where guid=:guid");\r
+               query.bindValue(":sequence", sequence);\r
+               query.bindValue(":guid", guid);\r
+               query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "SavedSearch sequence update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        }\r
-       // Update saved search guid\r
+       // Update a tag sequence number\r
        public void updateSavedSearchGuid(String oldGuid, String newGuid) {\r
        public void updateSavedSearchGuid(String oldGuid, String newGuid) {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Get_Saved_Search;\r
-               request.string1 = new String(oldGuid);\r
-               request.string2 = new String(newGuid);\r
-               Global.dbRunner.addWork(request);\r
-       }\r
-       public void resetDirtyFlag(String guid) {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Reset_Dirty_Flag;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Update SavedSearch set guid=:newGuid where guid=:oldGuid");\r
+               query.bindValue(":newGuid", newGuid);\r
+               query.bindValue(":oldGuid", oldGuid);\r
+               query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "SavedSearch guid update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        }\r
-       // Get dirty records\r
+       // Get dirty tags\r
        public List<SavedSearch> getDirty() {\r
        public List<SavedSearch> getDirty() {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Get_Dirty;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               SavedSearchRequest req = Global.dbRunner.savedSearchResponse.get(id).copy();\r
-               return req.responseSavedSearches;\r
+               SavedSearch search;\r
+               List<SavedSearch> index = new ArrayList<SavedSearch>();\r
+               boolean check;\r
+                                               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                               \r
+               check = query.exec("Select guid, query, sequence, name, format"\r
+                               +" from SavedSearch where isDirty = true");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "SavedSearch getDirty prepare has failed.");\r
+               while (query.next()) {\r
+                       search = new SavedSearch();\r
+                       search.setGuid(query.valueString(0));\r
+                       search.setQuery(query.valueString(1));\r
+                       int sequence = new Integer(query.valueString(2)).intValue();\r
+                       search.setUpdateSequenceNum(sequence);\r
+                       search.setName(query.valueString(3));\r
+                       int fmt = new Integer(query.valueString(4)).intValue();\r
+                       if (fmt == 1)\r
+                               search.setFormat(QueryFormat.USER);\r
+                       else\r
+                               search.setFormat(QueryFormat.SEXP);\r
+                       index.add(search); \r
+               }       \r
+               return index;\r
        }\r
        // Find a guid based upon the name\r
        public String findSavedSearchByName(String name) {\r
        }\r
        // Find a guid based upon the name\r
        public String findSavedSearchByName(String name) {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Find_Saved_Search_By_Name;\r
-               request.string1 = new String(name);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               SavedSearchRequest req = Global.dbRunner.savedSearchResponse.get(id).copy();\r
-               return req.string1;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Select guid from SavedSearch where name=:name");\r
+               query.bindValue(":name", name);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "SavedSearch SQL retrieve has failed in findSavedSearchByName().");\r
+               String val = null;\r
+               if (query.next())\r
+                       val = query.valueString(0);\r
+               return val;\r
        }\r
        }\r
-       // given a guid, does the saved search exist\r
+       // given a guid, does the tag exist\r
        public boolean exists(String guid) {\r
        public boolean exists(String guid) {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Exists;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               SavedSearchRequest req = Global.dbRunner.savedSearchResponse.get(id).copy();\r
-               return req.bool1;\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Select guid from SavedSearch where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "SavedSearch SQL retrieve has failed in exists().");\r
+               boolean retval = query.next();\r
+               return retval;\r
        }\r
        // This is a convience method to check if a tag exists & update/create based upon it\r
        public void syncSavedSearch(SavedSearch search, boolean isDirty) {\r
        }\r
        // This is a convience method to check if a tag exists & update/create based upon it\r
        public void syncSavedSearch(SavedSearch search, boolean isDirty) {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               request.requestor_id = id;\r
-               request.type = SavedSearchRequest.Sync_Saved_Search;\r
-               request.savedSearch = search.deepCopy();\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
+               if (exists(search.getGuid()))\r
+                       updateSavedSearch(search, isDirty);\r
+               else\r
+                       addSavedSearch(search, isDirty);\r
+       }\r
+       public void  resetDirtyFlag(String guid) {\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Update SavedSearch set isdirty=false where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Error resetting SavedSearch dirty field in resetDirtyFlag().");\r
        }\r
 }\r
        }\r
 }\r
index 79b469a..7812054 100644 (file)
 \r
 package cx.fbn.nevernote.sql;\r
 \r
 \r
 package cx.fbn.nevernote.sql;\r
 \r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.sql.requests.SyncRequest;\r
+import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
+import cx.fbn.nevernote.utilities.ListManager;\r
 \r
 public class SyncTable {\r
 \r
 public class SyncTable {\r
-       int id;\r
+       ListManager parent;\r
+       private final ApplicationLogger                 logger;\r
+       private final DatabaseConnection                db;\r
+\r
        \r
        // Constructor\r
        \r
        // Constructor\r
-       public SyncTable(int i) {\r
-               id = i;\r
+       public SyncTable(ApplicationLogger l, DatabaseConnection d) {\r
+               logger = l;\r
+               db = d;\r
        }\r
        // Create the table\r
        public void createTable() {\r
        }\r
        // Create the table\r
        public void createTable() {\r
-               SyncRequest request = new SyncRequest();\r
-               request.requestor_id = id;\r
-               request.type = SyncRequest.Create_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               logger.log(logger.HIGH, "Creating table Sync...");\r
+        if (!query.exec("Create table Sync (key varchar primary key, value varchar);"))\r
+               logger.log(logger.HIGH, "Table Sync creation FAILED!!!"); \r
+        addRecord("LastSequenceDate","0");\r
+        addRecord("UpdateSequenceNumber", "0");\r
        }\r
        // Drop the table\r
        public void dropTable() {\r
        }\r
        // Drop the table\r
        public void dropTable() {\r
-               SyncRequest request = new SyncRequest();\r
-               request.requestor_id = id;\r
-               request.type = SyncRequest.Drop_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("Drop table Sync");\r
+       }\r
+       // Add an item to the table\r
+       public void addRecord(String key, String value) {\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Insert Into Sync (key,  value) values (:key, :value);");\r
+               query.bindValue(":key", key);\r
+               query.bindValue(":value", value);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Add to into Sync failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+       }\r
+       // Set a key field\r
+       public String getRecord(String key) {\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+        query.prepare("Select value from Sync where key=:key");\r
+        query.bindValue(":key", key);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "getRecord from sync failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+                       return null;\r
+               }\r
+               if (query.next()) {\r
+                       return (query.valueString(0));\r
+               }\r
+               return null;\r
+       }\r
+       // Set a key field\r
+       public void setRecord(String key, String value) {\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+        query.prepare("Update Sync set value=:value where key=:key");\r
+        query.bindValue(":key", key);\r
+        query.bindValue(":value", value);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "setRecord from sync failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               return;\r
        }\r
        }\r
+\r
        // Set the last sequence date\r
        public void setLastSequenceDate(long date) {\r
        // Set the last sequence date\r
        public void setLastSequenceDate(long date) {\r
-               SyncRequest request = new SyncRequest();\r
-               request.requestor_id = id;\r
-               request.type = SyncRequest.Set_Record;\r
-               request.key = "LastSequenceDate";\r
-               request.value = new Long(date).toString();\r
-               Global.dbRunner.addWork(request);\r
+               setRecord("LastSequenceDate", new Long(date).toString());\r
        }\r
        // Set the last sequence date\r
        public void setUpdateSequenceNumber(int number) {\r
        }\r
        // Set the last sequence date\r
        public void setUpdateSequenceNumber(int number) {\r
-               SyncRequest request = new SyncRequest();\r
-               request.requestor_id = id;\r
-               request.type = SyncRequest.Set_Record;\r
-               request.key = "UpdateSequenceNumber";\r
-               request.value = new Integer(number).toString();\r
-               Global.dbRunner.addWork(request);\r
+               setRecord("UpdateSequenceNumber", new Integer(number).toString());\r
        }\r
        // get last sequence date\r
        public long getLastSequenceDate() {\r
        }\r
        // get last sequence date\r
        public long getLastSequenceDate() {\r
-               SyncRequest request = new SyncRequest();\r
-               request.requestor_id = id;\r
-               request.type = SyncRequest.Get_Record;\r
-               request.key = "LastSequenceDate";\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               SyncRequest req = Global.dbRunner.syncResponse.get(id).copy();\r
-               Long date = new Long(req.responseValue);\r
-               return date;\r
+               return new Long(getRecord("LastSequenceDate"));\r
        }\r
        // Get invalid attributes for a given element\r
        public int getUpdateSequenceNumber() {\r
        }\r
        // Get invalid attributes for a given element\r
        public int getUpdateSequenceNumber() {\r
-               SyncRequest request = new SyncRequest();\r
-               request.requestor_id = id;\r
-               request.type = SyncRequest.Get_Record;\r
-               request.key = "UpdateSequenceNumber";\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               SyncRequest req = Global.dbRunner.syncResponse.get(id).copy();\r
-               Integer number = new Integer(req.responseValue);\r
-               return number;\r
+               return new Integer(getRecord("UpdateSequenceNumber"));\r
        }\r
        }\r
-\r
-       \r
        \r
 \r
        \r
 \r
+\r
 }\r
 }\r
index ce2fe57..23d4a19 100644 (file)
 \r
 package cx.fbn.nevernote.sql;\r
 \r
 \r
 package cx.fbn.nevernote.sql;\r
 \r
+import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import com.evernote.edam.type.Tag;\r
 \r
 import java.util.List;\r
 \r
 import com.evernote.edam.type.Tag;\r
 \r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.sql.requests.DeletedItemRequest;\r
-import cx.fbn.nevernote.sql.requests.TagRequest;\r
+import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 \r
 public class TagTable {\r
 \r
 public class TagTable {\r
-       int id;\r
-       \r
-       public TagTable (int i) {\r
-               id = i;\r
+       private final ApplicationLogger logger;\r
+       DatabaseConnection db;\r
+\r
+       public TagTable (ApplicationLogger l, DatabaseConnection d) {\r
+               logger = l;\r
+               db = d;\r
        }\r
        // Create the table\r
        public void createTable() {\r
        }\r
        // Create the table\r
        public void createTable() {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.type = TagRequest.Create_Table;\r
-               Global.dbRunner.addWork(request);\r
-       }\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+        logger.log(logger.HIGH, "Creating table Tag...");\r
+        if (!query.exec("Create table Tag (guid varchar primary key, " +\r
+                       "parentGuid varchar, sequence integer, hashCode integer, name varchar, isDirty boolean)"))\r
+               logger.log(logger.HIGH, "Table TAG creation FAILED!!!");  \r
+               \r
+       }\r
        // Drop the table\r
        public void dropTable() {\r
        // Drop the table\r
        public void dropTable() {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.type = DeletedItemRequest.Drop_Table;\r
-               Global.dbRunner.addWork(request);\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("Drop table Tag");\r
+               \r
        }\r
        // get all tags\r
        public List<Tag> getAll() {\r
        }\r
        // get all tags\r
        public List<Tag> getAll() {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.type = DeletedItemRequest.Get_All;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               TagRequest req = Global.dbRunner.tagResponse.get(id).copy();\r
-               return req.responseTags;\r
+               \r
+               Tag tempTag;\r
+               List<Tag> index = new ArrayList<Tag>();\r
+               boolean check;\r
+                                               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                               \r
+               check = query.exec("Select guid, parentGuid, sequence, name"\r
+                               +" from Tag");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Tag SQL retrieve has failed.");\r
+                       logger.log(logger.EXTREME, query.lastError());\r
+               }\r
+               while (query.next()) {\r
+                       tempTag = new Tag();\r
+                       tempTag.setGuid(query.valueString(0));\r
+                       if (query.valueString(1) != null)\r
+                               tempTag.setParentGuid(query.valueString(1));\r
+                       else\r
+                               tempTag.setParentGuid(null);\r
+                       int sequence = new Integer(query.valueString(2)).intValue();\r
+                       tempTag.setUpdateSequenceNum(sequence);\r
+                       tempTag.setName(query.valueString(3));\r
+                       index.add(tempTag); \r
+               }       \r
+               \r
+               return index;\r
        }\r
        public Tag getTag(String guid) {\r
        }\r
        public Tag getTag(String guid) {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = new String(guid);\r
-               request.type = TagRequest.Get_Tag;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               TagRequest req = Global.dbRunner.tagResponse.get(id).copy();\r
-               return req.responseTag;\r
+               Tag tempTag = new Tag();                \r
+               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                                       \r
+               if (!query.prepare("Select guid, parentGuid, sequence, name"\r
+                               +" from Tag where guid=:guid"))\r
+                       logger.log(logger.EXTREME, "Tag select by guid SQL prepare has failed.");\r
+\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Tag select by guid SQL exec has failed.");\r
+               \r
+               if (!query.next())  {\r
+                       return tempTag;\r
+               }\r
+               tempTag.setGuid(query.valueString(0));\r
+               tempTag.setParentGuid(query.valueString(1));\r
+               int sequence = new Integer(query.valueString(2)).intValue();\r
+               tempTag.setUpdateSequenceNum(sequence);\r
+               tempTag.setName(query.valueString(3));\r
+               return tempTag;\r
        }\r
        // Update a tag\r
        public void updateTag(Tag tempTag, boolean isDirty) {\r
        }\r
        // Update a tag\r
        public void updateTag(Tag tempTag, boolean isDirty) {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.type = TagRequest.Update_Tag;\r
-               request.tag = tempTag.deepCopy();\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
-\r
+               boolean check;\r
+               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Update Tag set parentGuid=:parentGuid, sequence=:sequence, "+\r
+                       "hashCode=:hashCode, name=:name, isDirty=:isDirty "\r
+                       +"where guid=:guid");\r
+      \r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Tag SQL update prepare has failed.");\r
+                       logger.log(logger.EXTREME, query.lastError());\r
+               }\r
+               query.bindValue(":parentGuid", tempTag.getParentGuid());\r
+               query.bindValue(":sequence", tempTag.getUpdateSequenceNum());\r
+               query.bindValue(":hashCode", tempTag.hashCode());\r
+               query.bindValue(":name", tempTag.getName());\r
+               query.bindValue(":isDirty", isDirty);\r
+               query.bindValue(":guid", tempTag.getGuid());\r
+               \r
+               check = query.exec();\r
+               if (!check)\r
+                       logger.log(logger.MEDIUM, "Tag Table update failed.");\r
+               \r
        }\r
        // Delete a tag\r
        public void expungeTag(String guid, boolean needsSync) {\r
        }\r
        // Delete a tag\r
        public void expungeTag(String guid, boolean needsSync) {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = new String(guid);\r
-               request.bool1 = needsSync;\r
-               request.type = TagRequest.Expunge_Tag;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+               \r
+               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+\r
+               check = query.prepare("delete from Tag "\r
+                               +"where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Tag SQL delete prepare has failed.");\r
+                       logger.log(logger.EXTREME, query.lastError());\r
+               }\r
+               query.bindValue(":guid", guid);\r
+               check = query.exec();\r
+               if (!check)\r
+                       logger.log(logger.MEDIUM, "Tag delete failed.");\r
+               \r
+               check = query.prepare("delete from NoteTags "\r
+                               +"where tagGuid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "NoteTags SQL delete prepare has failed.");\r
+                       logger.log(logger.EXTREME, query.lastError());\r
+               }\r
+               \r
+               query.bindValue(":guid", guid);\r
+               check = query.exec();\r
+               if (!check)\r
+                       logger.log(logger.MEDIUM, "NoteTags delete failed.");\r
+               \r
+               // Add the work to the parent queue\r
+               if (needsSync) {\r
+                       DeletedTable del = new DeletedTable(logger, db);\r
+                       del.addDeletedItem(guid, "Tag");\r
+               }\r
        }\r
        // Save a tag\r
        public void addTag(Tag tempTag, boolean isDirty) {\r
        }\r
        // Save a tag\r
        public void addTag(Tag tempTag, boolean isDirty) {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.type = TagRequest.Add_Tag;\r
-               request.tag = tempTag.deepCopy();\r
-               request.bool1 = isDirty;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Insert Into Tag (guid, parentGuid, sequence, hashCode, name, isDirty)"\r
+                               +" Values(:guid, :parentGuid, :sequence, :hashCode, :name, :isDirty)");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Tag SQL insert prepare has failed.");\r
+                       logger.log(logger.EXTREME, query.lastError());\r
+               }\r
+               query.bindValue(":guid", tempTag.getGuid());\r
+               query.bindValue(":parentGuid", tempTag.getParentGuid());\r
+               query.bindValue(":sequence", tempTag.getUpdateSequenceNum());\r
+               query.bindValue(":hashCode", tempTag.hashCode());\r
+               query.bindValue(":name", tempTag.getName());\r
+               query.bindValue(":isDirty", isDirty);\r
+               \r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Tag Table insert failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        // Update a tag's parent\r
        public void updateTagParent(String guid, String parentGuid) {\r
        }\r
        // Update a tag's parent\r
        public void updateTagParent(String guid, String parentGuid) {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.type = TagRequest.Update_Parent;\r
-               request.string1 = new String(guid);\r
-               request.string2 = new String(parentGuid);\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Update Tag set parentGuid=:parentGuid where guid=:guid");\r
+               if (!check) {\r
+                       logger.log(logger.EXTREME, "Tag SQL tag parent update prepare has failed.");\r
+                       logger.log(logger.EXTREME, query.lastError());\r
+               }\r
+\r
+               query.bindValue(":parentGuid", parentGuid);\r
+               query.bindValue(":guid", guid);\r
+               \r
+               check = query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Tag parent update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        //Save tags from Evernote\r
        public void saveTags(List<Tag> tags) {\r
        }\r
        //Save tags from Evernote\r
        public void saveTags(List<Tag> tags) {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.type = TagRequest.Save_Tags;\r
-               for (int i=0; i<tags.size(); i++) \r
-                       request.tags.add(tags.get(i).deepCopy());\r
-               Global.dbRunner.addWork(request);\r
+               Tag tempTag;\r
+               for (int i=0; i<tags.size(); i++) {\r
+                       tempTag = tags.get(i);\r
+                       addTag(tempTag, false);\r
+               }               \r
        }\r
        // Update a tag sequence number\r
        public void updateTagSequence(String guid, int sequence) {\r
        }\r
        // Update a tag sequence number\r
        public void updateTagSequence(String guid, int sequence) {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.type = TagRequest.Update_Tag_Sequence;\r
-               request.string1 = new String(guid);\r
-               request.int1 = sequence;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Update Tag set sequence=:sequence where guid=:guid");\r
+               query.bindValue(":sequence", sequence);\r
+               query.bindValue(":guid", guid);\r
+               \r
+               query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Tag sequence update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               \r
        }\r
        // Update a tag sequence number\r
        public void updateTagGuid(String oldGuid, String newGuid) {\r
        }\r
        // Update a tag sequence number\r
        public void updateTagGuid(String oldGuid, String newGuid) {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = new String(oldGuid);\r
-               request.string2 = new String(newGuid);\r
-               request.type = TagRequest.Update_Tag_Guid;\r
-               Global.dbRunner.addWork(request);\r
+               boolean check;\r
+               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               check = query.prepare("Update Tag set guid=:newGuid where guid=:oldGuid");\r
+               query.bindValue(":newGuid", newGuid);\r
+               query.bindValue(":oldGuid", oldGuid);\r
+               query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Tag guid update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               \r
+               check = query.prepare("Update Tag set parentGuid=:newGuid where parentGuid=:oldGuid");\r
+               query.bindValue(":newGuid", newGuid);\r
+               query.bindValue(":oldGuid", oldGuid);\r
+               query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Tag guid update failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               \r
+               check = query.prepare("Update NoteTags set tagGuid=:newGuid where tagGuid=:oldGuid");\r
+               query.bindValue(":newGuid", newGuid);\r
+               query.bindValue(":oldGuid", oldGuid);\r
+               query.exec();\r
+               if (!check) {\r
+                       logger.log(logger.MEDIUM, "Tag guid update failed for NoteTags.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
+               \r
        }\r
        // Get dirty tags\r
        public List<Tag> getDirty() {\r
        }\r
        // Get dirty tags\r
        public List<Tag> getDirty() {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.type = TagRequest.Get_Dirty;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               TagRequest req = Global.dbRunner.tagResponse.get(id).copy();\r
-               return req.responseTags;\r
+               Tag tempTag;\r
+               List<Tag> index = new ArrayList<Tag>();\r
+               boolean check;\r
+                                               \r
+               \r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                               \r
+               check = query.exec("Select guid, parentGuid, sequence, name"\r
+                               +" from Tag where isDirty = true");\r
+               if (!check)\r
+                       logger.log(logger.EXTREME, "Tag SQL retrieve has failed.");\r
+               while (query.next()) {\r
+                       tempTag = new Tag();\r
+                       tempTag.setGuid(query.valueString(0));\r
+                       tempTag.setParentGuid(query.valueString(1));\r
+                       int sequence = new Integer(query.valueString(2)).intValue();\r
+                       tempTag.setUpdateSequenceNum(sequence);\r
+                       tempTag.setName(query.valueString(3));\r
+                       if (tempTag.getParentGuid() != null && tempTag.getParentGuid().equals(""))\r
+                               tempTag.setParentGuid(null);\r
+                       index.add(tempTag); \r
+               }\r
+               return index;\r
        }\r
        // Find a guid based upon the name\r
        public String findTagByName(String name) {\r
        }\r
        // Find a guid based upon the name\r
        public String findTagByName(String name) {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.type = TagRequest.Find_Tag_By_Name;\r
-               request.string1 = new String(name);\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               TagRequest req = Global.dbRunner.tagResponse.get(id).copy();\r
-               return req.responseString;\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Select guid from tag where name=:name");\r
+               query.bindValue(":name", name);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Tag SQL retrieve has failed.");\r
+               String val = null;\r
+               if (query.next())\r
+                       val = query.valueString(0);\r
+               return val;\r
        }\r
        // given a guid, does the tag exist\r
        public boolean exists(String guid) {\r
        }\r
        // given a guid, does the tag exist\r
        public boolean exists(String guid) {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = new String(guid);\r
-               request.type = TagRequest.Exists;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               TagRequest req = Global.dbRunner.tagResponse.get(id).copy();\r
-               return req.responseBool;\r
-\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Select guid from tag where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Tag SQL retrieve has failed.");\r
+               boolean retval = query.next();\r
+               return retval;\r
        }\r
        // This is a convience method to check if a tag exists & update/create based upon it\r
        public void syncTag(Tag tag, boolean isDirty) {\r
        }\r
        // This is a convience method to check if a tag exists & update/create based upon it\r
        public void syncTag(Tag tag, boolean isDirty) {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.tag = tag.deepCopy();\r
-               request.bool1 = isDirty;\r
-               request.type = TagRequest.Sync_Tag;\r
-               Global.dbRunner.addWork(request);\r
+               if (exists(tag.getGuid()))\r
+                       updateTag(tag, isDirty);\r
+               else\r
+                       addTag(tag, isDirty);\r
        }\r
        public void  resetDirtyFlag(String guid) {\r
        }\r
        public void  resetDirtyFlag(String guid) {\r
-               TagRequest request = new TagRequest();\r
-               request.requestor_id = id;\r
-               request.type = TagRequest.Reset_Dirty_Flag;\r
-               request.string1 = new String(guid);\r
-               Global.dbRunner.addWork(request);\r
+               \r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               \r
+               query.prepare("Update tag set isdirty=false where guid=:guid");\r
+               query.bindValue(":guid", guid);\r
+               if (!query.exec())\r
+                       logger.log(logger.EXTREME, "Error resetting tag dirty field.");\r
        }\r
 }\r
        }\r
 }\r
@@ -17,7 +17,7 @@
  *\r
 */\r
 \r
  *\r
 */\r
 \r
-package cx.fbn.nevernote.sql.runners;\r
+package cx.fbn.nevernote.sql;\r
 \r
 public class WatchFolderRecord {\r
        public String folder;\r
 \r
 public class WatchFolderRecord {\r
        public String folder;\r
index d802b6f..32caa0a 100644 (file)
 \r
 package cx.fbn.nevernote.sql;\r
 \r
 \r
 package cx.fbn.nevernote.sql;\r
 \r
+import java.util.ArrayList;\r
 import java.util.List;\r
 \r
 import java.util.List;\r
 \r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.sql.requests.WatchFolderRequest;\r
-import cx.fbn.nevernote.sql.runners.WatchFolderRecord;\r
+import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 import cx.fbn.nevernote.utilities.ListManager;\r
 \r
 public class WatchFolderTable {\r
        ListManager parent;\r
 import cx.fbn.nevernote.utilities.ListManager;\r
 \r
 public class WatchFolderTable {\r
        ListManager parent;\r
-       int id;\r
+       private final ApplicationLogger                 logger;\r
+       private final DatabaseConnection                db;\r
+\r
        \r
        // Constructor\r
        \r
        // Constructor\r
-       public WatchFolderTable(int i) {\r
-               id = i;\r
+       public WatchFolderTable(ApplicationLogger l, DatabaseConnection d) {\r
+               logger = l;\r
+               db = d;\r
        }\r
        // Create the table\r
        public void createTable() {\r
        }\r
        // Create the table\r
        public void createTable() {\r
-               WatchFolderRequest request = new WatchFolderRequest();\r
-               request.requestor_id = id;\r
-               request.type = WatchFolderRequest.Create_Tables;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               logger.log(logger.HIGH, "Creating table WatchFolder...");\r
+        if (!query.exec("Create table WatchFolders (folder varchar primary key, notebook varchar," +\r
+                       "keep boolean, depth integer)"));\r
+               logger.log(logger.HIGH, "Table WatchFolders creation FAILED!!!"); \r
        }\r
        // Drop the table\r
        public void dropTable() {\r
        }\r
        // Drop the table\r
        public void dropTable() {\r
-               WatchFolderRequest request = new WatchFolderRequest();\r
-               request.requestor_id = id;\r
-               request.type = WatchFolderRequest.Drop_Tables;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("Drop table WatchFolders");\r
        }\r
        }\r
-       // Add an item to the deleted table\r
+       // Add an folder\r
        public void addWatchFolder(String folder, String notebook, boolean keep, int depth) {\r
        public void addWatchFolder(String folder, String notebook, boolean keep, int depth) {\r
-               WatchFolderRequest request = new WatchFolderRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = folder;\r
-               request.string2 = notebook;\r
-               request.bool1 = keep;\r
-               request.int1 = depth;\r
-               request.type = WatchFolderRequest.Add_Watch_Folder;\r
-               Global.dbRunner.addWork(request);\r
-       }\r
-       public List<WatchFolderRecord> getAll() {\r
-               WatchFolderRequest request = new WatchFolderRequest();\r
-               request.requestor_id = id;\r
-               request.type = WatchFolderRequest.Get_All;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               WatchFolderRequest req = Global.dbRunner.watchFolderResponse.get(id).copy();\r
-               return req.responseWatchFolders;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Insert Into WatchFolders (folder, notebook, keep, depth) " +\r
+                               "values (:folder, :notebook, :keep, :depth)");\r
+               query.bindValue(":folder", folder);\r
+               query.bindValue(":notebook", notebook);\r
+               query.bindValue(":keep", keep);\r
+               query.bindValue(":depth", depth);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Insert into WatchFolder failed.");\r
+               }\r
        }\r
        }\r
-       public void expungeFolder(String folder) {\r
-               WatchFolderRequest request = new WatchFolderRequest();\r
-               request.requestor_id = id;\r
-               request.string1 = folder;\r
-               request.type = WatchFolderRequest.Expunge_Folder;\r
-               Global.dbRunner.addWork(request);\r
+       // remove an folder\r
+       public void expungeWatchFolder(String folder) {\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("delete from WatchFolders where folder=:folder");\r
+               query.bindValue(":folder", folder);\r
+               if (!query.exec()) {\r
+                       logger.log(logger.MEDIUM, "Expunge WatchFolder failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        public void expungeAll() {\r
        }\r
        public void expungeAll() {\r
-               WatchFolderRequest request = new WatchFolderRequest();\r
-               request.requestor_id = id;\r
-               request.type = WatchFolderRequest.Expunge_All;\r
-               Global.dbRunner.addWork(request);\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               if (!query.exec("delete from WatchFolders")) {\r
+                       logger.log(logger.MEDIUM, "Expunge all WatchFolder failed.");\r
+                       logger.log(logger.MEDIUM, query.lastError());\r
+               }\r
        }\r
        }\r
-       public String getNotebook(String dir) {\r
-               WatchFolderRequest request = new WatchFolderRequest();\r
-               request.requestor_id = id;\r
-               request.type = WatchFolderRequest.Get_Notebook;\r
-               request.string1 = dir;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               WatchFolderRequest req = Global.dbRunner.watchFolderResponse.get(id).copy();\r
-               return req.responseString;\r
+       public List<WatchFolderRecord> getAll() {\r
+               logger.log(logger.HIGH, "Entering RWatchFolders.getAll");\r
+               \r
+               List<WatchFolderRecord> list = new ArrayList<WatchFolderRecord>();\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("Select folder, (select name from notebook where guid = notebook), keep, depth from WatchFolders");\r
+               while (query.next()) {\r
+                       WatchFolderRecord record = new WatchFolderRecord();\r
+                       record.folder = query.valueString(0);\r
+                       record.notebook = query.valueString(1);\r
+                       record.keep = new Boolean(query.valueString(2));\r
+                       record.depth = new Integer(query.valueString(3));\r
+                       list.add(record);\r
+               }\r
+               logger.log(logger.HIGH, "Leaving RWatchFolders.getAll");\r
+               return list;\r
+\r
        }\r
        }\r
+       \r
+       public String getNotebook(String dir) {\r
+               logger.log(logger.HIGH, "Entering RWatchFolders.getNotebook");\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.prepare("Select notebook from WatchFolders where folder=:dir");\r
+               query.bindValue(":dir", dir);\r
+               query.exec();\r
+               String response = null;\r
+               while (query.next()) {\r
+                       response = query.valueString(0);\r
+               }\r
+               logger.log(logger.HIGH, "Leaving RWatchFolders.getNotebook");\r
+               return response;\r
 \r
 \r
+       }\r
 }\r
 }\r
index c7ca076..28f7b7b 100644 (file)
 \r
 package cx.fbn.nevernote.sql;\r
 \r
 \r
 package cx.fbn.nevernote.sql;\r
 \r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.sql.requests.WordRequest;\r
-\r
+import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
+import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 \r
 public class WordsTable {\r
 \r
 public class WordsTable {\r
-       private final int id;\r
+       private final ApplicationLogger                 logger;\r
+       private final DatabaseConnection                db;\r
+\r
        \r
        // Constructor\r
        \r
        // Constructor\r
-       public WordsTable(int i) {\r
-               id = i;\r
+       public WordsTable(ApplicationLogger l, DatabaseConnection d) {\r
+               logger = l;\r
+               db = d;\r
        }\r
        // Create the table\r
        public void createTable() {\r
        }\r
        // Create the table\r
        public void createTable() {\r
-               WordRequest request = new WordRequest();\r
-               request.requestor_id = id;\r
-               request.type = WordRequest.Create_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+        logger.log(logger.HIGH, "Creating table WORDS ...");\r
+        if (!query.exec("create table words (word varchar, guid varchar, source varchar, weight int, primary key (word, guid, source));")) {\r
+               logger.log(logger.HIGH, "Table WORDS creation FAILED!!!");   \r
+               logger.log(logger.HIGH, query.lastError());\r
+        }   \r
        }\r
        // Drop the table\r
        public void dropTable() {\r
        }\r
        // Drop the table\r
        public void dropTable() {\r
-               WordRequest request = new WordRequest();\r
-               request.requestor_id = id;\r
-               request.type = WordRequest.Drop_Table;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("drop table words");\r
        }\r
        // Count unindexed notes\r
        public int getWordCount() {\r
        }\r
        // Count unindexed notes\r
        public int getWordCount() {\r
-               WordRequest request = new WordRequest();\r
-               request.requestor_id = id;\r
-               request.type = WordRequest.Get_Word_Count;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
-               WordRequest req = Global.dbRunner.wordResponse.get(id).copy();\r
-               return req.responseInt;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+               query.exec("select count(*) from words");\r
+               query.next(); \r
+               int returnValue = new Integer(query.valueString(0));\r
+               return returnValue;\r
        }\r
 \r
        // Clear out the word index table\r
        public void clearWordIndex() {\r
        }\r
 \r
        // Clear out the word index table\r
        public void clearWordIndex() {\r
-               WordRequest request = new WordRequest();\r
-               request.requestor_id = id;\r
-               request.type = WordRequest.Clear_Word_Index;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery query = new NSqlQuery(db.getConnection());\r
+        logger.log(logger.HIGH, "DELETE FROM WORDS");\r
+        \r
+        boolean check = query.exec("DELETE FROM WORDS");\r
+        if (!check)\r
+               logger.log(logger.HIGH, "Table WORDS clear has FAILED!!!");  \r
        }       \r
 \r
        //********************************************************************************\r
        }       \r
 \r
        //********************************************************************************\r
@@ -70,24 +72,65 @@ public class WordsTable {
        //********************************************************************************\r
        //********************************************************************************\r
        public void expungeFromWordIndex(String guid, String type) {\r
        //********************************************************************************\r
        //********************************************************************************\r
        public void expungeFromWordIndex(String guid, String type) {\r
-               WordRequest request = new WordRequest();\r
-               request.requestor_id = id;\r
-               request.type = WordRequest.Expunge_From_Word_Index;\r
-               request.string1 = guid;\r
-               request.string2 = type;\r
-               Global.dbRunner.addWork(request);\r
+               NSqlQuery deleteWords = new NSqlQuery(db.getConnection());\r
+               if (!deleteWords.prepare("delete from words where guid=:guid and source=:source")) {\r
+                       logger.log(logger.EXTREME, "Note SQL select prepare deleteWords has failed.");\r
+                       logger.log(logger.MEDIUM, deleteWords.lastError());\r
+               }\r
+       \r
+               deleteWords.bindValue(":guid", guid);\r
+               deleteWords.bindValue(":source", type);\r
+               deleteWords.exec();\r
+\r
        }\r
        // Reindex a note\r
        public synchronized void addWordToNoteIndex(String guid, String word, String type, Integer weight) {\r
        }\r
        // Reindex a note\r
        public synchronized void addWordToNoteIndex(String guid, String word, String type, Integer weight) {\r
-               WordRequest request = new WordRequest();\r
-               request.requestor_id = id;\r
-               request.type = WordRequest.Add_Word_To_Note_Index;\r
-               request.string1 = guid;\r
-               request.string2 = word;\r
-               request.string3 = type;\r
-               request.int1 = weight;\r
-               Global.dbRunner.addWork(request);\r
-               Global.dbClientWait(id);\r
+               NSqlQuery findWords = new NSqlQuery(db.getConnection());\r
+               if (!findWords.prepare("Select weight from words where guid=:guid and source=:type and word=:word")) {\r
+                       logger.log(logger.MEDIUM, "Prepare failed in addWordToNoteIndex()");\r
+                       logger.log(logger.MEDIUM, findWords.lastError());\r
+               }\r
+               \r
+               findWords.bindValue(":guid", guid);\r
+               findWords.bindValue(":type", type);\r
+               findWords.bindValue(":word", word);\r
+               \r
+               boolean addNeeded = true;\r
+               findWords.exec();\r
+               // If we have a match, find out which has the heigher weight & update accordingly\r
+               if (findWords.next()) {\r
+                       int recordWeight = new Integer(findWords.valueString(0));\r
+                       addNeeded = false;\r
+                       if (recordWeight < weight) {\r
+                               NSqlQuery updateWord = new NSqlQuery(db.getConnection());\r
+                               if (!updateWord.prepare("Update words set weight=:weight where guid=:guid and source=:type and word=:word")) {\r
+                                       logger.log(logger.MEDIUM, "Prepare failed for find words in addWordToNoteIndex()");\r
+                                       logger.log(logger.MEDIUM, findWords.lastError());                                       \r
+                               }\r
+                               \r
+                               updateWord.bindValue(":weight", weight);\r
+                               updateWord.bindValue(":guid", guid);\r
+                               updateWord.bindValue(":type", type);\r
+                               updateWord.bindValue(":word",word);\r
+                               updateWord.exec();\r
+                       }\r
+               }\r
+               \r
+               \r
+               if (!addNeeded)\r
+                       return;\r
+               \r
+               NSqlQuery insertWords = new NSqlQuery(db.getConnection());\r
+               if (!insertWords.prepare("Insert Into Words (word, guid, weight, source)"\r
+                               +" Values(:word, :guid, :weight, :type )")) {\r
+                       logger.log(logger.EXTREME, "Note SQL select prepare checkWords has failed.");\r
+                       logger.log(logger.MEDIUM, insertWords.lastError());\r
+               }\r
+               insertWords.bindValue(":word", word);\r
+               insertWords.bindValue(":guid", guid);\r
+               insertWords.bindValue(":weight", weight);\r
+               insertWords.bindValue(":type", type);\r
+               insertWords.exec();\r
        }\r
 \r
 \r
        }\r
 \r
 \r
diff --git a/src/cx/fbn/nevernote/sql/requests/DBRunnerRequest.java b/src/cx/fbn/nevernote/sql/requests/DBRunnerRequest.java
deleted file mode 100644 (file)
index febf81b..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-\r
-public class DBRunnerRequest {\r
-       public static int GENERIC                       = 1;\r
-       public static int DATABASE                      = 2;\r
-       public static int DELETED_ITEM          = 3;\r
-       public static int NOTEBOOK                      = 4;\r
-       public static int TAG                           = 5;\r
-       public static int SAVED_SEARCH          = 6;\r
-       public static int NOTE                          = 7;\r
-       public static int RESOURCE                      = 8;\r
-       public static int NOTE_TAGS                     = 9;\r
-       public static int ENSEARCH                      = 10;\r
-       public static int WATCH_FOLDER          = 11;\r
-       public static int WORD                          = 12;\r
-       public static int Invalid_XML           = 13;\r
-       public static int Sync                          = 14;\r
-       \r
-       public volatile int requestor_id;\r
-       public volatile int category;\r
-       public volatile int type;\r
-       public volatile String request;\r
-}\r
diff --git a/src/cx/fbn/nevernote/sql/requests/DatabaseRequest.java b/src/cx/fbn/nevernote/sql/requests/DatabaseRequest.java
deleted file mode 100644 (file)
index 826de36..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-\r
-public class DatabaseRequest extends DBRunnerRequest {\r
-        // NFC TODO: change to use an Enum and clarify distinction with constants on DBRunnerRequest \r
-       public static int Create_Tables                         = 1;\r
-       public static int Drop_Tables                           = 2;\r
-       public static int Shutdown                                      = 4;\r
-       public static int Compact                                       = 5;\r
-       public static int Execute_Sql               = 6;\r
-       public static int Execute_Sql_Index                     = 7;\r
-       public static int Backup_Database                       = 8;\r
-\r
-       public volatile String                  string1;\r
-       public volatile String                  string2;\r
-       public volatile int                     int1;\r
-       public volatile long                    long1;\r
-       \r
-       public DatabaseRequest() {\r
-               category = DATABASE;\r
-       }\r
-       \r
-       public DatabaseRequest copy() {\r
-               DatabaseRequest request = new DatabaseRequest();\r
-               \r
-               request.requestor_id = requestor_id;\r
-               request.type = type;\r
-               request.category = category;\r
-               request.long1 = long1;\r
-               request.int1 = int1;\r
-               if (string1 != null)\r
-                       request.string1 = new String(string1);\r
-               if (string2 != null)\r
-                       request.string2 = new String(string2);\r
-               \r
-               return request;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/requests/DeletedItemRequest.java b/src/cx/fbn/nevernote/sql/requests/DeletedItemRequest.java
deleted file mode 100644 (file)
index 2335070..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import cx.fbn.nevernote.sql.runners.DeletedItemRecord;\r
-\r
-public class DeletedItemRequest extends DBRunnerRequest {\r
-       public static int Create_Table                          = 1;\r
-       public static int Drop_Table                            = 2;\r
-       public static int Add_Deleted_Item                      = 3;\r
-       public static int Expunge_All                           = 4;\r
-       public static int Get_All                                       = 5;\r
-       public static int Expunge_Record                        = 6;\r
-\r
-       public volatile String                  string1;\r
-       public volatile String                  string2;\r
-       \r
-       public List<DeletedItemRecord>  responseDeletedRecords;\r
-       \r
-       public DeletedItemRequest() {\r
-               category = DELETED_ITEM;\r
-       }\r
-       \r
-       public DeletedItemRequest copy() {\r
-               DeletedItemRequest request = new DeletedItemRequest();\r
-               \r
-               request.requestor_id = requestor_id;\r
-               request.type = type;\r
-               request.category = category;\r
-               \r
-               if (string1 != null)\r
-                       request.string1 = new String(string1);\r
-               if (string2 != null)\r
-                       request.string2 = new String(string2);\r
-               \r
-               if (responseDeletedRecords != null) {\r
-                       request.responseDeletedRecords = new ArrayList<DeletedItemRecord>();\r
-                       for (int i=0; i<responseDeletedRecords.size(); i++) {\r
-                               DeletedItemRecord record = new DeletedItemRecord();\r
-                               record.guid = new String(responseDeletedRecords.get(i).guid);\r
-                               record.type = new String(responseDeletedRecords.get(i).type);\r
-                               request.responseDeletedRecords.add(record);\r
-                       }\r
-               }\r
-               \r
-               return request;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/requests/EnSearchRequest.java b/src/cx/fbn/nevernote/sql/requests/EnSearchRequest.java
deleted file mode 100644 (file)
index 414b69b..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.evernote.edam.type.Note;\r
-import com.evernote.edam.type.Tag;\r
-\r
-\r
-public class EnSearchRequest extends DBRunnerRequest {\r
-       public volatile String                  string1;\r
-       public volatile List<Tag>               tags;\r
-       public volatile int                             int1;\r
-       public volatile int                             int2;\r
-       public volatile List<Note>              responseNotes;\r
-       public volatile List<String>    responseStrings;\r
-\r
-       \r
-       public EnSearchRequest() {\r
-               category = ENSEARCH;\r
-       }\r
-       \r
-       public EnSearchRequest copy() {\r
-               EnSearchRequest request = new EnSearchRequest();\r
-               \r
-               request.requestor_id = requestor_id;\r
-               request.type = type;\r
-               request.int1 = int1;\r
-               request.int2 = int2;\r
-               request.category = category;\r
-               if (string1 != null)\r
-                       request.string1 = new String(string1);\r
-               if (tags!=null) { \r
-                       request.tags = new ArrayList<Tag>();\r
-                       for (int i=0; i<tags.size(); i++)\r
-                               request.tags.add(tags.get(i).deepCopy());\r
-               }\r
-               \r
-               if (responseNotes != null) {\r
-                       request.responseNotes = new ArrayList<Note>();\r
-                       for (int i=0; i<responseNotes.size(); i++) {\r
-                               request.responseNotes.add(responseNotes.get(i).deepCopy());\r
-                       }\r
-               }\r
-               \r
-               if (responseStrings != null) {\r
-                       request.responseStrings = new ArrayList<String>();\r
-                       for (int i=0; i<responseStrings.size(); i++) {\r
-                               request.responseStrings.add(new String(responseStrings.get(i)));\r
-                       }\r
-               }\r
-\r
-               return request;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/requests/InvalidXMLRequest.java b/src/cx/fbn/nevernote/sql/requests/InvalidXMLRequest.java
deleted file mode 100644 (file)
index 6e348d2..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-\r
-public class InvalidXMLRequest extends DBRunnerRequest {\r
-       public static int Create_Table                                                  = 1;\r
-       public static int Drop_Table                                                    = 2;\r
-       public static int Get_Invalid_Elements                                  = 3;\r
-       public static int Get_Invalid_Attributes                                = 4;\r
-       public static int Get_Invalid_Attribute_Elements                = 5;\r
-       public static int Add_Invalid_Element                                   = 6;\r
-       public static int Add_Invalid_Attribute                                 = 7;\r
-\r
-\r
-       public volatile String          string1;\r
-       public volatile String          string2;\r
-       public volatile String          string3;\r
-       \r
-       public String responseString1;\r
-       public List<String> responseList;\r
-       public ArrayList<String> responseArrayList;\r
-       \r
-       public InvalidXMLRequest() {\r
-               category = Invalid_XML;\r
-       }\r
-       \r
-       public InvalidXMLRequest copy() {\r
-               InvalidXMLRequest req = new InvalidXMLRequest();\r
-               req.type = type;\r
-               req.category = category;\r
-               req.requestor_id = requestor_id;\r
-               \r
-               if (string1  != null)\r
-                       req.string1 = new String(string1);\r
-               if (string2  != null)\r
-                       req.string2 = new String(string2);\r
-               if (string3  != null)\r
-                       req.string3 = new String(string3);\r
-               if (responseString1  != null)\r
-                       req.responseString1 = new String(responseString1);\r
-               \r
-               if (responseList != null) {\r
-                       req.responseList = new ArrayList<String>();\r
-                       for (int i=0; i<responseList.size(); i++) {\r
-                               req.responseList.add(new String(responseList.get(i)));\r
-                       }\r
-               }\r
-               \r
-               if (responseArrayList != null) {\r
-                       req.responseArrayList = new ArrayList<String>();\r
-                       for (int i=0; i<responseArrayList.size(); i++) {\r
-                               req.responseArrayList.add(new String(responseArrayList.get(i)));\r
-                       }\r
-               }\r
-\r
-               return req;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/requests/NoteRequest.java b/src/cx/fbn/nevernote/sql/requests/NoteRequest.java
deleted file mode 100644 (file)
index 2cec7fd..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.evernote.edam.type.Note;\r
-import com.trolltech.qt.core.QByteArray;\r
-import com.trolltech.qt.core.QDateTime;\r
-\r
-import cx.fbn.nevernote.utilities.Pair;\r
-\r
-public class NoteRequest extends DBRunnerRequest {\r
-       public static int Create_Table                                          = 1;\r
-       public static int Drop_Table                                            = 2;\r
-       public static int Add_Note                                                      = 3;\r
-       public static int Get_Note                                                      = 4;\r
-       public static int Update_Note_Title                                     = 5;\r
-       public static int Update_Note_Creation_Date             = 6;\r
-       public static int Update_Note_Altered_Date                      = 7;\r
-       public static int Update_Note_Subject_Date                      = 8;\r
-       public static int Update_Note_Source_Url                        = 9;\r
-       public static int Update_Note_Author                            = 10;\r
-       public static int Update_Note_Notebook                          = 11;\r
-       public static int Update_Note_Content                           = 12;\r
-       public static int Delete_Note                                           = 13;\r
-       public static int Restore_Note                                          = 14;\r
-       public static int Expunge_Note                                          = 15;\r
-       public static int Expunge_All_Deleted_Notes                     = 16;\r
-       public static int Update_Note_Sequence                          = 17;\r
-       public static int Update_Note_Guid                                      = 18;\r
-       public static int Update_Note                                           = 19;\r
-       public static int Exists                                                        = 20;\r
-       public static int Sync_Note                                                     = 21;\r
-       public static int Get_Dirty                                                     = 22;\r
-       public static int Get_Unsynchronized_Guids                      = 23;\r
-       public static int Reset_Dirty_Flag                                      = 24;\r
-       public static int Get_All_Guids                                         = 25;\r
-       public static int Get_All_Notes                                         = 26;\r
-       public static int Get_Unindexed_Count                           = 27;\r
-       public static int Get_Dirty_Count                                       = 28;\r
-       public static int Update_Resource_Guid_By_Hash          = 29;\r
-       public static int Set_Index_Needed                                      = 30;\r
-       public static int Reindex_All_Notes                                     = 31;\r
-       public static int Get_Unindexed                                         = 32;\r
-       public static int Get_Next_Unindexed                            = 33;\r
-       public static int Update_Resource_Content_Hash          = 34;\r
-       public static int Get_Note_Count                                        = 35;\r
-       public static int Reset_Note_Sequence                           = 36;\r
-       public static int Get_Deleted_Count                                     = 37;\r
-       public static int Is_Note_Dirty                                         = 38;\r
-       public static int Get_Note_Content_Binary                       = 39;\r
-       public static int Get_Title_Colors                                      = 40;\r
-       public static int Set_Title_Colors                                      = 41;\r
-       public static int Set_Thumbnail                                         = 42;\r
-       public static int Get_Thumbnail                                         = 43;\r
-       public static int Is_Thumbail_Needed                            = 44;\r
-       public static int Set_Thumbnail_Needed                          = 45;\r
-\r
-       public volatile String                                  string1;\r
-       public volatile String                                  string2;\r
-       public volatile String                                  string3;\r
-       public volatile QDateTime                               date;\r
-       public volatile int                                             int1;\r
-       public volatile boolean                                 bool1;\r
-       public volatile boolean                                 bool2;\r
-       public volatile boolean                                 bool3;\r
-       public volatile boolean                                 bool4;\r
-       public volatile boolean                                 bool5;\r
-       public volatile Note                                    note;\r
-       public volatile List<Note>                              notes;\r
-       public volatile QByteArray                              bytes;\r
-       \r
-       public volatile List<Note>                              responseNotes;\r
-       public volatile Note                                    responseNote;\r
-       public volatile String                                  responseString;\r
-       public volatile boolean                                 responseBoolean;\r
-       public volatile List<String>                    responseStrings;\r
-       public volatile int                                             responseInt;\r
-       public volatile List<Pair<String,Integer>> responsePair;\r
-       public volatile QByteArray                              responseBytes;\r
-       \r
-       public NoteRequest() {\r
-               category = NOTE;\r
-       }\r
-       \r
-       public NoteRequest copy() {\r
-               NoteRequest request = new NoteRequest();\r
-               \r
-               request.requestor_id = requestor_id;\r
-               request.type = type;\r
-               request.category = category;\r
-               request.bool1 = bool1;\r
-               request.bool2 = bool2;\r
-               request.bool3 = bool3;\r
-               request.bool4 = bool4;\r
-               request.bool5 = bool5;\r
-               request.int1 = int1;\r
-               \r
-               if (date != null)\r
-                       request.date = new QDateTime(date);\r
-\r
-               if (string1 != null)\r
-                       request.string1 = new String(string1);\r
-               if (string2 != null)\r
-                       request.string2 = new String(string2);\r
-               if (string3 != null)\r
-                       request.string3 = new String(string3);\r
-               \r
-               if (note != null)\r
-                       request.note = note.deepCopy();\r
-\r
-               if (notes != null) {\r
-                       request.notes = new ArrayList<Note>();\r
-                       for (int i=0; i<notes.size(); i++)\r
-                               request.notes.add(notes.get(i).deepCopy());\r
-               }\r
-               \r
-               request.responseInt = responseInt;\r
-               request.responseBoolean = responseBoolean;\r
-               if (bytes != null)\r
-                       request.bytes = new QByteArray(bytes);\r
-               \r
-               if (responseNotes != null) {\r
-                       request.responseNotes = new ArrayList<Note>();\r
-                       for (int i=0; i<responseNotes.size(); i++)\r
-                               if (responseNotes.get(i) != null)       \r
-                                       request.responseNotes.add(responseNotes.get(i).deepCopy());\r
-               }\r
-\r
-               if (responseNote != null) {\r
-                       request.responseNote = responseNote.deepCopy();\r
-               }\r
-               \r
-               if (responseString != null) {\r
-                       request.responseString = new String(responseString);\r
-               }\r
-               \r
-               if (responseStrings != null) {\r
-                       request.responseStrings = new ArrayList<String>();\r
-                       for (int i=0; i<responseStrings.size(); i++) \r
-                               request.responseStrings.add(new String(responseStrings.get(i)));\r
-               }\r
-               \r
-               if (responsePair != null) {\r
-                       request.responsePair = new ArrayList<Pair<String,Integer>>();\r
-                       for (int i=0; i<responsePair.size(); i++) {\r
-                               Pair<String,Integer> p = new Pair<String,Integer>();\r
-                               p.setFirst(responsePair.get(i).getFirst());\r
-                               p.setSecond(responsePair.get(i).getSecond());\r
-                               request.responsePair.add(p);\r
-                       }\r
-               }\r
-               if (responseBytes != null)\r
-                       request.responseBytes = new QByteArray(responseBytes);\r
-\r
-               return request;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/requests/NoteTagsRequest.java b/src/cx/fbn/nevernote/sql/requests/NoteTagsRequest.java
deleted file mode 100644 (file)
index 064b0e0..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import cx.fbn.nevernote.sql.runners.NoteTagsRecord;\r
-import cx.fbn.nevernote.utilities.Pair;\r
-\r
-public class NoteTagsRequest extends DBRunnerRequest {\r
-       public static int Create_Table                          = 1;\r
-       public static int Drop_Table                            = 2;\r
-       public static int Get_Note_Tags                         = 3;\r
-       public static int Get_All_Note_Tags                     = 4;\r
-       public static int Check_Note_Note_Tags          = 5;\r
-       public static int Save_Note_Tag                         = 6;\r
-       public static int Delete_Note_Tag                       = 7;\r
-       public static int Tag_Counts                            = 8;\r
-\r
-\r
-       public volatile String                                  string1;\r
-       public volatile String                                  string2;\r
-       \r
-       public volatile List<String>                    responseStrings;\r
-       public volatile List<NoteTagsRecord>    responseNoteTagsRecord;\r
-       public volatile boolean                                 responseBoolean;\r
-       public volatile List<Pair<String,Integer>>              responseCounts;\r
-       \r
-       public NoteTagsRequest() {\r
-               category = NOTE_TAGS;\r
-       }\r
-       \r
-       public NoteTagsRequest copy() {\r
-               NoteTagsRequest request = new NoteTagsRequest();\r
-               \r
-               request.requestor_id = requestor_id;\r
-               request.type = type;\r
-               request.category = category;\r
-               if (string1 != null)\r
-                       request.string1 = new String(string1);\r
-               if (string2 != null)\r
-                       request.string2 = new String(string2);\r
-               \r
-               if (responseStrings != null) {\r
-                       request.responseStrings = new ArrayList<String>();\r
-                       for (int i=0; i<responseStrings.size(); i++) {\r
-                               request.responseStrings.add(new String(responseStrings.get(i)));\r
-                       }\r
-               }\r
-               \r
-               if (responseNoteTagsRecord != null) {\r
-                       request.responseNoteTagsRecord = new ArrayList<NoteTagsRecord>();\r
-                       for (int i=0; i<responseNoteTagsRecord.size(); i++) {\r
-                               NoteTagsRecord record = new NoteTagsRecord();\r
-                               record.noteGuid = new String(responseNoteTagsRecord.get(i).noteGuid);\r
-                               record.tagGuid = new String(responseNoteTagsRecord.get(i).tagGuid);\r
-                               request.responseNoteTagsRecord.add(record);\r
-                       }\r
-               }\r
-               \r
-               if (responseCounts != null) {\r
-                       request.responseCounts = new ArrayList<Pair<String,Integer>>();\r
-                       for (int i=0; i<responseCounts.size(); i++) {\r
-                               Pair<String,Integer> newPair = new Pair<String,Integer>();\r
-                               newPair.setFirst(responseCounts.get(i).getFirst());\r
-                               newPair.setSecond(responseCounts.get(i).getSecond());\r
-                               request.responseCounts.add(newPair);\r
-                       }\r
-               }\r
-               \r
-               return request;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/requests/NotebookRequest.java b/src/cx/fbn/nevernote/sql/requests/NotebookRequest.java
deleted file mode 100644 (file)
index f9d850d..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.evernote.edam.type.Notebook;\r
-\r
-import cx.fbn.nevernote.utilities.Pair;\r
-\r
-public class NotebookRequest extends DBRunnerRequest {\r
-       public static int Create_Table                          = 1;\r
-       public static int Drop_Table                            = 2;\r
-//     public static int Get_Notebook                          = 3;\r
-//     public static int Get_All_Notebooks                     = 4;\r
-       public static int Add_Notebook                          = 5;\r
-       public static int Expunge_Notebook                      = 6;\r
-       public static int Find_Note_By_Name             = 7;\r
-       public static int Get_All                                       = 8;\r
-       public static int Get_Dirty                                     = 9;\r
-       public static int Is_Notebook_Local                     = 10;\r
-       public static int Reset_Dirty                           = 11;\r
-//     public static int Save_Notebooks                        = 12;\r
-       public static int Set_Archived                          = 13;\r
-       public static int Sync_Notebook                         = 14;\r
-       public static int Update_Notebook                       = 15;\r
-       public static int Update_Notebook_Guid          = 16;\r
-       public static int Update_Notebook_Sequence      = 17;\r
-       public static int Get_All_Local                         = 18;\r
-       public static int Get_All_Archived                      = 19;\r
-       public static int Notebook_Counts                       = 20;\r
-\r
-       public volatile boolean                 bool1;\r
-       public volatile boolean                 bool2;\r
-       public volatile String                  string1;\r
-       public volatile String                  string2;\r
-       public volatile Notebook                notebook;\r
-       public volatile int                             int1;\r
-       \r
-       public volatile List<Notebook>  responseNotebooks;\r
-       public volatile boolean                 responseBoolean;\r
-       public volatile String                  responseString;\r
-       public volatile List<Pair<String,Integer>>              responseCounts;\r
-       \r
-       public NotebookRequest() {\r
-               category = NOTEBOOK;\r
-       }\r
-       \r
-       public NotebookRequest copy() {\r
-               NotebookRequest request = new NotebookRequest();\r
-               \r
-               request.category = category;\r
-               request.requestor_id = requestor_id;\r
-               request.type = type;\r
-               request.bool1 = bool1;\r
-               request.bool2 = bool2;\r
-               if (string1 != null)\r
-                       request.string1 = new String(string1);\r
-               if (string2 != null)\r
-                       request.string2 = new String(string2);\r
-               if (notebook != null)\r
-                       request.notebook = notebook.deepCopy();\r
-               if (responseNotebooks != null) {\r
-                       request.responseNotebooks = new ArrayList<Notebook>();\r
-                       for (int i=0; i<responseNotebooks.size(); i++) {\r
-                               request.responseNotebooks.add(responseNotebooks.get(i).deepCopy());\r
-                       }\r
-               }\r
-               if (responseString != null) {\r
-                       request.responseString = new String(responseString);\r
-               }\r
-       \r
-               if (responseCounts != null) {\r
-                       request.responseCounts = new ArrayList<Pair<String,Integer>>();\r
-                       for (int i=0; i<responseCounts.size(); i++) {\r
-                               Pair<String,Integer> newPair = new Pair<String,Integer>();\r
-                               newPair.setFirst(responseCounts.get(i).getFirst());\r
-                               newPair.setSecond(responseCounts.get(i).getSecond());\r
-                               request.responseCounts.add(newPair);\r
-                       }\r
-               }\r
-               \r
-               \r
-               return request;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/requests/ResourceRequest.java b/src/cx/fbn/nevernote/sql/requests/ResourceRequest.java
deleted file mode 100644 (file)
index 3e84bba..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.evernote.edam.type.Resource;\r
-\r
-public class ResourceRequest extends DBRunnerRequest {\r
-       public static int Create_Table                          = 1;\r
-       public static int Drop_Table                            = 2;\r
-       public static int Reset_Dirty_Flag                      = 3;\r
-       public static int Get_Next_Unindexed            = 4;\r
-       public static int Set_Index_Needed                      = 5;\r
-       public static int Save_Note_Resource            = 6;\r
-       public static int Expunge_Note_Resource         = 7;\r
-       public static int Get_Note_Resource_Guid_By_Hash_Hex    = 8;\r
-       public static int Get_Note_Resource_Data_Body_By_Hash_Hex = 9;\r
-       public static int Get_Note_Resource                     = 10;\r
-       public static int Get_Note_Resources            = 11;\r
-       public static int Get_Note_Resources_Recognition = 12;\r
-       public static int Get_Note_Resource_Recognition = 13;\r
-       public static int Update_Note_Resource          = 14;\r
-       public static int Reindex_All                           = 15;\r
-       public static int Get_Resource_Count            = 16;\r
-       public static int Update_Note_Resource_Guid = 17;\r
-       public static int Reset_Update_Sequence_Number = 18;\r
-       \r
-\r
-\r
-       public volatile String                  string1;\r
-       public volatile String                  string2;\r
-       public volatile Resource                resource;\r
-       public volatile boolean                 bool1;\r
-       public volatile int                             int1;\r
-       \r
-       public volatile List<String>    responseStrings;\r
-       public volatile String                  responseString;\r
-       public volatile List<Resource>  responseResources;\r
-       public volatile Resource                responseResource;\r
-       public volatile int                             responseInteger;\r
-       \r
-       public ResourceRequest() {\r
-               category = RESOURCE;\r
-       }\r
-       \r
-       public ResourceRequest copy() {\r
-               ResourceRequest request = new ResourceRequest();\r
-               \r
-               request.requestor_id = requestor_id;\r
-               request.type = type;\r
-               request.category = category;\r
-               if (string1 != null)\r
-                       request.string1 = new String(string1);\r
-               if (string2 != null)\r
-                       request.string2 = new String(string2);\r
-               if (resource != null)\r
-                       request.resource = resource.deepCopy();\r
-               request.bool1 = bool1;\r
-               request.int1 = int1;\r
-               \r
-               if (responseStrings != null) {\r
-                       request.responseStrings = new ArrayList<String>();\r
-                       for (int i=0; i<responseStrings.size(); i++) \r
-                               request.responseStrings.add(new String(responseStrings.get(i)));        \r
-               }\r
-               \r
-               if (responseResource != null) {\r
-                       request.responseResource = responseResource.deepCopy();\r
-               }\r
-               \r
-               if (responseString != null) \r
-                       request.responseString = new String(responseString);\r
-               \r
-               if (responseResources != null) {\r
-                       request.responseResources = new ArrayList<Resource>();\r
-                       for (int i=0; i<responseResources.size(); i++) \r
-                               request.responseResources.add(responseResources.get(i).deepCopy());     \r
-               }\r
-               \r
-               request.responseInteger = responseInteger;\r
-               return request;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/requests/SavedSearchRequest.java b/src/cx/fbn/nevernote/sql/requests/SavedSearchRequest.java
deleted file mode 100644 (file)
index c484329..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.evernote.edam.type.SavedSearch;\r
-\r
-public class SavedSearchRequest extends DBRunnerRequest {\r
-       public static int Create_Table                          = 1;\r
-       public static int Drop_Table                            = 2;\r
-       public static int Get_All                                       = 3;\r
-       public static int Update_Saved_Search           = 4;\r
-       public static int Expunge_Saved_Search          = 5;\r
-       public static int Get_Saved_Search                      = 6;\r
-       public static int Add_Saved_Search                      = 7;\r
-       public static int Update_Saved_Search_Sequence = 8;\r
-       public static int Get_Dirty                                     = 9;\r
-       public static int Find_Saved_Search_By_Name = 10;\r
-       public static int Exists                                        = 11;\r
-       public static int Sync_Saved_Search                     = 12;\r
-       public static int Reset_Dirty_Flag                      = 13;\r
-       \r
-\r
-       public volatile String                                  string1;\r
-       public volatile String                                  string2;\r
-       public volatile int                                             int1;\r
-       public volatile boolean                                 bool1;\r
-       public volatile SavedSearch                             savedSearch;\r
-       public volatile List<SavedSearch>               savedSearches;\r
-       \r
-       public volatile List<SavedSearch>               responseSavedSearches;\r
-       public volatile SavedSearch                             responseSavedSearch;\r
-       public volatile String                                  responseString;\r
-       public volatile boolean                                 responseBoolean;\r
-       \r
-       public SavedSearchRequest() {\r
-               category = SAVED_SEARCH;\r
-       }\r
-       \r
-       public SavedSearchRequest copy() {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               \r
-               request.requestor_id = requestor_id;\r
-               request.type = type;\r
-               request.category = category;\r
-               if (string1 != null)\r
-                       request.string1 = new String(string1);\r
-               if (string2 != null)\r
-                       request.string2 = new String(string2);\r
-               request.bool1 = bool1;\r
-               \r
-               if (responseString != null)\r
-                       request.responseString = new String(responseString);\r
-               \r
-               if (savedSearch != null)\r
-                       request.savedSearch = savedSearch.deepCopy();\r
-               if (savedSearches != null)\r
-                       for (int i=0; i<savedSearches.size(); i++)\r
-                               request.savedSearches.add(savedSearches.get(i).deepCopy());\r
-               \r
-               request.responseBoolean = responseBoolean;\r
-               \r
-               if (responseSavedSearches != null) {\r
-                       request.responseSavedSearches = new ArrayList<SavedSearch>();\r
-                       for (int i=0; i<responseSavedSearches.size(); i++) \r
-                               request.responseSavedSearches.add(responseSavedSearches.get(i).deepCopy());     \r
-               }\r
-               \r
-               if (responseSavedSearch != null) {\r
-                       request.responseSavedSearch = responseSavedSearch.deepCopy();\r
-               }\r
-\r
-               return request;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/requests/SyncRequest.java b/src/cx/fbn/nevernote/sql/requests/SyncRequest.java
deleted file mode 100644 (file)
index cfc2c18..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-\r
-\r
-public class SyncRequest extends DBRunnerRequest {\r
-       public static int Create_Table                                                  = 1;\r
-       public static int Drop_Table                                                    = 2;\r
-       public static int Set_Record                                                    = 3;\r
-       public static int Get_Record                                                    = 4;\r
-\r
-\r
-       public volatile int                     int1;\r
-       public volatile long            long1;\r
-       public volatile String          key;\r
-       public volatile String          value;\r
-       \r
-       public String responseValue;\r
-       \r
-       public SyncRequest() {\r
-               category = Sync;\r
-       }\r
-       \r
-       public SyncRequest copy() {\r
-               SyncRequest req = new SyncRequest();\r
-               req.type = type;\r
-               req.category = category;\r
-               req.requestor_id = requestor_id;\r
-               \r
-               req.int1 = int1;\r
-               req.long1 = long1;\r
-               if (key != null) \r
-                       req.key = new String(key);\r
-               if (value != null) \r
-                       req.value = new String(value);\r
-               if (responseValue != null) \r
-                       req.responseValue = new String(responseValue);\r
-\r
-               return req;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/requests/TagRequest.java b/src/cx/fbn/nevernote/sql/requests/TagRequest.java
deleted file mode 100644 (file)
index 456471c..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.evernote.edam.type.Tag;\r
-\r
-public class TagRequest extends DBRunnerRequest {\r
-       public static int Create_Table                          = 1;\r
-       public static int Drop_Table                            = 2;\r
-       public static int Add_Tag                                       = 3;\r
-       public static int Delete_Tag                            = 4;\r
-       public static int Get_All                                       = 5;\r
-       public static int Get_Tag                                       = 6;\r
-       public static int Update_Tag                            = 7;\r
-       public static int Expunge_Tag                           = 8;\r
-       public static int Update_Parent                         = 9;\r
-       public static int Save_Tags                                     = 10;\r
-       public static int Update_Tag_Sequence           = 11;\r
-       public static int Update_Tag_Guid                       = 12;\r
-       public static int Get_Dirty                                     = 13;\r
-       public static int Find_Tag_By_Name                      = 14;\r
-       public static int Exists                                        = 15;\r
-       public static int Reset_Dirty_Flag                      = 16;\r
-       public static int Sync_Tag                                      = 17;\r
-\r
-       public volatile String                  string1;\r
-       public volatile String                  string2;        \r
-       public volatile boolean                 bool1;\r
-       public volatile int                             int1;\r
-\r
-       public volatile Tag                             tag;\r
-       public volatile List<Tag>               tags;\r
-       \r
-       public volatile List<Tag>               responseTags;\r
-       public volatile Tag                             responseTag;\r
-       public volatile String                  responseString;\r
-       public volatile boolean                 responseBool;\r
-       \r
-       public TagRequest() {\r
-               category = TAG;\r
-       }\r
-       \r
-       public TagRequest copy() {\r
-               TagRequest request = new TagRequest();\r
-               \r
-               request.requestor_id = requestor_id;\r
-               request.type = type;\r
-               request.category = category;\r
-               request.int1 = int1;\r
-               if (string1 != null)\r
-                       request.string1 = new String(string1);\r
-               if (string2 != null)\r
-                       request.string2 = new String(string2);\r
-               if (tag != null)\r
-                       request.tag = tag;\r
-               request.bool1 = bool1;\r
-               if (tags != null && tags.size() > 0) {\r
-                       for (int i=0; i<tags.size(); i++)\r
-                               request.tags.add(tags.get(i));\r
-               }\r
-               \r
-               responseBool = request.responseBool;\r
-               if (responseString != null) {\r
-                       request.responseString = new String(responseString);\r
-               }\r
-               \r
-               if (responseTag != null)\r
-                       request.responseTag = responseTag.deepCopy();\r
-               \r
-               if (responseTags != null) {\r
-                       request.responseTags = new ArrayList<Tag>();\r
-                       for (int i =0; i<responseTags.size(); i++)\r
-                               request.responseTags.add(responseTags.get(i).deepCopy());\r
-               }\r
-               \r
-               return request;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/requests/WatchFolderRequest.java b/src/cx/fbn/nevernote/sql/requests/WatchFolderRequest.java
deleted file mode 100644 (file)
index cfde319..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import cx.fbn.nevernote.sql.runners.WatchFolderRecord;\r
-\r
-\r
-public class WatchFolderRequest extends DBRunnerRequest {\r
-       public static int Create_Tables                         = 1;\r
-       public static int Drop_Tables                           = 2;\r
-       public static int Expunge_Folder                        = 3;\r
-       public static int Get_All                                       = 4;\r
-       public static int Add_Watch_Folder                      = 5;\r
-       public static int Expunge_All                           = 6;\r
-       public static int Get_Notebook                          = 7;\r
-\r
-       public volatile String                  string1;\r
-       public volatile String                  string2;\r
-       public volatile Boolean                 bool1;\r
-       public volatile Integer                 int1;\r
-       \r
-       public List<WatchFolderRecord> responseWatchFolders;\r
-       public String                                   responseString;\r
-       \r
-       public WatchFolderRequest() {\r
-               category = WATCH_FOLDER;\r
-       }\r
-       \r
-       public WatchFolderRequest copy() {\r
-               WatchFolderRequest request = new WatchFolderRequest();\r
-               \r
-               request.requestor_id = requestor_id;\r
-               request.type = type;\r
-               request.category = category;\r
-               if (string1 != null)\r
-                       request.string1 = new String(string1);\r
-               if (string2 != null)\r
-                       request.string2 = new String(string2);\r
-               if (int1 != null)\r
-                       request.int1 = new Integer(int1);\r
-               if (bool1 != null)\r
-                       request.bool1 = new Boolean(bool1);\r
-               \r
-               if (responseWatchFolders != null) {\r
-                       request.responseWatchFolders = new ArrayList<WatchFolderRecord>();\r
-                       for (int i=0; i<responseWatchFolders.size(); i++) {\r
-                               WatchFolderRecord newRec = new WatchFolderRecord();\r
-                               newRec.depth = responseWatchFolders.get(i).depth;\r
-                               newRec.keep = responseWatchFolders.get(i).keep;\r
-                               newRec.folder = responseWatchFolders.get(i).folder;\r
-                               newRec.notebook = responseWatchFolders.get(i).notebook;\r
-                               request.responseWatchFolders.add(newRec);\r
-                       }\r
-               }\r
-               \r
-               if (responseString != null) {\r
-                       request.responseString = new String(responseString);\r
-               }\r
-               \r
-               return request;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/requests/WordRequest.java b/src/cx/fbn/nevernote/sql/requests/WordRequest.java
deleted file mode 100644 (file)
index 5acfbbc..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-package cx.fbn.nevernote.sql.requests;\r
-\r
-\r
-public class WordRequest extends DBRunnerRequest {\r
-       public static int Create_Table                          = 1;\r
-       public static int Drop_Table                            = 2;\r
-       public static int Get_Word_Count                        = 3;\r
-       public static int Clear_Word_Index                      = 4;\r
-       public static int Expunge_From_Word_Index       = 5;\r
-       public static int Add_Word_To_Note_Index        = 6;\r
-\r
-\r
-       public volatile String                  string1;\r
-       public volatile String                  string2;\r
-       public volatile String                  string3;\r
-       public volatile String                  string4;\r
-       public volatile int                             int1;\r
-       \r
-       public int responseInt;\r
-       \r
-       public WordRequest() {\r
-               category = WORD;\r
-       }\r
-       \r
-       public WordRequest copy() {\r
-               WordRequest req = new WordRequest();\r
-               req.type = type;\r
-               req.category = category;\r
-               req.requestor_id = requestor_id;\r
-               \r
-               req.responseInt = responseInt;\r
-               \r
-               if (string1  != null)\r
-                       req.string1 = new String(string1);\r
-               if (string2  != null)\r
-                       req.string2 = new String(string2);\r
-               if (string3  != null)\r
-                       req.string3 = new String(string3);\r
-               if (string4  != null)\r
-                       req.string4 = new String(string4);\r
-               req.int1 = int1;\r
-\r
-               return req;\r
-       }\r
-       \r
-}
\ No newline at end of file
diff --git a/src/cx/fbn/nevernote/sql/runners/RDatabaseConnection.java b/src/cx/fbn/nevernote/sql/runners/RDatabaseConnection.java
deleted file mode 100644 (file)
index 3a36a81..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * This file is part of NeverNote 
- * Copyright 2009 Randy Baumgarte
- * 
- * This file may be licensed under the terms of of the
- * GNU General Public License Version 2 (the ``GPL'').
- *
- * Software distributed under the License is distributed
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
- * express or implied. See the GPL for the specific language
- * governing rights and limitations.
- *
- * You should have received a copy of the GPL along with this
- * program. If not, go to http://www.gnu.org/licenses/gpl.html
- * or write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
-*/
-package cx.fbn.nevernote.sql.runners;
-
-import java.io.File;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-
-import com.trolltech.qt.sql.QJdbc;
-
-import cx.fbn.nevernote.Global;
-import cx.fbn.nevernote.config.InitializationException;
-import cx.fbn.nevernote.sql.driver.NSqlQuery;
-import cx.fbn.nevernote.utilities.ApplicationLogger;
-
-public class RDatabaseConnection {
-       // Table helpers
-       private RTagTable                                       tagTable;
-       private RNotebookTable                          notebookTable;
-       private RNoteTable                                      noteTable;
-       private RDeletedTable                           deletedTable;
-       private RSavedSearchTable                       searchTable;
-       private RWatchFolderTable                       watchFolderTable;
-       private RInvalidXMLTable                        invalidXMLTable;
-       private final ApplicationLogger         logger;
-       private Connection                                      conn;
-       private final String                            databaseName;
-       private RWordsTable                                     wordsTable;
-       private RSyncTable                                      syncTable;
-
-       
-       public RDatabaseConnection(ApplicationLogger l) {
-               logger = l;
-               databaseName = Global.databaseName;
-       }
-       
-       private void setupTables() {
-               tagTable = new RTagTable(logger, this);
-               notebookTable = new RNotebookTable(logger, this);
-               noteTable = new RNoteTable(logger, this);
-               deletedTable = new RDeletedTable(logger, this);
-               searchTable = new RSavedSearchTable(logger, this);      
-               watchFolderTable = new RWatchFolderTable(logger, this);
-               invalidXMLTable = new RInvalidXMLTable(logger, this);
-               wordsTable = new RWordsTable(logger, this);
-               syncTable = new RSyncTable(logger, this);
-       }
-       
-    //***************************************************************
-    //***************************************************************
-    //** These functions deal starting & stopping the database
-    //***************************************************************
-    //***************************************************************
-       // Initialize the database connection
-       /**
-        * @throws InitializationException for missing driver, bad connection URL / user / password, or DB locked by another process
-        */
-       public void dbSetup(String url,String userid, String userPassword, String cypherPassword)
-               throws InitializationException {
-               logger.log(logger.HIGH, "Entering RDatabaseConnection.dbSetup");
-               
-               // This thread cleans things up if we crash
-//             ShutdownRunner shutdownRunner = new ShutdownRunner(this);
-//             Runtime.getRuntime().addShutdownHook(shutdownRunner);
-
-/*             if (QSqlDatabase.isDriverAvailable("QSQLITE"))
-                       logger.log(logger.MEDIUM, "SQL Driver check was successful.");
-                       else {
-                               logger.log(logger.MEDIUM, "SQL Driver check has failed.");
-                               System.err.println("Database failure");
-                               System.exit(16);
-                       }
-*/
-
-               final String driverClassName = "org.h2.Driver";
-               try {
-                        Class.forName(driverClassName);
-               } catch (ClassNotFoundException e1) {
-                       throw new InitializationException("Cannot find JDBC driver class '" + driverClassName
-                               + "', check jar is in the classpath");
-               }
-
-               QJdbc.initialize();
-//             db = QSqlDatabase.addDatabase("QSQLITE", connectionName);               
-//             db = QSqlDatabase.addDatabase("QJDBC", connectionName); 
-//             db.setDatabaseName("jdbc:h2:"+Global.getDirectoryPath() +File.separator +"db" +File.separator +databaseName);
-               
-               setupTables();
-               
-               File f = Global.getFileManager().getDbDirFile(databaseName + ".h2.db");
-               boolean dbExists = f.exists(); 
-
-               try {
-                       String passwordString = null;
-                       if (cypherPassword==null || cypherPassword.trim().equals(""))
-                               passwordString = userPassword;
-                       else
-                               passwordString = cypherPassword+" "+userPassword;
-                       conn = DriverManager.getConnection(url,userid,passwordString);
-               } catch (SQLException e) {
-                       File lockFile = Global.getFileManager().getDbDirFile(databaseName + ".lock.db");
-                       if (lockFile.exists()) {
-                           throw new InitializationException("H2 database is locked,\n"
-                                       + "probably because another NeverNote instance is already using it.\n"
-                                       + "Please close the other instance, or run them from separate directories.",
-                                       e);
-                       } else if (dbExists) {
-                            throw new InitializationException("Cannot open existing H2 database,\n"
-                                        + "maybe it is encrypted or corrupt?",
-                                        e);
-                       } else {
-                            throw new InitializationException("Cannot create H2 database,\n"
-                                        + "check URL and filesystem permissions",
-                                        e);
-                       }
-               }
-
-               // NFC TODO: change the low-level commands to propagate exceptions so we can detect them here
-               if (!dbExists)
-                       createTables();
-               
-               logger.log(logger.HIGH, "Leaving RDatabaseConnection.dbSetup");
-       }
-       // Tear down the database connections
-       public void dbShutdown() {
-               logger.log(logger.HIGH, "Entering RDatabaseConnection.dbShutdown");
-               try {
-                       conn.close();
-               } catch (SQLException e) {
-                       e.printStackTrace();
-               }
-               logger.log(logger.HIGH, "Leaving RDatabaseConnection.dbShutdown");
-       }
-       
-       public void backupDatabase() {
-       }
-       
-       public void executeSql(String sql) {
-               NSqlQuery query = new NSqlQuery(conn);
-               query.exec(sql);        
-       }
-       
-       // Create note tables
-       public void dropTables() { 
-               logger.log(logger.HIGH, "Entering RDatabaseConnection.dropTables");
-        getTagTable().dropTable();
-        getNotebookTable().dropTable();
-        getNoteTable().dropTable();
-        getDeletedTable().dropTable();
-        getSavedSearchTable().dropTable();
-               logger.log(logger.HIGH, "Leaving RDatabaseConnection.dropTables");
-       }
-       public void createTables() {
-               logger.log(logger.HIGH, "Entering RDatabaseConnection.createTables");
-               getTagTable().createTable();
-               notebookTable.createTable();
-               noteTable.createTable();
-               deletedTable.createTable();             
-               searchTable.createTable();
-               watchFolderTable.createTable();
-               invalidXMLTable.createTable();
-               wordsTable.createTable();
-               syncTable.createTable();
-               logger.log(logger.HIGH, "Leaving RDatabaseConnection.createTables");
-       }
-       
-
-       public void compactDatabase() {
-               logger.log(logger.HIGH, "Entering RDatabaseConnection.compactDatabase");
-               NSqlQuery query = new NSqlQuery(conn);
-               query.exec("vacuum");
-               logger.log(logger.HIGH, "Leaving RDatabaseConnection.PragmaSettings");
-       }
-       
-       
-       public Connection getConnection() {
-               return conn;
-       }
-       
-       //***************************************************************
-       //* Table get methods
-       //***************************************************************
-       public RDeletedTable getDeletedTable() {
-               return deletedTable;
-       }
-       public RTagTable getTagTable() {
-               return tagTable;
-       }
-       public RNoteTable getNoteTable() {
-               return noteTable;
-       }
-       public RNotebookTable getNotebookTable() {
-               return notebookTable;
-       }
-       public RSavedSearchTable getSavedSearchTable() {
-               return searchTable;
-       }
-       public RWatchFolderTable getWatchFolderTable() {
-               return watchFolderTable;
-       }
-       public RInvalidXMLTable getInvalidXMLTable() {
-               return invalidXMLTable;
-       }
-       public RWordsTable              getWordsTable() {
-               return wordsTable;
-       }
-       public RSyncTable               getSyncTable() {
-               return syncTable;
-       }
-}
diff --git a/src/cx/fbn/nevernote/sql/runners/RDeletedTable.java b/src/cx/fbn/nevernote/sql/runners/RDeletedTable.java
deleted file mode 100644 (file)
index e5da3a0..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.runners;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-import cx.fbn.nevernote.utilities.ListManager;\r
-\r
-public class RDeletedTable {\r
-       ListManager parent;\r
-       private final ApplicationLogger                 logger;\r
-       private final RDatabaseConnection               db;\r
-\r
-       \r
-       // Constructor\r
-       public RDeletedTable(ApplicationLogger l, RDatabaseConnection d) {\r
-               logger = l;\r
-               db = d;\r
-       }\r
-       // Create the table\r
-       public void createTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               logger.log(logger.HIGH, "Creating table DeletedItems...");\r
-        if (!query.exec("Create table DeletedItems (guid varchar primary key, type varchar)"))\r
-               logger.log(logger.HIGH, "Table DeletedItems creation FAILED!!!"); \r
-       }\r
-       // Drop the table\r
-       public void dropTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Drop table DeletedItems");\r
-       }\r
-       // Add an item to the deleted table\r
-       public void addDeletedItem(String guid, String type) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Insert Into DeletedItems (guid, type) Values(:guid, :type)");\r
-               query.bindValue(":guid", guid);\r
-               query.bindValue(":type", type);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Insert into deleted items failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Add an item to the deleted table\r
-       public void expungeDeletedItem(String guid, String type) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("delete from DeletedItems where guid=:guid and type=:type");\r
-               query.bindValue(":guid", guid);\r
-               query.bindValue(":type", type);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Expunge deleted items failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       public List<DeletedItemRecord> getAllDeleted() {\r
-               logger.log(logger.HIGH, "Entering DeletedTable.getAllDeleted");\r
-               List<DeletedItemRecord> list = new ArrayList<DeletedItemRecord>();\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Select guid, type from DeletedItems");\r
-               while (query.next()) {\r
-                       DeletedItemRecord record = new DeletedItemRecord();\r
-                       record.guid = query.valueString(0);\r
-                       record.type = query.valueString(1);\r
-                       list.add(record);\r
-               }\r
-               logger.log(logger.HIGH, "Leaving DeletedTable.getAllDeleted");\r
-               return list;\r
-\r
-       }\r
-       public void expungeAllDeletedRecords() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("delete from DeletedItems");\r
-       }\r
-\r
-}\r
diff --git a/src/cx/fbn/nevernote/sql/runners/RInvalidXMLTable.java b/src/cx/fbn/nevernote/sql/runners/RInvalidXMLTable.java
deleted file mode 100644 (file)
index b1fe1fd..0000000
+++ /dev/null
@@ -1,221 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.runners;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-import cx.fbn.nevernote.utilities.ListManager;\r
-\r
-public class RInvalidXMLTable {\r
-       ListManager parent;\r
-       private final ApplicationLogger                 logger;\r
-       private final RDatabaseConnection               db;\r
-\r
-       \r
-       // Constructor\r
-       public RInvalidXMLTable(ApplicationLogger l, RDatabaseConnection d) {\r
-               logger = l;\r
-               db = d;\r
-       }\r
-       // Create the table\r
-       public void createTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-//             query.exec("drop table InvalidXML");\r
-               logger.log(logger.HIGH, "Creating table InvalidXML...");\r
-        if (!query.exec("Create table InvalidXML (type varchar, element varchar, attribute varchar,primary key(type, element,attribute) );"))\r
-               logger.log(logger.HIGH, "Table InvalidXML creation FAILED!!!"); \r
-//        query.clear();\r
-        \r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'button', '');");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'embed', '');");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'fieldset', '');");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'form', '');");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'input', '');");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'label', '');");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'legend', '');");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'o:p', '')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'option', '')");        \r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'script', '')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'select', '')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ELEMENT', 'wbr', '')");\r
-        \r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'a', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'a', 'done')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'a', 'id')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'a', 'onclick')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'a', 'onmousedown')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'div', 'id')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'dl', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'dl', 'id')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'dt', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'h1', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'h2', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'h3', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'h4', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'h5', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'img', 'gptag')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'li', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'ol', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'ol', 'id')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'p', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'p', 'id')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'p', 'span')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'accesskey')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'action')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'alt')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'bgcolor')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'checked')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'flashvars')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'for')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'height')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'id')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'maxlength')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'method')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'name')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'onblur')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'onchange')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'aclick')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'onsubmit')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'quality')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'selected')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'src')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'target')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'type')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'value')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'width')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'span', 'wmode')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'table', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'td', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'tr', 'class')");\r
-        query.exec("Insert into InvalidXML (type, element, attribute) values ('ATTRIBUTE', 'ul', 'class')");\r
-\r
-       }\r
-       // Drop the table\r
-       public void dropTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Drop table InvalidXML");\r
-       }\r
-       // Add an item to the table\r
-       public void addAttribute(String element, String attribute) {\r
-               if (attributeExists(element,attribute))\r
-                       return;\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Insert Into InvalidXML (type, element, attribute) Values('ATTRIBUTE', :element, :attribute)");\r
-               query.bindValue(":element", element);\r
-               query.bindValue(":attribute", attribute);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Insert Attribute into invalidXML failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Add an item to the table\r
-       public void addElement(String element) {\r
-               if (elementExists(element))\r
-                       return;\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Insert Into InvalidXML (type, element) Values('ELEMENT', :element)");\r
-               query.bindValue(":element", element);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Insert Element into invalidXML failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // get invalid elements\r
-       public List<String> getInvalidElements() {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               if (!query.exec("Select element from InvalidXML where type = 'ELEMENT'")) {\r
-                       logger.log(logger.MEDIUM, "getInvalidElement from invalidXML failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               List<String> elements = new ArrayList<String>();\r
-               while (query.next()) {\r
-                       elements.add(query.valueString(0));\r
-               }\r
-               return elements;\r
-       }\r
-       \r
-       // get invalid elements\r
-       public List<String> getInvalidAttributeElements() {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               if (!query.exec("Select distinct element from InvalidXML where type = 'ATTRIBUTE'")) {\r
-                       logger.log(logger.MEDIUM, "getInvalidElement from invalidXML failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               List<String> elements = new ArrayList<String>();\r
-               while (query.next()) {\r
-                       elements.add(query.valueString(0));\r
-               }\r
-               return elements;\r
-       }\r
-       // get invalid attributes for a given element\r
-       public ArrayList<String> getInvalidAttributes(String element) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Select attribute from InvalidXML where type = 'ATTRIBUTE' and element = :element");\r
-               query.bindValue(":element", element);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "getInvalidElement from invalidXML failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               ArrayList<String> elements = new ArrayList<String>();\r
-               while (query.next()) {\r
-                       elements.add(query.valueString(0));\r
-               }\r
-               return elements;\r
-       }\r
-\r
-       // Determine if an element already is in the table\r
-       public boolean elementExists(String element) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Select element from InvalidXML where type='ELEMENT' and element=:element");\r
-               query.bindValue(":element", element);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "elementExists in invalidXML failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               if (query.next())\r
-                       return true;\r
-               else\r
-                       return false;\r
-       }\r
-       \r
-       // Determine if an element already is in the table\r
-       public boolean attributeExists(String element, String attribute) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Select element from InvalidXML where type='ATTRIBUTE' and element=:element and attribute=:attribute");\r
-               query.bindValue(":element", element);\r
-               query.bindValue(":attribute", attribute);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "attributeExists in invalidXML failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               if (query.next())\r
-                       return true;\r
-               else\r
-                       return false;\r
-       }\r
-}\r
diff --git a/src/cx/fbn/nevernote/sql/runners/RNoteResourceTable.java b/src/cx/fbn/nevernote/sql/runners/RNoteResourceTable.java
deleted file mode 100644 (file)
index ef48e6c..0000000
+++ /dev/null
@@ -1,569 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.runners;\r
-import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.evernote.edam.type.Data;\r
-import com.evernote.edam.type.Resource;\r
-import com.evernote.edam.type.ResourceAttributes;\r
-import com.trolltech.qt.core.QByteArray;\r
-\r
-import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-\r
-\r
-\r
-public class RNoteResourceTable  {\r
-       /**\r
-        * \r
-        */\r
-       private static final long serialVersionUID = 1L;\r
-       private final ApplicationLogger                 logger;\r
-       private final RDatabaseConnection               db;     \r
-       \r
-       // Constructor\r
-       public RNoteResourceTable(ApplicationLogger l, RDatabaseConnection d) {\r
-               logger = l;\r
-               db = d;\r
-       }\r
-       // Create the table\r
-       public void createTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-        // Create the NoteResource table\r
-        logger.log(logger.HIGH, "Creating table NoteResource...");\r
-        if (!query.exec("Create table NoteResources (guid varchar primary key, " +\r
-                       "noteGuid varchar, updateSequenceNumber integer, dataHash varchar, "+\r
-                       "dataSize integer, dataBinary blob, "+\r
-                       "mime varchar, width integer, height integer, duration integer, "+\r
-                       "active integer, recognitionHash varchar, recognitionSize integer, " +\r
-                       "recognitionBinary varchar, attributeSourceUrl varchar, attributeTimestamp timestamp, " +\r
-                       "attributeLatitude double, attributeLongitude double, "+\r
-                       "attributeAltitude double, attributeCameraMake varchar, attributeCameraModel varchar, "\r
-                       +"attributeClientWillIndex varchar, attributeRecoType varchar, attributeFileName varchar,"+\r
-                       "attributeAttachment boolean, isDirty boolean, indexNeeded boolean)"))\r
-               logger.log(logger.HIGH, "Table NoteResource creation FAILED!!!"); \r
-        if (!query.exec("CREATE INDEX unindexed_resources on noteresources (indexneeded desc, guid);"))\r
-               logger.log(logger.HIGH, "Noteresources unindexed_resources index creation FAILED!!!");\r
-        if (!query.exec("CREATE INDEX resources_dataheshhex on noteresources (datahash, guid);"))\r
-               logger.log(logger.HIGH, "Noteresources resources_datahash index creation FAILED!!!");  \r
-        \r
-       }\r
-       // Drop the table\r
-       public void dropTable() {               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Drop table NoteResources");\r
-       }\r
-       // Reset the dirty flag\r
-       public void  resetDirtyFlag(String guid) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               query.prepare("Update noteresources set isdirty=false where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error resetting noteresource dirty field. " +query.lastError());\r
-       }\r
-       // Set if the resource should be indexed\r
-       public void  setIndexNeeded(String guid, Boolean indexNeeded) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());            \r
-               query.prepare("Update noteresources set indexNeeded=:needed where guid=:guid");\r
-               query.bindValue(":needed", indexNeeded);\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error setting noteresource indexneeded field: " +query.lastError());\r
-       }\r
-       // get any unindexed resource\r
-       public List<String> getNextUnindexed(int limit) {\r
-               List<String> guids = new ArrayList<String>();\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               if (!query.exec("Select guid from NoteResources where indexNeeded = true limit " +limit))\r
-                       logger.log(logger.EXTREME, "NoteResources SQL retrieve has failed on getNextUnindexed(): " +query.lastError());\r
-\r
-               // Get a list of the notes\r
-               String guid;\r
-               while (query.next()) {\r
-                       guid = new String();\r
-                       guid = query.valueString(0);\r
-                       guids.add(guid);\r
-               }       \r
-               return guids;   \r
-       }\r
-\r
-\r
-       \r
-       public void saveNoteResource(Resource r, boolean isDirty) {\r
-               logger.log(logger.HIGH, "Entering DBRunner.saveNoteResources");\r
-               boolean check;\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");\r
-               \r
-               check = query.prepare("Insert Into NoteResources ("\r
-                               +"guid, noteGuid, dataHash, dataSize, dataBinary, updateSequenceNumber, "\r
-                               +"mime, width, height, duration, active, recognitionHash, "                             \r
-                               +"recognitionSize, recognitionBinary, attributeSourceUrl, attributeTimestamp, "\r
-                               +"attributeLatitude, attributeLongitude, attributeAltitude, attributeCameraMake, "\r
-                               +"attributeCameraModel, "\r
-                               +"attributeClientWillIndex, attributeRecoType, attributeFileName, attributeAttachment, isDirty, "\r
-                               +"indexNeeded) Values("\r
-                               +":guid, :noteGuid, :dataHash,:dataSize, :dataBody, :updateSequenceNumber, "\r
-                               +":mime, :width, :height, :duration, :active, :recognitionHash, "                               \r
-                               +":recognitionSize, :recognitionBody, :attributeSourceUrl, :attributeTimestamp, "\r
-                               +":attributeLatitude, :attributeLongitude, :attributeAltitude, :attributeCameraMake, "\r
-                               +":attributeCameraModel, "\r
-                               +":attributeClientWillIndex, :attributeRecoType, :attributeFileName, :attributeAttachment, "\r
-                               +":isDirty, true)");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "NoteResource SQL insert prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       \r
-                       query.bindValue(":guid", r.getGuid());\r
-                       query.bindValue(":noteGuid", r.getNoteGuid());\r
-                       if (r.getData() != null) {\r
-//                             query.bindValue(":dataHash", new QByteArray(r.getData().getBodyHash()).toHex());\r
-//                             query.bindValue(":dataHash", "");\r
-                               query.bindValue(":dataHash", byteArrayToHexString(r.getData().getBodyHash()));\r
-                               query.bindValue(":dataSize", r.getData().getSize());\r
-                               query.bindBlob(":dataBody", r.getData().getBody());\r
-                       }\r
-                       query.bindValue(":updateSequenceNumber", r.getUpdateSequenceNum());\r
-                       query.bindValue(":mime", r.getMime());\r
-                       query.bindValue(":width", new Integer(r.getWidth()));\r
-                       query.bindValue(":height", new Integer(r.getHeight()));\r
-                       query.bindValue(":duration", new Integer(r.getDuration()));\r
-                       query.bindValue(":active", r.isActive());\r
-                       if (r.getRecognition() != null) {\r
-                               query.bindValue(":recognitionHash", r.getRecognition().getBodyHash());\r
-                               query.bindValue(":recognitionSize", r.getRecognition().getSize());\r
-                               if (r.getRecognition().getBody() != null)\r
-                                       query.bindValue(":recognitionBody", new String(r.getRecognition().getBody()));\r
-                               else\r
-                                       query.bindValue(":recognitionBody", "");\r
-                       } else {\r
-                               query.bindValue(":recognitionHash", "");\r
-                               query.bindValue(":recognitionSize", 0);\r
-                               query.bindValue(":recognitionBody", "");\r
-                       }\r
-                       if (r.getAttributes() != null) {\r
-                               query.bindValue(":attributeSourceUrl", r.getAttributes().getSourceURL());\r
-                               StringBuilder ts = new StringBuilder(simple.format(r.getAttributes().getTimestamp()));\r
-                               query.bindValue(":attributeTimestamp", ts.toString());\r
-                               query.bindValue(":attributeLatitude", r.getAttributes().getLatitude());\r
-                               query.bindValue(":attributeLongitude", r.getAttributes().getLongitude());\r
-                               query.bindValue(":attributeAltitude", r.getAttributes().getAltitude());\r
-                               query.bindValue(":attributeCameraMake", r.getAttributes().getCameraMake());\r
-                               query.bindValue(":attributeCameraModel", r.getAttributes().getCameraModel());\r
-                               query.bindValue(":attributeClientWillIndex", r.getAttributes().isClientWillIndex());\r
-                               query.bindValue(":attributeRecoType", r.getAttributes().getRecoType());\r
-                               query.bindValue(":attributeFileName", r.getAttributes().getFileName());\r
-                               query.bindValue(":attributeAttachment", r.getAttributes().isAttachment());                      \r
-                       }\r
-                       query.bindValue(":isDirty", isDirty);\r
-                                               \r
-                       check = query.exec();\r
-                       if (!check) {\r
-                               logger.log(logger.MEDIUM, "*** NoteResource Table insert failed.");             \r
-                               logger.log(logger.MEDIUM, query.lastError());\r
-                       }\r
-                       \r
-                                               \r
-                       logger.log(logger.HIGH, "Leaving DBRunner.saveNoteResources");\r
-       }\r
-       // delete an old resource\r
-       public void expungeNoteResource(String guid) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("delete from NoteResources where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               query.exec();\r
-       }\r
-\r
-       \r
-       // Get a note resource from the database by it's hash value\r
-       public String getNoteResourceGuidByHashHex(String noteGuid, String hash) {\r
-               logger.log(logger.HIGH, "Entering DBRunner.getNoteResourceGuidByHashHex");\r
-\r
-               boolean check;\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               check = query.prepare("Select guid from NoteResources " +\r
-                                       "where noteGuid=:noteGuid and dataHash=:hash");\r
-               if (check)\r
-                       logger.log(logger.EXTREME, "NoteResource SQL select prepare was successful.");\r
-               else {\r
-                       logger.log(logger.EXTREME, "NoteResource SQL select prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               query.bindValue(":noteGuid", noteGuid);\r
-               query.bindValue(":hash", hash);\r
-       \r
-               check = query.exec();\r
-               if (!check)      {\r
-                       logger.log(logger.MEDIUM, "dbRunner.getNoteResourceGuidByHashHex Select failed." +\r
-                                       "Note Guid:" +noteGuid+\r
-                                       "Data Body Hash:" +hash);               \r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               if (!query.next()) {\r
-                       logger.log(logger.MEDIUM, "Note Resource not found.");\r
-                       return null;\r
-               }\r
-               return query.valueString(0);\r
-       }\r
-\r
-       // Get a note resource from the database by it's hash value\r
-       public Resource getNoteResourceDataBodyByHashHex(String noteGuid, String hash) {\r
-               logger.log(logger.HIGH, "Entering DBRunner.getNoteResourceDataBodyByHash");\r
-\r
-               boolean check;\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               check = query.prepare("Select guid, mime, from NoteResources " +\r
-                                       "where noteGuid=:noteGuid and dataHash=:hash");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "NoteResource SQL select prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               query.bindValue(":noteGuid", noteGuid);\r
-               query.bindValue(":hash", hash);\r
-       \r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "NoteResource Select failed." +\r
-                                       "Note Guid:" +noteGuid+\r
-                                       "Data Body Hash:" +hash);               \r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               if (!query.next()) {\r
-                       logger.log(logger.MEDIUM, "Note Resource not found.");\r
-                       return null;\r
-               }\r
-               \r
-               Resource r = new Resource();\r
-               r.setGuid(query.valueString(0));\r
-               r.setMime(query.valueString(1));\r
-               \r
-               NSqlQuery binary = new NSqlQuery(db.getConnection());\r
-               if (!binary.prepare("Select databinary from NoteResources " +\r
-                                       "where guid=:guid")) {\r
-                       logger.log(logger.MEDIUM, "Prepare for NoteResources Binary failed");\r
-                       logger.log(logger.MEDIUM, binary.lastError());\r
-               }\r
-               \r
-               if (!binary.exec()) {\r
-                       logger.log(logger.MEDIUM, "NoteResources Binary Select failed." +\r
-                                       "Note Guid:" +noteGuid+\r
-                                       "Data Body Hash:" +hash);               \r
-                       logger.log(logger.MEDIUM, binary.lastError());\r
-               }\r
-               if (!binary.next()) {\r
-                       logger.log(logger.MEDIUM, "Note Resource Binary not found.");\r
-                       return null;\r
-               }\r
-               \r
-               Data d = new Data();\r
-               r.setData(d);\r
-               d.setBody(binary.valueString(0).getBytes());\r
-               logger.log(logger.HIGH, "Leaving DBRunner.getNoteResourceDataBodyByHash");\r
-               return r;\r
-       }\r
-\r
-       \r
-       // Get a note's resourcesby Guid\r
-       public Resource getNoteResource(String guid, boolean withBinary) {\r
-               if (guid == null)\r
-                       return null;\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               String queryString;\r
-               queryString = new String("Select guid, noteGuid, mime, width, height, duration, "\r
-                               +"active, updateSequenceNumber, dataHash, dataSize, "\r
-                               +"recognitionHash, recognitionSize, "\r
-                               +"attributeLatitude, attributeLongitude, attributeAltitude, "\r
-                               +"attributeCameraMake, attributeCameraModel, attributeClientWillIndex, "\r
-                               +"attributeRecoType, attributeFileName, attributeAttachment, recognitionBinary "\r
-                               +" from NoteResources where guid=:guid");\r
-\r
-               \r
-               query.prepare(queryString);\r
-               \r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.EXTREME, "NoteResources SQL select has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               Resource r = null;\r
-               if (query.next()) {\r
-                                                                       \r
-                       r = new Resource();\r
-                       r.setGuid(query.valueString(0));        // Resource Guid\r
-                       r.setNoteGuid(query.valueString(1));   // note Guid\r
-                       r.setMime(query.valueString(2));       // Mime Type\r
-                       r.setWidth(new Short(query.valueString(3)));  // Width\r
-                       r.setHeight(new Short(query.valueString(4)));  // Height\r
-                       r.setDuration(new Short(query.valueString(5)));  // Duration\r
-                       r.setActive(new Boolean(query.valueString(6)));  // active\r
-                       r.setUpdateSequenceNum(new Integer(query.valueString(7)));  // update sequence number\r
-                       \r
-                       Data d = new Data();\r
-                       byte[] h = query.valueString(8).getBytes();    // data hash\r
-                       QByteArray hData = new QByteArray(h);\r
-                       QByteArray bData = new QByteArray(QByteArray.fromHex(hData));\r
-                       d.setBodyHash(bData.toByteArray());\r
-                       d.setSize(new Integer(query.valueString(9)));\r
-                       r.setData(d);\r
-                       \r
-                       Data rec = new Data();\r
-                       if (query.valueObject(10) != null)\r
-                               rec.setBodyHash(query.valueString(10).getBytes());   // Recognition Hash\r
-                       if (query.valueObject(11) != null)\r
-                               rec.setSize(new Integer(query.valueString(11)));\r
-                       else\r
-                               rec.setSize(0);\r
-                       r.setRecognition(rec);\r
-\r
-                       ResourceAttributes a = new ResourceAttributes();\r
-                       if (!query.valueString(12).equals(""))              // Latitude\r
-                               a.setLatitude(new Float(query.valueString(12)));\r
-                       if (!query.valueString(13).equals(""))              // Longitude\r
-                               a.setLongitude(new Float(query.valueString(13)));\r
-                       if (!query.valueString(14).equals(""))              // Altitude\r
-                               a.setAltitude(new Float(query.valueString(14)));\r
-                       a.setCameraMake(stringValue(query.valueString(15)));              // Camera Make\r
-                       a.setCameraModel(stringValue(query.valueString(16)));\r
-                       a.setClientWillIndex(booleanValue(query.valueString(17).toString(),false));  // Camera Model\r
-                       a.setRecoType(stringValue(query.valueString(18)));                 // Recognition Type\r
-                       a.setFileName(stringValue(query.valueString(19)));                  // File Name\r
-                       a.setAttachment(booleanValue(query.valueString(20).toString(),false));\r
-                       r.setAttributes(a);\r
-               \r
-                       if (withBinary) {\r
-                           \r
-                               query.prepare("Select dataBinary from NoteResources where guid=:guid");\r
-                               query.bindValue(":guid", r.getGuid());\r
-                               query.exec();\r
-                               if (query.next()) {\r
-                                       byte[] b = query.getBlob(0);\r
-                                       r.getData().setBody(b);\r
-                               }\r
-                       } \r
-               }\r
-               return r;\r
-       }\r
-       \r
-       \r
-       // Get a note's resourcesby Guid\r
-       public List<Resource> getNoteResources(String noteGuid, boolean withBinary) {\r
-               if (noteGuid == null)\r
-                       return null;\r
-               List<Resource> res = new ArrayList<Resource>();\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Select guid"\r
-                               +" from NoteResources where noteGuid = :noteGuid");\r
-               query.bindValue(":noteGuid", noteGuid);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.EXTREME, "NoteResources SQL select has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               while (query.next()) {\r
-                       String guid = (query.valueString(0));\r
-                       res.add(getNoteResource(guid, withBinary));\r
-               }       \r
-               return res;\r
-       }\r
-       // Get all of a note's recognition data by the note guid\r
-       public List<Resource> getNoteResourcesRecognition(String noteGuid) {\r
-               if (noteGuid == null)\r
-                       return null;\r
-               boolean check;\r
-               List<Resource> res = new ArrayList<Resource>();\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Select "\r
-                               +"recognitionHash, recognitionSize, recognitionBinary "\r
-                               +" from NoteResources where noteGuid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "NoteTable.getNoteRecognition SQL prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               query.bindValue(":guid", noteGuid);\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "NoteTable.getNoteRecognition exec has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               while (query.next()) {  \r
-                       Resource r = new Resource();            \r
-                       res.add(r);\r
-                       Data rec = new Data();\r
-                       rec.setBodyHash(query.valueString(0).getBytes());\r
-                       String x = new String(query.valueString(1));\r
-                       if (!x.equals("")) {\r
-                               rec.setSize(new Integer(x));\r
-                               rec.setBody(query.valueString(2).getBytes());\r
-                       } else\r
-                               rec.setSize(0);\r
-                       r.setRecognition(rec);\r
-               }       \r
-               return res;\r
-       }\r
-       \r
-       \r
-       // Get a note's recognition data by it's guid.\r
-       public Resource getNoteResourceRecognition(String guid) {\r
-               if (guid == null)\r
-                       return null;\r
-               boolean check;\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Select "\r
-                               +"recognitionHash, recognitionSize, recognitionBinary, noteGuid "\r
-                               +" from NoteResources where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "NoteTable.getNoteRecognition SQL prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               query.bindValue(":guid", guid);\r
-               query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "NoteTable.getNoteRecognition exec has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               Resource r = null;\r
-               while (query.next()) {\r
-                                                                       \r
-                       r = new Resource();             \r
-                       Data rec = new Data();\r
-                       rec.setBodyHash(query.valueString(0).getBytes());\r
-                       String x = new String(query.valueString(1));\r
-                       if (!x.equals("")) {\r
-                               rec.setSize(new Integer(x));\r
-                               rec.setBody(query.valueString(2).getBytes());\r
-                       } else\r
-                               rec.setSize(0);\r
-                       r.setRecognition(rec);\r
-                       r.setNoteGuid(query.valueString(3));\r
-               }       \r
-               return r;\r
-       }\r
-\r
-       // Save Note Resource\r
-       public void updateNoteResource(Resource r, boolean isDirty) {\r
-               logger.log(logger.HIGH, "Entering ListManager.updateNoteResource");\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("delete from NoteResources where guid=:recGuid");\r
-               query.bindValue(":recGuid", r.getGuid());\r
-               query.exec();\r
-               saveNoteResource(r, isDirty);\r
-               logger.log(logger.HIGH, "Leaving RNoteResourceTable.updateNoteResource");\r
-       }\r
-       // Update note resource GUID\r
-       public void updateNoteResourceGuid(String oldGuid, String newGuid, boolean isDirty) {\r
-               logger.log(logger.HIGH, "Entering RNoteResourceTable.updateNoteResourceGuid");\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("update NoteResources set guid=:newGuid, isDirty=:isDirty where guid=:oldGuid");\r
-               query.bindValue(":newGuid", newGuid);\r
-               query.bindValue(":isDirty", isDirty);\r
-               query.bindValue(":oldGuid", oldGuid);\r
-               query.exec();\r
-               logger.log(logger.HIGH, "Leaving RNoteResourceTable.updateNoteResourceGuid");\r
-       }\r
-       // Update note resource GUID\r
-       public void resetUpdateSequenceNumber(String guid, boolean isDirty) {\r
-               logger.log(logger.HIGH, "Entering RNoteResourceTable.updateNoteResourceGuid");\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("update NoteResources set updateSequenceNumber=0, isDirty=:isDirty where guid=:guid");\r
-               query.bindValue(":isDirty", isDirty);\r
-               query.bindValue(":guid", guid);\r
-               query.exec();\r
-               logger.log(logger.HIGH, "Leaving RNoteResourceTable.updateNoteResourceGuid");\r
-       }\r
-       \r
-       // Drop the table\r
-       public void reindexAll() {              \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Update NoteResources set indexneeded=true");\r
-       }\r
-       // Count unindexed notes\r
-       public int getResourceCount() {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("select count(*) from noteresources");\r
-               query.next(); \r
-               int returnValue = new Integer(query.valueString(0));\r
-               return returnValue;\r
-       }\r
-\r
-       //********************************************\r
-       //** Utility Functions\r
-       //********************************************\r
-       // Convert a byte array to a hex string\r
-       private static String byteArrayToHexString(byte data[]) {\r
-               StringBuffer buf = new StringBuffer();\r
-           for (byte element : data) {\r
-               int halfbyte = (element >>> 4) & 0x0F;\r
-               int two_halfs = 0;\r
-               do {\r
-                       if ((0 <= halfbyte) && (halfbyte <= 9))\r
-                              buf.append((char) ('0' + halfbyte));\r
-                          else\r
-                               buf.append((char) ('a' + (halfbyte - 10)));\r
-                       halfbyte = element & 0x0F;\r
-               } while(two_halfs++ < 1);\r
-           }\r
-           return buf.toString();              \r
-       }\r
-\r
-       \r
-       private String stringValue(Object value) {\r
-               if (value != null && value.toString() != null) \r
-                       return value.toString();\r
-               else\r
-                       return null;\r
-       }\r
-       \r
-       private  boolean booleanValue(Object value, boolean unknown) {\r
-               if (value != null && value.toString() != null) {\r
-                       try {\r
-                               if ((Integer)value > 0)\r
-                                       return true;\r
-                               else\r
-                                       return false;\r
-                       } catch (java.lang.ClassCastException e) {\r
-                               try {\r
-                                       String stringValue = (String)value;\r
-                                       if (stringValue.equalsIgnoreCase("true"))\r
-                                               return true;\r
-                                       else \r
-                                               return false;\r
-                               } catch (java.lang.ClassCastException e1) { \r
-                                       return unknown;\r
-                               }\r
-                       }\r
-               }\r
-               else\r
-                       return unknown;\r
-       }\r
-\r
-}\r
diff --git a/src/cx/fbn/nevernote/sql/runners/RNoteTable.java b/src/cx/fbn/nevernote/sql/runners/RNoteTable.java
deleted file mode 100644 (file)
index 0d84a18..0000000
+++ /dev/null
@@ -1,1110 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.runners;\r
-\r
-import java.text.DateFormat;\r
-import java.text.ParseException;\r
-import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.evernote.edam.type.Note;\r
-import com.evernote.edam.type.NoteAttributes;\r
-import com.evernote.edam.type.Resource;\r
-import com.evernote.edam.type.Tag;\r
-import com.trolltech.qt.core.QByteArray;\r
-import com.trolltech.qt.core.QDateTime;\r
-import com.trolltech.qt.core.QTextCodec;\r
-\r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.evernote.EnmlConverter;\r
-import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-import cx.fbn.nevernote.utilities.Pair;\r
-\r
-public class RNoteTable {\r
-       private final ApplicationLogger                 logger;\r
-       public final RNoteTagsTable                             noteTagsTable;\r
-       public RNoteResourceTable                               noteResourceTable;\r
-       private final RDatabaseConnection               db;\r
-       int id;\r
-\r
-       // Prepared Queries to improve speed\r
-       private NSqlQuery                                               getQueryWithContent;\r
-       private NSqlQuery                                               getQueryWithoutContent;\r
-       private NSqlQuery                                               getAllQueryWithoutContent;\r
-       \r
-       // Constructor\r
-       public RNoteTable(ApplicationLogger l, RDatabaseConnection d) {\r
-               logger = l;\r
-               db = d;\r
-               id = 0;\r
-               noteResourceTable = new RNoteResourceTable(logger, db);\r
-               noteTagsTable = new RNoteTagsTable(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
-               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
-                       "updateSequenceNumber integer, title varchar, content varchar, contentHash varchar, "+\r
-                       "contentLength integer, created timestamp, updated timestamp, deleted timestamp, " \r
-                       +"active integer, notebookGuid varchar, attributeSubjectDate timestamp, "+\r
-                       "attributeLatitude double, attributeLongitude double, attributeAltitude double,"+\r
-                       "attributeAuthor varchar, attributeSource varchar, attributeSourceUrl varchar, "+\r
-                       "attributeSourceApplication varchar, indexNeeded boolean, isExpunged boolean, " +\r
-                       "isDirty boolean)"))                    \r
-               logger.log(logger.HIGH, "Table Note creation FAILED!!!");    \r
-        if (!query.exec("CREATE INDEX unindexed_notess on note (indexneeded desc, guid);"))\r
-               logger.log(logger.HIGH, "Note unindexed_notes index creation FAILED!!!");\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
-       }\r
-       // Drop the table\r
-       public void dropTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Drop table Note");\r
-               noteTagsTable.dropTable();\r
-               noteResourceTable.dropTable();\r
-       }\r
-       // Save Note List from Evernote \r
-       public void addNote(Note n, boolean isDirty) {\r
-               logger.log(logger.EXTREME, "Inside addNote");\r
-               if (n == null)\r
-                       return;\r
-               \r
-               SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");\r
-\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());                    \r
-               query.prepare("Insert Into Note ("\r
-                               +"guid, updateSequenceNumber, title, content, "\r
-                               +"contentHash, contentLength, created, updated, deleted, active, notebookGuid, "\r
-                               +"attributeSubjectDate, attributeLatitude, attributeLongitude, attributeAltitude, "\r
-                               +"attributeAuthor, attributeSource, attributeSourceUrl, attributeSourceApplication, "\r
-                               +"indexNeeded, isExpunged, isDirty, titlecolor, thumbnailneeded" \r
-                               +") Values("\r
-                               +":guid, :updateSequenceNumber, :title, :content, "\r
-                               +":contentHash, :contentLength, :created, :updated, :deleted, :active, :notebookGuid, "\r
-                               +":attributeSubjectDate, :attributeLatitude, :attributeLongitude, :attributeAltitude, "\r
-                               +":attributeAuthor, :attributeSource, :attributeSourceUrl, :attributeSourceApplication, "\r
-                               +":indexNeeded, :isExpunged, :isDirty, -1, true) ");\r
-\r
-               StringBuilder created = new StringBuilder(simple.format(n.getCreated()));                       \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
-               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
-               query.bindValue(":contentHash", n.getContentHash());\r
-               query.bindValue(":contentLength", n.getContentLength());\r
-               query.bindValue(":created", created.toString());\r
-               query.bindValue(":updated", updated.toString());\r
-               query.bindValue(":deleted", deleted.toString());\r
-               query.bindValue(":active", n.isActive());\r
-               query.bindValue(":notebookGuid", n.getNotebookGuid());\r
-               \r
-               if (n.getAttributes() != null) {\r
-                       created = new StringBuilder(simple.format(n.getAttributes().getSubjectDate()));\r
-                       query.bindValue(":attributeSubjectDate", created.toString());\r
-                       query.bindValue(":attributeLatitude", n.getAttributes().getLatitude());\r
-                       query.bindValue(":attributeLongitude", n.getAttributes().getLongitude());\r
-                       query.bindValue(":attributeAltitude", n.getAttributes().getAltitude());\r
-                       query.bindValue(":attributeAuthor", n.getAttributes().getAuthor());\r
-                       query.bindValue(":attributeSource", n.getAttributes().getSource());\r
-                       query.bindValue(":attributeSourceUrl", n.getAttributes().getSourceURL());\r
-                       query.bindValue(":attributeSourceApplication", n.getAttributes().getSourceApplication());\r
-               }\r
-               query.bindValue(":indexNeeded", true);\r
-               query.bindValue(":isExpunged", false);\r
-               query.bindValue(":isDirty", isDirty);\r
-\r
-               \r
-               if (!query.exec())\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               \r
-               // Save the note tags\r
-               if (n.getTagGuids() != null) {\r
-                       for (int i=0; i<n.getTagGuids().size(); i++) \r
-                               noteTagsTable.saveNoteTag(n.getGuid(), n.getTagGuids().get(i));\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
-               }\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
-               }\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.MEDIUM, getQueryWithoutContent.lastError());\r
-               }\r
-       }\r
-\r
-       // Get a note's content in raw, binary format for the sync.\r
-       public String getNoteContentBinary(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
-               \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
-                       return null;\r
-               if (noteGuid.trim().equals(""))\r
-                       return null;\r
-\r
-               prepareQueries();\r
-               NSqlQuery query;\r
-               if (loadContent) {\r
-                       query = getQueryWithContent;\r
-               } else {\r
-                       query = getQueryWithoutContent;\r
-               }\r
-               \r
-               query.bindValue(":guid", noteGuid);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.EXTREME, "Note SQL select exec has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               if (!query.next()) {\r
-                       logger.log(logger.EXTREME, "SQL Retrieve failed for note guid " +noteGuid + " in getNote()");\r
-                       logger.log(logger.EXTREME, " -> " +query.lastError().toString());\r
-                       logger.log(logger.EXTREME, " -> " +query.lastError());\r
-                       return null;\r
-               }\r
-               Note n = mapNoteFromQuery(query, loadContent, loadResources, loadRecognition, loadBinary, loadTags);\r
-               n.setContent(fixCarriageReturn(n.getContent()));\r
-               return n;\r
-       }\r
-       // Get a note by Guid\r
-       public Note mapNoteFromQuery(NSqlQuery query, boolean loadContent, boolean loadResources, boolean loadRecognition, boolean loadBinary, boolean loadTags) {\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
-               \r
-               n.setGuid(query.valueString(0));\r
-               n.setUpdateSequenceNum(new Integer(query.valueString(1)));\r
-               n.setTitle(query.valueString(2));\r
-\r
-               try {\r
-                       n.setCreated(indfm.parse(query.valueString(3)).getTime());\r
-                       n.setUpdated(indfm.parse(query.valueString(4)).getTime());\r
-                       n.setDeleted(indfm.parse(query.valueString(5)).getTime());\r
-               } catch (ParseException e) {\r
-                       e.printStackTrace();\r
-               }\r
-\r
-               n.setActive(query.valueBoolean(6,true));\r
-               n.setNotebookGuid(query.valueString(7));\r
-               \r
-               try {\r
-                       String attributeSubjectDate = query.valueString(8);\r
-                       if (!attributeSubjectDate.equals(""))\r
-                               na.setSubjectDate(indfm.parse(attributeSubjectDate).getTime());\r
-               } catch (ParseException e) {\r
-                       e.printStackTrace();\r
-               }\r
-               na.setLatitude(new Float(query.valueString(9)));\r
-               na.setLongitude(new Float(query.valueString(10)));\r
-               na.setAltitude(new Float(query.valueString(11)));\r
-               na.setAuthor(query.valueString(12));\r
-               na.setSource(query.valueString(13));\r
-               na.setSourceURL(query.valueString(14));\r
-               na.setSourceApplication(query.valueString(15));\r
-               \r
-               if (loadTags) {\r
-                       n.setTagGuids(noteTagsTable.getNoteTags(n.getGuid()));\r
-                       List<String> tagNames = new ArrayList<String>();\r
-                       RTagTable tagTable = new RTagTable(logger, db);\r
-                       for (int i=0; i<n.getTagGuids().size(); i++) {\r
-                               String currentGuid = n.getTagGuids().get(i);\r
-                               Tag tag = tagTable.getTag(currentGuid);\r
-                               tagNames.add(tag.getName());\r
-                       }\r
-                       n.setTagNames(tagNames);\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
-//                     n.setContent(query.valueString(16).toString());\r
-                       \r
-                       String contentHash = query.valueString(17);\r
-                       if (contentHash != null)\r
-                               n.setContentHash(contentHash.getBytes());\r
-                       n.setContentLength(new Integer(query.valueString(18)));\r
-               }\r
-               if (loadResources)\r
-                       n.setResources(noteResourceTable.getNoteResources(n.getGuid(), loadBinary));\r
-               if (loadRecognition) {\r
-                       if (n.getResources() == null) {\r
-                               List<Resource> resources = noteResourceTable.getNoteResourcesRecognition(n.getGuid());\r
-                               n.setResources(resources);\r
-                       } else {\r
-                               // We need to merge the recognition resources with the note resources retrieved earlier\r
-                               for (int i=0; i<n.getResources().size(); i++) {\r
-                                       Resource r = noteResourceTable.getNoteResourceRecognition(n.getResources().get(i).getGuid());\r
-                                       n.getResources().get(i).setRecognition(r.getRecognition());\r
-                               }\r
-                       }\r
-               }\r
-               n.setContent(fixCarriageReturn(n.getContent()));\r
-               return n;\r
-       }\r
-       // Update a note's title\r
-       public void updateNoteTitle(String guid, String title) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               boolean check = query.prepare("Update Note set title=:title, isDirty=true where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note title sql prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               query.bindValue(":title", title);\r
-               query.bindValue(":guid", guid);\r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note title has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Update a note's creation date\r
-       public void updateNoteCreatedDate(String guid, QDateTime date) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               boolean check = query.prepare("Update Note set created=:created, isDirty=true where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note creation update sql prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               \r
-               query.bindValue(":created", date.toString("yyyy-MM-dd HH:mm:ss"));\r
-               query.bindValue(":guid", guid);\r
-               \r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note creation date has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Update a note's creation date\r
-       public void updateNoteAlteredDate(String guid, QDateTime date) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               boolean check = query.prepare("Update Note set updated=:altered, isDirty=true where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note altered sql prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               \r
-               query.bindValue(":altered", date.toString("yyyy-MM-dd HH:mm:ss"));\r
-               query.bindValue(":guid", guid);\r
-               \r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note altered date has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Update a note's creation date\r
-       public void updateNoteSubjectDate(String guid, QDateTime date) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               boolean check = query.prepare("Update Note set attributeSubjectDate=:altered, isDirty=true where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note subject date sql prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       \r
-               query.bindValue(":altered", date.toString("yyyy-MM-dd HH:mm:ss"));\r
-               query.bindValue(":guid", guid);\r
-               \r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note subject date date has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Update a note's creation date\r
-       public void updateNoteAuthor(String guid, String author) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               boolean check = query.prepare("Update Note set attributeAuthor=:author, isDirty=true where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note author sql prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-\r
-               query.bindValue(":author", author);\r
-               query.bindValue(":guid", guid);\r
-\r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note author has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               \r
-       }\r
-       // Update a note's creation date\r
-       public void updateNoteSourceUrl(String guid, String url) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               boolean check = query.prepare("Update Note set attributeSourceUrl=:url, isDirty=true where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note url sql prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               \r
-               query.bindValue(":url", url);\r
-               query.bindValue(":guid", guid);\r
-\r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note url has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               \r
-       }\r
-       // Update the notebook that a note is assigned to\r
-       public void updateNoteNotebook(String guid, String notebookGuid, boolean expungeFromRemote) {\r
-               String currentNotebookGuid = new String("");\r
-               \r
-               \r
-               // If we are going from a synchronized notebook to a local notebook, we\r
-               // need to tell Evernote to purge the note online.  However, if this is  \r
-               // conflicting change we move it to the local notebook without deleting it \r
-               // or it would then delete the copy on the remote server.\r
-               RNotebookTable notebookTable = new RNotebookTable(logger, db);\r
-               RDeletedTable deletedTable = new RDeletedTable(logger, db);\r
-               if (expungeFromRemote) {\r
-                       if (!notebookTable.isNotebookLocal(currentNotebookGuid) & notebookTable.isNotebookLocal(notebookGuid)) {\r
-                               deletedTable.addDeletedItem(guid, "NOTE");\r
-                       }\r
-               }\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               boolean check = query.prepare("Update Note set notebookGuid=:notebook, isDirty=true where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note notebook sql prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               query.bindValue(":notebook", notebookGuid);\r
-               query.bindValue(":guid", guid);\r
-               \r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note notebook has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               };\r
-       }\r
-       // Update a note's title\r
-       public void updateNoteContent(String guid, String content) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               boolean check = query.prepare("Update Note set content=:content, updated=CURRENT_TIMESTAMP(), isDirty=true, indexNeeded=true " +\r
-                               " where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note content sql prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               \r
-               query.bindValue(":content", content);\r
-               query.bindValue(":guid", guid);\r
-\r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note content has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-\r
-       \r
-       // Check a note to see if it passes the attribute selection criteria\r
-       public boolean checkAttributeSelection(Note n) {\r
-               if (Global.createdSinceFilter.check(n) &&\r
-                       Global.createdBeforeFilter.check(n) && \r
-                       Global.changedSinceFilter.check(n) &&\r
-                       Global.changedBeforeFilter.check(n) )\r
-                               return true;\r
-               \r
-               return false;\r
-       }\r
-       // Delete a note\r
-       public void deleteNote(String guid) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-        query.prepare("Update Note set deleted=CURRENT_TIMESTAMP(), active=false, isDirty=true where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Note delete failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       public void restoreNote(String guid) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Update Note set deleted='1969-12-31 19.00.00', active=true, isDirty=true where guid=:guid");\r
-//             query.prepare("Update Note set deleted=0, active=true, isDirty=true where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Note restore failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Purge a note (actually delete it instead of just marking it deleted)\r
-       public void expungeNote(String guid, boolean permanentExpunge, boolean needsSync) {\r
-               \r
-               if (!permanentExpunge) {\r
-                       hideExpungedNote(guid, needsSync);\r
-                       return;\r
-               }\r
-               \r
-               \r
-        NSqlQuery note = new NSqlQuery(db.getConnection());\r
-        NSqlQuery resources = new NSqlQuery(db.getConnection());\r
-        NSqlQuery tags = new NSqlQuery(db.getConnection());\r
-        NSqlQuery words = new NSqlQuery(db.getConnection());\r
-        \r
-               note.prepare("Delete from Note 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
-\r
-               note.bindValue(":guid", guid);\r
-               resources.bindValue(":guid", guid);\r
-               tags.bindValue(":guid", guid);\r
-               words.bindValue(":guid", guid);\r
-       \r
-               // Start purging notes.\r
-               if (!note.exec()) {\r
-                       logger.log(logger.MEDIUM, "Purge from note failed.");\r
-                       logger.log(logger.MEDIUM, note.lastError());\r
-               }\r
-               if (!resources.exec()) {\r
-                               logger.log(logger.MEDIUM, "Purge from resources failed.");\r
-                       logger.log(logger.MEDIUM, resources.lastError());\r
-               }\r
-               if (!tags.exec()) {\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
-               if (needsSync) {\r
-                       RDeletedTable deletedTable = new RDeletedTable(logger, db);\r
-                       deletedTable.addDeletedItem(guid, "Note");\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 tags = new NSqlQuery(db.getConnection());\r
-        NSqlQuery words = new NSqlQuery(db.getConnection());\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
-\r
-               note.bindValue(":guid", guid);\r
-               resources.bindValue(":guid", guid);\r
-               tags.bindValue(":guid", guid);\r
-               words.bindValue(":guid", guid);\r
-\r
-               // Start purging notes.\r
-               if (!note.exec()) {\r
-                       logger.log(logger.MEDIUM, "Purge from note failed.");\r
-                       logger.log(logger.MEDIUM, note.lastError());\r
-               }\r
-               if (!resources.exec()) {\r
-                               logger.log(logger.MEDIUM, "Purge from resources failed.");\r
-                       logger.log(logger.MEDIUM, resources.lastError());\r
-               }\r
-               if (!tags.exec()) {\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
-               if (needsSync) {\r
-                       RDeletedTable deletedTable = new RDeletedTable(logger, db);\r
-                       deletedTable.addDeletedItem(guid, "Note");\r
-               }\r
-       }\r
-\r
-               \r
-       // Purge all deleted notes;\r
-       public void expungeAllDeletedNotes() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("select guid, updateSequenceNumber from note where active = false");\r
-               while (query.next()) {\r
-                       String guid = query.valueString(0);\r
-                       Integer usn = new Integer(query.valueString(1));\r
-                       if (usn == 0)\r
-                               expungeNote(guid, true, false);\r
-                       else\r
-                               expungeNote(guid, false, true);\r
-               }\r
-       }\r
-       // Update the note sequence number\r
-       public void updateNoteSequence(String guid, int sequence) {\r
-               boolean check;\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update Note set updateSequenceNumber=:sequence where guid=:guid");\r
-\r
-               query.bindValue(":sequence", sequence);\r
-               query.bindValue(":guid", guid);\r
-               \r
-               query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Note sequence update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               } \r
-       }\r
-       // Update the note Guid\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
-\r
-               query.bindValue(":newGuid", newGuid);\r
-               query.bindValue(":oldGuid", oldGuid);\r
-\r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Note Guid update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               } \r
-               \r
-               query.prepare("Update NoteTags set noteGuid=:newGuid where noteGuid=:oldGuid");\r
-               query.bindValue(":newGuid", newGuid);\r
-               query.bindValue(":oldGuid", oldGuid);\r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Note guid update failed for NoteTags.");\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
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Note guid update failed for Words.");\r
-                       logger.log(logger.MEDIUM, query.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
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Note guid update failed for noteresources.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Update a note\r
-       public void updateNote(Note n, boolean isNew) {\r
-               boolean isExpunged = isNoteExpunged(n.getGuid());\r
-               \r
-               expungeNote(n.getGuid(), !isExpunged, false);\r
-               addNote(n, false);\r
-       }\r
-       // Does a note exist?\r
-       public boolean exists(String guid) {\r
-               if (guid == null)\r
-                       return false;\r
-               if (guid.trim().equals(""))\r
-                       return false;\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Select guid from note where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "note.exists SQL retrieve has failed.");\r
-               boolean retVal = query.next();\r
-               return retVal;\r
-       }\r
-       // Does a note exist?\r
-       public boolean isNoteExpunged(String guid) {\r
-               if (guid == null)\r
-                       return false;\r
-               if (guid.trim().equals(""))\r
-                       return false;\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Select isExpunged from note where guid=:guid and isExpunged = true");\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "note.isNoteExpunged SQL retrieve has failed.");\r
-               boolean retVal = query.next();\r
-               return retVal;\r
-       }\r
-       // This is a convience method to check if a tag exists & update/create based upon it\r
-       public void syncNote(Note tag, boolean isDirty) {\r
-               if (exists(tag.getGuid()))\r
-                       updateNote(tag, isDirty);\r
-               else\r
-                       addNote(tag, isDirty);\r
-       }\r
-       // Get a list of notes that need to be updated\r
-       public List <Note> getDirty() {\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 notebookGuid not in (select guid from notebook where local = 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 boolean isNoteDirty(String guid) {\r
-               \r
-               boolean check;                  \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               check = query.prepare("Select guid from Note where isDirty = true and guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               check = query.exec();\r
-               if (!check) \r
-                       logger.log(logger.EXTREME, "Note SQL retrieve has failed: " +query.lastError().toString());\r
-               \r
-               boolean returnValue;\r
-               // Get a list of the notes\r
-               if (query.next()) \r
-                       returnValue = true; \r
-               else\r
-                       returnValue = false;\r
-\r
-               return returnValue;     \r
-       }\r
-       // Get a list of notes that need to be updated\r
-       public List <String> getUnsynchronizedGUIDs() {\r
-               String guid;\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");\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
-               return index;   \r
-       }\r
-       // Reset the dirty bit\r
-       public void  resetDirtyFlag(String guid) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               query.prepare("Update note set isdirty=false where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error resetting note dirty field.");\r
-       }\r
-       // Get all notes\r
-       public List<String> getAllGuids() {\r
-               List<String> notes = new ArrayList<String>();\r
-               \r
-               boolean check;                                  \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               check = query.exec("Select guid from Note");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed: "+query.lastError());\r
-\r
-               // Get a list of the notes\r
-               while (query.next()) {\r
-                       notes.add(new String(query.valueString(0))); \r
-               }\r
-               return notes;\r
-       }\r
-       // Get all notes\r
-       public List<Note> getAllNotes() {\r
-               List<Note> notes = new ArrayList<Note>();\r
-               prepareQueries();\r
-               boolean check;                                  \r
-        NSqlQuery query = getAllQueryWithoutContent;\r
-               check = query.exec();\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed: "+query.lastError());\r
-               // Get a list of the notes\r
-               while (query.next()) {\r
-                       notes.add(mapNoteFromQuery(query, false, false, false, false, true));\r
-               }\r
-               return notes;\r
-       }\r
-       // Count unindexed notes\r
-       public int getUnindexedCount() {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("select count(*) from note where indexneeded=true and isExpunged = false");\r
-               query.next(); \r
-               int returnValue = new Integer(query.valueString(0));\r
-               return returnValue;\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.next(); \r
-               int returnValue = new Integer(query.valueString(0));\r
-               return returnValue;\r
-       }\r
-       // Count notes\r
-       public int getNoteCount() {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("select count(*) from note where isExpunged = false");\r
-               query.next(); \r
-               int returnValue = new Integer(query.valueString(0));\r
-               return returnValue;\r
-       }\r
-       // Count deleted notes\r
-       public int getDeletedCount() {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("select count(*) from note where isExpunged = false and active = false");\r
-               if (!query.next()) \r
-                       return 0;\r
-               int returnValue = new Integer(query.valueString(0));\r
-               return returnValue;\r
-       }\r
-       // Reset a note sequence number to zero.  This is useful for moving conflicting notes\r
-       public void resetNoteSequence(String guid) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               boolean check = query.prepare("Update Note set updateSequenceNumber=0, isDirty=true where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note ResetSequence sql prepare has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               query.bindValue(":guid", guid);\r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Update note sequence number has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       \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
-/*             query.prepare("Select guid from NoteResources where noteGuid=:noteGuid and datahash=:hex");\r
-               query.bindValue(":noteGuid", noteGuid);\r
-               query.bindValue(":hex", hash);\r
-               query.exec();\r
-               if (!query.next()) {\r
-                       logger.log(logger.LOW, "Error finding note resource in RNoteTable.updateNoteResourceGuidbyHash.  GUID="+noteGuid +" resGuid="+ resGuid+" hash="+hash);\r
-                       return;\r
-               }\r
-               String guid = query.valueString(0);\r
-*/             \r
-               query.prepare("update noteresources set guid=:guid where noteGuid=:noteGuid and datahash=:hex");\r
-               query.bindValue(":guid", resGuid);\r
-               query.bindValue(":noteGuid", noteGuid);\r
-               query.bindValue(":hex", hash);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.EXTREME, "Note Resource Update by Hash failed");\r
-                       logger.log(logger.EXTREME, query.lastError().toString());\r
-               }\r
-       }\r
-\r
-       // Fix CRLF problem that is on some notes\r
-       private String fixCarriageReturn(String note) {\r
-               if (note == null || !Global.enableCarriageReturnFix)\r
-                       return note;\r
-               QByteArray a0Hex = new QByteArray("a0");\r
-               String a0 = QByteArray.fromHex(a0Hex).toString();\r
-               note = note.replace("<div>"+a0+"</div>", "<div>&nbsp;</div>");\r
-               return note.replace("<div/>", "<div>&nbsp;</div>");\r
-       }\r
-       \r
-       \r
-       \r
-       //********************************************************************************\r
-       //********************************************************************************\r
-       //* Indexing Functions\r
-       //********************************************************************************\r
-       //********************************************************************************\r
-       // set/unset a note to be reindexed\r
-       public void setIndexNeeded(String guid, Boolean flag) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Update Note set indexNeeded=:flag where guid=:guid");\r
-\r
-               if (flag)\r
-                       query.bindValue(":flag", 1);\r
-               else\r
-                       query.bindValue(":flag", 0);\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Note indexNeeded update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               } \r
-       }\r
-       // Set all notes to be reindexed\r
-       public void reindexAllNotes() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               if (!query.exec("Update Note set indexNeeded=true")) {\r
-                       logger.log(logger.MEDIUM, "Note reindexAllNotes update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               } \r
-       }\r
-\r
-       // Get all unindexed notes\r
-       public List <String> getUnindexed() {\r
-               String guid;\r
-               List<String> index = new ArrayList<String>();\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               if (!query.exec("Select guid from Note where isExpunged = false and indexNeeded = true and DATEDIFF('MINUTE',updated,CURRENT_TIMESTAMP)>5"))\r
-                       logger.log(logger.EXTREME, "Note SQL retrieve has failed on getUnindexed().");\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
-               return index;   \r
-       }\r
-       public List<String> getNextUnindexed(int limit) {\r
-               List<String> guids = new ArrayList<String>();\r
-                       \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               if (!query.exec("Select guid from Note where isExpunged = false and indexNeeded = true and DATEDIFF('MINUTE',Updated,CURRENT_TIMESTAMP)>5 limit " +limit))\r
-                       logger.log(logger.EXTREME, "Note SQL retrieve has failed on getUnindexed().");\r
-               \r
-               // Get a list of the notes\r
-               String guid;\r
-               while (query.next()) {\r
-                       guid = new String();\r
-                       guid = query.valueString(0);\r
-                       guids.add(guid);\r
-               }       \r
-               return guids;   \r
-       }\r
-       \r
-       \r
-       //**********************************************************************************\r
-       //* Title color functions\r
-       //**********************************************************************************\r
-       // Get the title color of all notes\r
-       public List<Pair<String, Integer>> getNoteTitleColors() {\r
-               List<Pair<String,Integer>> returnValue = new ArrayList<Pair<String,Integer>>();\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               if (!query.exec("Select guid,titleColor from Note where titleColor != -1"))\r
-                       logger.log(logger.EXTREME, "Note SQL retrieve has failed on getUnindexed().");\r
-\r
-               String guid;\r
-               Integer color;\r
-               \r
-               // Get a list of the notes\r
-               while (query.next()) {\r
-                       Pair<String, Integer> pair = new Pair<String,Integer>();\r
-                       guid = query.valueString(0);\r
-                       color = query.valueInteger(1);\r
-                       pair.setFirst(guid);\r
-                       pair.setSecond(color);\r
-                       returnValue.add(pair); \r
-               }       \r
-\r
-               \r
-               \r
-               return returnValue;\r
-       }\r
-       // Set a title color\r
-       // Reset the dirty bit\r
-       public void  setNoteTitleColor(String guid, int color) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               query.prepare("Update note set titlecolor=:color where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               query.bindValue(":color", color);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error updating title color.");\r
-       }\r
-\r
-       \r
-       \r
-       //**********************************************************************************\r
-       //* Thumbnail functions\r
-       //**********************************************************************************\r
-       // Set if a new thumbnail is needed\r
-       public void setThumbnailNeeded(String guid, boolean needed) {\r
-               \r
-               boolean check;                  \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               check = query.prepare("Update note set thumbnailneeded = :needed where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               query.bindValue(":needed", needed);\r
-               check = query.exec();\r
-               if (!check) \r
-                       logger.log(logger.EXTREME, "Note SQL set thumbail needed failed: " +query.lastError().toString());\r
-\r
-       }\r
-       // Is a thumbail needed for this guid?\r
-       public boolean isThumbnailNeeded(String guid) {\r
-               \r
-               boolean check;                  \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               check = query.prepare("select thumbnailneeded from note where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               check = query.exec();\r
-               if (!check) \r
-                       logger.log(logger.EXTREME, "Note SQL isThumbnailNeeded query failed: " +query.lastError().toString());\r
-               \r
-               boolean returnValue;\r
-               // Get a list of the notes\r
-               if (query.next()) \r
-                       returnValue = query.valueBoolean(0, false); \r
-               else\r
-                       returnValue = false;\r
-\r
-               return returnValue;     \r
-       }\r
-       // Set if a new thumbnail is needed\r
-       public void setThumbnail(String guid, QByteArray thumbnail) {\r
-               \r
-               boolean check;                  \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               check = query.prepare("Update note set thumbnail = :thumbnail where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               query.bindValue(":thumbnail", thumbnail.toByteArray());\r
-               check = query.exec();\r
-               if (!check) \r
-                       logger.log(logger.EXTREME, "Note SQL set thumbail failed: " +query.lastError().toString());\r
-\r
-       }\r
-       // Set if a new thumbnail is needed\r
-       public QByteArray getThumbnail(String guid) {\r
-               \r
-               boolean check;                  \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               check = query.prepare("Select thumbnail from note where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               check = query.exec();\r
-               if (!check) \r
-                       logger.log(logger.EXTREME, "Note SQL get thumbail failed: " +query.lastError().toString());\r
-               // Get a list of the notes\r
-               if (query.next()) \r
-                       if (query.getBlob(0) != null)\r
-                               return new QByteArray(query.getBlob(0)); \r
-               return null;\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
-               Note n = getNote(guid, true, false, false, false,false);\r
-               int position = n.getContent().indexOf("<en-media");\r
-               int endPos;\r
-               for (;position>-1;) {\r
-                       endPos = n.getContent().indexOf(">", position+1);\r
-                       String oldSegment = n.getContent().substring(position,endPos);\r
-                       int hashPos = oldSegment.indexOf("hash=\"");\r
-                       int hashEnd = oldSegment.indexOf("\"", hashPos+7);\r
-                       String hash = oldSegment.substring(hashPos+6, hashEnd);\r
-                       if (hash.equalsIgnoreCase(oldHash)) {\r
-                               String newSegment = oldSegment.replace(oldHash, newHash);\r
-                               String content = n.getContent().substring(0,position) +\r
-                                                newSegment +\r
-                                                n.getContent().substring(endPos);\r
-                               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                               query.prepare("update note set isdirty=true, content=:content where guid=:guid");\r
-                               query.bindValue(":content", content);\r
-                               query.bindValue(":guid", n.getGuid());\r
-                               query.exec();\r
-                       }\r
-                       \r
-                       position = n.getContent().indexOf("<en-media", position+1);\r
-               }\r
-       }\r
-}      \r
diff --git a/src/cx/fbn/nevernote/sql/runners/RNoteTagsTable.java b/src/cx/fbn/nevernote/sql/runners/RNoteTagsTable.java
deleted file mode 100644 (file)
index 6222630..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.runners;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-import cx.fbn.nevernote.utilities.Pair;\r
-\r
-public class RNoteTagsTable {\r
-       private final ApplicationLogger                 logger;\r
-       RDatabaseConnection                                             db;\r
-\r
-       \r
-       // Constructor\r
-       public RNoteTagsTable(ApplicationLogger l,RDatabaseConnection d) {\r
-               logger = l;\r
-               db = d;\r
-       }\r
-       // Create the table\r
-       public void createTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-        // Create the NoteTag table\r
-        logger.log(logger.HIGH, "Creating table NoteTags...");\r
-        if (!query.exec("Create table NoteTags (noteGuid varchar, " +\r
-                       "tagGuid varchar, primary key(noteGuid, tagGuid))"))\r
-               logger.log(logger.HIGH, "Table NoteTags creation FAILED!!!"); \r
-       }\r
-       // Drop the table\r
-       public void dropTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("drop table NoteTags");\r
-       }\r
-       // Get a note tags by the note's Guid\r
-       public List<String> getNoteTags(String noteGuid) {\r
-               if (noteGuid == null)\r
-                       return null;\r
-               boolean check;\r
-               List<String> tags = new ArrayList<String>();\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.exec("Select "\r
-                               +"TagGuid from NoteTags where noteGuid = '" +noteGuid +"'");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "NoteTags SQL select has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               while (query.next()) {\r
-                       tags.add(query.valueString(0));\r
-               }       \r
-               return tags;\r
-       }\r
-       // Get a note tags by the note's Guid\r
-       public List<NoteTagsRecord> getAllNoteTags() {\r
-               List<NoteTagsRecord> tags = new ArrayList<NoteTagsRecord>();\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               if (!query.exec("Select TagGuid, NoteGuid from NoteTags")) {\r
-                       logger.log(logger.EXTREME, "NoteTags SQL select has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               while (query.next()) {\r
-                       NoteTagsRecord record = new NoteTagsRecord();\r
-                       record.tagGuid = query.valueString(0);\r
-                       record.noteGuid = query.valueString(1);\r
-                       tags.add(record);\r
-               }       \r
-               return tags;\r
-       }\r
-       // Check if a note has a specific tag already\r
-       public boolean checkNoteNoteTags(String noteGuid, String tagGuid) {\r
-               if (noteGuid == null || tagGuid == null)\r
-                       return false;\r
-               boolean check;\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Select "\r
-                               +"NoteGuid, TagGuid from NoteTags where noteGuid = :noteGuid and tagGuid = :tagGuid");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "checkNoteTags SQL prepare has failed.");\r
-               \r
-               query.bindValue(":noteGuid", noteGuid);\r
-               query.bindValue(":tagGuid", tagGuid);\r
-               query.exec();\r
-               \r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "checkNoteTags SQL select has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return false;\r
-               }\r
-               \r
-               if (query.next()) {\r
-                       return true;\r
-               }       \r
-               return false;\r
-       }\r
-       // Save Note Tags\r
-       public void saveNoteTag(String noteGuid, String tagGuid) {\r
-               boolean check;\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-\r
-               check = query.prepare("Insert Into NoteTags (noteGuid, tagGuid) "\r
-                               +"Values("\r
-                               +":noteGuid, :tagGuid)");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "Note SQL insert prepare has failed.");\r
-       \r
-               query.bindValue(":noteGuid", noteGuid);\r
-               query.bindValue(":tagGuid", tagGuid);\r
-                                               \r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "NoteTags Table insert failed.");             \r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               check = query.prepare("Update Note set isDirty=1 where guid=:guid");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "RNoteTagsTable.saveNoteTag prepare has failed.");\r
-               query.bindValue(":guid", noteGuid);\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "RNoteTagsTable.saveNoteTag has failed to set note as dirty.");               \r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Delete a note's tags\r
-       public void deleteNoteTag(String noteGuid) {\r
-               boolean check;\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Delete from NoteTags where noteGuid = :noteGuid");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "Note SQL delete prepare has failed.");\r
-       \r
-               query.bindValue(":noteGuid", noteGuid);\r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "NoteTags Table delete failed.");             \r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-\r
-       }\r
-       // Get a note tag counts\r
-       public List<Pair<String,Integer>> getTagCounts() {\r
-               List<Pair<String,Integer>> counts = new ArrayList<Pair<String,Integer>>();              \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               if (!query.exec("select tagguid, count(noteguid) from notetags group by tagguid;")) {\r
-                       logger.log(logger.EXTREME, "NoteTags SQL getTagCounts has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               while (query.next()) {\r
-                       Pair<String,Integer> newCount = new Pair<String,Integer>();\r
-                       newCount.setFirst(query.valueString(0));\r
-                       newCount.setSecond(query.valueInteger(1));\r
-                       counts.add(newCount);\r
-               }       \r
-               return counts;\r
-       }\r
-}\r
diff --git a/src/cx/fbn/nevernote/sql/runners/RNotebookTable.java b/src/cx/fbn/nevernote/sql/runners/RNotebookTable.java
deleted file mode 100644 (file)
index 2bb9b5b..0000000
+++ /dev/null
@@ -1,432 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.runners;\r
-\r
-import java.text.DateFormat;\r
-import java.text.ParseException;\r
-import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.evernote.edam.type.Notebook;\r
-\r
-import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
-import cx.fbn.nevernote.sql.requests.NotebookRequest;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-import cx.fbn.nevernote.utilities.Pair;\r
-\r
-public class RNotebookTable {\r
-       \r
-       private final ApplicationLogger                 logger;\r
-       RDatabaseConnection                                                     db;\r
-       public NotebookRequest                                  mainResponse;\r
-       \r
-       // Constructor\r
-       public RNotebookTable(ApplicationLogger l, RDatabaseConnection d) {\r
-               logger = l;\r
-               db = d;\r
-               mainResponse = new NotebookRequest();\r
-       }\r
-       // Create the table\r
-       public void createTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-        logger.log(logger.HIGH, "Creating table Notebook...");\r
-        if (!query.exec("Create table Notebook (guid varchar primary key, " +\r
-                       "sequence integer, name varchar, defaultNotebook varchar, "+\r
-                       "serviceCreated timestamp, serviceUpdated timestamp, published boolean, isDirty boolean, "+\r
-                       "autoEncrypt boolean, local boolean, archived boolean)"))                               \r
-               logger.log(logger.HIGH, "Table Notebook creation FAILED!!!");   \r
-        Notebook newnote = new Notebook();\r
-        newnote.setDefaultNotebook(true);\r
-        newnote.setName("My Notebook");\r
-        newnote.setPublished(false);\r
-        newnote.setGuid("1");\r
-        addNotebook(newnote, true, false);\r
-               \r
-       }\r
-       // Drop the table\r
-       public void dropTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Drop table Notebook");\r
-       }\r
-       // Save an individual notebook\r
-       public void addNotebook(Notebook tempNotebook, boolean isDirty, boolean local) {\r
-               boolean check;\r
-               \r
-               SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Insert Into Notebook (guid, sequence, name, defaultNotebook, "\r
-                               +"serviceCreated, serviceUpdated, published, "   \r
-                               + "isDirty, autoEncrypt," \r
-                               + "local, archived) Values("\r
-                               +":guid, :sequence, :name, :defaultNotebook,  "\r
-                               +":serviceCreated, :serviceUpdated, :published, "\r
-                               +":isDirty, :autoEncrypt, "\r
-                               +":local, false)");\r
-               query.bindValue(":guid", tempNotebook.getGuid());\r
-               query.bindValue(":sequence", tempNotebook.getUpdateSequenceNum());\r
-               query.bindValue(":name", tempNotebook.getName());\r
-               query.bindValue(":defaultNotebook", tempNotebook.isDefaultNotebook());\r
-               \r
-               StringBuilder serviceCreated = new StringBuilder(simple.format(tempNotebook.getServiceCreated()));                      \r
-               StringBuilder serviceUpdated = new StringBuilder(simple.format(tempNotebook.getServiceUpdated()));\r
-               if (serviceUpdated.toString() == null)\r
-                       serviceUpdated = serviceCreated;\r
-               query.bindValue(":serviceCreated", serviceCreated.toString());\r
-               query.bindValue(":serviceUpdated", serviceCreated.toString());\r
-               query.bindValue(":published",tempNotebook.isPublished());\r
-               \r
-               if (isDirty)\r
-                       query.bindValue(":isDirty", true);\r
-               else\r
-                       query.bindValue(":isDirty", false);\r
-               query.bindValue(":autoEncrypt", false);\r
-               query.bindValue(":local", local);\r
-\r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Notebook Table insert failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError().toString());\r
-               }\r
-       }\r
-       // Delete the notebook based on a guid\r
-       public void expungeNotebook(String guid, boolean needsSync) {\r
-               boolean check;\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-\r
-               check = query.prepare("delete from Notebook "\r
-                               +"where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Notebook SQL delete prepare has failed.");\r
-                       logger.log(logger.EXTREME, query.lastError().toString());\r
-               }\r
-               query.bindValue(":guid", guid);\r
-               check = query.exec();\r
-               if (!check) \r
-                       logger.log(logger.MEDIUM, "Notebook delete failed.");\r
-               \r
-               // Signal the parent that work needs to be done\r
-               if  (needsSync) {\r
-                       RDeletedTable deletedTable = new RDeletedTable(logger, db);\r
-                       deletedTable.addDeletedItem(guid, "Notebook");\r
-               }\r
-       }\r
-       // Update a notebook\r
-       public void updateNotebook(Notebook tempNotebook, boolean isDirty) {\r
-               boolean check;\r
-               \r
-               SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
-               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update Notebook set sequence=:sequence, name=:name, defaultNotebook=:defaultNotebook, " +\r
-                               "serviceCreated=:serviceCreated, serviceUpdated=:serviceUpdated, "+\r
-                               "published=:published, isDirty=:isDirty where guid=:guid ");\r
-               query.bindValue(":sequence", tempNotebook.getUpdateSequenceNum());\r
-               query.bindValue(":name", tempNotebook.getName());\r
-               query.bindValue(":defaultNotebook", tempNotebook.isDefaultNotebook());\r
-\r
-               StringBuilder serviceCreated = new StringBuilder(simple.format(tempNotebook.getServiceCreated()));                      \r
-               StringBuilder serviceUpdated = new StringBuilder(simple.format(tempNotebook.getServiceUpdated()));                      \r
-               query.bindValue(":serviceCreated", serviceCreated.toString());\r
-               query.bindValue(":serviceUpdated", serviceUpdated.toString());\r
-               \r
-               query.bindValue(":published", tempNotebook.isPublished());\r
-               query.bindValue(":isDirty", isDirty);\r
-               query.bindValue(":guid", tempNotebook.getGuid());\r
-               \r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Notebook Table update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError().toString());\r
-               }\r
-       }\r
-       // Load notebooks from the database\r
-       public List<Notebook> getAll() {\r
-               Notebook tempNotebook;\r
-               List<Notebook> index = new ArrayList<Notebook>();\r
-               boolean check;\r
-                                       \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
-                               "serviceCreated, "+\r
-                               "serviceUpdated, "+\r
-                               "published, defaultNotebook from Notebook order by name");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
-               while (query.next()) {\r
-                       tempNotebook = new Notebook();\r
-                       tempNotebook.setGuid(query.valueString(0));\r
-                       int sequence = new Integer(query.valueString(1)).intValue();\r
-                       tempNotebook.setUpdateSequenceNum(sequence);\r
-                       tempNotebook.setName(query.valueString(2));\r
-                       DateFormat indfm = null;\r
-                       try {\r
-                               indfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");\r
-//                             indfm = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy");\r
-                       } catch (Exception e) { }\r
-                       try {\r
-                               tempNotebook.setServiceCreated(indfm.parse(query.valueString(4)).getTime());\r
-                               tempNotebook.setServiceUpdated(indfm.parse(query.valueString(5)).getTime());\r
-                       } catch (ParseException e) {\r
-                               e.printStackTrace();\r
-                       }\r
-                       tempNotebook.setPublished(new Boolean(query.valueString(6)));\r
-                       tempNotebook.setDefaultNotebook(new Boolean(query.valueString(7)));\r
-                       index.add(tempNotebook); \r
-               }       \r
-               return index;\r
-       }       \r
-       public List<Notebook> getAllLocal() {\r
-               Notebook tempNotebook;\r
-               List<Notebook> index = new ArrayList<Notebook>();\r
-               boolean check;\r
-\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
-                               "serviceCreated, serviceUpdated, published from Notebook where local=true order by name");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
-               while (query.next()) {\r
-                       tempNotebook = new Notebook();\r
-                       tempNotebook.setGuid(query.valueString(0));\r
-                       int sequence = new Integer(query.valueString(1)).intValue();\r
-                       tempNotebook.setUpdateSequenceNum(sequence);\r
-                       tempNotebook.setName(query.valueString(2));\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
-                       try {\r
-                               tempNotebook.setServiceCreated(indfm.parse(query.valueString(4)).getTime());\r
-                               tempNotebook.setServiceUpdated(indfm.parse(query.valueString(5)).getTime());\r
-                       } catch (ParseException e) {\r
-                               e.printStackTrace();\r
-                       }\r
-                       index.add(tempNotebook); \r
-               }       \r
-               return index;\r
-       }\r
-       // Archive or un-archive a notebook\r
-       public void setArchived(String guid, boolean val) {\r
-               boolean check;                  \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());                                   \r
-               check = query.prepare("Update notebook set archived=:archived where guid=:guid");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "Notebook SQL archive update has failed.");\r
-               query.bindValue(":guid", guid);\r
-               query.bindValue(":archived", val);\r
-               query.exec();\r
-       }\r
-       // Load non-archived notebooks from the database\r
-       public List<Notebook> getAllArchived() {\r
-               Notebook tempNotebook;\r
-               List<Notebook> index = new ArrayList<Notebook>();\r
-               boolean check;\r
-                                               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
-                               "serviceCreated, serviceUpdated, published from Notebook where archived=true order by name");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
-               while (query.next()) {\r
-                       tempNotebook = new Notebook();\r
-                       tempNotebook.setGuid(query.valueString(0));\r
-                       int sequence = new Integer(query.valueString(1)).intValue();\r
-                       tempNotebook.setUpdateSequenceNum(sequence);\r
-                       tempNotebook.setName(query.valueString(2));\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
-                       try {\r
-                               tempNotebook.setServiceCreated(indfm.parse(query.valueString(4)).getTime());\r
-                               tempNotebook.setServiceUpdated(indfm.parse(query.valueString(5)).getTime());\r
-                       } catch (ParseException e) {\r
-                               e.printStackTrace();\r
-                       }\r
-                       tempNotebook.setPublished(new Boolean(query.valueString(6)));\r
-                       index.add(tempNotebook); \r
-               }       \r
-               return index;\r
-       }       \r
-       // Check for a local/remote notebook\r
-       public boolean isNotebookLocal(String guid) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               query.prepare("Select local from Notebook where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               query.exec();\r
-               if (!query.next()) {\r
-                       return false;\r
-               }\r
-               boolean returnValue = false;\r
-               String returnVal = query.valueString(0);\r
-               if (returnVal.equals("false"))\r
-                       returnValue = false;\r
-               else\r
-                       returnValue = true;\r
-               return returnValue;\r
-       }\r
-       // Update a notebook sequence number\r
-       public void updateNotebookSequence(String guid, int sequence) {\r
-               boolean check;\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update Notebook set sequence=:sequence where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               query.bindValue(":sequence", sequence);\r
-               query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Notebook sequence update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               } \r
-       }\r
-       // Update a notebook GUID number\r
-       public void updateNotebookGuid(String oldGuid, String newGuid) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Update Notebook set guid=:newGuid where guid=:oldGuid");\r
-               query.bindValue(":oldGuid", oldGuid);\r
-               query.bindValue(":newGuid", newGuid);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Notebook guid update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               } \r
-               \r
-               // Update any notes containing the notebook guid\r
-               query.prepare("Update Note set notebookGuid=:newGuid where notebookGuid=:oldGuid");\r
-               query.bindValue(":oldGuid", oldGuid);\r
-               query.bindValue(":newGuid", newGuid);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Notebook guid update for note failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               } \r
-               \r
-               // Update any watch folders with the new guid\r
-               query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Update WatchFolders set notebook=:newGuid where notebook=:oldGuid");\r
-               query.bindValue(":oldGuid", oldGuid);\r
-               query.bindValue(":newGuid", newGuid);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Update WatchFolder notebook failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError().toString());\r
-               }               \r
-       }\r
-       // Get a list of notes that need to be updated\r
-       public List <Notebook> getDirty() {\r
-               Notebook tempNotebook;\r
-               List<Notebook> index = new ArrayList<Notebook>();\r
-               boolean check;\r
-                                               \r
-               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                       \r
-               check = query.exec("Select guid, sequence, name, defaultNotebook, " +\r
-                               "serviceCreated, serviceUpdated, published from Notebook where isDirty = true and local=false");\r
-               if (!check) \r
-                       logger.log(logger.EXTREME, "Notebook SQL retrieve has failed.");\r
-               while (query.next()) {\r
-                       tempNotebook = new Notebook();\r
-                       tempNotebook.setGuid(query.valueString(0));\r
-                       int sequence = new Integer(query.valueString(1)).intValue();\r
-                       tempNotebook.setUpdateSequenceNum(sequence);\r
-                       tempNotebook.setName(query.valueString(2));\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
-                       try {\r
-                               tempNotebook.setServiceCreated(indfm.parse(query.valueString(4)).getTime());\r
-                               tempNotebook.setServiceUpdated(indfm.parse(query.valueString(5)).getTime());\r
-                       } catch (ParseException e) {\r
-                               e.printStackTrace();\r
-                       }\r
-                       tempNotebook.setPublished(new Boolean(query.valueString(6)));\r
-                       index.add(tempNotebook); \r
-               }       \r
-               return index;   \r
-       }\r
-       // This is a convience method to check if a tag exists & update/create based upon it\r
-       public void syncNotebook(Notebook notebook, boolean isDirty) {\r
-               if (!exists(notebook.getGuid())) {\r
-                       addNotebook(notebook, isDirty, isDirty);\r
-                       return;\r
-               }\r
-               updateNotebook(notebook, isDirty);\r
-       }\r
-       // does a record exist?\r
-       private boolean exists(String guid) {\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               query.prepare("Select guid from notebook where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "notebook SQL retrieve has failed.");\r
-               boolean retval = query.next();\r
-               return retval;\r
-       }\r
-       // Reset the dirty flag.  Typically done after a sync.\r
-       public void  resetDirtyFlag(String guid) {\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               query.prepare("Update notebook set isdirty='false' where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error resetting notebook dirty field.");\r
-       }\r
-       \r
-       \r
-       \r
-\r
-       // does a record exist?\r
-       public String findNotebookByName(String newname) {\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               query.prepare("Select guid from notebook where name=:newname");\r
-               query.bindValue(":newname", newname);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "notebook SQL retrieve has failed.");\r
-               String val = null;\r
-               if (query.next())\r
-                       val = query.valueString(0);\r
-               return val;\r
-       }\r
-       // Get a note tag counts\r
-       public List<Pair<String,Integer>> getNotebookCounts() {\r
-               List<Pair<String,Integer>> counts = new ArrayList<Pair<String,Integer>>();              \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               if (!query.exec("select notebookGuid, count(guid) from note where active=1 group by notebookguid;")) {\r
-                       logger.log(logger.EXTREME, "NoteTags SQL getTagCounts has failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               while (query.next()) {\r
-                       Pair<String,Integer> newCount = new Pair<String,Integer>();\r
-                       newCount.setFirst(query.valueString(0));\r
-                       newCount.setSecond(query.valueInteger(1));\r
-                       counts.add(newCount);\r
-               }       \r
-               return counts;\r
-       }\r
-\r
-}\r
-\r
diff --git a/src/cx/fbn/nevernote/sql/runners/RSavedSearchTable.java b/src/cx/fbn/nevernote/sql/runners/RSavedSearchTable.java
deleted file mode 100644 (file)
index 5e20bd2..0000000
+++ /dev/null
@@ -1,284 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.runners;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.evernote.edam.type.QueryFormat;\r
-import com.evernote.edam.type.SavedSearch;\r
-\r
-import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-\r
-public class RSavedSearchTable {\r
-       private final ApplicationLogger                 logger;\r
-       private final RDatabaseConnection               db;\r
-\r
-       \r
-       // Constructor\r
-       public RSavedSearchTable(ApplicationLogger l, RDatabaseConnection d) {\r
-               logger = l;\r
-               db = d;\r
-       }\r
-       // Create the table\r
-       public void createTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-        logger.log(logger.HIGH, "Creating table SavedSearch...");\r
-        if (!query.exec("Create table SavedSearch (guid varchar primary key, " +\r
-                       "name varchar, query varchar, format integer, sequence integer, isDirty boolean)"))\r
-               logger.log(logger.HIGH, "Table SavedSearch creation FAILED!!!"); \r
-       }\r
-       // Drop the table\r
-       public void dropTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Drop table SavedSearch");\r
-       }\r
-       // get all tags\r
-       public List<SavedSearch> getAll() {\r
-               SavedSearch tempSearch;\r
-               List<SavedSearch> index = new ArrayList<SavedSearch>();\r
-               boolean check;\r
-                                               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                               \r
-               check = query.exec("Select guid, name, query, format, sequence"\r
-                               +" from SavedSearch");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "SavedSearch SQL retrieve has failed in getAll().");\r
-               while (query.next()) {\r
-                       tempSearch = new SavedSearch();\r
-                       tempSearch.setGuid(query.valueString(0));\r
-                       tempSearch.setName(query.valueString(1));\r
-                       tempSearch.setQuery(query.valueString(2));\r
-                       int fmt = new Integer(query.valueString(3));\r
-                       if (fmt == 1)\r
-                               tempSearch.setFormat(QueryFormat.USER);\r
-                       else\r
-                               tempSearch.setFormat(QueryFormat.SEXP);\r
-                       int sequence = new Integer(query.valueString(4)).intValue();\r
-                       tempSearch.setUpdateSequenceNum(sequence);\r
-                       index.add(tempSearch); \r
-               }       \r
-               return index;\r
-       }\r
-       public SavedSearch getSavedSearch(String guid) {\r
-               SavedSearch tempSearch = null;\r
-               boolean check;\r
-                       \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                               \r
-               check = query.prepare("Select guid, name, query, format, sequence"\r
-                               +" from SavedSearch where guid=:guid");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "SavedSearch SQL prepare has failed in getSavedSearch.");\r
-               query.bindValue(":guid", guid);\r
-               query.exec();\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "SavedSearch SQL retrieve has failed in getSavedSearch.");\r
-               if (query.next()) {\r
-                       tempSearch = new SavedSearch();\r
-                       tempSearch.setGuid(query.valueString(0));\r
-                       tempSearch.setName(query.valueString(1));\r
-                       tempSearch.setQuery(query.valueString(2));\r
-                       int fmt = new Integer(query.valueString(3));\r
-                       if (fmt == 1)\r
-                               tempSearch.setFormat(QueryFormat.USER);\r
-                       else\r
-                               tempSearch.setFormat(QueryFormat.SEXP);\r
-                       int sequence = new Integer(query.valueString(4)).intValue();\r
-                       tempSearch.setUpdateSequenceNum(sequence);\r
-               }\r
-               return tempSearch;\r
-       }\r
-       // Update a tag\r
-       public void updateSavedSearch(SavedSearch search, boolean isDirty) {\r
-               boolean check;\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update SavedSearch set sequence=:sequence, "+\r
-                       "name=:name, isDirty=:isDirty, query=:query, format=:format "\r
-                       +"where guid=:guid");\r
-       \r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "SavedSearch SQL update prepare has failed.");\r
-                       logger.log(logger.EXTREME, query.lastError().toString());\r
-               }\r
-               query.bindValue(":sequence", search.getUpdateSequenceNum());\r
-               query.bindValue(":name", search.getName());\r
-               query.bindValue(":isDirty", isDirty);\r
-               query.bindValue(":query", search.getQuery());\r
-               if (search.getFormat() == QueryFormat.USER)\r
-                       query.bindValue(":format", 1);\r
-               else\r
-                       query.bindValue(":format", 2);\r
-               \r
-               query.bindValue(":guid", search.getGuid());\r
-               \r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Tag Table update failed.");\r
-                       logger.log(logger.EXTREME, query.lastError().toString());\r
-               }\r
-       }\r
-       // Delete a tag\r
-       public void expungeSavedSearch(String guid, boolean needsSync) {\r
-               boolean check;\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-\r
-               check = query.prepare("delete from SavedSearch "\r
-                               +"where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "SavedSearch SQL delete prepare has failed.");\r
-                       logger.log(logger.EXTREME, query.lastError().toString());\r
-               }\r
-               query.bindValue(":guid", guid);\r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Saved Search delete failed.");\r
-                       logger.log(logger.EXTREME, query.lastError().toString());\r
-               }\r
-\r
-               // Add the work to the parent queue\r
-               if (needsSync) {\r
-                       RDeletedTable del = new RDeletedTable(logger, db);\r
-                       del.addDeletedItem(guid, "SavedSearch");\r
-               }\r
-       }\r
-       // Save a tag\r
-       public void addSavedSearch(SavedSearch search, boolean isDirty) {\r
-               boolean check;\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Insert Into SavedSearch (guid, query, sequence, format, name, isDirty)"\r
-                               +" Values(:guid, :query, :sequence, :format, :name, :isDirty)");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Search SQL insert prepare has failed.");\r
-                       logger.log(logger.EXTREME, query.lastError().toString());\r
-               }\r
-               query.bindValue(":guid", search.getGuid());\r
-               query.bindValue(":query", search.getQuery());\r
-               query.bindValue(":sequence", search.getUpdateSequenceNum());\r
-               if (search.getFormat() == QueryFormat.USER)\r
-                       query.bindValue(":format", 1);\r
-               else\r
-                       query.bindValue(":format", 2);\r
-               query.bindValue(":name", search.getName());\r
-               query.bindValue(":isDirty", isDirty);\r
-       \r
-               check = query.exec();\r
-               if  (!check) {\r
-                       logger.log(logger.MEDIUM, "Search Table insert failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError().toString());\r
-               }\r
-       }\r
-       // Update a tag sequence number\r
-       public void updateSavedSearchSequence(String guid, int sequence) {\r
-               boolean check;\r
-               ;\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update SavedSearch set sequence=:sequence where guid=:guid");\r
-               query.bindValue(":sequence", sequence);\r
-               query.bindValue(":guid", guid);\r
-               query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "SavedSearch sequence update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Update a tag sequence number\r
-       public void updateSavedSearchGuid(String oldGuid, String newGuid) {\r
-               boolean check;\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update SavedSearch set guid=:newGuid where guid=:oldGuid");\r
-               query.bindValue(":newGuid", newGuid);\r
-               query.bindValue(":oldGuid", oldGuid);\r
-               query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "SavedSearch guid update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Get dirty tags\r
-       public List<SavedSearch> getDirty() {\r
-               SavedSearch search;\r
-               List<SavedSearch> index = new ArrayList<SavedSearch>();\r
-               boolean check;\r
-                                               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                               \r
-               check = query.exec("Select guid, query, sequence, name, format"\r
-                               +" from SavedSearch where isDirty = true");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "SavedSearch getDirty prepare has failed.");\r
-               while (query.next()) {\r
-                       search = new SavedSearch();\r
-                       search.setGuid(query.valueString(0));\r
-                       search.setQuery(query.valueString(1));\r
-                       int sequence = new Integer(query.valueString(2)).intValue();\r
-                       search.setUpdateSequenceNum(sequence);\r
-                       search.setName(query.valueString(3));\r
-                       int fmt = new Integer(query.valueString(4)).intValue();\r
-                       if (fmt == 1)\r
-                               search.setFormat(QueryFormat.USER);\r
-                       else\r
-                               search.setFormat(QueryFormat.SEXP);\r
-                       index.add(search); \r
-               }       \r
-               return index;\r
-       }\r
-       // Find a guid based upon the name\r
-       public String findSavedSearchByName(String name) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               query.prepare("Select guid from SavedSearch where name=:name");\r
-               query.bindValue(":name", name);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "SavedSearch SQL retrieve has failed in findSavedSearchByName().");\r
-               String val = null;\r
-               if (query.next())\r
-                       val = query.valueString(0);\r
-               return val;\r
-       }\r
-       // given a guid, does the tag exist\r
-       public boolean exists(String guid) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Select guid from SavedSearch where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "SavedSearch SQL retrieve has failed in exists().");\r
-               boolean retval = query.next();\r
-               return retval;\r
-       }\r
-       // This is a convience method to check if a tag exists & update/create based upon it\r
-       public void syncSavedSearch(SavedSearch search, boolean isDirty) {\r
-               if (exists(search.getGuid()))\r
-                       updateSavedSearch(search, isDirty);\r
-               else\r
-                       addSavedSearch(search, isDirty);\r
-       }\r
-       public void  resetDirtyFlag(String guid) {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               query.prepare("Update SavedSearch set isdirty=false where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error resetting SavedSearch dirty field in resetDirtyFlag().");\r
-       }\r
-}\r
diff --git a/src/cx/fbn/nevernote/sql/runners/RSyncTable.java b/src/cx/fbn/nevernote/sql/runners/RSyncTable.java
deleted file mode 100644 (file)
index 184dde2..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.runners;\r
-\r
-import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-import cx.fbn.nevernote.utilities.ListManager;\r
-\r
-public class RSyncTable {\r
-       ListManager parent;\r
-       private final ApplicationLogger                 logger;\r
-       private final RDatabaseConnection               db;\r
-\r
-       \r
-       // Constructor\r
-       public RSyncTable(ApplicationLogger l, RDatabaseConnection d) {\r
-               logger = l;\r
-               db = d;\r
-       }\r
-       // Create the table\r
-       public void createTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               logger.log(logger.HIGH, "Creating table Sync...");\r
-        if (!query.exec("Create table Sync (key varchar primary key, value varchar);"))\r
-               logger.log(logger.HIGH, "Table Sync creation FAILED!!!"); \r
-        addRecord("LastSequenceDate","0");\r
-        addRecord("UpdateSequenceNumber", "0");\r
-       }\r
-       // Drop the table\r
-       public void dropTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Drop table Sync");\r
-       }\r
-       // Add an item to the table\r
-       public void addRecord(String key, String value) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Insert Into Sync (key,  value) values (:key, :value);");\r
-               query.bindValue(":key", key);\r
-               query.bindValue(":value", value);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Add to into Sync failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Set a key field\r
-       public String getRecord(String key) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-        query.prepare("Select value from Sync where key=:key");\r
-        query.bindValue(":key", key);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "getRecord from sync failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-                       return null;\r
-               }\r
-               if (query.next()) {\r
-                       return (query.valueString(0));\r
-               }\r
-               return null;\r
-       }\r
-       // Set a key field\r
-       public void setRecord(String key, String value) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-        query.prepare("Update Sync set value=:value where key=:key");\r
-        query.bindValue(":key", key);\r
-        query.bindValue(":value", value);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "setRecord from sync failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               return;\r
-       }\r
-\r
-       \r
-\r
-\r
-}\r
diff --git a/src/cx/fbn/nevernote/sql/runners/RTagTable.java b/src/cx/fbn/nevernote/sql/runners/RTagTable.java
deleted file mode 100644 (file)
index 5824cf6..0000000
+++ /dev/null
@@ -1,338 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.runners;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import com.evernote.edam.type.Tag;\r
-\r
-import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-\r
-public class RTagTable {\r
-       private final ApplicationLogger logger;\r
-       RDatabaseConnection db;\r
-\r
-       public RTagTable (ApplicationLogger l, RDatabaseConnection d) {\r
-               logger = l;\r
-               db = d;\r
-       }\r
-       // Create the table\r
-       public void createTable() {\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-        logger.log(logger.HIGH, "Creating table Tag...");\r
-        if (!query.exec("Create table Tag (guid varchar primary key, " +\r
-                       "parentGuid varchar, sequence integer, hashCode integer, name varchar, isDirty boolean)"))\r
-               logger.log(logger.HIGH, "Table TAG creation FAILED!!!");  \r
-               \r
-       }\r
-       // Drop the table\r
-       public void dropTable() {\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Drop table Tag");\r
-               \r
-       }\r
-       // get all tags\r
-       public List<Tag> getAll() {\r
-               \r
-               Tag tempTag;\r
-               List<Tag> index = new ArrayList<Tag>();\r
-               boolean check;\r
-                                               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                               \r
-               check = query.exec("Select guid, parentGuid, sequence, name"\r
-                               +" from Tag");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Tag SQL retrieve has failed.");\r
-                       logger.log(logger.EXTREME, query.lastError());\r
-               }\r
-               while (query.next()) {\r
-                       tempTag = new Tag();\r
-                       tempTag.setGuid(query.valueString(0));\r
-                       if (query.valueString(1) != null)\r
-                               tempTag.setParentGuid(query.valueString(1));\r
-                       else\r
-                               tempTag.setParentGuid(null);\r
-                       int sequence = new Integer(query.valueString(2)).intValue();\r
-                       tempTag.setUpdateSequenceNum(sequence);\r
-                       tempTag.setName(query.valueString(3));\r
-                       index.add(tempTag); \r
-               }       \r
-               \r
-               return index;\r
-       }\r
-       public Tag getTag(String guid) {\r
-               Tag tempTag = new Tag();                \r
-               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                                       \r
-               if (!query.prepare("Select guid, parentGuid, sequence, name"\r
-                               +" from Tag where guid=:guid"))\r
-                       logger.log(logger.EXTREME, "Tag select by guid SQL prepare has failed.");\r
-\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Tag select by guid SQL exec has failed.");\r
-               \r
-               if (!query.next())  {\r
-                       return tempTag;\r
-               }\r
-               tempTag.setGuid(query.valueString(0));\r
-               tempTag.setParentGuid(query.valueString(1));\r
-               int sequence = new Integer(query.valueString(2)).intValue();\r
-               tempTag.setUpdateSequenceNum(sequence);\r
-               tempTag.setName(query.valueString(3));\r
-               return tempTag;\r
-       }\r
-       // Update a tag\r
-       public void updateTag(Tag tempTag, boolean isDirty) {\r
-               boolean check;\r
-               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update Tag set parentGuid=:parentGuid, sequence=:sequence, "+\r
-                       "hashCode=:hashCode, name=:name, isDirty=:isDirty "\r
-                       +"where guid=:guid");\r
-      \r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Tag SQL update prepare has failed.");\r
-                       logger.log(logger.EXTREME, query.lastError());\r
-               }\r
-               query.bindValue(":parentGuid", tempTag.getParentGuid());\r
-               query.bindValue(":sequence", tempTag.getUpdateSequenceNum());\r
-               query.bindValue(":hashCode", tempTag.hashCode());\r
-               query.bindValue(":name", tempTag.getName());\r
-               query.bindValue(":isDirty", isDirty);\r
-               query.bindValue(":guid", tempTag.getGuid());\r
-               \r
-               check = query.exec();\r
-               if (!check)\r
-                       logger.log(logger.MEDIUM, "Tag Table update failed.");\r
-               \r
-       }\r
-       // Delete a tag\r
-       public void expungeTag(String guid, boolean needsSync) {\r
-               boolean check;\r
-               \r
-               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-\r
-               check = query.prepare("delete from Tag "\r
-                               +"where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Tag SQL delete prepare has failed.");\r
-                       logger.log(logger.EXTREME, query.lastError());\r
-               }\r
-               query.bindValue(":guid", guid);\r
-               check = query.exec();\r
-               if (!check)\r
-                       logger.log(logger.MEDIUM, "Tag delete failed.");\r
-               \r
-               check = query.prepare("delete from NoteTags "\r
-                               +"where tagGuid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "NoteTags SQL delete prepare has failed.");\r
-                       logger.log(logger.EXTREME, query.lastError());\r
-               }\r
-               \r
-               query.bindValue(":guid", guid);\r
-               check = query.exec();\r
-               if (!check)\r
-                       logger.log(logger.MEDIUM, "NoteTags delete failed.");\r
-               \r
-               // Add the work to the parent queue\r
-               if (needsSync) {\r
-                       RDeletedTable del = new RDeletedTable(logger, db);\r
-                       del.addDeletedItem(guid, "Tag");\r
-               }\r
-       }\r
-       // Save a tag\r
-       public void addTag(Tag tempTag, boolean isDirty) {\r
-               boolean check;\r
-               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Insert Into Tag (guid, parentGuid, sequence, hashCode, name, isDirty)"\r
-                               +" Values(:guid, :parentGuid, :sequence, :hashCode, :name, :isDirty)");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Tag SQL insert prepare has failed.");\r
-                       logger.log(logger.EXTREME, query.lastError());\r
-               }\r
-               query.bindValue(":guid", tempTag.getGuid());\r
-               query.bindValue(":parentGuid", tempTag.getParentGuid());\r
-               query.bindValue(":sequence", tempTag.getUpdateSequenceNum());\r
-               query.bindValue(":hashCode", tempTag.hashCode());\r
-               query.bindValue(":name", tempTag.getName());\r
-               query.bindValue(":isDirty", isDirty);\r
-               \r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Tag Table insert failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       // Update a tag's parent\r
-       public void updateTagParent(String guid, String parentGuid) {\r
-               boolean check;\r
-               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update Tag set parentGuid=:parentGuid where guid=:guid");\r
-               if (!check) {\r
-                       logger.log(logger.EXTREME, "Tag SQL tag parent update prepare has failed.");\r
-                       logger.log(logger.EXTREME, query.lastError());\r
-               }\r
-\r
-               query.bindValue(":parentGuid", parentGuid);\r
-               query.bindValue(":guid", guid);\r
-               \r
-               check = query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Tag parent update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       //Save tags from Evernote\r
-       public void saveTags(List<Tag> tags) {\r
-               Tag tempTag;\r
-               for (int i=0; i<tags.size(); i++) {\r
-                       tempTag = tags.get(i);\r
-                       addTag(tempTag, false);\r
-               }               \r
-       }\r
-       // Update a tag sequence number\r
-       public void updateTagSequence(String guid, int sequence) {\r
-               boolean check;\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update Tag set sequence=:sequence where guid=:guid");\r
-               query.bindValue(":sequence", sequence);\r
-               query.bindValue(":guid", guid);\r
-               \r
-               query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Tag sequence update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               \r
-       }\r
-       // Update a tag sequence number\r
-       public void updateTagGuid(String oldGuid, String newGuid) {\r
-               boolean check;\r
-               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               check = query.prepare("Update Tag set guid=:newGuid where guid=:oldGuid");\r
-               query.bindValue(":newGuid", newGuid);\r
-               query.bindValue(":oldGuid", oldGuid);\r
-               query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Tag guid update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               \r
-               check = query.prepare("Update Tag set parentGuid=:newGuid where parentGuid=:oldGuid");\r
-               query.bindValue(":newGuid", newGuid);\r
-               query.bindValue(":oldGuid", oldGuid);\r
-               query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Tag guid update failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               \r
-               check = query.prepare("Update NoteTags set tagGuid=:newGuid where tagGuid=:oldGuid");\r
-               query.bindValue(":newGuid", newGuid);\r
-               query.bindValue(":oldGuid", oldGuid);\r
-               query.exec();\r
-               if (!check) {\r
-                       logger.log(logger.MEDIUM, "Tag guid update failed for NoteTags.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-               \r
-       }\r
-       // Get dirty tags\r
-       public List<Tag> getDirty() {\r
-               Tag tempTag;\r
-               List<Tag> index = new ArrayList<Tag>();\r
-               boolean check;\r
-                                               \r
-               \r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-                                               \r
-               check = query.exec("Select guid, parentGuid, sequence, name"\r
-                               +" from Tag where isDirty = true");\r
-               if (!check)\r
-                       logger.log(logger.EXTREME, "Tag SQL retrieve has failed.");\r
-               while (query.next()) {\r
-                       tempTag = new Tag();\r
-                       tempTag.setGuid(query.valueString(0));\r
-                       tempTag.setParentGuid(query.valueString(1));\r
-                       int sequence = new Integer(query.valueString(2)).intValue();\r
-                       tempTag.setUpdateSequenceNum(sequence);\r
-                       tempTag.setName(query.valueString(3));\r
-                       if (tempTag.getParentGuid() != null && tempTag.getParentGuid().equals(""))\r
-                               tempTag.setParentGuid(null);\r
-                       index.add(tempTag); \r
-               }\r
-               return index;\r
-       }\r
-       // Find a guid based upon the name\r
-       public String findTagByName(String name) {\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               query.prepare("Select guid from tag where name=:name");\r
-               query.bindValue(":name", name);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Tag SQL retrieve has failed.");\r
-               String val = null;\r
-               if (query.next())\r
-                       val = query.valueString(0);\r
-               return val;\r
-       }\r
-       // given a guid, does the tag exist\r
-       public boolean exists(String guid) {\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               query.prepare("Select guid from tag where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Tag SQL retrieve has failed.");\r
-               boolean retval = query.next();\r
-               return retval;\r
-       }\r
-       // This is a convience method to check if a tag exists & update/create based upon it\r
-       public void syncTag(Tag tag, boolean isDirty) {\r
-               if (exists(tag.getGuid()))\r
-                       updateTag(tag, isDirty);\r
-               else\r
-                       addTag(tag, isDirty);\r
-       }\r
-       public void  resetDirtyFlag(String guid) {\r
-               \r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               \r
-               query.prepare("Update tag set isdirty=false where guid=:guid");\r
-               query.bindValue(":guid", guid);\r
-               if (!query.exec())\r
-                       logger.log(logger.EXTREME, "Error resetting tag dirty field.");\r
-       }\r
-}\r
diff --git a/src/cx/fbn/nevernote/sql/runners/RWatchFolderTable.java b/src/cx/fbn/nevernote/sql/runners/RWatchFolderTable.java
deleted file mode 100644 (file)
index 7eb169c..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.runners;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-import cx.fbn.nevernote.utilities.ListManager;\r
-\r
-public class RWatchFolderTable {\r
-       ListManager parent;\r
-       private final ApplicationLogger                 logger;\r
-       private final RDatabaseConnection               db;\r
-\r
-       \r
-       // Constructor\r
-       public RWatchFolderTable(ApplicationLogger l, RDatabaseConnection d) {\r
-               logger = l;\r
-               db = d;\r
-       }\r
-       // Create the table\r
-       public void createTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               logger.log(logger.HIGH, "Creating table WatchFolder...");\r
-        if (!query.exec("Create table WatchFolders (folder varchar primary key, notebook varchar," +\r
-                       "keep boolean, depth integer)"));\r
-               logger.log(logger.HIGH, "Table WatchFolders creation FAILED!!!"); \r
-       }\r
-       // Drop the table\r
-       public void dropTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Drop table WatchFolders");\r
-       }\r
-       // Add an folder\r
-       public void addWatchFolder(String folder, String notebook, boolean keep, int depth) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Insert Into WatchFolders (folder, notebook, keep, depth) " +\r
-                               "values (:folder, :notebook, :keep, :depth)");\r
-               query.bindValue(":folder", folder);\r
-               query.bindValue(":notebook", notebook);\r
-               query.bindValue(":keep", keep);\r
-               query.bindValue(":depth", depth);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Insert into WatchFolder failed.");\r
-               }\r
-       }\r
-       // remove an folder\r
-       public void expungeWatchFolder(String folder) {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("delete from WatchFolders where folder=:folder");\r
-               query.bindValue(":folder", folder);\r
-               if (!query.exec()) {\r
-                       logger.log(logger.MEDIUM, "Expunge WatchFolder failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       public void expungeAll() {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               if (!query.exec("delete from WatchFolders")) {\r
-                       logger.log(logger.MEDIUM, "Expunge all WatchFolder failed.");\r
-                       logger.log(logger.MEDIUM, query.lastError());\r
-               }\r
-       }\r
-       public List<WatchFolderRecord> getAll() {\r
-               logger.log(logger.HIGH, "Entering RWatchFolders.getAll");\r
-               \r
-               List<WatchFolderRecord> list = new ArrayList<WatchFolderRecord>();\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("Select folder, (select name from notebook where guid = notebook), keep, depth from WatchFolders");\r
-               while (query.next()) {\r
-                       WatchFolderRecord record = new WatchFolderRecord();\r
-                       record.folder = query.valueString(0);\r
-                       record.notebook = query.valueString(1);\r
-                       record.keep = new Boolean(query.valueString(2));\r
-                       record.depth = new Integer(query.valueString(3));\r
-                       list.add(record);\r
-               }\r
-               logger.log(logger.HIGH, "Leaving RWatchFolders.getAll");\r
-               return list;\r
-\r
-       }\r
-       \r
-       public String getNotebook(String dir) {\r
-               logger.log(logger.HIGH, "Entering RWatchFolders.getNotebook");\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.prepare("Select notebook from WatchFolders where folder=:dir");\r
-               query.bindValue(":dir", dir);\r
-               query.exec();\r
-               String response = null;\r
-               while (query.next()) {\r
-                       response = query.valueString(0);\r
-               }\r
-               logger.log(logger.HIGH, "Leaving RWatchFolders.getNotebook");\r
-               return response;\r
-\r
-       }\r
-}\r
diff --git a/src/cx/fbn/nevernote/sql/runners/RWordsTable.java b/src/cx/fbn/nevernote/sql/runners/RWordsTable.java
deleted file mode 100644 (file)
index 1608956..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-\r
-package cx.fbn.nevernote.sql.runners;\r
-\r
-import cx.fbn.nevernote.sql.driver.NSqlQuery;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-\r
-public class RWordsTable {\r
-       private final ApplicationLogger                 logger;\r
-       private final RDatabaseConnection               db;\r
-\r
-       \r
-       // Constructor\r
-       public RWordsTable(ApplicationLogger l, RDatabaseConnection d) {\r
-               logger = l;\r
-               db = d;\r
-       }\r
-       // Create the table\r
-       public void createTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-        logger.log(logger.HIGH, "Creating table WORDS ...");\r
-        if (!query.exec("create table words (word varchar, guid varchar, source varchar, weight int, primary key (word, guid, source));")) {\r
-               logger.log(logger.HIGH, "Table WORDS creation FAILED!!!");   \r
-               logger.log(logger.HIGH, query.lastError());\r
-        }   \r
-       }\r
-       // Drop the table\r
-       public void dropTable() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("drop table words");\r
-       }\r
-       // Count unindexed notes\r
-       public int getWordCount() {\r
-        NSqlQuery query = new NSqlQuery(db.getConnection());\r
-               query.exec("select count(*) from words");\r
-               query.next(); \r
-               int returnValue = new Integer(query.valueString(0));\r
-               return returnValue;\r
-       }\r
-\r
-       // Clear out the word index table\r
-       public void clearWordIndex() {\r
-               NSqlQuery query = new NSqlQuery(db.getConnection());\r
-        logger.log(logger.HIGH, "DELETE FROM WORDS");\r
-        \r
-        boolean check = query.exec("DELETE FROM WORDS");\r
-        if (!check)\r
-               logger.log(logger.HIGH, "Table WORDS clear has FAILED!!!");  \r
-       }       \r
-\r
-       //********************************************************************************\r
-       //********************************************************************************\r
-       //* Support adding & deleting index words\r
-       //********************************************************************************\r
-       //********************************************************************************\r
-       public void expungeFromWordIndex(String guid, String type) {\r
-               NSqlQuery deleteWords = new NSqlQuery(db.getConnection());\r
-               if (!deleteWords.prepare("delete from words where guid=:guid and source=:source")) {\r
-                       logger.log(logger.EXTREME, "Note SQL select prepare deleteWords has failed.");\r
-                       logger.log(logger.MEDIUM, deleteWords.lastError());\r
-               }\r
-       \r
-               deleteWords.bindValue(":guid", guid);\r
-               deleteWords.bindValue(":source", type);\r
-               deleteWords.exec();\r
-\r
-       }\r
-       // Reindex a note\r
-       public synchronized void addWordToNoteIndex(String guid, String word, String type, Integer weight) {\r
-               NSqlQuery findWords = new NSqlQuery(db.getConnection());\r
-               if (!findWords.prepare("Select weight from words where guid=:guid and source=:type and word=:word")) {\r
-                       logger.log(logger.MEDIUM, "Prepare failed in addWordToNoteIndex()");\r
-                       logger.log(logger.MEDIUM, findWords.lastError());\r
-               }\r
-               \r
-               findWords.bindValue(":guid", guid);\r
-               findWords.bindValue(":type", type);\r
-               findWords.bindValue(":word", word);\r
-               \r
-               boolean addNeeded = true;\r
-               findWords.exec();\r
-               // If we have a match, find out which has the heigher weight & update accordingly\r
-               if (findWords.next()) {\r
-                       int recordWeight = new Integer(findWords.valueString(0));\r
-                       addNeeded = false;\r
-                       if (recordWeight < weight) {\r
-                               NSqlQuery updateWord = new NSqlQuery(db.getConnection());\r
-                               if (!updateWord.prepare("Update words set weight=:weight where guid=:guid and source=:type and word=:word")) {\r
-                                       logger.log(logger.MEDIUM, "Prepare failed for find words in addWordToNoteIndex()");\r
-                                       logger.log(logger.MEDIUM, findWords.lastError());                                       \r
-                               }\r
-                               \r
-                               updateWord.bindValue(":weight", weight);\r
-                               updateWord.bindValue(":guid", guid);\r
-                               updateWord.bindValue(":type", type);\r
-                               updateWord.bindValue(":word",word);\r
-                               updateWord.exec();\r
-                       }\r
-               }\r
-               \r
-               \r
-               if (!addNeeded)\r
-                       return;\r
-               \r
-               NSqlQuery insertWords = new NSqlQuery(db.getConnection());\r
-               if (!insertWords.prepare("Insert Into Words (word, guid, weight, source)"\r
-                               +" Values(:word, :guid, :weight, :type )")) {\r
-                       logger.log(logger.EXTREME, "Note SQL select prepare checkWords has failed.");\r
-                       logger.log(logger.MEDIUM, insertWords.lastError());\r
-               }\r
-               insertWords.bindValue(":word", word);\r
-               insertWords.bindValue(":guid", guid);\r
-               insertWords.bindValue(":weight", weight);\r
-               insertWords.bindValue(":type", type);\r
-               insertWords.exec();\r
-       }\r
-\r
-\r
-}\r
index 6ad627d..6e1b81c 100644 (file)
@@ -37,7 +37,6 @@ import cx.fbn.nevernote.signals.NotebookSignal;
 import cx.fbn.nevernote.signals.TagSignal;\r
 import cx.fbn.nevernote.signals.TrashSignal;\r
 import cx.fbn.nevernote.sql.DatabaseConnection;\r
 import cx.fbn.nevernote.signals.TagSignal;\r
 import cx.fbn.nevernote.signals.TrashSignal;\r
 import cx.fbn.nevernote.sql.DatabaseConnection;\r
-import cx.fbn.nevernote.sql.runners.NoteTagsRecord;\r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 import cx.fbn.nevernote.utilities.Pair;\r
 \r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 import cx.fbn.nevernote.utilities.Pair;\r
 \r
@@ -64,17 +63,21 @@ public class CounterRunner extends QObject implements Runnable {
        \r
        public boolean                                          ready = false;\r
        public boolean                                          abortCount = false;\r
        \r
        public boolean                                          ready = false;\r
        public boolean                                          abortCount = false;\r
+       private final DatabaseConnection                                        conn;\r
+\r
        private volatile LinkedBlockingQueue<Integer> readyQueue = new LinkedBlockingQueue<Integer>();\r
        \r
        \r
        //*********************************************\r
        //* Constructor                               *\r
        //*********************************************\r
        private volatile LinkedBlockingQueue<Integer> readyQueue = new LinkedBlockingQueue<Integer>();\r
        \r
        \r
        //*********************************************\r
        //* Constructor                               *\r
        //*********************************************\r
-       public CounterRunner(String logname, int t) {\r
+       public CounterRunner(String logname, int t, String u, String uid, String pswd, String cpswd) {\r
                type = t;\r
                type = t;\r
+\r
                threadLock = new QMutex();\r
                logger = new ApplicationLogger(logname);\r
 //             setAutoDelete(false);   \r
                threadLock = new QMutex();\r
                logger = new ApplicationLogger(logname);\r
 //             setAutoDelete(false);   \r
+               conn = new DatabaseConnection(logger, u, uid, pswd, cpswd);\r
                keepRunning = true;\r
                notebookSignal = new NotebookSignal();\r
                tagSignal = new TagSignal();\r
                keepRunning = true;\r
                notebookSignal = new NotebookSignal();\r
                tagSignal = new TagSignal();\r
@@ -116,6 +119,7 @@ public class CounterRunner extends QObject implements Runnable {
                                threadLock.unlock();\r
                        } catch (InterruptedException e) {}\r
                }\r
                                threadLock.unlock();\r
                        } catch (InterruptedException e) {}\r
                }\r
+               conn.dbShutdown();\r
        }\r
        \r
        \r
        }\r
        \r
        \r
@@ -166,7 +170,6 @@ public class CounterRunner extends QObject implements Runnable {
                logger.log(logger.EXTREME, "Entering ListManager.countNotebookResults");                \r
                if (abortCount)\r
                        return;\r
                logger.log(logger.EXTREME, "Entering ListManager.countNotebookResults");                \r
                if (abortCount)\r
                        return;\r
-               DatabaseConnection conn = new DatabaseConnection(Global.tagCounterThreadId);\r
                List<NotebookCounter> nCounter = new ArrayList<NotebookCounter>();\r
                if (abortCount)\r
                        return;\r
                List<NotebookCounter> nCounter = new ArrayList<NotebookCounter>();\r
                if (abortCount)\r
                        return;\r
@@ -245,7 +248,6 @@ public class CounterRunner extends QObject implements Runnable {
        \r
        private void countTagResults() {\r
                logger.log(logger.EXTREME, "Entering ListManager.countTagResults");             \r
        \r
        private void countTagResults() {\r
                logger.log(logger.EXTREME, "Entering ListManager.countTagResults");             \r
-               DatabaseConnection conn = new DatabaseConnection(Global.tagCounterThreadId);\r
                List<TagCounter> counter = new ArrayList<TagCounter>();\r
                List<Tag> allTags = conn.getTagTable().getAll();\r
                \r
                List<TagCounter> counter = new ArrayList<TagCounter>();\r
                List<Tag> allTags = conn.getTagTable().getAll();\r
                \r
@@ -287,7 +289,7 @@ public class CounterRunner extends QObject implements Runnable {
                \r
                if (abortCount)\r
                        return;\r
                \r
                if (abortCount)\r
                        return;\r
-               List<NoteTagsRecord> tags = conn.getNoteTable().noteTagsTable.getAllNoteTags();\r
+               List<cx.fbn.nevernote.sql.NoteTagsRecord> tags = conn.getNoteTable().noteTagsTable.getAllNoteTags();\r
                for (int i=noteIndex.size()-1; i>=0; i--) {\r
                        if (abortCount)\r
                                return;\r
                for (int i=noteIndex.size()-1; i>=0; i--) {\r
                        if (abortCount)\r
                                return;\r
@@ -315,7 +317,6 @@ public class CounterRunner extends QObject implements Runnable {
        \r
        private void countTrashResults() {\r
                logger.log(logger.EXTREME, "Entering CounterRunner.countTrashResults()");               \r
        \r
        private void countTrashResults() {\r
                logger.log(logger.EXTREME, "Entering CounterRunner.countTrashResults()");               \r
-               DatabaseConnection conn = new DatabaseConnection(Global.trashCounterThreadId);\r
                if (abortCount)\r
                        return;\r
 \r
                if (abortCount)\r
                        return;\r
 \r
diff --git a/src/cx/fbn/nevernote/threads/DBRunner.java b/src/cx/fbn/nevernote/threads/DBRunner.java
deleted file mode 100644 (file)
index 58b3df1..0000000
+++ /dev/null
@@ -1,936 +0,0 @@
-/*\r
- * This file is part of NeverNote \r
- * Copyright 2009 Randy Baumgarte\r
- * \r
- * This file may be licensed under the terms of of the\r
- * GNU General Public License Version 2 (the ``GPL'').\r
- *\r
- * Software distributed under the License is distributed\r
- * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either\r
- * express or implied. See the GPL for the specific language\r
- * governing rights and limitations.\r
- *\r
- * You should have received a copy of the GPL along with this\r
- * program. If not, go to http://www.gnu.org/licenses/gpl.html\r
- * or write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\r
- *\r
-*/\r
-\r
-package cx.fbn.nevernote.threads;\r
-\r
-import java.util.Vector;\r
-import java.util.concurrent.LinkedBlockingQueue;\r
-\r
-import com.trolltech.qt.core.QObject;\r
-\r
-import cx.fbn.nevernote.Global;\r
-import cx.fbn.nevernote.config.InitializationException;\r
-import cx.fbn.nevernote.signals.DBRunnerSignal;\r
-import cx.fbn.nevernote.sql.requests.DBRunnerRequest;\r
-import cx.fbn.nevernote.sql.requests.DatabaseRequest;\r
-import cx.fbn.nevernote.sql.requests.DeletedItemRequest;\r
-import cx.fbn.nevernote.sql.requests.EnSearchRequest;\r
-import cx.fbn.nevernote.sql.requests.InvalidXMLRequest;\r
-import cx.fbn.nevernote.sql.requests.NoteRequest;\r
-import cx.fbn.nevernote.sql.requests.NoteTagsRequest;\r
-import cx.fbn.nevernote.sql.requests.NotebookRequest;\r
-import cx.fbn.nevernote.sql.requests.ResourceRequest;\r
-import cx.fbn.nevernote.sql.requests.SavedSearchRequest;\r
-import cx.fbn.nevernote.sql.requests.SyncRequest;\r
-import cx.fbn.nevernote.sql.requests.TagRequest;\r
-import cx.fbn.nevernote.sql.requests.WatchFolderRequest;\r
-import cx.fbn.nevernote.sql.requests.WordRequest;\r
-import cx.fbn.nevernote.sql.runners.RDatabaseConnection;\r
-import cx.fbn.nevernote.sql.runners.REnSearch;\r
-import cx.fbn.nevernote.utilities.ApplicationLogger;\r
-\r
-public class DBRunner extends QObject implements Runnable {\r
-       private final ApplicationLogger                         logger;\r
-       \r
-       private final RDatabaseConnection               conn;\r
-\r
-       // NFC TODO: why do these need to be volatile?\r
-       private volatile LinkedBlockingQueue<DBRunnerRequest> workQueue;\r
-\r
-       public volatile Vector<DBRunnerRequest>         genericResponse;\r
-       public volatile Vector<DeletedItemRequest>      deletedItemResponse;\r
-       public volatile Vector<NotebookRequest>         notebookResponse;\r
-       public volatile Vector<TagRequest>                      tagResponse;\r
-       public volatile Vector<SavedSearchRequest>      savedSearchResponse;\r
-       public volatile Vector<NoteRequest>                     noteResponse;\r
-       public volatile Vector<ResourceRequest>         resourceResponse;\r
-       public volatile Vector<NoteTagsRequest>         noteTagsResponse;\r
-       public volatile Vector<EnSearchRequest>         enSearchResponse;\r
-       public volatile Vector<WatchFolderRequest>      watchFolderResponse;\r
-       public volatile Vector<WordRequest>                     wordResponse;\r
-       public volatile Vector<InvalidXMLRequest>       invalidXMLResponse;\r
-       public volatile Vector<SyncRequest>                     syncResponse;\r
-       \r
-       // priority queues\r
-       public volatile Vector<DBRunnerRequest>     user;\r
-       public volatile Vector<DBRunnerRequest>         background;\r
-       public volatile Vector<DBRunnerRequest>         discretionary;\r
-       private static int MAX_EMPTY_QUEUE_COUNT = 100;\r
-       private static int MAX_QUEUED_WAITING = 100;\r
-\r
-       \r
-       public DBRunnerSignal dbSignal;\r
-       public boolean keepRunning;\r
-       private final String url;\r
-       private final String cypherPassword;\r
-       private final String userid;\r
-       private final String userPassword;\r
-       \r
-       /**\r
-        * @throws InitializationException when opening the database fails\r
-        */\r
-       public DBRunner(String u, String id, String pass, String cypher) throws InitializationException {\r
-               workQueue=new LinkedBlockingQueue<DBRunnerRequest>(MAX_QUEUED_WAITING);\r
-\r
-               url=u;\r
-               userid = id;\r
-               userPassword = pass;\r
-               cypherPassword=cypher;\r
-\r
-               //***********************************************\r
-               //* These are the priority queues.    \r
-               //***********************************************\r
-               user = new Vector<DBRunnerRequest>();\r
-               background = new Vector<DBRunnerRequest>();\r
-               discretionary = new Vector<DBRunnerRequest>();\r
-\r
-               //***********************************************\r
-               //* These are database response queues.  Each\r
-               //* thread has its own individual queue and     \r
-               //* will access it based upod it's individual\r
-               //* thread ID\r
-               //***********************************************\r
-               \r
-               genericResponse = new Vector<DBRunnerRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       genericResponse.add(new DBRunnerRequest());\r
-       \r
-               deletedItemResponse = new Vector<DeletedItemRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       deletedItemResponse.add(new DeletedItemRequest());\r
-               \r
-               notebookResponse = new Vector<NotebookRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       notebookResponse.add(new NotebookRequest());\r
-\r
-               tagResponse = new Vector<TagRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       tagResponse.add(new TagRequest());\r
-\r
-               savedSearchResponse = new Vector<SavedSearchRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       savedSearchResponse.add(new SavedSearchRequest());\r
-\r
-               noteResponse = new Vector<NoteRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       noteResponse.add(new NoteRequest());\r
-               \r
-               resourceResponse = new Vector<ResourceRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       resourceResponse.add(new ResourceRequest());\r
-               \r
-               noteTagsResponse = new Vector<NoteTagsRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       noteTagsResponse.add(new NoteTagsRequest());\r
-               \r
-               enSearchResponse = new Vector<EnSearchRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       enSearchResponse.add(new EnSearchRequest());\r
-               \r
-               watchFolderResponse = new Vector<WatchFolderRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       watchFolderResponse.add(new WatchFolderRequest());\r
-               \r
-               wordResponse = new Vector<WordRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       wordResponse.add(new WordRequest());\r
-\r
-               invalidXMLResponse = new Vector<InvalidXMLRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       invalidXMLResponse.add(new InvalidXMLRequest());\r
-               \r
-               syncResponse = new Vector<SyncRequest>();\r
-               for (int i=0; i<Global.dbThreadId; i++)\r
-                       syncResponse.add(new SyncRequest());\r
-\r
-               dbSignal = new DBRunnerSignal();\r
-\r
-                logger = new ApplicationLogger("dbrunner.log");\r
-\r
-                conn = new RDatabaseConnection(logger);\r
-                conn.dbSetup(url, userid, userPassword, cypherPassword);\r
-       }\r
-\r
-       \r
-       public void run() {\r
-               thread().setPriority(Thread.NORM_PRIORITY);\r
-               \r
-               \r
-               dbSignal.start.connect(this, "releaseThread()");\r
-       \r
-               keepRunning=true;\r
-               while(keepRunning) {\r
-                       try {\r
-                               DBRunnerRequest request;\r
-                               //System.gc();\r
-                               request = workQueue.take();\r
-                               logger.log(logger.EXTREME, "Work pulled.  Current size is now " +workQueue.size());\r
-                               prioritizeWork(request); \r
-                               \r
-                               // Now the queue should be empty.  \r
-                               // Try to do work\r
-                               while (user.size() > 0 || background.size() > 0 || discretionary.size() > 0) {\r
-                                       if (workQueue.size() > 0)\r
-                                               emptyQueue();\r
-                                       if (user.size() > 0)\r
-                                               releaseWork(user);\r
-                                       else\r
-                                               if (background.size() > 0)\r
-                                                       releaseWork(background);\r
-                                               else\r
-                                                       releaseWork(discretionary);\r
-                               }\r
-                       } catch (InterruptedException e) {\r
-                               e.printStackTrace();\r
-                       }\r
-               }\r
-               return;\r
-       }\r
-       \r
-       @SuppressWarnings("unused")\r
-       private void releaseThread() {\r
-               Global.dbContinue();\r
-       }\r
-       \r
-       private void emptyQueue() {\r
-               logger.log(logger.EXTREME, "Draining queue.  Current size " +workQueue.size());\r
-               int count = 0;\r
-               while (workQueue.size() > 0 && count > MAX_EMPTY_QUEUE_COUNT) {\r
-                       DBRunnerRequest request;\r
-                       try {\r
-                               request = workQueue.take();\r
-                               prioritizeWork(request);\r
-                       } catch (InterruptedException e) {}\r
-                       count++;\r
-                       logger.log(logger.EXTREME, "Draining queue - counter is now " +count);\r
-               }\r
-       }\r
-       \r
-       private void releaseWork(Vector<DBRunnerRequest> queue) {\r
-               logger.log(logger.EXTREME, "Releasing work.  Current size is " +workQueue.size());\r
-               while(queue.size() > 0) {\r
-                       DBRunnerRequest request = queue.get(0);\r
-                       queue.remove(0);\r
-                       doWork(request);\r
-               }\r
-               logger.log(logger.EXTREME, "Leaving release queue.");\r
-       }\r
-\r
-       private void prioritizeWork(DBRunnerRequest request) {\r
-               logger.log(logger.EXTREME, "Entering prioritizeWork()");\r
-               if (request.requestor_id == Global.mainThreadId || \r
-                               (request.category == DBRunnerRequest.NOTE) && (request.type == NoteRequest.Set_Index_Needed)) {\r
-                       user.add(request);\r
-                       return;\r
-               } \r
-               if (request.requestor_id == Global.tagCounterThreadId) {\r
-                       background.add(request);\r
-                       return;\r
-               }\r
-               if (request.requestor_id == Global.trashCounterThreadId) {\r
-                       discretionary.add(request);\r
-                       return;\r
-               }\r
-               \r
-               // Anything remaining should be index threads, put\r
-               // them in a low priority\r
-               discretionary.add(request);\r
-               logger.log(logger.EXTREME, "Leaving prioritizeWork()");\r
-       }\r
-       \r
-       \r
-       public synchronized void addWork(DBRunnerRequest s) {\r
-               while(!workQueue.offer(s));\r
-       }\r
-       \r
-       private void doWork(DBRunnerRequest s) {\r
-               if (s.category == DBRunnerRequest.GENERIC){\r
-                       String work = new String(s.request);\r
-                       if (work.equalsIgnoreCase("shutdown"))\r
-                               keepRunning = false;\r
-               } else  if (s.category == DBRunnerRequest.DATABASE){\r
-                       DatabaseRequest work = copyDatabaseRequest(s);\r
-                       doDatabaseRequest(work);\r
-               } else if (s.category == DBRunnerRequest.DELETED_ITEM) {\r
-                       DeletedItemRequest work = copyDeletedItemRequest(s);\r
-                       Global.dbrunnerWorkLock.unlock();       \r
-                       doDeletedItemRequest(work);\r
-               } else if (s.category == DBRunnerRequest.NOTEBOOK) {\r
-                       NotebookRequest work = copyNotebookRequest(s);\r
-                       doNotebookRequest(work);\r
-               } else if (s.category == DBRunnerRequest.TAG    ) {\r
-                       TagRequest work = copyTagRequest(s);\r
-                       doTagRequest(work);\r
-               } else if (s.category == DBRunnerRequest.SAVED_SEARCH   ) {\r
-                       SavedSearchRequest work = copySavedSearchRequest(s);\r
-                       doSavedSearchRequest(work);\r
-               } else if (s.category == DBRunnerRequest.NOTE) {\r
-                       NoteRequest work = copyNoteRequest(s);\r
-                       doNoteRequest(work);\r
-               } else if (s.category == DBRunnerRequest.RESOURCE) {\r
-                       ResourceRequest work = copyResourceRequest(s);\r
-                       doResourceRequest(work);\r
-               } else if (s.category == DBRunnerRequest.NOTE_TAGS) {\r
-                       NoteTagsRequest work = copyNoteTagsRequest(s);\r
-                       doNoteTagsRequest(work);\r
-               } else if (s.category == DBRunnerRequest.ENSEARCH) {\r
-                       EnSearchRequest work = copyEnSearchRequest(s);\r
-                       doEnSearchRequest(work);\r
-               } else if (s.category == DBRunnerRequest.WATCH_FOLDER) {\r
-                       WatchFolderRequest work = copyWatchFolderRequest(s);\r
-                       doWatchFolderRequest(work);\r
-               } else if (s.category == DBRunnerRequest.WORD) {\r
-                       WordRequest work = copyWordRequest(s);\r
-                       doWordRequest(work);\r
-               } else if (s.category == DBRunnerRequest.Invalid_XML) {\r
-                       InvalidXMLRequest work = copyInvalidXMLRequest(s);\r
-                       doInvalidXMLRequest(work);\r
-               }       else if (s.category == DBRunnerRequest.Sync) {\r
-                               SyncRequest work = copySyncRequest(s);\r
-                               doSyncRequest(work);\r
-               }       \r
-               return;\r
-       }\r
-       \r
-       \r
-       //*********************************************\r
-       //* If the requestor is expecting a response, *\r
-       //* release them so they can pick it up.      *\r
-       //*********************************************\r
-       private void release(int i) {\r
-               logger.log(logger.EXTREME, "Releasing "+i);\r
-               Global.dbClientContinue(i);\r
-//             if (i == Global.mainThreadId)\r
-//                     Global.mainThreadWait.wakeOne();\r
-       }\r
-       \r
-       //**************************************\r
-       //* Copy items off the work queue so   *\r
-       //* the resources can be freed up.     *\r
-       //**************************************\r
-       private DatabaseRequest copyDatabaseRequest(DBRunnerRequest n) {\r
-               DatabaseRequest request = new DatabaseRequest();\r
-               DatabaseRequest old = (DatabaseRequest) n;\r
-               request = old.copy();\r
-               return request;\r
-       }\r
-       private SyncRequest copySyncRequest(DBRunnerRequest n) {\r
-               SyncRequest request = new SyncRequest();\r
-               SyncRequest old = (SyncRequest) n;\r
-               request = old.copy();\r
-               return request;\r
-       }\r
-       private DeletedItemRequest copyDeletedItemRequest(DBRunnerRequest r) {\r
-               DeletedItemRequest request = new DeletedItemRequest();\r
-               DeletedItemRequest old = (DeletedItemRequest) r;\r
-               request = old.copy();\r
-               return request;\r
-       }       \r
-       private NotebookRequest copyNotebookRequest(DBRunnerRequest n) {\r
-               NotebookRequest request = new NotebookRequest();\r
-               NotebookRequest old = (NotebookRequest) n;\r
-               request = old.copy();\r
-               return request;\r
-       }\r
-       private TagRequest copyTagRequest(DBRunnerRequest n) {\r
-               TagRequest request = new TagRequest();\r
-               TagRequest old = (TagRequest) n;\r
-               request = old.copy();\r
-               return request;\r
-       }\r
-       private SavedSearchRequest copySavedSearchRequest(DBRunnerRequest n) {\r
-               SavedSearchRequest request = new SavedSearchRequest();\r
-               SavedSearchRequest old = (SavedSearchRequest) n;\r
-               request = old.copy();\r
-               return request;\r
-       }\r
-       private NoteRequest copyNoteRequest(DBRunnerRequest n) {\r
-               NoteRequest request = new NoteRequest();\r
-               NoteRequest old = (NoteRequest) n;\r
-               request = old.copy();\r
-               return request;\r
-       }\r
-       private ResourceRequest copyResourceRequest(DBRunnerRequest n) {\r
-               ResourceRequest request = new ResourceRequest();\r
-               ResourceRequest old = (ResourceRequest) n;\r
-               request = old.copy();\r
-               return request;\r
-       }\r
-       private NoteTagsRequest copyNoteTagsRequest(DBRunnerRequest n) {\r
-               NoteTagsRequest request = new NoteTagsRequest();\r
-               NoteTagsRequest old = (NoteTagsRequest) n;\r
-               request = old.copy();\r
-               return request;\r
-       }\r
-       private EnSearchRequest copyEnSearchRequest(DBRunnerRequest n) {\r
-               EnSearchRequest request = new EnSearchRequest();\r
-               EnSearchRequest old = (EnSearchRequest) n;\r
-               request = old.copy();\r
-               return request;\r
-       }\r
-       private WatchFolderRequest copyWatchFolderRequest(DBRunnerRequest n) {\r
-               WatchFolderRequest request = new WatchFolderRequest();\r
-               WatchFolderRequest old = (WatchFolderRequest) n;\r
-               request = old.copy();\r
-               return request;\r
-       }\r
-       private WordRequest copyWordRequest(DBRunnerRequest n) {\r
-               WordRequest request = new WordRequest();\r
-               WordRequest old = (WordRequest) n;\r
-               request = old.copy();\r
-               return request;\r
-       }\r
-       private InvalidXMLRequest copyInvalidXMLRequest(DBRunnerRequest n) {\r
-               InvalidXMLRequest request = new InvalidXMLRequest();\r
-               InvalidXMLRequest old = (InvalidXMLRequest) n;\r
-               request = old.copy();\r
-               return request;\r
-       }       \r
-       //**************************************\r
-       //* Database requests                  *\r
-       //**************************************\r
-       private void doDatabaseRequest(DatabaseRequest r) {\r
-               if (r.type == DatabaseRequest.Create_Tables) {\r
-                       conn.createTables();\r
-                       release(r.requestor_id);\r
-                       return;\r
-               } else if (r.type == DatabaseRequest.Drop_Tables) {\r
-                       conn.dropTables();\r
-                       return;\r
-               } else if (r.type == DatabaseRequest.Compact) {\r
-                       conn.compactDatabase();\r
-                       release(r.requestor_id);\r
-                       return;\r
-               } else if (r.type == DatabaseRequest.Shutdown) {\r
-                       conn.dbShutdown();\r
-                       keepRunning = false;\r
-                       return;\r
-               } else if (r.type == DatabaseRequest.Execute_Sql) {\r
-                       conn.executeSql(r.string1);\r
-                       release(r.requestor_id);\r
-                       return;\r
-               }  else if (r.type == DatabaseRequest.Execute_Sql_Index) {\r
-                       release(r.requestor_id);\r
-                       return;\r
-               }  else if (r.type == DatabaseRequest.Backup_Database) {\r
-                       conn.backupDatabase();\r
-                       release(r.requestor_id);\r
-                       return;\r
-               }\r
-               return;\r
-       }\r
-       \r
-       //**************************************\r
-       //* Notebook database requests         *\r
-       //**************************************\r
-       private void doNotebookRequest(NotebookRequest n) {\r
-               logger.log(logger.EXTREME, "Notebook request: " +n.category + " " + n.type + " from " +n.requestor_id);\r
-               if (n.type == NotebookRequest.Create_Table) {\r
-                       conn.getNotebookTable().createTable();\r
-               }\r
-               if (n.type == NotebookRequest.Drop_Table) {\r
-                       conn.getNotebookTable().dropTable();\r
-               }\r
-               if (n.type == NotebookRequest.Expunge_Notebook) {\r
-                       conn.getNotebookTable().expungeNotebook(n.string1, n.bool1);\r
-               }\r
-               if (n.type == NotebookRequest.Add_Notebook) {\r
-                       conn.getNotebookTable().addNotebook(n.notebook, n.bool1, n.bool2);\r
-               }\r
-               if (n.type == NotebookRequest.Update_Notebook) {\r
-                       conn.getNotebookTable().updateNotebook(n.notebook, n.bool1);\r
-               }\r
-               if (n.type == NotebookRequest.Sync_Notebook) {\r
-                       conn.getNotebookTable().syncNotebook(n.notebook, n.bool1);\r
-               }\r
-               if (n.type == NotebookRequest.Get_All) {\r
-                       notebookResponse.get(n.requestor_id).responseNotebooks = conn.getNotebookTable().getAll();\r
-                       release(n.requestor_id);\r
-               }\r
-               if (n.type == NotebookRequest.Get_All_Local) {\r
-                       notebookResponse.get(n.requestor_id).responseNotebooks = conn.getNotebookTable().getAllLocal();\r
-                       release(n.requestor_id);\r
-               }\r
-               if (n.type == NotebookRequest.Get_All_Archived) {\r
-                       notebookResponse.get(n.requestor_id).responseNotebooks = conn.getNotebookTable().getAllArchived();\r
-                       release(n.requestor_id);\r
-               }\r
-               if (n.type == NotebookRequest.Get_Dirty) {\r
-                       notebookResponse.get(n.requestor_id).responseNotebooks = conn.getNotebookTable().getDirty();\r
-                       release(n.requestor_id);\r
-               }\r
-               if (n.type == NotebookRequest.Set_Archived) {\r
-                       conn.getNotebookTable().setArchived(n.string1, n.bool1);\r
-               }\r
-               if (n.type == NotebookRequest.Is_Notebook_Local) {\r
-                       notebookResponse.get(n.requestor_id).responseBoolean = conn.getNotebookTable().isNotebookLocal(n.string1);\r
-                       release(n.requestor_id);\r
-               }\r
-               if (n.type == NotebookRequest.Reset_Dirty) {\r
-                       conn.getNotebookTable().resetDirtyFlag(n.string1);\r
-               }\r
-               if (n.type == NotebookRequest.Find_Note_By_Name) {\r
-                       notebookResponse.get(n.requestor_id).responseString = conn.getNotebookTable().findNotebookByName(n.string1);\r
-                       release(n.requestor_id);\r
-               }\r
-               if (n.type == NotebookRequest.Update_Notebook_Guid) {\r
-                       conn.getNotebookTable().updateNotebookGuid(n.string1, n.string2);\r
-               }\r
-               if (n.type == NotebookRequest.Update_Notebook_Sequence) {\r
-                       conn.getNotebookTable().updateNotebookSequence(n.string1, n.int1);\r
-               }\r
-               if (n.type == NotebookRequest.Notebook_Counts) {\r
-                       notebookResponse.get(n.requestor_id).responseCounts = conn.getNotebookTable().getNotebookCounts();\r
-                       release(n.requestor_id);\r
-               }\r
-               logger.log(logger.EXTREME, "End of Notebook request");\r
-               return;\r
-       }\r
-\r
-       //******************************************\r
-       //* Deleted (expunged) database requests   *\r
-       //******************************************\r
-       private void doDeletedItemRequest(DeletedItemRequest r) {\r
-               logger.log(logger.EXTREME, "DeletedItem request: " +r.category + " " + r.type + " from " +r.requestor_id);\r
-               if (r.type == DeletedItemRequest.Create_Table) {\r
-                       conn.getDeletedTable().createTable();\r
-               } else  if (r.type == DeletedItemRequest.Drop_Table) {\r
-                       conn.getDeletedTable().dropTable();\r
-               } else  if (r.type == DeletedItemRequest.Expunge_All) {\r
-                       conn.getDeletedTable().expungeAllDeletedRecords();\r
-               } else  if (r.type == DeletedItemRequest.Add_Deleted_Item) {\r
-                       conn.getDeletedTable().addDeletedItem(r.string1, r.string2);\r
-               } else  if (r.type == DeletedItemRequest.Get_All) {\r
-                       deletedItemResponse.get(r.requestor_id).responseDeletedRecords = conn.getDeletedTable().getAllDeleted();\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == DeletedItemRequest.Expunge_Record) {\r
-                       conn.getDeletedTable().expungeDeletedItem(r.string1, r.string2);\r
-                       release(r.requestor_id);\r
-               }\r
-               logger.log(logger.EXTREME, "End Of DeletedItem request");\r
-               return;\r
-       }\r
-\r
-       //******************************************\r
-       //* Tag database requests                  *\r
-       //******************************************\r
-       private void doTagRequest(TagRequest r) {\r
-               logger.log(logger.EXTREME, "Tag request: " +r.category + " " + r.type + " from " +r.requestor_id);\r
-               if (r.type == TagRequest.Create_Table) {\r
-                       conn.getTagTable().createTable();\r
-               } else if (r.type == TagRequest.Drop_Table) {\r
-                       conn.getTagTable().dropTable();\r
-               } else if (r.type == TagRequest.Add_Tag) {\r
-                       conn.getTagTable().addTag(r.tag, r.bool1);\r
-               } else if (r.type == TagRequest.Expunge_Tag) {\r
-                       conn.getTagTable().expungeTag(r.string1, r.bool1);\r
-               } else if (r.type == TagRequest.Exists) {\r
-                       tagResponse.get(r.requestor_id).responseBool = conn.getTagTable().exists(r.string1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == TagRequest.Find_Tag_By_Name) {\r
-                       tagResponse.get(r.requestor_id).responseString = conn.getTagTable().findTagByName(r.string1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == TagRequest.Get_All) {\r
-                       tagResponse.get(r.requestor_id).responseTags = conn.getTagTable().getAll();\r
-                       release(r.requestor_id);\r
-               } else if (r.type == TagRequest.Get_Dirty) {\r
-                       tagResponse.get(r.requestor_id).responseTags = conn.getTagTable().getDirty();\r
-                       release(r.requestor_id);\r
-               } else if (r.type == TagRequest.Get_Tag) {\r
-                       tagResponse.get(r.requestor_id).responseTag = conn.getTagTable().getTag(r.string1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == TagRequest.Reset_Dirty_Flag) {\r
-                       conn.getTagTable().resetDirtyFlag(r.string1);\r
-               } else if (r.type == TagRequest.Save_Tags) {\r
-                       conn.getTagTable().saveTags(r.tags);\r
-               } else if (r.type == TagRequest.Sync_Tag) {\r
-                       conn.getTagTable().syncTag(r.tag, r.bool1);\r
-               } else if (r.type == TagRequest.Update_Parent) {\r
-                       conn.getTagTable().updateTagParent(r.string1, r.string2);\r
-               } else if (r.type == TagRequest.Update_Tag) {\r
-                       conn.getTagTable().updateTag(r.tag, r.bool1);\r
-               } else if (r.type == TagRequest.Update_Tag_Guid) {\r
-                       conn.getTagTable().updateTagGuid(r.string1, r.string2);\r
-               } else if (r.type == TagRequest.Update_Tag_Sequence) {\r
-                       conn.getTagTable().updateTagSequence(r.string1, r.int1);\r
-               } \r
-               logger.log(logger.EXTREME, "End of tag request");\r
-               return;\r
-       }\r
-\r
-       //******************************************\r
-       //* Saved Search database requests         *\r
-       //******************************************\r
-       private void doSavedSearchRequest(SavedSearchRequest r) {\r
-               logger.log(logger.EXTREME, "Saved Search request: " +r.category + " " + r.type + " from " +r.requestor_id);\r
-               if (r.type == SavedSearchRequest.Create_Table) {\r
-                       conn.getSavedSearchTable().createTable();\r
-               } else  if (r.type == SavedSearchRequest.Drop_Table) {\r
-                       conn.getSavedSearchTable().dropTable();\r
-               } else  if (r.type == SavedSearchRequest.Add_Saved_Search) {\r
-                       conn.getSavedSearchTable().addSavedSearch(r.savedSearch, r.bool1);\r
-               } else  if (r.type == SavedSearchRequest.Exists) {\r
-                       savedSearchResponse.get(r.requestor_id).responseBoolean = conn.getSavedSearchTable().exists(r.string1);\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == SavedSearchRequest.Expunge_Saved_Search) {\r
-                       conn.getSavedSearchTable().expungeSavedSearch(r.string1, r.bool1);\r
-               } else  if (r.type == SavedSearchRequest.Find_Saved_Search_By_Name) {\r
-                       savedSearchResponse.get(r.requestor_id).responseString = conn.getSavedSearchTable().findSavedSearchByName(r.string1);\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == SavedSearchRequest.Get_All) {\r
-                       savedSearchResponse.get(r.requestor_id).responseSavedSearches = conn.getSavedSearchTable().getAll();\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == SavedSearchRequest.Get_Dirty) {\r
-                       savedSearchResponse.get(r.requestor_id).responseSavedSearches = conn.getSavedSearchTable().getDirty();\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == SavedSearchRequest.Get_Saved_Search) {\r
-                       savedSearchResponse.get(r.requestor_id).responseSavedSearch = conn.getSavedSearchTable().getSavedSearch(r.string1);\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == SavedSearchRequest.Sync_Saved_Search) {\r
-                       conn.getSavedSearchTable().syncSavedSearch(r.savedSearch, r.bool1);\r
-               } else  if (r.type == SavedSearchRequest.Update_Saved_Search) {\r
-                       conn.getSavedSearchTable().updateSavedSearch(r.savedSearch, r.bool1);\r
-               } else if (r.type == SavedSearchRequest.Reset_Dirty_Flag) {\r
-                       conn.getSavedSearchTable().resetDirtyFlag(r.string1);\r
-               } \r
-               logger.log(logger.EXTREME, "End of saved search request");\r
-               return;\r
-       }\r
-\r
-       //******************************************\r
-       //* Saved Search database requests         *\r
-       //******************************************\r
-       private void doNoteRequest(NoteRequest r) {\r
-               logger.log(logger.EXTREME, "Note request: " +r.category + " " + r.type + " from " +r.requestor_id);\r
-               if (r.type == NoteRequest.Create_Table) {\r
-                       conn.getNoteTable().createTable();\r
-               } else  if (r.type == NoteRequest.Drop_Table) {\r
-                       conn.getNoteTable().dropTable();\r
-               } else  if (r.type == NoteRequest.Get_Note) {\r
-                       noteResponse.get(r.requestor_id).responseNote = conn.getNoteTable().getNote(r.string1, r.bool1, r.bool2, r.bool3, r.bool4, r.bool5);\r
-                       logger.log(logger.EXTREME, "Releasing " +r.requestor_id);\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == NoteRequest.Add_Note) {\r
-                       conn.getNoteTable().addNote(r.note, r.bool1);\r
-               } else  if (r.type == NoteRequest.Update_Note_Title) {\r
-                       conn.getNoteTable().updateNoteTitle(r.string1, r.string2);\r
-               } else  if (r.type == NoteRequest.Update_Note_Creation_Date) {\r
-                       conn.getNoteTable().updateNoteCreatedDate(r.string1, r.date);\r
-               } else  if (r.type == NoteRequest.Update_Note_Altered_Date) {\r
-                       conn.getNoteTable().updateNoteAlteredDate(r.string1, r.date);\r
-               } else  if (r.type == NoteRequest.Update_Note_Subject_Date) {\r
-                       conn.getNoteTable().updateNoteSubjectDate(r.string1, r.date);\r
-               } else  if (r.type == NoteRequest.Update_Note_Source_Url) {\r
-                       conn.getNoteTable().updateNoteSourceUrl(r.string1, r.string2);\r
-               } else  if (r.type == NoteRequest.Update_Note_Author) {\r
-                       conn.getNoteTable().updateNoteAuthor(r.string1, r.string2);\r
-               } else  if (r.type == NoteRequest.Update_Note_Notebook) {\r
-                       conn.getNoteTable().updateNoteNotebook(r.string1, r.string2, r.bool1);\r
-               } else  if (r.type == NoteRequest.Update_Note_Content) {\r
-                       conn.getNoteTable().updateNoteContent(r.string1, r.string2);\r
-               } else  if (r.type == NoteRequest.Delete_Note) {\r
-                       conn.getNoteTable().deleteNote(r.string1);\r
-               } else  if (r.type == NoteRequest.Restore_Note) {\r
-                       conn.getNoteTable().restoreNote(r.string1);\r
-               } else  if (r.type == NoteRequest.Expunge_Note) {\r
-                       conn.getNoteTable().expungeNote(r.string1, r.bool1, r.bool2);\r
-               } else  if (r.type == NoteRequest.Expunge_All_Deleted_Notes) {\r
-                       conn.getNoteTable().expungeAllDeletedNotes();\r
-               } else  if (r.type == NoteRequest.Update_Note_Sequence) {\r
-                       conn.getNoteTable().updateNoteSequence(r.string1, r.int1);\r
-               } else  if (r.type == NoteRequest.Update_Note_Guid) {\r
-                       conn.getNoteTable().updateNoteGuid(r.string1, r.string2);\r
-               } else  if (r.type == NoteRequest.Update_Note) {\r
-                       conn.getNoteTable().updateNote(r.note, r.bool1);\r
-               } else  if (r.type == NoteRequest.Exists) {\r
-                       noteResponse.get(r.requestor_id).responseBoolean =conn.getNoteTable().exists(r.string1);\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == NoteRequest.Sync_Note) {\r
-                       conn.getNoteTable().syncNote(r.note, r.bool1);\r
-               } else  if (r.type == NoteRequest.Get_Dirty) {\r
-                       noteResponse.get(r.requestor_id).responseNotes = conn.getNoteTable().getDirty();\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == NoteRequest.Get_Unsynchronized_Guids) {\r
-                       noteResponse.get(r.requestor_id).responseStrings = conn.getNoteTable().getUnsynchronizedGUIDs();\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == NoteRequest.Reset_Dirty_Flag) {\r
-                       conn.getNoteTable().resetDirtyFlag(r.string1);\r
-               } else  if (r.type == NoteRequest.Get_All_Guids) {\r
-                       noteResponse.get(r.requestor_id).responseStrings = conn.getNoteTable().getAllGuids();\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == NoteRequest.Get_All_Notes) {\r
-                       noteResponse.get(r.requestor_id).responseNotes = conn.getNoteTable().getAllNotes();\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == NoteRequest.Get_Unindexed_Count) {\r
-                       noteResponse.get(r.requestor_id).responseInt = conn.getNoteTable().getUnindexedCount();\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == NoteRequest.Get_Dirty_Count) {\r
-                       noteResponse.get(r.requestor_id).responseInt = conn.getNoteTable().getDirtyCount();\r
-                       logger.log(logger.EXTREME, "Note request: " +r.category + " " + r.type + " from " +r.requestor_id);\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == NoteRequest.Update_Resource_Guid_By_Hash) {\r
-                       conn.getNoteTable().updateNoteResourceGuidbyHash(r.string1, r.string2, r.string3);\r
-               } else  if (r.type == NoteRequest.Set_Index_Needed) {\r
-                       conn.getNoteTable().setIndexNeeded(r.string1, r.bool1);\r
-               } else  if (r.type == NoteRequest.Reindex_All_Notes) {\r
-                       conn.getNoteTable().reindexAllNotes();\r
-               } else  if (r.type == NoteRequest.Get_Unindexed) {\r
-                       noteResponse.get(r.requestor_id).responseStrings = conn.getNoteTable().getUnindexed();\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == NoteRequest.Get_Next_Unindexed) {\r
-                       noteResponse.get(r.requestor_id).responseStrings = conn.getNoteTable().getNextUnindexed(r.int1);\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == NoteRequest.Update_Resource_Content_Hash) {\r
-                       conn.getNoteTable().updateResourceContentHash(r.string1, r.string2, r.string3);\r
-               } else  if (r.type == NoteRequest.Get_Note_Count) {\r
-                       noteResponse.get(r.requestor_id).responseInt = conn.getNoteTable().getNoteCount();\r
-                       release(r.requestor_id);\r
-               } else if (r.type == NoteRequest.Reset_Note_Sequence) {\r
-                       conn.getNoteTable().resetNoteSequence(r.string1);\r
-               } else if (r.type == NoteRequest.Get_Deleted_Count) {\r
-                       noteResponse.get(r.requestor_id).responseInt = conn.getNoteTable().getDeletedCount();\r
-                       release(r.requestor_id);\r
-               } else if (r.type == NoteRequest.Is_Note_Dirty) {\r
-                       noteResponse.get(r.requestor_id).responseBoolean = conn.getNoteTable().isNoteDirty(r.string1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == NoteRequest.Get_Note_Content_Binary) {\r
-                       noteResponse.get(r.requestor_id).responseString = conn.getNoteTable().getNoteContentBinary(r.string1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == NoteRequest.Get_Title_Colors) {\r
-                       noteResponse.get(r.requestor_id).responsePair = conn.getNoteTable().getNoteTitleColors();\r
-                       release(r.requestor_id);\r
-               } else  if (r.type == NoteRequest.Set_Title_Colors) {\r
-                       conn.getNoteTable().setNoteTitleColor(r.string1, r.int1);\r
-               } else if (r.type == NoteRequest.Get_Thumbnail) {\r
-                       noteResponse.get(r.requestor_id).responseBytes = conn.getNoteTable().getThumbnail(r.string1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == NoteRequest.Is_Thumbail_Needed) {\r
-                       noteResponse.get(r.requestor_id).responseBoolean = conn.getNoteTable().isThumbnailNeeded(r.string1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == NoteRequest.Set_Thumbnail_Needed) {\r
-                       conn.getNoteTable().setThumbnailNeeded(r.string1, r.bool1);\r
-               }  else if (r.type == NoteRequest.Set_Thumbnail) {\r
-                       conn.getNoteTable().setThumbnail(r.string1, r.bytes);\r
-               } \r
-               logger.log(logger.EXTREME, "End of Note request");\r
-               return;\r
-       }\r
-\r
-       //******************************************\r
-       //* Note Resource database requests        *\r
-       //******************************************\r
-       private void doResourceRequest(ResourceRequest r) {\r
-               logger.log(logger.EXTREME, "Resource request: " +r.category + " " + r.type);\r
-               if (r.type == ResourceRequest.Create_Table) {\r
-                       conn.getNoteTable().noteResourceTable.createTable();\r
-               } else if (r.type == ResourceRequest.Drop_Table) {\r
-                       conn.getNoteTable().noteResourceTable.dropTable();\r
-               } if (r.type == ResourceRequest.Expunge_Note_Resource) {\r
-                       conn.getNoteTable().noteResourceTable.expungeNoteResource(r.string1);\r
-               } else if (r.type == ResourceRequest.Get_Next_Unindexed) {\r
-                       resourceResponse.get(r.requestor_id).responseStrings = conn.getNoteTable().noteResourceTable.getNextUnindexed(r.int1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == ResourceRequest.Get_Note_Resource) {\r
-                       resourceResponse.get(r.requestor_id).responseResource = conn.getNoteTable().noteResourceTable.getNoteResource(r.string1, r.bool1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == ResourceRequest.Get_Note_Resource_Data_Body_By_Hash_Hex) {\r
-                       resourceResponse.get(r.requestor_id).responseResource = conn.getNoteTable().noteResourceTable.getNoteResourceDataBodyByHashHex(r.string1, r.string2);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == ResourceRequest.Get_Note_Resource_Guid_By_Hash_Hex) {\r
-                       resourceResponse.get(r.requestor_id).responseString = conn.getNoteTable().noteResourceTable.getNoteResourceGuidByHashHex(r.string1, r.string2);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == ResourceRequest.Get_Note_Resource_Recognition) {\r
-                       resourceResponse.get(r.requestor_id).responseResource = conn.getNoteTable().noteResourceTable.getNoteResourceRecognition(r.string1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == ResourceRequest.Get_Note_Resources) {\r
-                       resourceResponse.get(r.requestor_id).responseResources = conn.getNoteTable().noteResourceTable.getNoteResources(r.string1, r.bool1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == ResourceRequest.Get_Note_Resources_Recognition) {\r
-                       resourceResponse.get(r.requestor_id).responseResources = conn.getNoteTable().noteResourceTable.getNoteResourcesRecognition(r.string1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == ResourceRequest.Get_Resource_Count) {\r
-                       resourceResponse.get(r.requestor_id).responseInteger = conn.getNoteTable().noteResourceTable.getResourceCount();\r
-                       release(r.requestor_id);\r
-               } else if (r.type == ResourceRequest.Reindex_All) {\r
-                       conn.getNoteTable().noteResourceTable.reindexAll();\r
-               } else if (r.type == ResourceRequest.Reset_Dirty_Flag) {\r
-                       conn.getNoteTable().noteResourceTable.resetDirtyFlag(r.string1);\r
-               } else if (r.type == ResourceRequest.Save_Note_Resource) {\r
-                       conn.getNoteTable().noteResourceTable.saveNoteResource(r.resource, r.bool1);\r
-               } else if (r.type == ResourceRequest.Set_Index_Needed) {\r
-                       conn.getNoteTable().noteResourceTable.setIndexNeeded(r.string1, r.bool1);\r
-               } else if (r.type == ResourceRequest.Update_Note_Resource) {\r
-                       conn.getNoteTable().noteResourceTable.updateNoteResource(r.resource, r.bool1);\r
-               } else if (r.type == ResourceRequest.Update_Note_Resource_Guid) {\r
-                       conn.getNoteTable().noteResourceTable.updateNoteResourceGuid(r.string1, r.string2, r.bool1);\r
-               } else if (r.type == ResourceRequest.Reset_Update_Sequence_Number) {\r
-                       conn.getNoteTable().noteResourceTable.resetUpdateSequenceNumber(r.string1, r.bool1);\r
-               }\r
-               logger.log(logger.EXTREME, "End of note resource request");\r
-       }\r
-\r
-\r
-       //******************************************\r
-       //* Note Resource database requests        *\r
-       //******************************************\r
-       private void doNoteTagsRequest(NoteTagsRequest r) {\r
-               logger.log(logger.EXTREME, "Note Tags request: " +r.category + " " + r.type + " from " +r.requestor_id);\r
-               if (r.type == NoteTagsRequest.Create_Table) {\r
-                       conn.getNoteTable().noteTagsTable.createTable();\r
-               } else if (r.type == NoteTagsRequest.Drop_Table) {\r
-                       conn.getNoteTable().noteTagsTable.dropTable();\r
-               }  else if (r.type == NoteTagsRequest.Check_Note_Note_Tags) {\r
-                       noteTagsResponse.get(r.requestor_id).responseBoolean = conn.getNoteTable().noteTagsTable.checkNoteNoteTags(r.string1, r.string2);\r
-                       release(r.requestor_id);\r
-               } if (r.type == NoteTagsRequest.Delete_Note_Tag) {\r
-                       conn.getNoteTable().noteTagsTable.deleteNoteTag(r.string1);\r
-               } if (r.type == NoteTagsRequest.Get_All_Note_Tags) {\r
-                       noteTagsResponse.get(r.requestor_id).responseNoteTagsRecord = conn.getNoteTable().noteTagsTable.getAllNoteTags();\r
-                       release(r.requestor_id);\r
-               } if (r.type == NoteTagsRequest.Get_Note_Tags) {\r
-                       noteTagsResponse.get(r.requestor_id).responseStrings = conn.getNoteTable().noteTagsTable.getNoteTags(r.string1);\r
-                       release(r.requestor_id);\r
-               } if (r.type == NoteTagsRequest.Save_Note_Tag) {\r
-                       conn.getNoteTable().noteTagsTable.saveNoteTag(r.string1, r.string2);\r
-               } \r
-               if (r.type == NoteTagsRequest.Tag_Counts) {\r
-                       noteTagsResponse.get(r.requestor_id).responseCounts = conn.getNoteTable().noteTagsTable.getTagCounts();\r
-                       release(r.requestor_id);\r
-               } \r
-               logger.log(logger.EXTREME, "End of note tags request");\r
-       }\r
-\r
-\r
-       //**************************************\r
-       //* Search requests                    *\r
-       //**************************************\r
-       private void doEnSearchRequest(EnSearchRequest r) {\r
-               logger.log(logger.EXTREME, "EnSearch request: " +r.category + " " + r.type + " from " +r.requestor_id);\r
-               REnSearch s = new REnSearch(conn, logger, conn, r.string1, r.tags, r.int1, r.int2);\r
-               enSearchResponse.get(r.requestor_id).responseNotes = s.matchWords();\r
-               enSearchResponse.get(r.requestor_id).responseStrings = s.getWords();\r
-               release(r.requestor_id);\r
-               logger.log(logger.EXTREME, "End of EnSearch request");\r
-               return;\r
-       }\r
-       \r
-       \r
-       \r
-       //**************************************\r
-       //* Watch Folders                      *\r
-       //**************************************\r
-       private void doWatchFolderRequest(WatchFolderRequest r) {\r
-               logger.log(logger.EXTREME, "Watch folder request: " +r.category + " " + r.type + " from " +r.requestor_id);\r
-               if (r.type == WatchFolderRequest.Create_Tables) {\r
-                       conn.getWatchFolderTable().createTable();\r
-               } else if (r.type == WatchFolderRequest.Add_Watch_Folder) {\r
-                       conn.getWatchFolderTable().addWatchFolder(r.string1, r.string2, r.bool1, r.int1);\r
-               } else if (r.type == WatchFolderRequest.Get_All) {\r
-                       watchFolderResponse.get(r.requestor_id).responseWatchFolders = conn.getWatchFolderTable().getAll();\r
-                       release(r.requestor_id);\r
-               }\r
-               else if (r.type == WatchFolderRequest.Get_Notebook) {\r
-                       watchFolderResponse.get(r.requestor_id).responseString = conn.getWatchFolderTable().getNotebook(r.string1);\r
-                       release(r.requestor_id);\r
-               } else if (r.type == WatchFolderRequest.Drop_Tables) {\r
-                       conn.getWatchFolderTable().dropTable();\r
-               } else if (r.type == WatchFolderRequest.Expunge_Folder) {\r
-                       conn.getWatchFolderTable().expungeWatchFolder(r.string1);\r
-               } else if (r.type == WatchFolderRequest.Expunge_All) {\r
-                       conn.getWatchFolderTable().expungeAll();\r
-               }\r
-               logger.log(logger.EXTREME, "End of watch folder request");\r
-       }\r
-       \r
-       //**************************************\r
-       //* Word Index                         *\r
-       //**************************************\r
-       private void doWordRequest(WordRequest r) {\r
-               logger.log(logger.EXTREME, "Word request: " +r.category + " " + r.type + " from " +r.requestor_id);\r
-               if (r.type == WordRequest.Create_Table) {\r
-                       conn.getWordsTable().createTable();\r
-               } else if (r.type == WordRequest.Drop_Table) {\r
-                       conn.getWordsTable().dropTable();\r
-               } else if (r.type == WordRequest.Expunge_From_Word_Index) {\r
-                       conn.getWordsTable().expungeFromWordIndex(r.string1, r.string2);\r
-               } else if (r.type == WordRequest.Clear_Word_Index) {\r
-                       conn.getWordsTable().clearWordIndex();\r
-               } else if (r.type == WordRequest.Get_Word_Count) {\r
-                       wordResponse.get(r.requestor_id).responseInt = conn.getWordsTable().getWordCount();\r
-                       release(r.requestor_id);\r
-               } else if (r.type == WordRequest.Add_Word_To_Note_Index) {\r
-                       conn.getWordsTable().addWordToNoteIndex(r.string1, r.string2, r.string3, r.int1);\r
-                       release(r.requestor_id);\r
-               } \r
-               logger.log(logger.EXTREME, "End of word request");\r
-       }\r
-       \r
-       \r
-       //**************************************\r
-       //* Invalid XML                        *\r
-       //**************************************\r
-       private void doInvalidXMLRequest(InvalidXMLRequest r) {\r
-               if (r.type == InvalidXMLRequest.Create_Table) {\r
-                       conn.getInvalidXMLTable().createTable();\r
-                       return;\r
-               } else if (r.type == InvalidXMLRequest.Drop_Table) {\r
-                       conn.getInvalidXMLTable().dropTable();\r
-                       return;\r
-               } else if (r.type == InvalidXMLRequest.Get_Invalid_Elements) {\r
-                       invalidXMLResponse.get(r.requestor_id).responseList = conn.getInvalidXMLTable().getInvalidElements();\r
-                       release(r.requestor_id);\r
-                       return;\r
-               } else if (r.type == InvalidXMLRequest.Get_Invalid_Attributes) {\r
-                       invalidXMLResponse.get(r.requestor_id).responseArrayList = conn.getInvalidXMLTable().getInvalidAttributes(r.string1);\r
-                       release(r.requestor_id);\r
-                       return;\r
-               } else if (r.type == InvalidXMLRequest.Get_Invalid_Attribute_Elements) {\r
-                       invalidXMLResponse.get(r.requestor_id).responseList = conn.getInvalidXMLTable().getInvalidAttributeElements();\r
-                       release(r.requestor_id);\r
-                       return;\r
-               } else if (r.type == InvalidXMLRequest.Add_Invalid_Element) {\r
-                       conn.getInvalidXMLTable().addElement(r.string1);\r
-                       return;\r
-               } else if (r.type == InvalidXMLRequest.Add_Invalid_Attribute) {\r
-                       conn.getInvalidXMLTable().addAttribute(r.string1, r.string2);\r
-                       return;\r
-               } \r
-       }\r
-       \r
-       \r
-       //**************************************\r
-       //* Sync database                      *\r
-       //**************************************\r
-       private void doSyncRequest(SyncRequest r) {\r
-               if (r.type == SyncRequest.Create_Table) {\r
-                       conn.getInvalidXMLTable().createTable();\r
-                       return;\r
-               } else if (r.type == SyncRequest.Drop_Table) {\r
-                       conn.getInvalidXMLTable().dropTable();\r
-                       return;\r
-               } else if (r.type == SyncRequest.Get_Record) {\r
-                       syncResponse.get(r.requestor_id).responseValue = conn.getSyncTable().getRecord(r.key);\r
-                       release(r.requestor_id);\r
-                       return;\r
-               }  else if (r.type == SyncRequest.Set_Record) {\r
-                       conn.getSyncTable().setRecord(r.key,r.value);\r
-                       return;\r
-               } \r
-       }\r
-}
\ No newline at end of file
index 80d4615..76a50fb 100644 (file)
@@ -50,19 +50,18 @@ public class IndexRunner extends QObject implements Runnable {
        private boolean                                         keepRunning;\r
 //     public volatile int                                     ID;\r
        private final QDomDocument                      doc;\r
        private boolean                                         keepRunning;\r
 //     public volatile int                                     ID;\r
        private final QDomDocument                      doc;\r
-       private final int                                                       threadID;\r
        private static String                           regex = Global.getWordRegex();\r
        private final DatabaseConnection        conn;\r
        private volatile LinkedBlockingQueue<String> workQueue;\r
 //     private static int MAX_EMPTY_QUEUE_COUNT = 1;\r
        private static int MAX_QUEUED_WAITING = 1000;\r
        private static String                           regex = Global.getWordRegex();\r
        private final DatabaseConnection        conn;\r
        private volatile LinkedBlockingQueue<String> workQueue;\r
 //     private static int MAX_EMPTY_QUEUE_COUNT = 1;\r
        private static int MAX_QUEUED_WAITING = 1000;\r
+\r
        \r
 \r
        \r
        \r
 \r
        \r
-       public IndexRunner(String logname) {\r
+       public IndexRunner(String logname, String u, String uid, String pswd, String cpswd) {\r
                logger = new ApplicationLogger(logname);\r
                logger = new ApplicationLogger(logname);\r
-               threadID = Global.indexThreadId;\r
-               conn = new DatabaseConnection(threadID);\r
+               conn = new DatabaseConnection(logger, u, uid, pswd, cpswd);\r
                noteSignal = new NoteSignal();\r
                resourceSignal = new NoteResourceSignal();\r
 //             threadSignal = new ThreadSignal();\r
                noteSignal = new NoteSignal();\r
                resourceSignal = new NoteResourceSignal();\r
 //             threadSignal = new ThreadSignal();\r
@@ -120,6 +119,7 @@ public class IndexRunner extends QObject implements Runnable {
                                e.printStackTrace();\r
                        }\r
                }\r
                                e.printStackTrace();\r
                        }\r
                }\r
+               conn.dbShutdown();\r
        }\r
        \r
        // Reindex a note\r
        }\r
        \r
        // Reindex a note\r
index 510055f..9efbd1a 100644 (file)
@@ -40,7 +40,6 @@ public class SaveRunner extends QObject implements Runnable {
        public QMutex                                           threadLock;\r
        private final DatabaseConnection        conn;\r
        private boolean                                         idle;\r
        public QMutex                                           threadLock;\r
        private final DatabaseConnection        conn;\r
        private boolean                                         idle;\r
-       private final int                                       threadID;\r
 \r
        private volatile LinkedBlockingQueue<Pair<String, String>> workQueue = new LinkedBlockingQueue<Pair<String, String>>();\r
        \r
 \r
        private volatile LinkedBlockingQueue<Pair<String, String>> workQueue = new LinkedBlockingQueue<Pair<String, String>>();\r
        \r
@@ -48,10 +47,9 @@ public class SaveRunner extends QObject implements Runnable {
        //*********************************************\r
        //* Constructor                               *\r
        //*********************************************\r
        //*********************************************\r
        //* Constructor                               *\r
        //*********************************************\r
-       public SaveRunner(String logname) {\r
+       public SaveRunner(String logname, String u, String uid, String pswd, String cpswd) {\r
                logger = new ApplicationLogger(logname);\r
                logger = new ApplicationLogger(logname);\r
-               threadID = Global.saveThreadId;\r
-               conn = new DatabaseConnection(threadID);\r
+               conn = new DatabaseConnection(logger, u, uid, pswd, cpswd);\r
                threadLock = new QMutex();\r
                keepRunning = true;\r
        }\r
                threadLock = new QMutex();\r
                keepRunning = true;\r
        }\r
@@ -92,6 +90,7 @@ public class SaveRunner extends QObject implements Runnable {
                                threadLock.unlock();\r
                        } catch (InterruptedException e) { }\r
                }\r
                                threadLock.unlock();\r
                        } catch (InterruptedException e) { }\r
                }\r
+               conn.dbShutdown();\r
        }\r
        \r
        \r
        }\r
        \r
        \r
index 45b73ef..5ed5137 100644 (file)
@@ -50,7 +50,6 @@ import com.evernote.edam.userstore.UserStore;
 import com.trolltech.qt.core.QObject;\r
 import com.trolltech.qt.gui.QMessageBox;\r
 \r
 import com.trolltech.qt.core.QObject;\r
 import com.trolltech.qt.gui.QMessageBox;\r
 \r
-import cx.fbn.nevernote.Global;\r
 import cx.fbn.nevernote.signals.NoteIndexSignal;\r
 import cx.fbn.nevernote.signals.NoteResourceSignal;\r
 import cx.fbn.nevernote.signals.NoteSignal;\r
 import cx.fbn.nevernote.signals.NoteIndexSignal;\r
 import cx.fbn.nevernote.signals.NoteResourceSignal;\r
 import cx.fbn.nevernote.signals.NoteSignal;\r
@@ -60,13 +59,13 @@ import cx.fbn.nevernote.signals.StatusSignal;
 import cx.fbn.nevernote.signals.SyncSignal;\r
 import cx.fbn.nevernote.signals.TagSignal;\r
 import cx.fbn.nevernote.sql.DatabaseConnection;\r
 import cx.fbn.nevernote.signals.SyncSignal;\r
 import cx.fbn.nevernote.signals.TagSignal;\r
 import cx.fbn.nevernote.sql.DatabaseConnection;\r
-import cx.fbn.nevernote.sql.runners.DeletedItemRecord;\r
+import cx.fbn.nevernote.sql.DeletedItemRecord;\r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 \r
 public class SyncRunner extends QObject implements Runnable {\r
        \r
        private final ApplicationLogger logger;\r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
 \r
 public class SyncRunner extends QObject implements Runnable {\r
        \r
        private final ApplicationLogger logger;\r
-               private final DatabaseConnection                conn;\r
+               private DatabaseConnection              conn;\r
                private boolean                                 idle;\r
                private boolean                                 error;\r
                public volatile boolean                 isConnected;\r
                private boolean                                 idle;\r
                private boolean                                 error;\r
                public volatile boolean                 isConnected;\r
@@ -113,10 +112,14 @@ public class SyncRunner extends QObject implements Runnable {
            private volatile LinkedBlockingQueue<String> workQueue;\r
 //             private static int MAX_EMPTY_QUEUE_COUNT = 1;\r
                private static int MAX_QUEUED_WAITING = 1000;\r
            private volatile LinkedBlockingQueue<String> workQueue;\r
 //             private static int MAX_EMPTY_QUEUE_COUNT = 1;\r
                private static int MAX_QUEUED_WAITING = 1000;\r
+               String dbuid;\r
+               String dburl;\r
+               String dbpswd;\r
+               String dbcpswd;\r
        \r
                \r
                \r
        \r
                \r
                \r
-       public SyncRunner(String logname) {\r
+       public SyncRunner(String logname, String u, String uid, String pswd, String cpswd) {\r
                logger = new ApplicationLogger(logname);\r
                \r
                noteSignal = new NoteSignal();\r
                logger = new ApplicationLogger(logname);\r
                \r
                noteSignal = new NoteSignal();\r
@@ -128,9 +131,12 @@ public class SyncRunner extends QObject implements Runnable {
                searchSignal = new SavedSearchSignal();\r
                syncSignal = new SyncSignal();\r
                resourceSignal = new NoteResourceSignal();\r
                searchSignal = new SavedSearchSignal();\r
                syncSignal = new SyncSignal();\r
                resourceSignal = new NoteResourceSignal();\r
-               \r
+               dbuid = uid;\r
+               dburl = u;\r
+               dbpswd = pswd;\r
+               dbcpswd = cpswd;\r
 //             this.setAutoDelete(false);\r
 //             this.setAutoDelete(false);\r
-               conn = new DatabaseConnection(Global.syncThreadId);\r
+               \r
                isConnected = false;\r
                syncNeeded = false;\r
                authRefreshNeeded = false;\r
                isConnected = false;\r
                syncNeeded = false;\r
                authRefreshNeeded = false;\r
@@ -147,6 +153,7 @@ public class SyncRunner extends QObject implements Runnable {
        public void run() {\r
                try {\r
                        logger.log(logger.EXTREME, "Starting thread");\r
        public void run() {\r
                try {\r
                        logger.log(logger.EXTREME, "Starting thread");\r
+                       conn = new DatabaseConnection(logger, dburl, dbuid, dbpswd, dbcpswd);\r
                        while(keepRunning) {\r
                                String work = workQueue.take();\r
                                logger.log(logger.EXTREME, "Work found: " +work);\r
                        while(keepRunning) {\r
                                String work = workQueue.take();\r
                                logger.log(logger.EXTREME, "Work found: " +work);\r
@@ -180,6 +187,7 @@ public class SyncRunner extends QObject implements Runnable {
                catch (InterruptedException e1) {\r
                        e1.printStackTrace();\r
                }\r
                catch (InterruptedException e1) {\r
                        e1.printStackTrace();\r
                }\r
+               conn.dbShutdown();\r
        }\r
 \r
        \r
        }\r
 \r
        \r
@@ -480,6 +488,9 @@ public class SyncRunner extends QObject implements Runnable {
                                        logger.log(logger.EXTREME, "Active dirty note found - non new");\r
                                        if (enNote.getUpdateSequenceNum() > 0) {\r
                                                enNote = getNoteContent(enNote);\r
                                        logger.log(logger.EXTREME, "Active dirty note found - non new");\r
                                        if (enNote.getUpdateSequenceNum() > 0) {\r
                                                enNote = getNoteContent(enNote);\r
+                                               System.out.println("--------");\r
+                                               System.out.println("Note:" +enNote);\r
+                                               System.out.println("--------");\r
                                                logger.log(logger.MEDIUM, "Updating note : "+ enNote.getGuid() +" <title>" +enNote.getTitle()+"</title>");\r
                                                enNote = noteStore.updateNote(authToken, enNote);\r
                                        } else { \r
                                                logger.log(logger.MEDIUM, "Updating note : "+ enNote.getGuid() +" <title>" +enNote.getTitle()+"</title>");\r
                                                enNote = noteStore.updateNote(authToken, enNote);\r
                                        } else { \r
@@ -1171,7 +1182,7 @@ public class SyncRunner extends QObject implements Runnable {
                        conn.getNoteTable().noteResourceTable.updateNoteResourceGuid(oldResG, newResG, true);\r
                }\r
                \r
                        conn.getNoteTable().noteResourceTable.updateNoteResourceGuid(oldResG, newResG, true);\r
                }\r
                \r
-               conn.getNoteTable().resetSequenceNumber(guid);\r
+               conn.getNoteTable().resetNoteSequence(guid);\r
                conn.getNoteTable().updateNoteGuid(guid, newGuid);\r
                conn.getNoteTable().updateNoteNotebook(newGuid, notebookGuid, true);\r
                \r
                conn.getNoteTable().updateNoteGuid(guid, newGuid);\r
                conn.getNoteTable().updateNoteNotebook(newGuid, notebookGuid, true);\r
                \r
index ea1073d..3694608 100644 (file)
@@ -50,7 +50,6 @@ import cx.fbn.nevernote.signals.TagSignal;
 import cx.fbn.nevernote.signals.ThreadSignal;\r
 import cx.fbn.nevernote.signals.TrashSignal;\r
 import cx.fbn.nevernote.sql.DatabaseConnection;\r
 import cx.fbn.nevernote.signals.ThreadSignal;\r
 import cx.fbn.nevernote.signals.TrashSignal;\r
 import cx.fbn.nevernote.sql.DatabaseConnection;\r
-import cx.fbn.nevernote.sql.runners.NoteTagsRecord;\r
 import cx.fbn.nevernote.threads.CounterRunner;\r
 import cx.fbn.nevernote.threads.SaveRunner;\r
 \r
 import cx.fbn.nevernote.threads.CounterRunner;\r
 import cx.fbn.nevernote.threads.SaveRunner;\r
 \r
@@ -125,21 +124,21 @@ public class ListManager  {
                reloadIndexes();\r
                \r
                notebookSignal = new NotebookSignal();\r
                reloadIndexes();\r
                \r
                notebookSignal = new NotebookSignal();\r
-               notebookCounterRunner = new CounterRunner("notebook_counter.log", CounterRunner.NOTEBOOK);\r
+               notebookCounterRunner = new CounterRunner("notebook_counter.log", CounterRunner.NOTEBOOK, Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);\r
                notebookCounterRunner.setNoteIndex(getNoteIndex());\r
                notebookCounterRunner.notebookSignal.countsChanged.connect(this, "setNotebookCounter(List)");\r
                notebookThread = new QThread(notebookCounterRunner, "Notebook Counter Thread");\r
                notebookThread.start();\r
                \r
                tagSignal = new TagSignal();\r
                notebookCounterRunner.setNoteIndex(getNoteIndex());\r
                notebookCounterRunner.notebookSignal.countsChanged.connect(this, "setNotebookCounter(List)");\r
                notebookThread = new QThread(notebookCounterRunner, "Notebook Counter Thread");\r
                notebookThread.start();\r
                \r
                tagSignal = new TagSignal();\r
-               tagCounterRunner = new CounterRunner("tag_counter.log", CounterRunner.TAG);\r
+               tagCounterRunner = new CounterRunner("tag_counter.log", CounterRunner.TAG, Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);\r
                tagCounterRunner.setNoteIndex(getNoteIndex());\r
                tagCounterRunner.tagSignal.countsChanged.connect(this, "setTagCounter(List)");\r
                tagThread = new QThread(tagCounterRunner, "Tag Counter Thread");\r
                tagThread.start();\r
                \r
                trashSignal = new TrashSignal();\r
                tagCounterRunner.setNoteIndex(getNoteIndex());\r
                tagCounterRunner.tagSignal.countsChanged.connect(this, "setTagCounter(List)");\r
                tagThread = new QThread(tagCounterRunner, "Tag Counter Thread");\r
                tagThread.start();\r
                \r
                trashSignal = new TrashSignal();\r
-               trashCounterRunner = new CounterRunner("trash_counter.log", CounterRunner.TRASH);\r
+               trashCounterRunner = new CounterRunner("trash_counter.log", CounterRunner.TRASH, Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);\r
                trashCounterRunner.trashSignal.countChanged.connect(this, "trashSignalReceiver(Integer)");\r
                trashThread = new QThread(trashCounterRunner, "Trash Counter Thread");\r
                trashThread.start();\r
                trashCounterRunner.trashSignal.countChanged.connect(this, "trashSignalReceiver(Integer)");\r
                trashThread = new QThread(trashCounterRunner, "Trash Counter Thread");\r
                trashThread.start();\r
@@ -149,7 +148,7 @@ public class ListManager  {
                tagSignal = new TagSignal();\r
                \r
                logger.log(logger.EXTREME, "Setting save thread");\r
                tagSignal = new TagSignal();\r
                \r
                logger.log(logger.EXTREME, "Setting save thread");\r
-               saveRunner = new SaveRunner("saveRunner.log");\r
+               saveRunner = new SaveRunner("saveRunner.log", Global.getDatabaseUrl(), Global.getDatabaseUserid(), Global.getDatabaseUserPassword(), Global.cipherPassword);\r
                saveThread = new QThread(saveRunner, "Save Runner Thread");\r
                saveThread.start();\r
 \r
                saveThread = new QThread(saveRunner, "Save Runner Thread");\r
                saveThread.start();\r
 \r
@@ -219,7 +218,7 @@ public class ListManager  {
                masterNoteIndex = conn.getNoteTable().getAllNotes();\r
                // For performance reasons, we didn't get the tags for every note individually.  We now need to \r
                // get them\r
                masterNoteIndex = conn.getNoteTable().getAllNotes();\r
                // For performance reasons, we didn't get the tags for every note individually.  We now need to \r
                // get them\r
-               List<NoteTagsRecord> noteTags = conn.getNoteTable().noteTagsTable.getAllNoteTags();\r
+               List<cx.fbn.nevernote.sql.NoteTagsRecord> noteTags = conn.getNoteTable().noteTagsTable.getAllNoteTags();\r
                for (int i=0; i<masterNoteIndex.size(); i++) {\r
                        List<String> tags = new ArrayList<String>();\r
                        List<String> names = new ArrayList<String>();\r
                for (int i=0; i<masterNoteIndex.size(); i++) {\r
                        List<String> tags = new ArrayList<String>();\r
                        List<String> names = new ArrayList<String>();\r
@@ -257,7 +256,7 @@ public class ListManager  {
                // load saved search index\r
                setSavedSearchIndex(conn.getSavedSearchTable().getAll());\r
                // Load search helper utility\r
                // load saved search index\r
                setSavedSearchIndex(conn.getSavedSearchTable().getAll());\r
                // Load search helper utility\r
-               enSearch = new EnSearch(id,  "", getTagIndex(), Global.getMinimumWordLength(), Global.getRecognitionWeight());\r
+               enSearch = new EnSearch(conn,  logger, "", getTagIndex(), Global.getMinimumWordLength(), Global.getRecognitionWeight());\r
                logger.log(logger.HIGH, "Building note index");\r
 \r
                if (masterNoteIndex == null) { \r
                logger.log(logger.HIGH, "Building note index");\r
 \r
                if (masterNoteIndex == null) { \r
@@ -265,7 +264,7 @@ public class ListManager  {
                }\r
                // For performance reasons, we didn't get the tags for every note individually.  We now need to \r
                // get them\r
                }\r
                // For performance reasons, we didn't get the tags for every note individually.  We now need to \r
                // get them\r
-               List<NoteTagsRecord> noteTags = conn.getNoteTable().noteTagsTable.getAllNoteTags();\r
+               List<cx.fbn.nevernote.sql.NoteTagsRecord> noteTags = conn.getNoteTable().noteTagsTable.getAllNoteTags();\r
                for (int i=0; i<masterNoteIndex.size(); i++) {\r
                        List<String> tags = new ArrayList<String>();\r
                        List<String> names = new ArrayList<String>();\r
                for (int i=0; i<masterNoteIndex.size(); i++) {\r
                        List<String> tags = new ArrayList<String>();\r
                        List<String> names = new ArrayList<String>();\r
@@ -389,7 +388,7 @@ public class ListManager  {
     //***************************************************************\r
     //***************************************************************\r
        public void setEnSearch(String t) {\r
     //***************************************************************\r
     //***************************************************************\r
        public void setEnSearch(String t) {\r
-               enSearch = new EnSearch(id, t, getTagIndex(), Global.getMinimumWordLength(), Global.getRecognitionWeight());\r
+               enSearch = new EnSearch(conn,logger, t, getTagIndex(), Global.getMinimumWordLength(), Global.getRecognitionWeight());\r
                enSearchChanged = true;\r
        }\r
        // Save search tags\r
                enSearchChanged = true;\r
        }\r
        // Save search tags\r
@@ -674,6 +673,33 @@ public class ListManager  {
                conn.getNoteTable().updateNoteAuthor(guid, author);\r
        }\r
        // Author has changed\r
                conn.getNoteTable().updateNoteAuthor(guid, author);\r
        }\r
        // Author has changed\r
+       public void updateNoteGeoTag(String guid, Double lon, Double lat, Double alt) {\r
+               for (int i=0; i<masterNoteIndex.size(); i++) {\r
+                       if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
+                               masterNoteIndex.get(i).getAttributes().setLongitude(lon);\r
+                               masterNoteIndex.get(i).getAttributes().setLongitudeIsSet(true);\r
+                               masterNoteIndex.get(i).getAttributes().setLatitude(lat);\r
+                               masterNoteIndex.get(i).getAttributes().setLatitudeIsSet(true);\r
+                               masterNoteIndex.get(i).getAttributes().setAltitude(alt);\r
+                               masterNoteIndex.get(i).getAttributes().setAltitudeIsSet(true);\r
+                               i = masterNoteIndex.size();\r
+                       }       \r
+               }\r
+               // Update the list tables \r
+               for (int i=0; i<getNoteIndex().size(); i++) {\r
+                       if (getNoteIndex().get(i).getGuid().equals(guid)) {\r
+                               getNoteIndex().get(i).getAttributes().setLongitude(lon);\r
+                               getNoteIndex().get(i).getAttributes().setLongitudeIsSet(true);\r
+                               getNoteIndex().get(i).getAttributes().setLatitude(lat);\r
+                               getNoteIndex().get(i).getAttributes().setLatitudeIsSet(true);\r
+                               getNoteIndex().get(i).getAttributes().setAltitude(alt);\r
+                               getNoteIndex().get(i).getAttributes().setAltitudeIsSet(true);\r
+                               i = getNoteIndex().size();\r
+                       }\r
+               }\r
+               conn.getNoteTable().updateNoteGeoTags(guid, lon, lat, alt);\r
+       }\r
+       // Author has changed\r
        public void updateNoteSourceUrl(String guid, String url) {\r
                for (int i=0; i<masterNoteIndex.size(); i++) {\r
                        if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r
        public void updateNoteSourceUrl(String guid, String url) {\r
                for (int i=0; i<masterNoteIndex.size(); i++) {\r
                        if (masterNoteIndex.get(i).getGuid().equals(guid)) {\r