home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 August / PCWorld_2001-08_cd.bin / Komunikace / phptriad / phptriadsetup2-11.exe / php / pear / Cache / Container / db.php next >
PHP Script  |  2001-03-08  |  7KB  |  214 lines

  1. <?php
  2. // +----------------------------------------------------------------------+
  3. // | PHP version 4.0                                                      |
  4. // +----------------------------------------------------------------------+
  5. // | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group             |
  6. // +----------------------------------------------------------------------+
  7. // | This source file is subject to version 2.0 of the PHP license,       |
  8. // | that is bundled with this package in the file LICENSE, and is        |
  9. // | available at through the world-wide-web at                           |
  10. // | http://www.php.net/license/2_02.txt.                                 |
  11. // | If you did not receive a copy of the PHP license and are unable to   |
  12. // | obtain it through the world-wide-web, please send a note to          |
  13. // | license@php.net so we can mail you a copy immediately.               |
  14. // +----------------------------------------------------------------------+
  15. // | Authors: Ulf Wendel <ulf.wendel@phpdoc.de>                           |
  16. // |          Sebastian Bergmann <sb@sebastian-bergmann.de>               |
  17. // |          Chuck Hagenbuch <chuck@horde.org>                           |
  18. // +----------------------------------------------------------------------+
  19. //
  20. // $Id: db.php,v 1.9 2001/03/08 20:39:16 uw Exp $
  21.  
  22. require_once 'DB.php';
  23. require_once 'Cache/Container.php';
  24.  
  25. /**
  26. * PEAR/DB Cache Container.
  27. *
  28. * WARNING: Other systems might or might not support certain datatypes of 
  29. * the tables shown. As far as I know there's no large binary 
  30. * type in SQL-92 or SQL-99. Postgres seems to lack any 
  31. * BLOB or TEXT type, for MS-SQL you could use IMAGE, don't know 
  32. * about other databases. Please add sugestions for other databases to 
  33. * the inline docs.
  34. *
  35. * The field 'changed' has no meaning for the Cache itself. It's just there 
  36. * because it's a good idea to have an automatically updated timestamp
  37. * field for debugging in all of your tables.
  38. *
  39. * For _MySQL_ you need this DB table:
  40. *
  41. * CREATE TABLE cache (
  42. *   id          CHAR(32) NOT NULL DEFAULT '',
  43. *   cachegroup  VARCHAR(127) NOT NULL DEFAULT '',
  44. *   cachedata   BLOB NOT NULL DEFAULT '',
  45. *   userdata    VARCHAR(255) NOT NULL DEFAUL '',
  46. *   expires     INT(9) NOT NULL DEFAULT 0,
  47. *  
  48. *   changed     TIMESTAMP(14) NOT NULL,
  49. *  
  50. *   INDEX (expires),
  51. *   PRIMARY KEY (id, cachegroup)
  52. * )
  53. *
  54. * @author   Sebastian Bergmann <sb@sebastian-bergmann.de>
  55. * @version  $Id: db.php,v 1.9 2001/03/08 20:39:16 uw Exp $
  56. * @package  Cache
  57. */
  58. class Cache_Container_db extends Cache_Container {
  59.   
  60.     /**
  61.     * Name of the DB table to store caching data
  62.     * 
  63.     * @see  Cache_Container_file::$filename_prefix
  64.     */  
  65.     var $cache_table = '';
  66.  
  67.     /**
  68.     * PEAR DB dsn to use.
  69.     * 
  70.     * @var  string
  71.     */
  72.     var $dsn = '';
  73.  
  74.     /**
  75.     * PEAR DB object
  76.     * 
  77.     * @var  object PEAR_DB
  78.     */
  79.     var $db;
  80.  
  81.     function Cache_Container_db($options)
  82.     {
  83.         if (!is_array($options) || !isset($options['dsn'])) {
  84.             return new Cache_Error('No dsn specified!', __FILE__, __LINE__);
  85.         }
  86.  
  87.         $this->setOptions($options, array('dsn', 'cache_table'));
  88.  
  89.         if (!$this->dsn)
  90.             return new Cache_Error('No dsn specified!', __FILE__, __LINE__);
  91.  
  92.         $this->db = DB::connect($this->dsn, true);
  93.         if (DB::isError($this->db)) {
  94.             return new Cache_Error('DB::connect failed: ' . DB::errorMessage($this->db), __FILE__, __LINE__);
  95.         } else {
  96.             $this->db->setFetchMode(DB_FETCHMODE_ASSOC);
  97.         }
  98.     }
  99.  
  100.     function fetch($id, $group)
  101.     {
  102.         $query = sprintf("SELECT cachedata, userdata, expires FROM %s WHERE id = '%s' AND cachegroup = '%s'",
  103.                          $this->cache_table,
  104.                          addslashes($id),
  105.                          addslashes($group)
  106.                          );
  107.  
  108.         $res = $this->db->query($query);
  109.  
  110.         if (DB::isError($res))
  111.             return new Cache_Error('DB::query failed: ' . DB::errorMessage($res), __FILE__, __LINE__);
  112.  
  113.         $row = $res->fetchRow();
  114.  
  115.         if (is_array($row))
  116.             return array($row['expires'], $this->decode($row['cachedata']), $row['userdata']);
  117.     }
  118.  
  119.     /**
  120.     * Stores a dataset.
  121.     * 
  122.     * WARNING: we use the SQL command REPLACE INTO this might be 
  123.     * MySQL specific. As MySQL is very popular the method should
  124.     * work fine for 95% of you.
  125.     */
  126.     function save($id, $data, $expires, $group, $userdata)
  127.     {
  128.         $this->flushPreload($id, $group);
  129.  
  130.         $query = sprintf("REPLACE INTO %s (userdata, cachedata, expires, id, cachegroup) VALUES ('%s', '%s', %d, '%s', '%s')",
  131.                          $this->cache_table,
  132.                          addslashes($userdata),
  133.                          addslashes($this->encode($data)),
  134.                           $this->getExpiresAbsolute($expires) ,
  135.                          addslashes($id),
  136.                          addslashes($group)
  137.                         );
  138.  
  139.         $res = $this->db->query($query);
  140.  
  141.         if (DB::isError($res)) {
  142.             return new Cache_Error('DB::query failed: ' . DB::errorMessage($res) , __FILE__, __LINE__);
  143.         }
  144.     }
  145.  
  146.     function delete($id, $group)
  147.     {
  148.         $this->flushPreload($id, $group);
  149.  
  150.         $query = sprintf("DELETE FROM %s WHERE id = '%s' and cachegroup = '%s'",
  151.                          $this->cache_table,
  152.                          addslashes($id),
  153.                          addslashes($group)
  154.                         );
  155.  
  156.         $res = $this->db->query($query);
  157.  
  158.         if (DB::isError($res))
  159.             return new Cache_Error('DB::query failed: ' . DB::errorMessage($res), __FILE__, __LINE__);
  160.     }
  161.  
  162.     function flush($group = "")
  163.     {
  164.         $this->flushPreload();
  165.  
  166.          if ($group) {
  167.             $query = sprintf("DELETE FROM %s WHERE cachegroup = '%s'", $this->cache_table, addslashes($group));    
  168.         } else {
  169.             $query = sprintf("DELETE FROM %s", $this->cache_table);    
  170.         }
  171.  
  172.         $res = $this->db->query($query);
  173.  
  174.         if (DB::isError($res))
  175.             return new Cache_Error('DB::query failed: ' . DB::errorMessage($res), __FILE__, __LINE__);
  176.     }
  177.  
  178.     function idExists($id, $group)
  179.     {
  180.         $query = sprintf("SELECT id FROM %s WHERE ID = '%s' AND cachegroup = '%s'", 
  181.                          $this->cache_table,
  182.                          addslashes($id),
  183.                          addslashes($group)
  184.                         );
  185.  
  186.         $res = $this->db->query($query);
  187.  
  188.         if (DB::isError($res))
  189.             return new Cache_Error('DB::query failed: ' . DB::errorMessage($res), __FILE__, __LINE__);
  190.  
  191.         $row = $res->fetchRow();
  192.  
  193.         if (is_array($row)) {
  194.             return true;
  195.         } else {
  196.             return false;
  197.         }
  198.     }
  199.  
  200.     function garbageCollection()
  201.     {
  202.         $query = sprintf('DELETE FROM %s WHERE expires <= %d AND expires > 0',
  203.                          $this->cache_table,
  204.                          time());
  205.  
  206.         $res = $this->db->query($query);
  207.  
  208.         if (DB::isError($res)) {
  209.             return new Cache_Error('DB::query failed: ' . DB::errorMessage($res), __FILE__, __LINE__);
  210.         }
  211.     }
  212. }
  213. ?>
  214.