You are here

mobile_tools_cache.inc in Mobile Tools 7.2

mobile_tools_cache.inc This files allow to override the default drupal cache in order to support theme switching based on device type and device group.

In order to enable this file, add the following to your settings.php file $conf['page_cache_fastpath'] = FALSE, $conf['cache_inc'] = './sites/all/modules/mobile_tools/mobile_tools_cache.inc', );

File

mobile_tools_cache.inc
View source
<?php

/**
 * @file mobile_tools_cache.inc
 *  This files allow to override the default drupal cache in order to support theme switching based
 *  on device type and device group.
 *
 *  In order to enable this file, add the following to your settings.php file
 *  $conf['page_cache_fastpath'] = FALSE,
 *  $conf['cache_inc'] = './sites/all/modules/mobile_tools/mobile_tools_cache.inc',
 * );
 *
 */

/**
 * Return data from the persistent cache. Data may be stored as either plain text or as serialized data.
 * cache_get will automatically return unserialized objects and arrays.
 *
 * @param $cid
 *   The cache ID of the data to retrieve.
 * @param $table
 *   The table $table to store the data in. Valid core values are 'cache_filter',
 *   'cache_menu', 'cache_page', or 'cache' for the default cache.
 */
function cache_get($cid, $table = 'cache') {
  global $user;
  if ($table == "cache_page") {
    cache_rewrite_cid($cid);

    // THIS IS THE MAGIC
  }

  // Garbage collection necessary when enforcing a minimum cache lifetime
  $cache_flush = variable_get('cache_flush_' . $table, 0);
  if ($cache_flush && $cache_flush + variable_get('cache_lifetime', 0) <= REQUEST_TIME) {

    // Reset the variable immediately to prevent a meltdown in heavy load situations.
    variable_set('cache_flush_' . $table, 0);

    // Time to flush old cache data
    // TODO Please convert this statement to the D7 database API syntax.
    db_query("DELETE FROM {" . $table . "} WHERE expire != %d AND expire <= %d", CACHE_PERMANENT, $cache_flush);
  }

  // TODO Please convert this statement to the D7 database API syntax.
  $cache = db_fetch_object(db_query("SELECT data, created, headers, expire, serialized FROM {" . $table . "} WHERE cid = '%s'", $cid));
  if (isset($cache->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);
      }
    }
    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) {
  if ($table == 'cache_page') {
    cache_rewrite_cid($cid);
  }
  $serialized = 0;
  if (is_object($data) || is_array($data)) {
    $data = serialize($data);
    $serialized = 1;
  }
  $created = REQUEST_TIME;

  // TODO Please convert this statement to the D7 database API syntax.
  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 $wildcard is TRUE, cache IDs starting with $cid are deleted in
 *   addition to the exact cache ID specified by $cid.  If $wildcard is
 *   TRUE and $cid is '*' then the entire table $table is 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 = REQUEST_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, REQUEST_TIME);
      }
      else {
        if (REQUEST_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.
          // TODO Please convert this statement to the D7 database API syntax.
          db_query("DELETE FROM {" . $table . "} WHERE expire != %d AND expire < %d", CACHE_PERMANENT, REQUEST_TIME);
          variable_set('cache_flush_' . $table, 0);
        }
      }
    }
    else {

      // No minimum cache lifetime, flush all temporary cache entries now.
      // TODO Please convert this statement to the D7 database API syntax.
      db_query("DELETE FROM {" . $table . "} WHERE expire != %d AND expire < %d", CACHE_PERMANENT, REQUEST_TIME);
    }
  }
  else {
    if ($wildcard) {
      if ($cid == '*') {

        // TODO Please convert this statement to the D7 database API syntax.
        db_query("TRUNCATE TABLE {" . $table . "}");
      }
      else {

        // TODO Please convert this statement to the D7 database API syntax.
        db_query("DELETE FROM {" . $table . "} WHERE cid LIKE '%s%%'", $cid);
      }
    }
    else {

      // TODO Please convert this statement to the D7 database API syntax.
      db_query("DELETE FROM {" . $table . "} WHERE cid = '%s'", $cid);
    }
  }
}

/**
 * Rewriting the cid support the usage of caching with mobile tools when using theme switching
 * for several device groups
 */
function cache_rewrite_cid(&$cid) {
  require_once DRUPAL_ROOT . '/' . dirname(__FILE__) . '/mobile_tools.module';
  $result = _mobile_tools_is_mobile_device();
  $query = $_GET;
  unset($query['q']);
  $seperator = count($query) ? '&' : '?';
  $cid = $cid . $seperator . 'mobile_group=' . $result['group'] . '&device=' . $result['type'];
}

Functions

Namesort descending Description
cache_clear_all Expire data from the cache. If called without arguments, expirable entries will be cleared from the cache_page and cache_block tables.
cache_get Return data from the persistent cache. Data may be stored as either plain text or as serialized data. cache_get will automatically return unserialized objects and arrays.
cache_rewrite_cid Rewriting the cid support the usage of caching with mobile tools when using theme switching for several device groups
cache_set Store data in the persistent cache.