[almanah] VFS: Included a "finish" function



commit e00f13e5e2031edf8b55f1e9b0e18db826ecf772
Author: Álvaro Peña <alvaropg gmail com>
Date:   Mon Jun 15 10:22:46 2015 +0200

    VFS: Included a "finish" function
    
    Because the Sqlite VFS requires a GSettings pointer
    to read the encryption key ID, the sqlite3_vfs struct
    is not a static struct but a kind of singleton.
    
    So every time that you need to change the settings provider,
    it's required to a call the almanah_vfs_finish function in
    order to clear the last sqlite3_vfs struct (freeing memory)
    and (the most important) unregister the Almanah VFS in the
    SQLite3 list of VFS providers.
    
    See https://bugzilla.gnome.org/show_bug.cgi?id=659500

 src/storage-manager.c |    1 +
 src/vfs.c             |   58 ++++++++++++++++++++++++++++++------------------
 src/vfs.h             |    3 +-
 tests/gtests_vfs.c    |    4 +++
 4 files changed, 43 insertions(+), 23 deletions(-)
---
diff --git a/src/storage-manager.c b/src/storage-manager.c
index c925444..01a65da 100644
--- a/src/storage-manager.c
+++ b/src/storage-manager.c
@@ -268,6 +268,7 @@ almanah_storage_manager_disconnect (AlmanahStorageManager *self, __attribute__ (
        else
                g_signal_emit (self, storage_manager_signals[SIGNAL_DISCONNECTED], 0, NULL, NULL);
 
+       almanah_vfs_finish();
 
        return TRUE;
 }
diff --git a/src/vfs.c b/src/vfs.c
index ae0d835..092dafc 100644
--- a/src/vfs.c
+++ b/src/vfs.c
@@ -53,6 +53,10 @@
 
 #include <config.h>
 
+/* VFS singleton and not a sqlite3_vfs static struct
+   due GSettings is setup in initialization time */
+static sqlite3_vfs *almanah_vfs_singleton = NULL;
+
 #define ENCRYPTED_SUFFIX ".encrypted"
 
 /*
@@ -1244,32 +1248,32 @@ almanah_vfs_current_time (__attribute__ ((unused)) sqlite3_vfs *pVfs, double *pT
 ** This function returns a pointer to the VFS implemented in this file.
 ** To make the VFS available to SQLite:
 **
-**   sqlite3_vfs_register(sqlite3_demovfs(), 0);
+**   sqlite3_vfs_register(sqlite3_almanah_vfs(settings), 0);
 */
 sqlite3_vfs*
 sqlite3_almanah_vfs (GSettings *settings)
 {
-       sqlite3_vfs *almanah_vfs;
-
-       almanah_vfs = (sqlite3_vfs *) g_new0(sqlite3_vfs, 1);
-       almanah_vfs->iVersion = 1;
-       almanah_vfs->szOsFile = sizeof(AlmanahSQLiteVFS);
-       almanah_vfs->mxPathname = MAXPATHNAME;
-       almanah_vfs->zName = "almanah";
-       almanah_vfs->pAppData = settings;
-       almanah_vfs->xOpen = almanah_vfs_open;
-       almanah_vfs->xDelete = almanah_vfs_delete;
-       almanah_vfs->xAccess = almanah_vfs_access;
-       almanah_vfs->xFullPathname = almanah_vfs_full_pathname;
-       almanah_vfs->xDlOpen = almanah_vfs_dl_open;
-       almanah_vfs->xDlError = almanah_vfs_dl_error;
-       almanah_vfs->xDlSym  = almanah_vfs_dl_sym;
-       almanah_vfs->xDlClose = almanah_vfs_dl_close;
-       almanah_vfs->xRandomness = almanah_vfs_randomness;
-       almanah_vfs->xSleep = almanah_vfs_sleep;
-       almanah_vfs->xCurrentTime = almanah_vfs_current_time;
-
-       return almanah_vfs;
+       if (almanah_vfs_singleton == NULL) {
+               almanah_vfs_singleton = (sqlite3_vfs *) g_new0(sqlite3_vfs, 1);
+               almanah_vfs_singleton->iVersion = 1;
+               almanah_vfs_singleton->szOsFile = sizeof(AlmanahSQLiteVFS);
+               almanah_vfs_singleton->mxPathname = MAXPATHNAME;
+               almanah_vfs_singleton->zName = "almanah";
+               almanah_vfs_singleton->pAppData = settings;
+               almanah_vfs_singleton->xOpen = almanah_vfs_open;
+               almanah_vfs_singleton->xDelete = almanah_vfs_delete;
+               almanah_vfs_singleton->xAccess = almanah_vfs_access;
+               almanah_vfs_singleton->xFullPathname = almanah_vfs_full_pathname;
+               almanah_vfs_singleton->xDlOpen = almanah_vfs_dl_open;
+               almanah_vfs_singleton->xDlError = almanah_vfs_dl_error;
+               almanah_vfs_singleton->xDlSym  = almanah_vfs_dl_sym;
+               almanah_vfs_singleton->xDlClose = almanah_vfs_dl_close;
+               almanah_vfs_singleton->xRandomness = almanah_vfs_randomness;
+               almanah_vfs_singleton->xSleep = almanah_vfs_sleep;
+               almanah_vfs_singleton->xCurrentTime = almanah_vfs_current_time;
+       }
+
+       return almanah_vfs_singleton;
 }
 
 int
@@ -1277,3 +1281,13 @@ almanah_vfs_init (GSettings *settings)
 {
        return sqlite3_vfs_register (sqlite3_almanah_vfs (settings), 0);
 }
+
+void
+almanah_vfs_finish (void)
+{
+       if (almanah_vfs_singleton)
+               sqlite3_vfs_unregister (almanah_vfs_singleton);
+
+       g_free (almanah_vfs_singleton);
+       almanah_vfs_singleton = NULL;
+}
diff --git a/src/vfs.h b/src/vfs.h
index 4c71b2f..34d3b28 100644
--- a/src/vfs.h
+++ b/src/vfs.h
@@ -19,4 +19,5 @@
 
 #include <gio/gio.h>
 
-int almanah_vfs_init(GSettings *settings);
+int  almanah_vfs_init   (GSettings *settings);
+void almanah_vfs_finish (void);
diff --git a/tests/gtests_vfs.c b/tests/gtests_vfs.c
index 1c98f96..20c67b2 100644
--- a/tests/gtests_vfs.c
+++ b/tests/gtests_vfs.c
@@ -147,6 +147,8 @@ almanah_test_vfs_enc_teardown (struct AlmanahTestVfsFixture *fixture, __attribut
                gpgme_release (fixture->gpgme_context);
        }
 
+       almanah_vfs_finish ();
+
        g_unlink (ALMANAH_TEST_VFS_DATABASE);
        g_unlink (ALMANAH_TEST_VFS_DATABASE".encrypted");
 }
@@ -161,6 +163,8 @@ almanah_test_vfs_plain_teardown (struct AlmanahTestVfsFixture *fixture, __attrib
        if (fixture->db != NULL)
                sqlite3_close (fixture->db);
 
+       almanah_vfs_finish ();
+
        g_unlink (ALMANAH_TEST_VFS_DATABASE);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]