From c10bf6bde08ae3abd2e15fa2107885c5e79157f0 Mon Sep 17 00:00:00 2001 From: Bart Van Der Meerssche Date: Fri, 18 Sep 2009 21:57:39 +0000 Subject: [PATCH] web: disable filter caching to allow image_annotate to work in conjunction with img_assist --- .../cache_no_filter/cache_no_filter.inc | 193 ++++++++++++++++++ .../settings.conf.no.filter.cache.patch | 15 ++ 2 files changed, 208 insertions(+) create mode 100644 web/drupal/modules/cache_no_filter/cache_no_filter.inc create mode 100644 web/drupal/modules/logger/patches/settings.conf.no.filter.cache.patch diff --git a/web/drupal/modules/cache_no_filter/cache_no_filter.inc b/web/drupal/modules/cache_no_filter/cache_no_filter.inc new file mode 100644 index 0000000..3c016d9 --- /dev/null +++ b/web/drupal/modules/cache_no_filter/cache_no_filter.inc @@ -0,0 +1,193 @@ +data)) { + // If the data is permanent or we're not enforcing a minimum cache lifetime + // always return the cached data. + if ($cache->expire == CACHE_PERMANENT || !variable_get('cache_lifetime', 0)) { + $cache->data = db_decode_blob($cache->data); + if ($cache->serialized) { + $cache->data = unserialize($cache->data); + } + } + // If enforcing a minimum cache lifetime, validate that the data is + // currently valid for this user before we return it by making sure the + // cache entry was created before the timestamp in the current session's + // cache timer. The cache variable is loaded into the $user object by + // sess_read() in session.inc. + else { + if ($user->cache > $cache->created) { + // This cache data is too old and thus not valid for us, ignore it. + return 0; + } + else { + $cache->data = db_decode_blob($cache->data); + if ($cache->serialized) { + $cache->data = unserialize($cache->data); + } + } + } + return $cache; + } + return 0; +} + +/** + * Store data in the persistent cache. + * + * The persistent cache is split up into four database + * tables. Contributed modules can add additional tables. + * + * 'cache_page': This table stores generated pages for anonymous + * users. This is the only table affected by the page cache setting on + * the administrator panel. + * + * 'cache_menu': Stores the cachable part of the users' menus. + * + * 'cache_filter': Stores filtered pieces of content. This table is + * periodically cleared of stale entries by cron. + * + * 'cache': Generic cache storage table. + * + * The reasons for having several tables are as follows: + * + * - smaller tables allow for faster selects and inserts + * - we try to put fast changing cache items and rather static + * ones into different tables. The effect is that only the fast + * changing tables will need a lot of writes to disk. The more + * static tables will also be better cachable with MySQL's query cache + * + * @param $cid + * The cache ID of the data to store. + * @param $data + * The data to store in the cache. Complex data types will be automatically serialized before insertion. + * Strings will be stored as plain text and not serialized. + * @param $table + * The table $table to store the data in. Valid core values are 'cache_filter', + * 'cache_menu', 'cache_page', or 'cache'. + * @param $expire + * One of the following values: + * - CACHE_PERMANENT: Indicates that the item should never be removed unless + * explicitly told to using cache_clear_all() with a cache ID. + * - CACHE_TEMPORARY: Indicates that the item should be removed at the next + * general cache wipe. + * - A Unix timestamp: Indicates that the item should be kept at least until + * the given time, after which it behaves like CACHE_TEMPORARY. + * @param $headers + * A string containing HTTP header information for cached pages. + */ +function cache_set($cid, $data, $table = 'cache', $expire = CACHE_PERMANENT, $headers = NULL) { + //BVDM: disable filter caching for image_annotate to work on img_assist inserted images + if ($table == 'cache_filter') { + return 0; + } + + $serialized = 0; + if (is_object($data) || is_array($data)) { + $data = serialize($data); + $serialized = 1; + } + $created = time(); + db_query("UPDATE {". $table ."} SET data = %b, created = %d, expire = %d, headers = '%s', serialized = %d WHERE cid = '%s'", $data, $created, $expire, $headers, $serialized, $cid); + if (!db_affected_rows()) { + @db_query("INSERT INTO {". $table ."} (cid, data, created, expire, headers, serialized) VALUES ('%s', %b, %d, %d, '%s', %d)", $cid, $data, $created, $expire, $headers, $serialized); + } +} + +/** + * + * Expire data from the cache. If called without arguments, expirable + * entries will be cleared from the cache_page and cache_block tables. + * + * @param $cid + * If set, the cache ID to delete. Otherwise, all cache entries that can + * expire are deleted. + * + * @param $table + * If set, the table $table to delete from. Mandatory + * argument if $cid is set. + * + * @param $wildcard + * If set to TRUE, the $cid is treated as a substring + * to match rather than a complete ID. The match is a right hand + * match. If '*' is given as $cid, the table $table will be emptied. + */ +function cache_clear_all($cid = NULL, $table = NULL, $wildcard = FALSE) { + global $user; + + if (!isset($cid) && !isset($table)) { + // Clear the block cache first, so stale data will + // not end up in the page cache. + cache_clear_all(NULL, 'cache_block'); + cache_clear_all(NULL, 'cache_page'); + return; + } + + if (empty($cid)) { + if (variable_get('cache_lifetime', 0)) { + // We store the time in the current user's $user->cache variable which + // will be saved into the sessions table by sess_write(). We then + // simulate that the cache was flushed for this user by not returning + // cached data that was cached before the timestamp. + $user->cache = time(); + + $cache_flush = variable_get('cache_flush_'. $table, 0); + if ($cache_flush == 0) { + // This is the first request to clear the cache, start a timer. + variable_set('cache_flush_'. $table, time()); + } + else if (time() > ($cache_flush + variable_get('cache_lifetime', 0))) { + // Clear the cache for everyone, cache_lifetime seconds have + // passed since the first request to clear the cache. + db_query("DELETE FROM {". $table ."} WHERE expire != %d AND expire < %d", CACHE_PERMANENT, time()); + variable_set('cache_flush_'. $table, 0); + } + } + else { + // No minimum cache lifetime, flush all temporary cache entries now. + db_query("DELETE FROM {". $table ."} WHERE expire != %d AND expire < %d", CACHE_PERMANENT, time()); + } + } + else { + if ($wildcard) { + if ($cid == '*') { + db_query("DELETE FROM {". $table ."}"); + } + else { + db_query("DELETE FROM {". $table ."} WHERE cid LIKE '%s%%'", $cid); + } + } + else { + db_query("DELETE FROM {". $table ."} WHERE cid = '%s'", $cid); + } + } +} + diff --git a/web/drupal/modules/logger/patches/settings.conf.no.filter.cache.patch b/web/drupal/modules/logger/patches/settings.conf.no.filter.cache.patch new file mode 100644 index 0000000..5f1135c --- /dev/null +++ b/web/drupal/modules/logger/patches/settings.conf.no.filter.cache.patch @@ -0,0 +1,15 @@ +Index: settings.php +=================================================================== +RCS file: /cvs/drupal/drupal/sites/default/Attic/settings.php,v +retrieving revision 1.39.2.3 +diff -u -p -r1.39.2.3 settings.php +--- settings.php 9 Jul 2007 04:28:12 -0000 1.39.2.3 ++++ settings.php 18 Sep 2009 21:54:57 -0000 +@@ -163,3 +163,7 @@ ini_set('url_rewriter.tags', ''); + # 'anonymous' => 'Visitor', + # ); + ++//BVDM: disable filter caching for image_annotate to work on img_assist inserted images ++$conf = array( ++ 'cache_inc' => './sites/all/modules/cache_no_filter/cache_no_filter.inc', ++);