diff -upr cacherouter.orig/Cache.php cacherouter/Cache.php
--- cacherouter.orig/Cache.php	2008-06-02 04:04:34.000000000 +0200
+++ cacherouter/Cache.php	2008-07-06 20:27:37.000000000 +0200
@@ -32,8 +32,22 @@ class Cache {
     $this->content[$key] = $value;
   }
   
-  function delete($key) {
-    unset($this->content[$key]);
+  function delete($key, $wildcard) {
+    if ($wildcard == TRUE) {
+      if ($key == '*') {
+        $this->content = array();
+      }
+      else {
+        foreach($this->content as $cid => $value) {
+          if (strpos($cid, $key) === 0) {
+            unset($this->content[$cid]);
+          }          
+        }
+      }
+    }
+    else {
+      unset($this->content[$key]);
+    }
   }
   
   function flush() {
diff -upr cacherouter.orig/cacherouter.inc cacherouter/cacherouter.inc
--- cacherouter.orig/cacherouter.inc	2008-06-02 04:04:34.000000000 +0200
+++ cacherouter/cacherouter.inc	2008-07-06 20:33:25.000000000 +0200
@@ -140,10 +140,10 @@ function cache_clear_all($cid = NULL, $t
   else {
     if ($wildcard) {
       if ($cid == '*') {
-        $cache->delete('*', $table);
+        $cache->delete('*', $table, TRUE);
       }
       else {
-        $cache->delete($cid . '*', $table);
+        $cache->delete($cid, $table, TRUE);
       }
     }
     else {
Only in cacherouter: cacherouter.inc.orig
diff -upr cacherouter.orig/CacheRouter.php cacherouter/CacheRouter.php
--- cacherouter.orig/CacheRouter.php	2008-06-02 04:04:34.000000000 +0200
+++ cacherouter/CacheRouter.php	2008-07-06 20:13:59.000000000 +0200
@@ -33,6 +33,7 @@ class CacheRouter {
     if (!isset($this->map[$bin])) {
       $this->__init($bin);
     }
+    
     return $this->map[$bin]->get($key);
   }
 
@@ -43,11 +44,11 @@ class CacheRouter {
     return $this->map[$bin]->set($key, $value, $expire, $headers);
   }
 
-  public function delete($key, $bin) {
+  public function delete($key, $bin, $wildcard = FALSE) {
     if (!isset($this->map[$bin])) {
       $this->__init($bin);
     }
-    return $this->map[$bin]->delete($key);
+    return $this->map[$bin]->delete($key, $wildcard);
   }
 
   public function flush($bin) {
diff -upr cacherouter.orig/engines/apc.php cacherouter/engines/apc.php
--- cacherouter.orig/engines/apc.php	2008-06-02 04:04:34.000000000 +0200
+++ cacherouter/engines/apc.php	2008-07-06 20:31:51.000000000 +0200
@@ -111,11 +111,11 @@ class apcCache extends Cache {
    * @return mixed object|bool
    *   Returns either the cache object or FALSE on failure
    */
-  function delete($key) {
+  function delete($key, $wildcard) {
     // Remove from static array cache.
-    parent::delete($key);
+    parent::delete($key, $wildcard);
     
-    if (substr($key, -1, 1) == '*') {
+    if ($wildcard) {
       $key = substr($key, 0, strlen($key) - 1);
       $lookup = apc_fetch($this->lookup);
       foreach ($lookup as $k => $v) {
diff -upr cacherouter.orig/engines/db.php cacherouter/engines/db.php
--- cacherouter.orig/engines/db.php	2008-06-02 04:04:34.000000000 +0200
+++ cacherouter/engines/db.php	2008-07-06 20:31:57.000000000 +0200
@@ -64,14 +64,14 @@ class dbCache extends Cache {
     }
   }
   
-  function delete($key) {
-    unset($this->content[$key]);
-    if (substr($key, -1, 1) == '*') {
+  function delete($key, $wildcard) {
+    parent::delete($key, $wildcard);
+
+    if ($wildcard) {
       if ($key == '*') {
         db_query("DELETE FROM {". $this->name ."}");
       }
       else {
-        $key = substr($key, 0, strlen($key) - 1);
         db_query("DELETE FROM {". $this->name ."} WHERE cid LIKE '%s%%'", $key);
       }
     }
@@ -79,13 +79,12 @@ class dbCache extends Cache {
       db_query("DELETE FROM {". $this->name ."} WHERE cid = '%s'", $key);
     }
   }
-  
-  function flush() {
-    $this->content = array();
-    db_query("DELETE FROM {". $this->name ."} WHERE expire != %d AND expire < %d", CACHE_PERMANENT, time()); 
-  }
 
-  function flush($flush) {
+  function flush($flush = null) {
+    if ($flush == null) {
+      $flush = time();
+    }
+
     $this->content = array();
     db_query("DELETE FROM {". $this->name ."} WHERE expire != %d AND expire < %d", CACHE_PERMANENT, $flush);
   }
diff -upr cacherouter.orig/engines/eacc.php cacherouter/engines/eacc.php
--- cacherouter.orig/engines/eacc.php	2008-06-02 04:04:34.000000000 +0200
+++ cacherouter/engines/eacc.php	2008-07-06 20:29:08.000000000 +0200
@@ -110,9 +110,10 @@ class eaccCache extends Cache {
    * @return mixed object|bool
    *   Returns either the cache object or FALSE on failure
    */
-  function delete($key) {
+  function delete($key, $wildcard) {
     // Remove from static array cache.
     parent::flush();
+    parent::delete($key, $wildcard);
 
     if (substr($key, -1, 1) == '*') {
       $this->lock();
diff -upr cacherouter.orig/engines/file.php cacherouter/engines/file.php
--- cacherouter.orig/engines/file.php	2008-06-02 04:04:34.000000000 +0200
+++ cacherouter/engines/file.php	2008-07-06 20:30:12.000000000 +0200
@@ -88,7 +88,9 @@ class fileCache extends Cache {
     }
   }
   
-  function delete($key) {
+  function delete($key, $wildcard) {
+    parent::delete($key, $wildcard);
+    
     $file = $this->key($key);
     if ($fp = fopen($file, 'w')) {
       // only delete the cache file once we obtain an exclusive lock to prevent
diff -upr cacherouter.orig/engines/memcache.php cacherouter/engines/memcache.php
--- cacherouter.orig/engines/memcache.php	2008-06-02 04:04:34.000000000 +0200
+++ cacherouter/engines/memcache.php	2008-07-06 20:30:32.000000000 +0200
@@ -104,9 +104,9 @@ class memcacheCache extends Cache {
     }
   }
   
-  function delete($key) {
+  function delete($key, $wildcard) {
     // Delete from static cache
-    parent::delete($key);
+    parent::delete($key, $wildcard);
     
     // Remove from memcache.
     return $this->memcache->delete($this->key($key));
diff -upr cacherouter.orig/engines/xcache.php cacherouter/engines/xcache.php
--- cacherouter.orig/engines/xcache.php	2008-06-02 04:04:34.000000000 +0200
+++ cacherouter/engines/xcache.php	2008-07-06 20:31:35.000000000 +0200
@@ -112,12 +112,11 @@ class xcacheCache extends Cache {
    * @return mixed object|bool
    *   Returns either the cache object or FALSE on failure
    */
-  function delete($key) {
+  function delete($key, $wildcard) {
     // Remove from static array cache.
-    parent::delete($key);
+    parent::delete($key, $wildcard);
     
-    if (substr($key, -1, 1) == '*') {
-      $key = substr($key, 0, strlen($key) - 1);
+    if ($wildcard) {
       $lookup = xcache_get($this->lookup);
       foreach ($lookup as $k => $v) {
         if (substr($k, 0, strlen($key) - 1)) {
Only in cacherouter: patch_user_expiration.patch
