[tracker/async-queries-wip: 21/23] WIP



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]