MDB
[ class tree: MDB ] [ index: MDB ] [ all elements ]

Source for file peardb_wrapper.php

Documentation is available at peardb_wrapper.php

  1. <?php
  2. // +----------------------------------------------------------------------+
  3. // | PHP Version 4                                                        |
  4. // +----------------------------------------------------------------------+
  5. // | Copyright (c) 1998-2004 Manuel Lemos, Tomas V.V.Cox,                 |
  6. // | Stig. S. Bakken, Lukas Smith                                         |
  7. // | All rights reserved.                                                 |
  8. // +----------------------------------------------------------------------+
  9. // | MDB is a merge of PEAR DB and Metabases that provides a unified DB   |
  10. // | API as well as database abstraction for PHP applications.            |
  11. // | This LICENSE is in the BSD license style.                            |
  12. // |                                                                      |
  13. // | Redistribution and use in source and binary forms, with or without   |
  14. // | modification, are permitted provided that the following conditions   |
  15. // | are met:                                                             |
  16. // |                                                                      |
  17. // | Redistributions of source code must retain the above copyright       |
  18. // | notice, this list of conditions and the following disclaimer.        |
  19. // |                                                                      |
  20. // | Redistributions in binary form must reproduce the above copyright    |
  21. // | notice, this list of conditions and the following disclaimer in the  |
  22. // | documentation and/or other materials provided with the distribution. |
  23. // |                                                                      |
  24. // | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
  25. // | Lukas Smith nor the names of his contributors may be used to endorse |
  26. // | or promote products derived from this software without specific prior|
  27. // | written permission.                                                  |
  28. // |                                                                      |
  29. // | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
  30. // | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
  31. // | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
  32. // | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
  33. // | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
  34. // | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
  35. // | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
  36. // |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
  37. // | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
  38. // | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
  39. // | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
  40. // | POSSIBILITY OF SUCH DAMAGE.                                          |
  41. // +----------------------------------------------------------------------+
  42. // | Author: Lukas Smith <smith@backendmedia.com>                         |
  43. // +----------------------------------------------------------------------+
  44. //
  45. // $Id: peardb_wrapper.php,v 1.32.4.2 2004/04/08 17:19:01 lsmith Exp $
  46. //
  47.  
  48. /*
  49.  * The method mapErrorCode in each MDB_dbtype implementation maps
  50.  * native error codes to one of these.
  51.  *
  52.  * If you add an error code here, make sure you also add a textual
  53.  * version of it in DB::errorMessage().
  54.  */
  55.  
  56. define('DB_OK',                         MDB_OK);
  57. define('DB_ERROR',                      MDB_ERROR);
  58. define('DB_ERROR_SYNTAX',               MDB_ERROR_SYNTAX);
  59. define('DB_ERROR_CONSTRAINT',           MDB_ERROR_CONSTRAINT);
  60. define('DB_ERROR_NOT_FOUND',            MDB_ERROR_NOT_FOUND);
  61. define('DB_ERROR_ALREADY_EXISTS',       MDB_ERROR_ALREADY_EXISTS);
  62. define('DB_ERROR_UNSUPPORTED',          MDB_ERROR_UNSUPPORTED);
  63. define('DB_ERROR_MISMATCH',             MDB_ERROR_MISMATCH);
  64. define('DB_ERROR_INVALID',              MDB_ERROR_INVALID);
  65. define('DB_ERROR_NOT_CAPABLE',          MDB_ERROR_NOT_CAPABLE);
  66. define('DB_ERROR_TRUNCATED',            MDB_ERROR_TRUNCATED);
  67. define('DB_ERROR_INVALID_NUMBER',       MDB_ERROR_INVALID_NUMBER);
  68. define('DB_ERROR_INVALID_DATE',         MDB_ERROR_INVALID_DATE);
  69. define('DB_ERROR_DIVZERO',              MDB_ERROR_DIVZERO);
  70. define('DB_ERROR_NODBSELECTED',         MDB_ERROR_NODBSELECTED);
  71. define('DB_ERROR_CANNOT_CREATE',        MDB_ERROR_CANNOT_CREATE);
  72. define('DB_ERROR_CANNOT_DELETE',        MDB_ERROR_CANNOT_DELETE);
  73. define('DB_ERROR_CANNOT_DROP',          MDB_ERROR_CANNOT_DROP);
  74. define('DB_ERROR_NOSUCHTABLE',          MDB_ERROR_NOSUCHTABLE);
  75. define('DB_ERROR_NOSUCHFIELD',          MDB_ERROR_NOSUCHFIELD);
  76. define('DB_ERROR_NEED_MORE_DATA',       MDB_ERROR_NEED_MORE_DATA);
  77. define('DB_ERROR_NOT_LOCKED',           MDB_ERROR_NOT_LOCKED);
  78. define('DB_ERROR_VALUE_COUNT_ON_ROW',   MDB_ERROR_VALUE_COUNT_ON_ROW);
  79. define('DB_ERROR_INVALID_DSN',          MDB_ERROR_INVALID_DSN);
  80. define('DB_ERROR_CONNECT_FAILED',       MDB_ERROR_CONNECT_FAILED);
  81. define('DB_ERROR_EXTENSION_NOT_FOUND',  MDB_ERROR_EXTENSION_NOT_FOUND);
  82. define('DB_ERROR_ACCESS_VIOLATION',     MDB_ERROR_ACCESS_VIOLATION);
  83. define('DB_ERROR_NOSUCHDB',             MDB_ERROR_NOSUCHDB);
  84.  
  85. define('DB_WARNING',           -1000);
  86. define('DB_WARNING_READ_ONLY'-1001);
  87.  
  88. define('DB_PARAM_SCALAR',   MDB_PARAM_SCALAR);
  89. define('DB_PARAM_OPAQUE',   MDB_PARAM_OPAQUE);
  90. define('DB_PARAM_MISC',     MDB_PARAM_MISC);
  91.  
  92. define('DB_BINMODE_PASSTHRU',   MDB_BINMODE_PASSTHRU);
  93. define('DB_BINMODE_RETURN',     MDB_BINMODE_RETURN);
  94. define('DB_BINMODE_CONVERT',    MDB_BINMODE_CONVERT);
  95.  
  96. define('DB_FETCHMODE_DEFAULT',      MDB_FETCHMODE_DEFAULT);
  97. define('DB_FETCHMODE_ORDERED',      MDB_FETCHMODE_ORDERED);
  98. define('DB_FETCHMODE_ASSOC',        MDB_FETCHMODE_ASSOC);
  99. define('DB_FETCHMODE_OBJECT',       3);
  100. define('DB_FETCHMODE_FLIPPED',      MDB_FETCHMODE_FLIPPED);
  101.  
  102. define('DB_GETMODE_ORDERED'DB_FETCHMODE_ORDERED);
  103. define('DB_GETMODE_ASSOC',   DB_FETCHMODE_ASSOC);
  104. define('DB_GETMODE_FLIPPED'DB_FETCHMODE_FLIPPED);
  105.  
  106. define('DB_TABLEINFO_ORDER',        MDB_TABLEINFO_ORDER);
  107. define('DB_TABLEINFO_ORDERTABLE',   MDB_TABLEINFO_ORDERTABLE);
  108. define('DB_TABLEINFO_FULL',         MDB_TABLEINFO_FULL);
  109.  
  110. define('DB_AUTOQUERY_INSERT'1);
  111. define('DB_AUTOQUERY_UPDATE'2);
  112.  
  113. /**
  114.  * Wrapper that makes MDB behave like PEAR DB
  115.  *
  116.  * @package MDB
  117.  * @category Database
  118.  * @author  Lukas Smith <smith@backendmedia.com>
  119.  */
  120. class DB
  121. {
  122.     function &factory($type)
  123.     {
  124.         $db =MDB::factory($type);
  125.         if(PEAR::isError($db)) {
  126.             return($db);
  127.         }
  128.         $obj =new MDB_PEAR_PROXY($db);
  129.         return($obj);
  130.     }
  131.  
  132.     function &connect($dsn$options = FALSE)
  133.     {
  134.         if (!is_array($options&& $options{
  135.             $options['persistent'= TRUE;
  136.         }
  137.         $db =MDB::connect($dsn$options);
  138.         if(PEAR::isError($db)) {
  139.             return($db);
  140.         }
  141.         $obj =new MDB_PEAR_PROXY($db);
  142.         return($obj);
  143.     }
  144.  
  145.     function apiVersion()
  146.     {
  147.         return(2);
  148.     }
  149.  
  150.     function isError($value)
  151.     {
  152.         return(MDB::isError($value));
  153.     }
  154.  
  155.     function isManip($query)
  156.     {
  157.         return(MDB::isManip($query));
  158.     }
  159.  
  160.     function errorMessage($value)
  161.     {
  162.         return(MDB::errorMessage($value));
  163.     }
  164.  
  165.     function parseDSN($dsn)
  166.     {
  167.         return(MDB::parseDSN($dsn));
  168.     }
  169.  
  170.     function assertExtension($name)
  171.     {
  172.         if (!extension_loaded($name)) {
  173.             $dlext = OS_WINDOWS ? '.dll' '.so';
  174.             @dl($name $dlext);
  175.         }
  176.         return extension_loaded($name);
  177.     }
  178. }
  179.  
  180. /**
  181.  * MDB_Error implements a class for reporting portable database error
  182.  * messages.
  183.  *
  184.  * @package MDB
  185.  * @category Database
  186.  * @author  Stig Bakken <ssb@fast.no>
  187.  */
  188. class DB_Error extends PEAR_Error
  189. {
  190.     function DB_Error($code = DB_ERROR$mode = PEAR_ERROR_RETURN,
  191.               $level = E_USER_NOTICE$debuginfo = NULL)
  192.     {
  193.         if (is_int($code)) {
  194.             $this->PEAR_Error('DB Error: ' DB::errorMessage($code)$code$mode$level$debuginfo);
  195.         else {
  196.             $this->PEAR_Error("DB Error: $code"DB_ERROR$mode$level$debuginfo);
  197.         }
  198.     }
  199. }
  200.  
  201. /**
  202.  * Wrapper that makes MDB behave like PEAR DB
  203.  *
  204.  * @package MDB
  205.  * @category Database
  206.  * @author  Lukas Smith <smith@backendmedia.com>
  207.  */
  208. class DB_result
  209. {
  210.     var $dbh;
  211.     var $result;
  212.     var $row_counter = NULL;
  213.  
  214.     var $limit_from  = NULL;
  215.  
  216.     var $limit_count = NULL;
  217.  
  218.     function DB_result(&$dbh$result)
  219.     {
  220.         $this->dbh = &$dbh;
  221.         $this->result = $result;
  222.     }
  223.  
  224.     function fetchRow($fetchmode = DB_FETCHMODE_DEFAULT$rownum = 0)
  225.     {
  226.         $arr $this->dbh->fetchInto($this->result$fetchmode$rownum);
  227.         if(is_array($arr)) {
  228.             return($arr);
  229.         }
  230.         else {
  231.             return(NULL);
  232.         }
  233.     }
  234.  
  235.     function fetchInto(&$arr$fetchmode = DB_FETCHMODE_DEFAULT$rownum = 0)
  236.     {
  237.         $arr $this->dbh->fetchInto($this->result$fetchmode$rownum);
  238.         if(MDB::isError($arr)) {
  239.             return($arr);
  240.         }
  241.         if($arr === NULL{
  242.             return($arr);
  243.         }
  244.         return(DB_OK);
  245.     }
  246.  
  247.     function numCols()
  248.     {
  249.         return($this->dbh->numCols($this->result));
  250.     }
  251.  
  252.     function numRows()
  253.     {
  254.         return($this->dbh->numRows($this->result));
  255.     }
  256.  
  257.     function nextResult()
  258.     {
  259.         return($this->dbh->nextResult($this->result));
  260.     }
  261.  
  262.     function free()
  263.     {
  264.         $err $this->dbh->freeResult($this->result);
  265.         if(MDB::isError($err)) {
  266.             return($err);
  267.         }
  268.         $this->result = FALSE;
  269.         return(TRUE);
  270.     }
  271.  
  272.     function tableInfo($mode = NULL)
  273.     {
  274.         return($this->dbh->tableInfo($this->result$mode));
  275.     }
  276.  
  277.     function getRowCounter()
  278.     {
  279.         return($this->dbh->highest_fetched_row[$this->result]);
  280.     }
  281. }
  282.  
  283. class DB_row
  284. {
  285.     function DB_row(&$arr)
  286.     {
  287.         for (reset($arr)$key key($arr)next($arr)) {
  288.             $this->$key &$arr[$key];
  289.         }
  290.     }
  291. }
  292.  
  293. class MDB_PEAR_PROXY
  294. {
  295.     var $MDB_object;
  296.  
  297.     function MDB_PEAR_PROXY($MDB_object)
  298.     {
  299.         $this->MDB_object $MDB_object;
  300.         $this->MDB_object->option['sequence_col_name''id';
  301.     }
  302.  
  303.     function connect($dsninfo$persistent = FALSE)
  304.     {
  305.         return($this->MDB_object->connect($dsninfo$persistent));
  306.     }
  307.  
  308.     function disconnect()
  309.     {
  310.         return($this->MDB_object->disconnect());
  311.     }
  312.  
  313.     function quoteString($string)
  314.     {
  315.         $string $this->_quote($string);
  316.         if ($string{0== "'"{
  317.             return substr($string1-1);
  318.         }
  319.         return($string);
  320.     }
  321.  
  322.     function quote($string)
  323.     {
  324.         if ($string === NULL{
  325.             return 'NULL';
  326.         }
  327.         return($this->MDB_object->_quote($string));
  328.     }
  329.  
  330.     function provides($feature)
  331.     {
  332.         return($this->MDB_object->support($feature));
  333.     }
  334.  
  335.     function errorCode($nativecode)
  336.     {
  337.         return($this->MDB_object->errorCode($nativecode));
  338.     }
  339.  
  340.     function errorMessage($dbcode)
  341.     {
  342.         return($this->MDB_object->errorMessage($dbcode));
  343.     }
  344.  
  345.     function &raiseError($code = DB_ERROR$mode = NULL$options = NULL,
  346.                          $userinfo = NULL$nativecode = NULL)
  347.     {
  348.         return($this->MDB_object->raiseError($code DB_ERROR$mode$options$userinfo$nativecode));
  349.     }
  350.  
  351.     function setFetchMode($fetchmode$object_class = NULL)
  352.     {
  353.         return($this->MDB_object->setFetchMode($fetchmode$object_class));
  354.     }
  355.  
  356.     function setOption($option$value)
  357.     {
  358.         return($this->MDB_object->setOption($option$value));
  359.     }
  360.  
  361.     function getOption($option)
  362.     {
  363.         return($this->MDB_object->getOption($option));
  364.     }
  365.  
  366.     function prepare($query)
  367.     {
  368.         return($this->MDB_object->prepareQuery($query));
  369.     }
  370.  
  371.     function autoPrepare($table$table_fields$mode = DB_AUTOQUERY_INSERT$where = false)
  372.     {
  373.         $query $this->buildManipSQL($table$table_fields$mode$where);
  374.         return($this->prepare($query));
  375.     }
  376.  
  377.     function autoExecute($table$fields_values$mode = DB_AUTOQUERY_INSERT$where = false)
  378.     {
  379.         $sth $this->autoPrepare($tablearray_keys($fields_values)$mode$where);
  380.         return($this->execute($stharray_values($fields_values)));
  381.     }
  382.  
  383.     function buildManipSQL($table$table_fields$mode$where = false)
  384.     {
  385.         if (count($table_fields== 0{
  386.             $this->raiseError(DB_ERROR_NEED_MORE_DATA);
  387.         }
  388.         $first = true;
  389.         switch ($mode{
  390.             case DB_AUTOQUERY_INSERT:
  391.                 $values '';
  392.                 $names '';
  393.                 while (list($valueeach($table_fields)) {
  394.                     if ($first{
  395.                         $first = false;
  396.                     else {
  397.                         $names .= ',';
  398.                         $values .= ',';
  399.                     }
  400.                     $names .= $value;
  401.                     $values .= '?';
  402.                 }
  403.                 return "INSERT INTO $table ($names) VALUES ($values)";
  404.                 break;
  405.             case DB_AUTOQUERY_UPDATE:
  406.                 $set '';
  407.                 while (list($valueeach($table_fields)) {
  408.                     if ($first{
  409.                         $first = false;
  410.                     else {
  411.                         $set .= ',';
  412.                     }
  413.                     $set .= "$value = ?";
  414.                 }
  415.                 $sql = "UPDATE $table SET $set";
  416.                 if ($where{
  417.                     $sql .= " WHERE $where";
  418.                 }
  419.                 return($sql);
  420.                 break;
  421.             default:
  422.                 $this->raiseError(DB_ERROR_SYNTAX);
  423.         }
  424.     }
  425.  
  426.     function execute($stmt$data = FALSE)
  427.     {
  428.         $result $this->MDB_object->execute($stmtNULL$data);
  429.         if (MDB::isError($result|| $result === DB_OK{
  430.             return($result);
  431.         else {
  432.             return new DB_result($this->MDB_object$result);
  433.         }
  434.     }
  435.  
  436.     function executeMultiple$stmt&$data )
  437.     {
  438.         return($this->MDB_object->executeMultiple($stmtNULL$data));
  439.     }
  440.  
  441.     function &query($query$params = array()) {
  442.         if (sizeof($params> 0{
  443.             $sth $this->MDB_object->prepare($query);
  444.             if (MDB::isError($sth)) {
  445.                 return($sth);
  446.             }
  447.             return($this->MDB_object->execute($sth$params));
  448.         else {
  449.             $result $this->MDB_object->query($query);
  450.             if (MDB::isError($result|| $result === DB_OK{
  451.                 return($result);
  452.             else {
  453.                 return new DB_result($this->MDB_object$result);
  454.             }
  455.         }
  456.     }
  457.  
  458.     function simpleQuery($query{
  459.         return($this->MDB_object->query($query));
  460.     }
  461.  
  462.     function limitQuery($query$from$count)
  463.     {
  464.         $result $this->MDB_object->limitQuery($queryNULL$from$count);
  465.         if (MDB::isError($result|| $result === DB_OK{
  466.             return($result);
  467.         else {
  468.             return new DB_result($this->MDB_object$result);
  469.         }
  470.     }
  471.  
  472.     function &getOne($query$params = array())
  473.     {
  474.         return($this->MDB_object->getOne($queryNULL$params));
  475.     }
  476.  
  477.     function &getRow($query,
  478.                      $params = NULL,
  479.                      $fetchmode = DB_FETCHMODE_DEFAULT)
  480.     {
  481.         return($this->MDB_object->getRow($queryNULL$paramsNULL$fetchmode));
  482.     }
  483.  
  484.     function &getCol($query$col = 0$params = array())
  485.     {
  486.         return($this->MDB_object->getCol($queryNULL$paramsNULL$col));
  487.     }
  488.  
  489.     function &getAssoc($query$force_array = FALSE$params = array(),
  490.                        $fetchmode = DB_FETCHMODE_ORDERED$group = FALSE)
  491.     {
  492.         return($this->MDB_object->getAssoc($queryNULL$paramsNULL$fetchmode$force_array$group));
  493.     }
  494.  
  495.     function &getAll($query,
  496.                      $params = NULL,
  497.                      $fetchmode = DB_FETCHMODE_DEFAULT)
  498.     {
  499.         return($this->MDB_object->getAll($queryNULL$paramsNULL$fetchmode));
  500.     }
  501.  
  502.     function autoCommit($onoff = FALSE)
  503.     {
  504.         return($this->MDB_object->autoCommit($onoff));
  505.     }
  506.  
  507.     function commit()
  508.     {
  509.         return($this->MDB_object->commit());
  510.     }
  511.  
  512.     function rollback()
  513.     {
  514.         return($this->MDB_object->rollback());
  515.     }
  516.  
  517.     function numRows($result)
  518.     {
  519.         return($this->MDB_object->numRows($result));
  520.     }
  521.  
  522.     function affectedRows()
  523.     {
  524.         return($this->MDB_object->affectedRows());
  525.     }
  526.  
  527.     function errorNative()
  528.     {
  529.         return($this->MDB_object->errorNative());
  530.     }
  531.  
  532.     function nextId($seq_name$ondemand = TRUE)
  533.     {
  534.         return($this->MDB_object->nextId($seq_name$ondemand));
  535.     }
  536.  
  537.     function createSequence($seq_name)
  538.     {
  539.         return($this->MDB_object->createSequence($seq_name1));
  540.     }
  541.  
  542.     function dropSequence($seq_name)
  543.     {
  544.         return($this->MDB_object->dropSequence($seq_name));
  545.     }
  546.  
  547.     function tableInfo($result$mode = NULL)
  548.     {
  549.         return($this->MDB_object->tableInfo($result$mode));
  550.     }
  551.  
  552.     function getTables()
  553.     {
  554.         return($this->getListOf('tables'));
  555.     }
  556.  
  557.     function getListOf($type)
  558.     {
  559.         switch ($type{
  560.             case 'tables':
  561.                 return($this->MDB_object->listTables());
  562.             case 'views':
  563.                 return($this->MDB_object->listViews());
  564.             case 'users':
  565.                 return($this->MDB_object->listUsers());
  566.             case 'functions':
  567.                 return($this->MDB_object->listFunctions());
  568.             case 'databases':
  569.                 return($this->MDB_object->listDatabases());
  570.             default:
  571.                 return($this->raiseError(DB_ERROR_UNSUPPORTED));
  572.         }
  573.     }
  574. }
  575. ?>

Documentation generated on Mon, 11 Mar 2019 10:15:31 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.