[evolution-data-server] Bug #562015 - CalDAV - Store CTag in a cache



commit 9e2e454642b4e12a8a225260ddcdedb15fc8e2fe
Author: Milan Crha <mcrha redhat com>
Date:   Wed May 27 13:53:38 2009 +0200

    Bug #562015 - CalDAV - Store CTag in a cache
    
    Improved storing of a CTag, store it to a cache, to not fetch
    whole calendar every start, only when CTag changed.
    It's only part of that bug, it's not fixing it fully.
---
 calendar/backends/caldav/e-cal-backend-caldav.c |   19 ++++++--------
 calendar/libedata-cal/e-cal-backend-cache.c     |   31 ++++++++++++++++++----
 2 files changed, 33 insertions(+), 17 deletions(-)

diff --git a/calendar/backends/caldav/e-cal-backend-caldav.c b/calendar/backends/caldav/e-cal-backend-caldav.c
index 78002ca..364728e 100644
--- a/calendar/backends/caldav/e-cal-backend-caldav.c
+++ b/calendar/backends/caldav/e-cal-backend-caldav.c
@@ -49,6 +49,8 @@
 
 #define d(x)
 
+#define CALDAV_CTAG_KEY "CALDAV_CTAG"
+
 /* in seconds */
 #define DEFAULT_REFRESH_TIME 60
 
@@ -112,7 +114,6 @@ struct _ECalBackendCalDAVPrivate {
 
 	/* support for 'getctag' extension */
 	gboolean ctag_supported;
-	gchar *ctag;
 };
 
 /* ************************************************************************* */
@@ -1037,14 +1038,16 @@ check_calendar_changed_on_server (ECalBackendCalDAV *cbdav)
 		char *ctag = NULL;
 
 		if (parse_getctag_response (message, &ctag)) {
-			if (ctag && priv->ctag && g_str_equal (ctag, priv->ctag)) {
+			const char *my_ctag = e_cal_backend_cache_get_key_value (priv->cache, CALDAV_CTAG_KEY);
+
+			if (ctag && my_ctag && g_str_equal (ctag, my_ctag)) {
 				/* ctag is same, no change in the calendar */
 				result = FALSE;
-				g_free (ctag);
 			} else {
-				g_free (priv->ctag);
-				priv->ctag = ctag;
+				e_cal_backend_cache_put_key_value (priv->cache, CALDAV_CTAG_KEY, ctag);
 			}
+
+			g_free (ctag);
 		} else {
 			priv->ctag_supported = FALSE;
 		}
@@ -1896,8 +1899,6 @@ caldav_do_open (ECalBackendSync *backend,
 	g_mutex_lock (priv->lock);
 
 	/* let it decide the 'getctag' extension availability again */
-	g_free (priv->ctag);
-	priv->ctag = NULL;
 	priv->ctag_supported = TRUE;
 
 	if (!priv->loaded) {
@@ -3655,9 +3656,6 @@ e_cal_backend_caldav_finalize (GObject *object)
 	cbdav = E_CAL_BACKEND_CALDAV (object);
 	priv = E_CAL_BACKEND_CALDAV_GET_PRIVATE (cbdav);
 
-	g_free (priv->ctag);
-	priv->ctag = NULL;
-
 	g_mutex_free (priv->lock);
 	g_cond_free (priv->cond);
 	g_cond_free (priv->slave_gone_cond);
@@ -3693,7 +3691,6 @@ e_cal_backend_caldav_init (ECalBackendCalDAV *cbdav)
 
 	/* Thinks the 'getctag' extension is available the first time, but unset it when realizes it isn't. */
 	priv->ctag_supported = TRUE;
-	priv->ctag = NULL;
 
 	priv->lock = g_mutex_new ();
 	priv->cond = g_cond_new ();
diff --git a/calendar/libedata-cal/e-cal-backend-cache.c b/calendar/libedata-cal/e-cal-backend-cache.c
index 763f170..bfc75ef 100644
--- a/calendar/libedata-cal/e-cal-backend-cache.c
+++ b/calendar/libedata-cal/e-cal-backend-cache.c
@@ -46,7 +46,7 @@ static char *
 get_filename_from_uri (const char *uri, ECalSourceType source_type)
 {
 	char *mangled_uri, *filename;
-	char *source = NULL;
+	const char *source = NULL;
 	int i;
 
 	switch (source_type) {
@@ -832,6 +832,14 @@ e_cal_backend_cache_get_server_utc_time (ECalBackendCache *cache)
        	return	e_file_cache_get_object (E_FILE_CACHE (cache), "server_utc_time");
 }
 
+static char *
+get_keys_key (const char *key)
+{
+	g_return_val_if_fail (key != NULL, NULL);
+
+	return g_strconcat ("keys::", key, NULL);
+}
+
 /**
  * e_cal_backend_cache_put_key_value:
  * @cache: An #ECalBackendCache object.
@@ -843,17 +851,22 @@ e_cal_backend_cache_get_server_utc_time (ECalBackendCache *cache)
 gboolean
 e_cal_backend_cache_put_key_value (ECalBackendCache *cache, const char *key, const char *value)
 {
+	char *real_key;
 	gboolean ret_val = FALSE;
 
 	g_return_val_if_fail (E_IS_CAL_BACKEND_CACHE (cache), FALSE);
 
-	if (value) {
-		e_file_cache_remove_object (E_FILE_CACHE (cache), key);
+	real_key = get_keys_key (key);
+	if (!value) {
+		e_file_cache_remove_object (E_FILE_CACHE (cache), real_key);
+		g_free (real_key);
 		return TRUE;
 	}
 
-	if (!(ret_val = e_file_cache_add_object (E_FILE_CACHE (cache), key, value)))
-		ret_val = e_file_cache_replace_object (E_FILE_CACHE (cache), key, value);
+	if (!(ret_val = e_file_cache_add_object (E_FILE_CACHE (cache), real_key, value)))
+		ret_val = e_file_cache_replace_object (E_FILE_CACHE (cache), real_key, value);
+
+	g_free (real_key);
 
 	return ret_val;
 }
@@ -867,8 +880,14 @@ e_cal_backend_cache_put_key_value (ECalBackendCache *cache, const char *key, con
 const char *
 e_cal_backend_cache_get_key_value (ECalBackendCache *cache, const char *key)
 {
+	char *real_key;
+	const char *value;
 
 	g_return_val_if_fail (E_IS_CAL_BACKEND_CACHE (cache), NULL);
 
-       	return	e_file_cache_get_object (E_FILE_CACHE (cache), key);
+	real_key = get_keys_key (key);
+	value = e_file_cache_get_object (E_FILE_CACHE (cache), real_key);
+	g_free (real_key);
+
+	return value;
 }



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