[almanah] VFS: Included a "finish" function
- From: Álvaro Peña <alvaropg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [almanah] VFS: Included a "finish" function
- Date: Mon, 15 Jun 2015 09:19:33 +0000 (UTC)
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]