all-in-one-event-calendar/lib/cache/strategy/db.php
2017-11-09 17:36:04 +01:00

102 lines
2.5 KiB
PHP

<?php
/**
* Concrete class for DB caching strategy.
*
* @instantiator new
* @author Time.ly Network, Inc.
* @since 2.0
* @package Ai1EC
* @subpackage Ai1EC.Cache.Strategy
*/
class Ai1ec_Cache_Strategy_Db extends Ai1ec_Cache_Strategy {
/**
* @var Ai1ec_Option Instance of database adapter
*/
private $model_option;
public function __construct( Ai1ec_Registry_Object $registry, Ai1ec_Option $option ) {
parent::__construct( $registry );
$this->model_option = $option;
}
/**
*
* @see Ai1ec_Get_Data_From_Cache::get_data()
*
*/
public function get_data( $key ) {
$key = $this->_key( $key );
$data = $this->model_option->get( $key );
if ( false === $data ) {
throw new Ai1ec_Cache_Not_Set_Exception(
'No data under \'' . $key . '\' present'
);
}
return maybe_unserialize( $data );
}
/**
*
* @see Ai1ec_Write_Data_To_Cache::write_data()
*
*/
public function write_data( $key, $value ) {
$result = $this->model_option->set(
$this->_key( $key ),
maybe_serialize( $value )
);
if ( false === $result ) {
throw new Ai1ec_Cache_Write_Exception(
'An error occured while saving data to \'' . $key . '\''
);
}
}
/**
* (non-PHPdoc)
* @see Ai1ec_Write_Data_To_Cache::delete_data()
*/
public function delete_data( $key ) {
return $this->model_option->delete(
$this->_key( $key )
);
}
/**
*
* @see Ai1ec_Write_Data_To_Cache::delete_matching()
*/
public function delete_matching( $pattern ) {
$db = $this->_registry->get( 'dbi.dbi' );
$sql_query = $db->prepare(
'SELECT option_name FROM ' . $db->get_table_name( 'options' ) .
' WHERE option_name LIKE %s',
'%%' . $pattern . '%%'
);
$keys = $db->get_col( $sql_query );
foreach ( $keys as $key ) {
$this->model_option->delete( $key );
}
return count( $keys );
}
/**
* _key method
*
* Get safe key name to use within options API
*
* @param string $key Key to sanitize
*
* @return string Safe to use key
*/
protected function _key( $key ) {
if ( strlen( $key ) > 53 ) {
$hash = md5( $key );
$key = substr( $key, 0, 16 ) . '_' . $hash;
}
return $key;
}
}