danielebarchiesi@0: $sid, ':object' => $obj, ':name' => $name)) danielebarchiesi@0: ->fetchObject(); danielebarchiesi@0: if ($data) { danielebarchiesi@0: $cache[$key] = unserialize($data->data); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: return isset($cache[$key]) ? $cache[$key] : NULL; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Store an object in the non-volatile ctools cache. danielebarchiesi@0: * danielebarchiesi@0: * @param $obj danielebarchiesi@0: * A 128 character or less string to define what kind of object is being danielebarchiesi@0: * stored; primarily this is used to prevent collisions. danielebarchiesi@0: * @param $name danielebarchiesi@0: * The name of the object being stored. danielebarchiesi@0: * @param $cache danielebarchiesi@0: * The object to be cached. This will be serialized prior to writing. danielebarchiesi@0: * @param $sid danielebarchiesi@0: * The session id, allowing someone to use Session API or their own solution; danielebarchiesi@0: * defaults to session_id(). danielebarchiesi@0: */ danielebarchiesi@0: function ctools_object_cache_set($obj, $name, $cache, $sid = NULL) { danielebarchiesi@0: // Store the CTools session id in the user session to force a danielebarchiesi@0: // session for anonymous users in Drupal 7 and Drupal 6 Pressflow. danielebarchiesi@0: // see http://drupal.org/node/562374, http://drupal.org/node/861778 danielebarchiesi@0: if (empty($GLOBALS['user']->uid) && empty($_SESSION['ctools_session_id'])) { danielebarchiesi@0: $_SESSION['ctools_hold_session'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: ctools_object_cache_clear($obj, $name, $sid); danielebarchiesi@0: danielebarchiesi@0: if (!$sid) { danielebarchiesi@0: $sid = session_id(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: db_insert('ctools_object_cache') danielebarchiesi@0: ->fields(array( danielebarchiesi@0: 'sid' => $sid, danielebarchiesi@0: 'obj' => $obj, danielebarchiesi@0: 'name' => $name, danielebarchiesi@0: 'data' => serialize($cache), danielebarchiesi@0: 'updated' => REQUEST_TIME, danielebarchiesi@0: )) danielebarchiesi@0: ->execute(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Remove an object from the non-volatile ctools cache danielebarchiesi@0: * danielebarchiesi@0: * @param $obj danielebarchiesi@0: * A 128 character or less string to define what kind of object is being danielebarchiesi@0: * stored; primarily this is used to prevent collisions. danielebarchiesi@0: * @param $name danielebarchiesi@0: * The name of the object being removed. danielebarchiesi@0: * @param $sid danielebarchiesi@0: * The session id, allowing someone to use Session API or their own solution; danielebarchiesi@0: * defaults to session_id(). danielebarchiesi@0: */ danielebarchiesi@0: function ctools_object_cache_clear($obj, $name, $sid = NULL) { danielebarchiesi@0: danielebarchiesi@0: if (!$sid) { danielebarchiesi@0: $sid = session_id(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: db_delete('ctools_object_cache') danielebarchiesi@0: ->condition('sid', $sid) danielebarchiesi@0: ->condition('obj', $obj) danielebarchiesi@0: ->condition('name', $name) danielebarchiesi@0: ->execute(); danielebarchiesi@0: // Ensure the static cache is emptied of this obj:name set. danielebarchiesi@0: drupal_static_reset('ctools_object_cache_get'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Determine if another user has a given object cached. danielebarchiesi@0: * danielebarchiesi@0: * This is very useful for 'locking' objects so that only one user can danielebarchiesi@0: * modify them. danielebarchiesi@0: * danielebarchiesi@0: * @param $obj danielebarchiesi@0: * A 128 character or less string to define what kind of object is being danielebarchiesi@0: * stored; primarily this is used to prevent collisions. danielebarchiesi@0: * @param $name danielebarchiesi@0: * The name of the object being removed. danielebarchiesi@0: * @param $sid danielebarchiesi@0: * The session id, allowing someone to use Session API or their own solution; danielebarchiesi@0: * defaults to session_id(). danielebarchiesi@0: * danielebarchiesi@0: * @return danielebarchiesi@0: * An object containing the UID and updated date if found; NULL if not. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_object_cache_test($obj, $name, $sid = NULL) { danielebarchiesi@0: danielebarchiesi@0: if (!$sid) { danielebarchiesi@0: $sid = session_id(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return db_query('SELECT s.uid, c.updated FROM {ctools_object_cache} c INNER JOIN {sessions} s ON c.sid = s.sid WHERE s.sid <> :session_id AND c.obj = :obj AND c.name = :name ORDER BY c.updated ASC', array(':session_id' => $sid, ':obj' => $obj, ':name' => $name)) danielebarchiesi@0: ->fetchObject(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Get the cache status of a group of objects. danielebarchiesi@0: * danielebarchiesi@0: * This is useful for displaying lock status when listing a number of objects danielebarchiesi@0: * an an administration UI. danielebarchiesi@0: * danielebarchiesi@0: * @param $obj danielebarchiesi@0: * A 128 character or less string to define what kind of object is being danielebarchiesi@0: * stored; primarily this is used to prevent collisions. danielebarchiesi@0: * @param $names danielebarchiesi@0: * An array of names of objects danielebarchiesi@0: * danielebarchiesi@0: * @return danielebarchiesi@0: * An array of objects containing the UID and updated date for each name found. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_object_cache_test_objects($obj, $names) { danielebarchiesi@0: return db_query("SELECT c.name, s.uid, c.updated FROM {ctools_object_cache} c INNER JOIN {sessions} s ON c.sid = s.sid WHERE c.obj = :obj AND c.name IN (:names) ORDER BY c.updated ASC", array(':obj' => $obj, ':names' => $names)) danielebarchiesi@0: ->fetchAllAssoc('name'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Remove an object from the non-volatile ctools cache for all session IDs. danielebarchiesi@0: * danielebarchiesi@0: * This is useful for clearing a lock. danielebarchiesi@0: * danielebarchiesi@0: * @param $obj danielebarchiesi@0: * A 128 character or less string to define what kind of object is being danielebarchiesi@0: * stored; primarily this is used to prevent collisions. danielebarchiesi@0: * @param $name danielebarchiesi@0: * The name of the object being removed. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_object_cache_clear_all($obj, $name) { danielebarchiesi@0: db_delete('ctools_object_cache') danielebarchiesi@0: ->condition('obj', $obj) danielebarchiesi@0: ->condition('name', $name) danielebarchiesi@0: ->execute(); danielebarchiesi@0: // Ensure the static cache is emptied of this obj:name set. danielebarchiesi@0: $cache = &drupal_static('ctools_object_cache_get', array()); danielebarchiesi@0: unset($cache["$obj:$name"]); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Remove all objects in the object cache that are older than the danielebarchiesi@0: * specified age. danielebarchiesi@0: * danielebarchiesi@0: * @param $age danielebarchiesi@0: * The minimum age of objects to remove, in seconds. For example, 86400 is danielebarchiesi@0: * one day. Defaults to 7 days. danielebarchiesi@0: */ danielebarchiesi@0: function ctools_object_cache_clean($age = NULL) { danielebarchiesi@0: if (empty($age)) { danielebarchiesi@0: $age = 86400 * 7; // 7 days danielebarchiesi@0: } danielebarchiesi@0: db_delete('ctools_object_cache') danielebarchiesi@0: ->condition('updated', REQUEST_TIME - $age, '<') danielebarchiesi@0: ->execute(); danielebarchiesi@0: }