[tracker/async-queries-wip: 21/23] WIP
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/async-queries-wip: 21/23] WIP
- Date: Thu, 15 Apr 2010 12:14:34 +0000 (UTC)
commit 42bf98f0ba5d543fff7092def03b5c5a2352f359
Author: Jürg Billeter <j bitron ch>
Date: Wed Apr 14 19:42:48 2010 +0200
WIP
src/libtracker-db/tracker-db-interface-sqlite.c | 71 +++++++++++++++++++++++
src/libtracker-db/tracker-db-interface-sqlite.h | 3 +
src/libtracker-db/tracker-db-manager.c | 39 +------------
src/libtracker-db/tracker-db-manager.h | 3 -
src/tracker-store/tracker-store.c | 3 +
5 files changed, 79 insertions(+), 40 deletions(-)
---
diff --git a/src/libtracker-db/tracker-db-interface-sqlite.c b/src/libtracker-db/tracker-db-interface-sqlite.c
index f257014..6e056da 100644
--- a/src/libtracker-db/tracker-db-interface-sqlite.c
+++ b/src/libtracker-db/tracker-db-interface-sqlite.c
@@ -138,9 +138,80 @@ G_DEFINE_TYPE_WITH_CODE (TrackerDBCursorSqlite, tracker_db_cursor_sqlite, G_TYPE
G_IMPLEMENT_INTERFACE (TRACKER_TYPE_DB_CURSOR,
tracker_db_cursor_sqlite_iface_init))
+/* from GLib */
+#define STRUCT_ALIGNMENT (2 * sizeof (gsize))
+#define ALIGN_STRUCT(offset) \
+ ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT)
+
+static sqlite3_vfs *default_vfs = NULL;
+
+#define DEFAULT_METHODS(file) (*((const sqlite3_io_methods **) ((gchar *) file + ALIGN_STRUCT(default_vfs->szOsFile))))
+
+static gboolean db_locked = FALSE;
+
+static int
+my_lock (sqlite3_file* file, int locktype)
+{
+ if (locktype >= SQLITE_LOCK_PENDING) {
+ g_warning ("%p locked %d", file, locktype);
+ db_locked = TRUE;
+ }
+ int rc = DEFAULT_METHODS(file)->xLock (file, locktype);
+ return rc;
+}
+
+/*static const sqlite3_io_methods my_methods = {
+ 1,
+ my_close,
+ my_read,
+ my_write,
+ my_truncate,
+ my_sync,
+ my_file_size,
+ my_lock,
+ my_unlock,
+ my_cklock,
+ my_file_control,
+ my_sector_size,
+ my_
+};*/
+
+static int
+my_open (sqlite3_vfs *vfs, const char *zName, sqlite3_file* file, int flags, int *pOutFlags)
+{
+ int rc = default_vfs->xOpen (vfs, zName, file, flags, pOutFlags);
+ g_warning ("%p %s", file, zName);
+ if ((flags & SQLITE_OPEN_MAIN_DB) && file->pMethods) {
+ sqlite3_io_methods *my_methods = g_memdup (file->pMethods, sizeof (sqlite3_io_methods));
+ my_methods->xLock = my_lock;
+
+ DEFAULT_METHODS(file) = file->pMethods;
+ file->pMethods = my_methods;
+ }
+ return rc;
+}
+
+gboolean
+tracker_db_manager_pending_lock (void)
+{
+ if (db_locked) {
+ db_locked = FALSE;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
void
tracker_db_interface_sqlite_enable_shared_cache (void)
{
+ default_vfs = sqlite3_vfs_find (NULL);
+ sqlite3_vfs *wrapper = g_memdup (default_vfs, sizeof (sqlite3_vfs));
+ wrapper->szOsFile = ALIGN_STRUCT(default_vfs->szOsFile) + sizeof (gpointer);
+ wrapper->xOpen = my_open;
+
+ sqlite3_vfs_register (wrapper, TRUE);
+
sqlite3_config (SQLITE_CONFIG_MULTITHREAD);
//sqlite3_enable_shared_cache (1);
}
diff --git a/src/libtracker-db/tracker-db-interface-sqlite.h b/src/libtracker-db/tracker-db-interface-sqlite.h
index adf579e..f7dc6b5 100644
--- a/src/libtracker-db/tracker-db-interface-sqlite.h
+++ b/src/libtracker-db/tracker-db-interface-sqlite.h
@@ -63,6 +63,9 @@ void tracker_db_interface_sqlite_enable_shared_cache (void);
void tracker_db_interface_sqlite_fts_init (TrackerDBInterfaceSqlite *interface,
gboolean create);
+gboolean
+tracker_db_manager_pending_lock (void);
+
G_END_DECLS
#endif /* __LIBTRACKER_DB_INTERFACE_SQLITE_H__ */
diff --git a/src/libtracker-db/tracker-db-manager.c b/src/libtracker-db/tracker-db-manager.c
index 2180b0e..6af6d5b 100644
--- a/src/libtracker-db/tracker-db-manager.c
+++ b/src/libtracker-db/tracker-db-manager.c
@@ -113,7 +113,7 @@ static TrackerDBDefinition dbs[] = {
"meta.db",
"meta",
NULL,
- 2000,
+ 20000,
TRACKER_DB_PAGE_SIZE_DONT_SET,
FALSE,
FALSE,
@@ -135,7 +135,7 @@ static TrackerDBDefinition dbs[] = {
"fulltext.db",
"fulltext",
NULL,
- 512,
+ 51200,
TRACKER_DB_PAGE_SIZE_DONT_SET,
FALSE,
TRUE,
@@ -1523,38 +1523,3 @@ tracker_db_interface_pool_execute_query_async (TrackerDBInterfacePool *pool,
}
}
-#define PENDING_BYTE 0x40000000
-#define SHARED_FIRST (PENDING_BYTE+2)
-#define SHARED_SIZE 510
-
-gboolean
-tracker_db_manager_pending_lock (void)
-{
- static int fd1 = -1;
- static int fd2 = -1;
-
- if (G_UNLIKELY (fd1 == -1)) {
- fd1 = open ("/home/juerg/.cache/tracker/meta.db", O_RDWR);
- fd2 = open ("/home/juerg/.cache/tracker/fulltext.db", O_RDWR);
- }
-
- struct flock lock;
- lock.l_len = SHARED_SIZE;
- lock.l_whence = SEEK_SET;
- lock.l_type = F_WRLCK;
- lock.l_start = SHARED_FIRST;
- if (fcntl (fd1, F_SETLK, &lock) == -1) {
- /* wouldn't be able to get exclusive lock, must already be locked */
- return TRUE;
- } else {
- lock.l_type = F_WRLCK;
- if (fcntl (fd2, F_SETLK, &lock) == -1) {
- /* wouldn't be able to get exclusive lock, must already be locked */
- return TRUE;
- }
- lock.l_type = F_UNLCK;
- fcntl (fd1, F_SETLK, &lock);
- lock.l_type = F_UNLCK;
- fcntl (fd2, F_SETLK, &lock);
- }
-}
diff --git a/src/libtracker-db/tracker-db-manager.h b/src/libtracker-db/tracker-db-manager.h
index b3e44bf..7e7b865 100644
--- a/src/libtracker-db/tracker-db-manager.h
+++ b/src/libtracker-db/tracker-db-manager.h
@@ -104,9 +104,6 @@ void tracker_db_interface_pool_execute_query_async (TrackerDBIn
GAsyncReadyCallback callback,
gpointer user_data);
-gboolean
-tracker_db_manager_pending_lock (void);
-
G_END_DECLS
#endif /* __LIBTRACKER_DB_MANAGER_H__ */
diff --git a/src/tracker-store/tracker-store.c b/src/tracker-store/tracker-store.c
index 9faa238..75e04f5 100644
--- a/src/tracker-store/tracker-store.c
+++ b/src/tracker-store/tracker-store.c
@@ -192,6 +192,9 @@ end_batch (TrackerStorePrivate *private)
/* commit pending batch items */
tracker_data_commit_db_transaction ();
+ /* the above commit will trigger a lock again, reset it */
+ tracker_db_manager_pending_lock ();
+
private->batch_mode = FALSE;
private->batch_count = 0;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]