vendor/swiftmailer/lib/classes/Swift/KeyCache/DiskKeyCache.php
author cavaliet
Mon, 07 Jul 2014 17:23:47 +0200
changeset 122 d672f7dd74dc
parent 0 7f95f8617b0b
permissions -rwxr-xr-x
Added tag V00.17 for changeset ada5f3d8b5b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of SwiftMailer.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * (c) 2004-2009 Chris Corbyn
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * For the full copyright and license information, please view the LICENSE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * file that was distributed with this source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
 * A KeyCache which streams to and from disk.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 * @package Swift
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 * @subpackage KeyCache
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 * @author Chris Corbyn
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
class Swift_KeyCache_DiskKeyCache implements Swift_KeyCache
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
  /** Signal to place pointer at start of file */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
  const POSITION_START = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
  /** Signal to place pointer at end of file */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
  const POSITION_END = 1;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
  /** Signal to leave pointer in whatever position it currently is */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
  const POSITION_CURRENT = 2;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
   * An InputStream for cloning.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
   * @var Swift_KeyCache_KeyCacheInputStream
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
   * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
  private $_stream;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
   * A path to write to.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
   * @var string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
   * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
  private $_path;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
   * Stored keys.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
   * @var array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
   * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
  private $_keys = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
   * Will be true if magic_quotes_runtime is turned on.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
   * @var boolean
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
   * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
  private $_quotes = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
   * Create a new DiskKeyCache with the given $stream for cloning to make
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
   * InputByteStreams, and the given $path to save to.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
   * @param Swift_KeyCache_KeyCacheInputStream $stream
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
   * @param string $path to save to
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
  public function __construct(Swift_KeyCache_KeyCacheInputStream $stream, $path)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
    $this->_stream = $stream;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    $this->_path = $path;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
    $this->_quotes = ini_get('magic_quotes_runtime');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
   * Set a string into the cache under $itemKey for the namespace $nsKey.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
   * @param string $nsKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
   * @param string $itemKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
   * @param string $string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
   * @param int $mode
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
   * @throws Swift_IoException
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
   * @see MODE_WRITE, MODE_APPEND
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
  public function setString($nsKey, $itemKey, $string, $mode)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    $this->_prepareCache($nsKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    switch ($mode)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
      case self::MODE_WRITE:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
        $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_START);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
        break;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
      case self::MODE_APPEND:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
        $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_END);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
        break;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
      default:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
        throw new Swift_SwiftException(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
          'Invalid mode [' . $mode . '] used to set nsKey='.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
          $nsKey . ', itemKey=' . $itemKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
          );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
        break;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
    fwrite($fp, $string);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
    $this->_freeHandle($nsKey, $itemKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
   * Set a ByteStream into the cache under $itemKey for the namespace $nsKey.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
   * @param string $nsKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
   * @param string $itemKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
   * @param Swift_OutputByteStream $os
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
   * @param int $mode
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
   * @see MODE_WRITE, MODE_APPEND
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
   * @throws Swift_IoException
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
  public function importFromByteStream($nsKey, $itemKey, Swift_OutputByteStream $os,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
    $mode)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
    $this->_prepareCache($nsKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
    switch ($mode)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
      case self::MODE_WRITE:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_START);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
        break;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
      case self::MODE_APPEND:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_END);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
        break;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
      default:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        throw new Swift_SwiftException(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
          'Invalid mode [' . $mode . '] used to set nsKey='.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
          $nsKey . ', itemKey=' . $itemKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
          );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
        break;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
    while (false !== $bytes = $os->read(8192))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
      fwrite($fp, $bytes);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
    $this->_freeHandle($nsKey, $itemKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
   * Provides a ByteStream which when written to, writes data to $itemKey.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
   * NOTE: The stream will always write in append mode.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
   * @param string $nsKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
   * @param string $itemKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
   * @return Swift_InputByteStream
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
  public function getInputByteStream($nsKey, $itemKey,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
    Swift_InputByteStream $writeThrough = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
    $is = clone $this->_stream;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
    $is->setKeyCache($this);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
    $is->setNsKey($nsKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
    $is->setItemKey($itemKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
    if (isset($writeThrough))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
      $is->setWriteThroughStream($writeThrough);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
    return $is;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
   * Get data back out of the cache as a string.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
   * @param string $nsKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
   * @param string $itemKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
   * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
   * @throws Swift_IoException
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
  public function getString($nsKey, $itemKey)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
    $this->_prepareCache($nsKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
    if ($this->hasKey($nsKey, $itemKey))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
      $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_START);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
      if ($this->_quotes)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
        ini_set('magic_quotes_runtime', 0);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
      $str = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
      while (!feof($fp) && false !== $bytes = fread($fp, 8192))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
        $str .= $bytes;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
      if ($this->_quotes)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
        ini_set('magic_quotes_runtime', 1);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
      $this->_freeHandle($nsKey, $itemKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
      return $str;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
   * Get data back out of the cache as a ByteStream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
   * @param string $nsKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
   * @param string $itemKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
   * @param Swift_InputByteStream $is to write the data to
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
  public function exportToByteStream($nsKey, $itemKey, Swift_InputByteStream $is)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
    if ($this->hasKey($nsKey, $itemKey))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
      $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_START);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
      if ($this->_quotes)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
        ini_set('magic_quotes_runtime', 0);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
      while (!feof($fp) && false !== $bytes = fread($fp, 8192))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
        $is->write($bytes);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
      if ($this->_quotes)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
        ini_set('magic_quotes_runtime', 1);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
      $this->_freeHandle($nsKey, $itemKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
   * Check if the given $itemKey exists in the namespace $nsKey.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
   * @param string $nsKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
   * @param string $itemKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
   * @return boolean
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
  public function hasKey($nsKey, $itemKey)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
    return is_file($this->_path . '/' . $nsKey . '/' . $itemKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
   * Clear data for $itemKey in the namespace $nsKey if it exists.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
   * @param string $nsKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
   * @param string $itemKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
  public function clearKey($nsKey, $itemKey)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
    if ($this->hasKey($nsKey, $itemKey))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
      $this->_freeHandle($nsKey, $itemKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
      unlink($this->_path . '/' . $nsKey . '/' . $itemKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
   * Clear all data in the namespace $nsKey if it exists.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
   * @param string $nsKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
  public function clearAll($nsKey)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
    if (array_key_exists($nsKey, $this->_keys))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
      foreach ($this->_keys[$nsKey] as $itemKey=>$null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
        $this->clearKey($nsKey, $itemKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
      rmdir($this->_path . '/' . $nsKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
      unset($this->_keys[$nsKey]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
  // -- Private methods
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
   * Initialize the namespace of $nsKey if needed.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
   * @param string $nsKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
   * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
  private function _prepareCache($nsKey)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
    $cacheDir = $this->_path . '/' . $nsKey;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
    if (!is_dir($cacheDir))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
      if (!mkdir($cacheDir))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
      {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
        throw new Swift_IoException('Failed to create cache directory ' . $cacheDir);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
      }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
      $this->_keys[$nsKey] = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
   * Get a file handle on the cache item.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
   * @param string $nsKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
   * @param string $itemKey
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
   * @param int $position
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
   * @return resource
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
   * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
  private function _getHandle($nsKey, $itemKey, $position)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
    if (!isset($this->_keys[$nsKey][$itemKey]))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
      $openMode = $this->hasKey($nsKey, $itemKey)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
        ? 'r+b'
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
        : 'w+b'
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
        ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
      $fp = fopen($this->_path . '/' . $nsKey . '/' . $itemKey, $openMode);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
      $this->_keys[$nsKey][$itemKey] = $fp;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
    if (self::POSITION_START == $position)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
      fseek($this->_keys[$nsKey][$itemKey], 0, SEEK_SET);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
    elseif (self::POSITION_END == $position)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
      fseek($this->_keys[$nsKey][$itemKey], 0, SEEK_END);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
    return $this->_keys[$nsKey][$itemKey];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
  private function _freeHandle($nsKey, $itemKey)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
    $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_CURRENT);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
    fclose($fp);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
    $this->_keys[$nsKey][$itemKey] = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
   * Destructor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
  public function __destruct()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
    foreach ($this->_keys as $nsKey=>$null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
      $this->clearAll($nsKey);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
}