web/lib/Zend/Db/Adapter/Abstract.php
changeset 64 162c1de6545a
parent 19 1c2f13fd785c
child 68 ecaf28ffe26e
equal deleted inserted replaced
63:5b37998e522e 64:162c1de6545a
       
     1 <?php
       
     2 /**
       
     3  * Zend Framework
       
     4  *
       
     5  * LICENSE
       
     6  *
       
     7  * This source file is subject to the new BSD license that is bundled
       
     8  * with this package in the file LICENSE.txt.
       
     9  * It is also available through the world-wide-web at this URL:
       
    10  * http://framework.zend.com/license/new-bsd
       
    11  * If you did not receive a copy of the license and are unable to
       
    12  * obtain it through the world-wide-web, please send an email
       
    13  * to license@zend.com so we can send you a copy immediately.
       
    14  *
       
    15  * @category   Zend
       
    16  * @package    Zend_Db
       
    17  * @subpackage Adapter
       
    18  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    19  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    20  * @version    $Id: Abstract.php 23252 2010-10-26 12:48:32Z matthew $
       
    21  */
       
    22 
       
    23 
       
    24 /**
       
    25  * @see Zend_Db
       
    26  */
       
    27 require_once 'Zend/Db.php';
       
    28 
       
    29 /**
       
    30  * @see Zend_Db_Select
       
    31  */
       
    32 require_once 'Zend/Db/Select.php';
       
    33 
       
    34 /**
       
    35  * Class for connecting to SQL databases and performing common operations.
       
    36  *
       
    37  * @category   Zend
       
    38  * @package    Zend_Db
       
    39  * @subpackage Adapter
       
    40  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    41  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    42  */
       
    43 abstract class Zend_Db_Adapter_Abstract
       
    44 {
       
    45 
       
    46     /**
       
    47      * User-provided configuration
       
    48      *
       
    49      * @var array
       
    50      */
       
    51     protected $_config = array();
       
    52 
       
    53     /**
       
    54      * Fetch mode
       
    55      *
       
    56      * @var integer
       
    57      */
       
    58     protected $_fetchMode = Zend_Db::FETCH_ASSOC;
       
    59 
       
    60     /**
       
    61      * Query profiler object, of type Zend_Db_Profiler
       
    62      * or a subclass of that.
       
    63      *
       
    64      * @var Zend_Db_Profiler
       
    65      */
       
    66     protected $_profiler;
       
    67 
       
    68     /**
       
    69      * Default class name for a DB statement.
       
    70      *
       
    71      * @var string
       
    72      */
       
    73     protected $_defaultStmtClass = 'Zend_Db_Statement';
       
    74 
       
    75     /**
       
    76      * Default class name for the profiler object.
       
    77      *
       
    78      * @var string
       
    79      */
       
    80     protected $_defaultProfilerClass = 'Zend_Db_Profiler';
       
    81 
       
    82     /**
       
    83      * Database connection
       
    84      *
       
    85      * @var object|resource|null
       
    86      */
       
    87     protected $_connection = null;
       
    88 
       
    89     /**
       
    90      * Specifies the case of column names retrieved in queries
       
    91      * Options
       
    92      * Zend_Db::CASE_NATURAL (default)
       
    93      * Zend_Db::CASE_LOWER
       
    94      * Zend_Db::CASE_UPPER
       
    95      *
       
    96      * @var integer
       
    97      */
       
    98     protected $_caseFolding = Zend_Db::CASE_NATURAL;
       
    99 
       
   100     /**
       
   101      * Specifies whether the adapter automatically quotes identifiers.
       
   102      * If true, most SQL generated by Zend_Db classes applies
       
   103      * identifier quoting automatically.
       
   104      * If false, developer must quote identifiers themselves
       
   105      * by calling quoteIdentifier().
       
   106      *
       
   107      * @var bool
       
   108      */
       
   109     protected $_autoQuoteIdentifiers = true;
       
   110 
       
   111     /**
       
   112      * Keys are UPPERCASE SQL datatypes or the constants
       
   113      * Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, or Zend_Db::FLOAT_TYPE.
       
   114      *
       
   115      * Values are:
       
   116      * 0 = 32-bit integer
       
   117      * 1 = 64-bit integer
       
   118      * 2 = float or decimal
       
   119      *
       
   120      * @var array Associative array of datatypes to values 0, 1, or 2.
       
   121      */
       
   122     protected $_numericDataTypes = array(
       
   123         Zend_Db::INT_TYPE    => Zend_Db::INT_TYPE,
       
   124         Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE,
       
   125         Zend_Db::FLOAT_TYPE  => Zend_Db::FLOAT_TYPE
       
   126     );
       
   127 
       
   128     /** Weither or not that object can get serialized
       
   129      *
       
   130      * @var bool
       
   131      */
       
   132     protected $_allowSerialization = true;
       
   133 
       
   134     /**
       
   135      * Weither or not the database should be reconnected
       
   136      * to that adapter when waking up
       
   137      *
       
   138      * @var bool
       
   139      */
       
   140     protected $_autoReconnectOnUnserialize = false;
       
   141 
       
   142     /**
       
   143      * Constructor.
       
   144      *
       
   145      * $config is an array of key/value pairs or an instance of Zend_Config
       
   146      * containing configuration options.  These options are common to most adapters:
       
   147      *
       
   148      * dbname         => (string) The name of the database to user
       
   149      * username       => (string) Connect to the database as this username.
       
   150      * password       => (string) Password associated with the username.
       
   151      * host           => (string) What host to connect to, defaults to localhost
       
   152      *
       
   153      * Some options are used on a case-by-case basis by adapters:
       
   154      *
       
   155      * port           => (string) The port of the database
       
   156      * persistent     => (boolean) Whether to use a persistent connection or not, defaults to false
       
   157      * protocol       => (string) The network protocol, defaults to TCPIP
       
   158      * caseFolding    => (int) style of case-alteration used for identifiers
       
   159      *
       
   160      * @param  array|Zend_Config $config An array or instance of Zend_Config having configuration data
       
   161      * @throws Zend_Db_Adapter_Exception
       
   162      */
       
   163     public function __construct($config)
       
   164     {
       
   165         /*
       
   166          * Verify that adapter parameters are in an array.
       
   167          */
       
   168         if (!is_array($config)) {
       
   169             /*
       
   170              * Convert Zend_Config argument to a plain array.
       
   171              */
       
   172             if ($config instanceof Zend_Config) {
       
   173                 $config = $config->toArray();
       
   174             } else {
       
   175                 /**
       
   176                  * @see Zend_Db_Adapter_Exception
       
   177                  */
       
   178                 require_once 'Zend/Db/Adapter/Exception.php';
       
   179                 throw new Zend_Db_Adapter_Exception('Adapter parameters must be in an array or a Zend_Config object');
       
   180             }
       
   181         }
       
   182 
       
   183         $this->_checkRequiredOptions($config);
       
   184 
       
   185         $options = array(
       
   186             Zend_Db::CASE_FOLDING           => $this->_caseFolding,
       
   187             Zend_Db::AUTO_QUOTE_IDENTIFIERS => $this->_autoQuoteIdentifiers,
       
   188             Zend_Db::FETCH_MODE             => $this->_fetchMode,
       
   189         );
       
   190         $driverOptions = array();
       
   191 
       
   192         /*
       
   193          * normalize the config and merge it with the defaults
       
   194          */
       
   195         if (array_key_exists('options', $config)) {
       
   196             // can't use array_merge() because keys might be integers
       
   197             foreach ((array) $config['options'] as $key => $value) {
       
   198                 $options[$key] = $value;
       
   199             }
       
   200         }
       
   201         if (array_key_exists('driver_options', $config)) {
       
   202             if (!empty($config['driver_options'])) {
       
   203                 // can't use array_merge() because keys might be integers
       
   204                 foreach ((array) $config['driver_options'] as $key => $value) {
       
   205                     $driverOptions[$key] = $value;
       
   206                 }
       
   207             }
       
   208         }
       
   209 
       
   210         if (!isset($config['charset'])) {
       
   211             $config['charset'] = null;
       
   212         }
       
   213 
       
   214         if (!isset($config['persistent'])) {
       
   215             $config['persistent'] = false;
       
   216         }
       
   217 
       
   218         $this->_config = array_merge($this->_config, $config);
       
   219         $this->_config['options'] = $options;
       
   220         $this->_config['driver_options'] = $driverOptions;
       
   221 
       
   222 
       
   223         // obtain the case setting, if there is one
       
   224         if (array_key_exists(Zend_Db::CASE_FOLDING, $options)) {
       
   225             $case = (int) $options[Zend_Db::CASE_FOLDING];
       
   226             switch ($case) {
       
   227                 case Zend_Db::CASE_LOWER:
       
   228                 case Zend_Db::CASE_UPPER:
       
   229                 case Zend_Db::CASE_NATURAL:
       
   230                     $this->_caseFolding = $case;
       
   231                     break;
       
   232                 default:
       
   233                     /** @see Zend_Db_Adapter_Exception */
       
   234                     require_once 'Zend/Db/Adapter/Exception.php';
       
   235                     throw new Zend_Db_Adapter_Exception('Case must be one of the following constants: '
       
   236                         . 'Zend_Db::CASE_NATURAL, Zend_Db::CASE_LOWER, Zend_Db::CASE_UPPER');
       
   237             }
       
   238         }
       
   239 
       
   240         if (array_key_exists(Zend_Db::FETCH_MODE, $options)) {
       
   241             if (is_string($options[Zend_Db::FETCH_MODE])) {
       
   242                 $constant = 'Zend_Db::FETCH_' . strtoupper($options[Zend_Db::FETCH_MODE]);
       
   243                 if(defined($constant)) {
       
   244                     $options[Zend_Db::FETCH_MODE] = constant($constant);
       
   245                 }
       
   246             }
       
   247             $this->setFetchMode((int) $options[Zend_Db::FETCH_MODE]);
       
   248         }
       
   249 
       
   250         // obtain quoting property if there is one
       
   251         if (array_key_exists(Zend_Db::AUTO_QUOTE_IDENTIFIERS, $options)) {
       
   252             $this->_autoQuoteIdentifiers = (bool) $options[Zend_Db::AUTO_QUOTE_IDENTIFIERS];
       
   253         }
       
   254 
       
   255         // obtain allow serialization property if there is one
       
   256         if (array_key_exists(Zend_Db::ALLOW_SERIALIZATION, $options)) {
       
   257             $this->_allowSerialization = (bool) $options[Zend_Db::ALLOW_SERIALIZATION];
       
   258         }
       
   259 
       
   260         // obtain auto reconnect on unserialize property if there is one
       
   261         if (array_key_exists(Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE, $options)) {
       
   262             $this->_autoReconnectOnUnserialize = (bool) $options[Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE];
       
   263         }
       
   264 
       
   265         // create a profiler object
       
   266         $profiler = false;
       
   267         if (array_key_exists(Zend_Db::PROFILER, $this->_config)) {
       
   268             $profiler = $this->_config[Zend_Db::PROFILER];
       
   269             unset($this->_config[Zend_Db::PROFILER]);
       
   270         }
       
   271         $this->setProfiler($profiler);
       
   272     }
       
   273 
       
   274     /**
       
   275      * Check for config options that are mandatory.
       
   276      * Throw exceptions if any are missing.
       
   277      *
       
   278      * @param array $config
       
   279      * @throws Zend_Db_Adapter_Exception
       
   280      */
       
   281     protected function _checkRequiredOptions(array $config)
       
   282     {
       
   283         // we need at least a dbname
       
   284         if (! array_key_exists('dbname', $config)) {
       
   285             /** @see Zend_Db_Adapter_Exception */
       
   286             require_once 'Zend/Db/Adapter/Exception.php';
       
   287             throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'dbname' that names the database instance");
       
   288         }
       
   289 
       
   290         if (! array_key_exists('password', $config)) {
       
   291             /**
       
   292              * @see Zend_Db_Adapter_Exception
       
   293              */
       
   294             require_once 'Zend/Db/Adapter/Exception.php';
       
   295             throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'password' for login credentials");
       
   296         }
       
   297 
       
   298         if (! array_key_exists('username', $config)) {
       
   299             /**
       
   300              * @see Zend_Db_Adapter_Exception
       
   301              */
       
   302             require_once 'Zend/Db/Adapter/Exception.php';
       
   303             throw new Zend_Db_Adapter_Exception("Configuration array must have a key for 'username' for login credentials");
       
   304         }
       
   305     }
       
   306 
       
   307     /**
       
   308      * Returns the underlying database connection object or resource.
       
   309      * If not presently connected, this initiates the connection.
       
   310      *
       
   311      * @return object|resource|null
       
   312      */
       
   313     public function getConnection()
       
   314     {
       
   315         $this->_connect();
       
   316         return $this->_connection;
       
   317     }
       
   318 
       
   319     /**
       
   320      * Returns the configuration variables in this adapter.
       
   321      *
       
   322      * @return array
       
   323      */
       
   324     public function getConfig()
       
   325     {
       
   326         return $this->_config;
       
   327     }
       
   328 
       
   329     /**
       
   330      * Set the adapter's profiler object.
       
   331      *
       
   332      * The argument may be a boolean, an associative array, an instance of
       
   333      * Zend_Db_Profiler, or an instance of Zend_Config.
       
   334      *
       
   335      * A boolean argument sets the profiler to enabled if true, or disabled if
       
   336      * false.  The profiler class is the adapter's default profiler class,
       
   337      * Zend_Db_Profiler.
       
   338      *
       
   339      * An instance of Zend_Db_Profiler sets the adapter's instance to that
       
   340      * object.  The profiler is enabled and disabled separately.
       
   341      *
       
   342      * An associative array argument may contain any of the keys 'enabled',
       
   343      * 'class', and 'instance'. The 'enabled' and 'instance' keys correspond to the
       
   344      * boolean and object types documented above. The 'class' key is used to name a
       
   345      * class to use for a custom profiler. The class must be Zend_Db_Profiler or a
       
   346      * subclass. The class is instantiated with no constructor arguments. The 'class'
       
   347      * option is ignored when the 'instance' option is supplied.
       
   348      *
       
   349      * An object of type Zend_Config may contain the properties 'enabled', 'class', and
       
   350      * 'instance', just as if an associative array had been passed instead.
       
   351      *
       
   352      * @param  Zend_Db_Profiler|Zend_Config|array|boolean $profiler
       
   353      * @return Zend_Db_Adapter_Abstract Provides a fluent interface
       
   354      * @throws Zend_Db_Profiler_Exception if the object instance or class specified
       
   355      *         is not Zend_Db_Profiler or an extension of that class.
       
   356      */
       
   357     public function setProfiler($profiler)
       
   358     {
       
   359         $enabled          = null;
       
   360         $profilerClass    = $this->_defaultProfilerClass;
       
   361         $profilerInstance = null;
       
   362 
       
   363         if ($profilerIsObject = is_object($profiler)) {
       
   364             if ($profiler instanceof Zend_Db_Profiler) {
       
   365                 $profilerInstance = $profiler;
       
   366             } else if ($profiler instanceof Zend_Config) {
       
   367                 $profiler = $profiler->toArray();
       
   368             } else {
       
   369                 /**
       
   370                  * @see Zend_Db_Profiler_Exception
       
   371                  */
       
   372                 require_once 'Zend/Db/Profiler/Exception.php';
       
   373                 throw new Zend_Db_Profiler_Exception('Profiler argument must be an instance of either Zend_Db_Profiler'
       
   374                     . ' or Zend_Config when provided as an object');
       
   375             }
       
   376         }
       
   377 
       
   378         if (is_array($profiler)) {
       
   379             if (isset($profiler['enabled'])) {
       
   380                 $enabled = (bool) $profiler['enabled'];
       
   381             }
       
   382             if (isset($profiler['class'])) {
       
   383                 $profilerClass = $profiler['class'];
       
   384             }
       
   385             if (isset($profiler['instance'])) {
       
   386                 $profilerInstance = $profiler['instance'];
       
   387             }
       
   388         } else if (!$profilerIsObject) {
       
   389             $enabled = (bool) $profiler;
       
   390         }
       
   391 
       
   392         if ($profilerInstance === null) {
       
   393             if (!class_exists($profilerClass)) {
       
   394                 require_once 'Zend/Loader.php';
       
   395                 Zend_Loader::loadClass($profilerClass);
       
   396             }
       
   397             $profilerInstance = new $profilerClass();
       
   398         }
       
   399 
       
   400         if (!$profilerInstance instanceof Zend_Db_Profiler) {
       
   401             /** @see Zend_Db_Profiler_Exception */
       
   402             require_once 'Zend/Db/Profiler/Exception.php';
       
   403             throw new Zend_Db_Profiler_Exception('Class ' . get_class($profilerInstance) . ' does not extend '
       
   404                 . 'Zend_Db_Profiler');
       
   405         }
       
   406 
       
   407         if (null !== $enabled) {
       
   408             $profilerInstance->setEnabled($enabled);
       
   409         }
       
   410 
       
   411         $this->_profiler = $profilerInstance;
       
   412 
       
   413         return $this;
       
   414     }
       
   415 
       
   416 
       
   417     /**
       
   418      * Returns the profiler for this adapter.
       
   419      *
       
   420      * @return Zend_Db_Profiler
       
   421      */
       
   422     public function getProfiler()
       
   423     {
       
   424         return $this->_profiler;
       
   425     }
       
   426 
       
   427     /**
       
   428      * Get the default statement class.
       
   429      *
       
   430      * @return string
       
   431      */
       
   432     public function getStatementClass()
       
   433     {
       
   434         return $this->_defaultStmtClass;
       
   435     }
       
   436 
       
   437     /**
       
   438      * Set the default statement class.
       
   439      *
       
   440      * @return Zend_Db_Adapter_Abstract Fluent interface
       
   441      */
       
   442     public function setStatementClass($class)
       
   443     {
       
   444         $this->_defaultStmtClass = $class;
       
   445         return $this;
       
   446     }
       
   447 
       
   448     /**
       
   449      * Prepares and executes an SQL statement with bound data.
       
   450      *
       
   451      * @param  mixed  $sql  The SQL statement with placeholders.
       
   452      *                      May be a string or Zend_Db_Select.
       
   453      * @param  mixed  $bind An array of data to bind to the placeholders.
       
   454      * @return Zend_Db_Statement_Interface
       
   455      */
       
   456     public function query($sql, $bind = array())
       
   457     {
       
   458         // connect to the database if needed
       
   459         $this->_connect();
       
   460 
       
   461         // is the $sql a Zend_Db_Select object?
       
   462         if ($sql instanceof Zend_Db_Select) {
       
   463             if (empty($bind)) {
       
   464                 $bind = $sql->getBind();
       
   465             }
       
   466 
       
   467             $sql = $sql->assemble();
       
   468         }
       
   469 
       
   470         // make sure $bind to an array;
       
   471         // don't use (array) typecasting because
       
   472         // because $bind may be a Zend_Db_Expr object
       
   473         if (!is_array($bind)) {
       
   474             $bind = array($bind);
       
   475         }
       
   476 
       
   477         // prepare and execute the statement with profiling
       
   478         $stmt = $this->prepare($sql);
       
   479         $stmt->execute($bind);
       
   480 
       
   481         // return the results embedded in the prepared statement object
       
   482         $stmt->setFetchMode($this->_fetchMode);
       
   483         return $stmt;
       
   484     }
       
   485 
       
   486     /**
       
   487      * Leave autocommit mode and begin a transaction.
       
   488      *
       
   489      * @return Zend_Db_Adapter_Abstract
       
   490      */
       
   491     public function beginTransaction()
       
   492     {
       
   493         $this->_connect();
       
   494         $q = $this->_profiler->queryStart('begin', Zend_Db_Profiler::TRANSACTION);
       
   495         $this->_beginTransaction();
       
   496         $this->_profiler->queryEnd($q);
       
   497         return $this;
       
   498     }
       
   499 
       
   500     /**
       
   501      * Commit a transaction and return to autocommit mode.
       
   502      *
       
   503      * @return Zend_Db_Adapter_Abstract
       
   504      */
       
   505     public function commit()
       
   506     {
       
   507         $this->_connect();
       
   508         $q = $this->_profiler->queryStart('commit', Zend_Db_Profiler::TRANSACTION);
       
   509         $this->_commit();
       
   510         $this->_profiler->queryEnd($q);
       
   511         return $this;
       
   512     }
       
   513 
       
   514     /**
       
   515      * Roll back a transaction and return to autocommit mode.
       
   516      *
       
   517      * @return Zend_Db_Adapter_Abstract
       
   518      */
       
   519     public function rollBack()
       
   520     {
       
   521         $this->_connect();
       
   522         $q = $this->_profiler->queryStart('rollback', Zend_Db_Profiler::TRANSACTION);
       
   523         $this->_rollBack();
       
   524         $this->_profiler->queryEnd($q);
       
   525         return $this;
       
   526     }
       
   527 
       
   528     /**
       
   529      * Inserts a table row with specified data.
       
   530      *
       
   531      * @param mixed $table The table to insert data into.
       
   532      * @param array $bind Column-value pairs.
       
   533      * @return int The number of affected rows.
       
   534      */
       
   535     public function insert($table, array $bind)
       
   536     {
       
   537         // extract and quote col names from the array keys
       
   538         $cols = array();
       
   539         $vals = array();
       
   540         $i = 0;
       
   541         foreach ($bind as $col => $val) {
       
   542             $cols[] = $this->quoteIdentifier($col, true);
       
   543             if ($val instanceof Zend_Db_Expr) {
       
   544                 $vals[] = $val->__toString();
       
   545                 unset($bind[$col]);
       
   546             } else {
       
   547                 if ($this->supportsParameters('positional')) {
       
   548                     $vals[] = '?';
       
   549                 } else {
       
   550                     if ($this->supportsParameters('named')) {
       
   551                         unset($bind[$col]);
       
   552                         $bind[':col'.$i] = $val;
       
   553                         $vals[] = ':col'.$i;
       
   554                         $i++;
       
   555                     } else {
       
   556                         /** @see Zend_Db_Adapter_Exception */
       
   557                         require_once 'Zend/Db/Adapter/Exception.php';
       
   558                         throw new Zend_Db_Adapter_Exception(get_class($this) ." doesn't support positional or named binding");
       
   559                     }
       
   560                 }
       
   561             }
       
   562         }
       
   563 
       
   564         // build the statement
       
   565         $sql = "INSERT INTO "
       
   566              . $this->quoteIdentifier($table, true)
       
   567              . ' (' . implode(', ', $cols) . ') '
       
   568              . 'VALUES (' . implode(', ', $vals) . ')';
       
   569 
       
   570         // execute the statement and return the number of affected rows
       
   571         if ($this->supportsParameters('positional')) {
       
   572             $bind = array_values($bind);
       
   573         }
       
   574         $stmt = $this->query($sql, $bind);
       
   575         $result = $stmt->rowCount();
       
   576         return $result;
       
   577     }
       
   578 
       
   579     /**
       
   580      * Updates table rows with specified data based on a WHERE clause.
       
   581      *
       
   582      * @param  mixed        $table The table to update.
       
   583      * @param  array        $bind  Column-value pairs.
       
   584      * @param  mixed        $where UPDATE WHERE clause(s).
       
   585      * @return int          The number of affected rows.
       
   586      */
       
   587     public function update($table, array $bind, $where = '')
       
   588     {
       
   589         /**
       
   590          * Build "col = ?" pairs for the statement,
       
   591          * except for Zend_Db_Expr which is treated literally.
       
   592          */
       
   593         $set = array();
       
   594         $i = 0;
       
   595         foreach ($bind as $col => $val) {
       
   596             if ($val instanceof Zend_Db_Expr) {
       
   597                 $val = $val->__toString();
       
   598                 unset($bind[$col]);
       
   599             } else {
       
   600                 if ($this->supportsParameters('positional')) {
       
   601                     $val = '?';
       
   602                 } else {
       
   603                     if ($this->supportsParameters('named')) {
       
   604                         unset($bind[$col]);
       
   605                         $bind[':col'.$i] = $val;
       
   606                         $val = ':col'.$i;
       
   607                         $i++;
       
   608                     } else {
       
   609                         /** @see Zend_Db_Adapter_Exception */
       
   610                         require_once 'Zend/Db/Adapter/Exception.php';
       
   611                         throw new Zend_Db_Adapter_Exception(get_class($this) ." doesn't support positional or named binding");
       
   612                     }
       
   613                 }
       
   614             }
       
   615             $set[] = $this->quoteIdentifier($col, true) . ' = ' . $val;
       
   616         }
       
   617 
       
   618         $where = $this->_whereExpr($where);
       
   619 
       
   620         /**
       
   621          * Build the UPDATE statement
       
   622          */
       
   623         $sql = "UPDATE "
       
   624              . $this->quoteIdentifier($table, true)
       
   625              . ' SET ' . implode(', ', $set)
       
   626              . (($where) ? " WHERE $where" : '');
       
   627 
       
   628         /**
       
   629          * Execute the statement and return the number of affected rows
       
   630          */
       
   631         if ($this->supportsParameters('positional')) {
       
   632             $stmt = $this->query($sql, array_values($bind));
       
   633         } else {
       
   634             $stmt = $this->query($sql, $bind);
       
   635         }
       
   636         $result = $stmt->rowCount();
       
   637         return $result;
       
   638     }
       
   639 
       
   640     /**
       
   641      * Deletes table rows based on a WHERE clause.
       
   642      *
       
   643      * @param  mixed        $table The table to update.
       
   644      * @param  mixed        $where DELETE WHERE clause(s).
       
   645      * @return int          The number of affected rows.
       
   646      */
       
   647     public function delete($table, $where = '')
       
   648     {
       
   649         $where = $this->_whereExpr($where);
       
   650 
       
   651         /**
       
   652          * Build the DELETE statement
       
   653          */
       
   654         $sql = "DELETE FROM "
       
   655              . $this->quoteIdentifier($table, true)
       
   656              . (($where) ? " WHERE $where" : '');
       
   657 
       
   658         /**
       
   659          * Execute the statement and return the number of affected rows
       
   660          */
       
   661         $stmt = $this->query($sql);
       
   662         $result = $stmt->rowCount();
       
   663         return $result;
       
   664     }
       
   665 
       
   666     /**
       
   667      * Convert an array, string, or Zend_Db_Expr object
       
   668      * into a string to put in a WHERE clause.
       
   669      *
       
   670      * @param mixed $where
       
   671      * @return string
       
   672      */
       
   673     protected function _whereExpr($where)
       
   674     {
       
   675         if (empty($where)) {
       
   676             return $where;
       
   677         }
       
   678         if (!is_array($where)) {
       
   679             $where = array($where);
       
   680         }
       
   681         foreach ($where as $cond => &$term) {
       
   682             // is $cond an int? (i.e. Not a condition)
       
   683             if (is_int($cond)) {
       
   684                 // $term is the full condition
       
   685                 if ($term instanceof Zend_Db_Expr) {
       
   686                     $term = $term->__toString();
       
   687                 }
       
   688             } else {
       
   689                 // $cond is the condition with placeholder,
       
   690                 // and $term is quoted into the condition
       
   691                 $term = $this->quoteInto($cond, $term);
       
   692             }
       
   693             $term = '(' . $term . ')';
       
   694         }
       
   695 
       
   696         $where = implode(' AND ', $where);
       
   697         return $where;
       
   698     }
       
   699 
       
   700     /**
       
   701      * Creates and returns a new Zend_Db_Select object for this adapter.
       
   702      *
       
   703      * @return Zend_Db_Select
       
   704      */
       
   705     public function select()
       
   706     {
       
   707         return new Zend_Db_Select($this);
       
   708     }
       
   709 
       
   710     /**
       
   711      * Get the fetch mode.
       
   712      *
       
   713      * @return int
       
   714      */
       
   715     public function getFetchMode()
       
   716     {
       
   717         return $this->_fetchMode;
       
   718     }
       
   719 
       
   720     /**
       
   721      * Fetches all SQL result rows as a sequential array.
       
   722      * Uses the current fetchMode for the adapter.
       
   723      *
       
   724      * @param string|Zend_Db_Select $sql  An SQL SELECT statement.
       
   725      * @param mixed                 $bind Data to bind into SELECT placeholders.
       
   726      * @param mixed                 $fetchMode Override current fetch mode.
       
   727      * @return array
       
   728      */
       
   729     public function fetchAll($sql, $bind = array(), $fetchMode = null)
       
   730     {
       
   731         if ($fetchMode === null) {
       
   732             $fetchMode = $this->_fetchMode;
       
   733         }
       
   734         $stmt = $this->query($sql, $bind);
       
   735         $result = $stmt->fetchAll($fetchMode);
       
   736         return $result;
       
   737     }
       
   738 
       
   739     /**
       
   740      * Fetches the first row of the SQL result.
       
   741      * Uses the current fetchMode for the adapter.
       
   742      *
       
   743      * @param string|Zend_Db_Select $sql An SQL SELECT statement.
       
   744      * @param mixed $bind Data to bind into SELECT placeholders.
       
   745      * @param mixed                 $fetchMode Override current fetch mode.
       
   746      * @return array
       
   747      */
       
   748     public function fetchRow($sql, $bind = array(), $fetchMode = null)
       
   749     {
       
   750         if ($fetchMode === null) {
       
   751             $fetchMode = $this->_fetchMode;
       
   752         }
       
   753         $stmt = $this->query($sql, $bind);
       
   754         $result = $stmt->fetch($fetchMode);
       
   755         return $result;
       
   756     }
       
   757 
       
   758     /**
       
   759      * Fetches all SQL result rows as an associative array.
       
   760      *
       
   761      * The first column is the key, the entire row array is the
       
   762      * value.  You should construct the query to be sure that
       
   763      * the first column contains unique values, or else
       
   764      * rows with duplicate values in the first column will
       
   765      * overwrite previous data.
       
   766      *
       
   767      * @param string|Zend_Db_Select $sql An SQL SELECT statement.
       
   768      * @param mixed $bind Data to bind into SELECT placeholders.
       
   769      * @return array
       
   770      */
       
   771     public function fetchAssoc($sql, $bind = array())
       
   772     {
       
   773         $stmt = $this->query($sql, $bind);
       
   774         $data = array();
       
   775         while ($row = $stmt->fetch(Zend_Db::FETCH_ASSOC)) {
       
   776             $tmp = array_values(array_slice($row, 0, 1));
       
   777             $data[$tmp[0]] = $row;
       
   778         }
       
   779         return $data;
       
   780     }
       
   781 
       
   782     /**
       
   783      * Fetches the first column of all SQL result rows as an array.
       
   784      *
       
   785      * @param string|Zend_Db_Select $sql An SQL SELECT statement.
       
   786      * @param mixed $bind Data to bind into SELECT placeholders.
       
   787      * @return array
       
   788      */
       
   789     public function fetchCol($sql, $bind = array())
       
   790     {
       
   791         $stmt = $this->query($sql, $bind);
       
   792         $result = $stmt->fetchAll(Zend_Db::FETCH_COLUMN, 0);
       
   793         return $result;
       
   794     }
       
   795 
       
   796     /**
       
   797      * Fetches all SQL result rows as an array of key-value pairs.
       
   798      *
       
   799      * The first column is the key, the second column is the
       
   800      * value.
       
   801      *
       
   802      * @param string|Zend_Db_Select $sql An SQL SELECT statement.
       
   803      * @param mixed $bind Data to bind into SELECT placeholders.
       
   804      * @return array
       
   805      */
       
   806     public function fetchPairs($sql, $bind = array())
       
   807     {
       
   808         $stmt = $this->query($sql, $bind);
       
   809         $data = array();
       
   810         while ($row = $stmt->fetch(Zend_Db::FETCH_NUM)) {
       
   811             $data[$row[0]] = $row[1];
       
   812         }
       
   813         return $data;
       
   814     }
       
   815 
       
   816     /**
       
   817      * Fetches the first column of the first row of the SQL result.
       
   818      *
       
   819      * @param string|Zend_Db_Select $sql An SQL SELECT statement.
       
   820      * @param mixed $bind Data to bind into SELECT placeholders.
       
   821      * @return string
       
   822      */
       
   823     public function fetchOne($sql, $bind = array())
       
   824     {
       
   825         $stmt = $this->query($sql, $bind);
       
   826         $result = $stmt->fetchColumn(0);
       
   827         return $result;
       
   828     }
       
   829 
       
   830     /**
       
   831      * Quote a raw string.
       
   832      *
       
   833      * @param string $value     Raw string
       
   834      * @return string           Quoted string
       
   835      */
       
   836     protected function _quote($value)
       
   837     {
       
   838         if (is_int($value)) {
       
   839             return $value;
       
   840         } elseif (is_float($value)) {
       
   841             return sprintf('%F', $value);
       
   842         }
       
   843         return "'" . addcslashes($value, "\000\n\r\\'\"\032") . "'";
       
   844     }
       
   845 
       
   846     /**
       
   847      * Safely quotes a value for an SQL statement.
       
   848      *
       
   849      * If an array is passed as the value, the array values are quoted
       
   850      * and then returned as a comma-separated string.
       
   851      *
       
   852      * @param mixed $value The value to quote.
       
   853      * @param mixed $type  OPTIONAL the SQL datatype name, or constant, or null.
       
   854      * @return mixed An SQL-safe quoted value (or string of separated values).
       
   855      */
       
   856     public function quote($value, $type = null)
       
   857     {
       
   858         $this->_connect();
       
   859 
       
   860         if ($value instanceof Zend_Db_Select) {
       
   861             return '(' . $value->assemble() . ')';
       
   862         }
       
   863 
       
   864         if ($value instanceof Zend_Db_Expr) {
       
   865             return $value->__toString();
       
   866         }
       
   867 
       
   868         if (is_array($value)) {
       
   869             foreach ($value as &$val) {
       
   870                 $val = $this->quote($val, $type);
       
   871             }
       
   872             return implode(', ', $value);
       
   873         }
       
   874 
       
   875         if ($type !== null && array_key_exists($type = strtoupper($type), $this->_numericDataTypes)) {
       
   876             $quotedValue = '0';
       
   877             switch ($this->_numericDataTypes[$type]) {
       
   878                 case Zend_Db::INT_TYPE: // 32-bit integer
       
   879                     $quotedValue = (string) intval($value);
       
   880                     break;
       
   881                 case Zend_Db::BIGINT_TYPE: // 64-bit integer
       
   882                     // ANSI SQL-style hex literals (e.g. x'[\dA-F]+')
       
   883                     // are not supported here, because these are string
       
   884                     // literals, not numeric literals.
       
   885                     if (preg_match('/^(
       
   886                           [+-]?                  # optional sign
       
   887                           (?:
       
   888                             0[Xx][\da-fA-F]+     # ODBC-style hexadecimal
       
   889                             |\d+                 # decimal or octal, or MySQL ZEROFILL decimal
       
   890                             (?:[eE][+-]?\d+)?    # optional exponent on decimals or octals
       
   891                           )
       
   892                         )/x',
       
   893                         (string) $value, $matches)) {
       
   894                         $quotedValue = $matches[1];
       
   895                     }
       
   896                     break;
       
   897                 case Zend_Db::FLOAT_TYPE: // float or decimal
       
   898                     $quotedValue = sprintf('%F', $value);
       
   899             }
       
   900             return $quotedValue;
       
   901         }
       
   902 
       
   903         return $this->_quote($value);
       
   904     }
       
   905 
       
   906     /**
       
   907      * Quotes a value and places into a piece of text at a placeholder.
       
   908      *
       
   909      * The placeholder is a question-mark; all placeholders will be replaced
       
   910      * with the quoted value.   For example:
       
   911      *
       
   912      * <code>
       
   913      * $text = "WHERE date < ?";
       
   914      * $date = "2005-01-02";
       
   915      * $safe = $sql->quoteInto($text, $date);
       
   916      * // $safe = "WHERE date < '2005-01-02'"
       
   917      * </code>
       
   918      *
       
   919      * @param string  $text  The text with a placeholder.
       
   920      * @param mixed   $value The value to quote.
       
   921      * @param string  $type  OPTIONAL SQL datatype
       
   922      * @param integer $count OPTIONAL count of placeholders to replace
       
   923      * @return string An SQL-safe quoted value placed into the original text.
       
   924      */
       
   925     public function quoteInto($text, $value, $type = null, $count = null)
       
   926     {
       
   927         if ($count === null) {
       
   928             return str_replace('?', $this->quote($value, $type), $text);
       
   929         } else {
       
   930             while ($count > 0) {
       
   931                 if (strpos($text, '?') !== false) {
       
   932                     $text = substr_replace($text, $this->quote($value, $type), strpos($text, '?'), 1);
       
   933                 }
       
   934                 --$count;
       
   935             }
       
   936             return $text;
       
   937         }
       
   938     }
       
   939 
       
   940     /**
       
   941      * Quotes an identifier.
       
   942      *
       
   943      * Accepts a string representing a qualified indentifier. For Example:
       
   944      * <code>
       
   945      * $adapter->quoteIdentifier('myschema.mytable')
       
   946      * </code>
       
   947      * Returns: "myschema"."mytable"
       
   948      *
       
   949      * Or, an array of one or more identifiers that may form a qualified identifier:
       
   950      * <code>
       
   951      * $adapter->quoteIdentifier(array('myschema','my.table'))
       
   952      * </code>
       
   953      * Returns: "myschema"."my.table"
       
   954      *
       
   955      * The actual quote character surrounding the identifiers may vary depending on
       
   956      * the adapter.
       
   957      *
       
   958      * @param string|array|Zend_Db_Expr $ident The identifier.
       
   959      * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
       
   960      * @return string The quoted identifier.
       
   961      */
       
   962     public function quoteIdentifier($ident, $auto=false)
       
   963     {
       
   964         return $this->_quoteIdentifierAs($ident, null, $auto);
       
   965     }
       
   966 
       
   967     /**
       
   968      * Quote a column identifier and alias.
       
   969      *
       
   970      * @param string|array|Zend_Db_Expr $ident The identifier or expression.
       
   971      * @param string $alias An alias for the column.
       
   972      * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
       
   973      * @return string The quoted identifier and alias.
       
   974      */
       
   975     public function quoteColumnAs($ident, $alias, $auto=false)
       
   976     {
       
   977         return $this->_quoteIdentifierAs($ident, $alias, $auto);
       
   978     }
       
   979 
       
   980     /**
       
   981      * Quote a table identifier and alias.
       
   982      *
       
   983      * @param string|array|Zend_Db_Expr $ident The identifier or expression.
       
   984      * @param string $alias An alias for the table.
       
   985      * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
       
   986      * @return string The quoted identifier and alias.
       
   987      */
       
   988     public function quoteTableAs($ident, $alias = null, $auto = false)
       
   989     {
       
   990         return $this->_quoteIdentifierAs($ident, $alias, $auto);
       
   991     }
       
   992 
       
   993     /**
       
   994      * Quote an identifier and an optional alias.
       
   995      *
       
   996      * @param string|array|Zend_Db_Expr $ident The identifier or expression.
       
   997      * @param string $alias An optional alias.
       
   998      * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
       
   999      * @param string $as The string to add between the identifier/expression and the alias.
       
  1000      * @return string The quoted identifier and alias.
       
  1001      */
       
  1002     protected function _quoteIdentifierAs($ident, $alias = null, $auto = false, $as = ' AS ')
       
  1003     {
       
  1004         if ($ident instanceof Zend_Db_Expr) {
       
  1005             $quoted = $ident->__toString();
       
  1006         } elseif ($ident instanceof Zend_Db_Select) {
       
  1007             $quoted = '(' . $ident->assemble() . ')';
       
  1008         } else {
       
  1009             if (is_string($ident)) {
       
  1010                 $ident = explode('.', $ident);
       
  1011             }
       
  1012             if (is_array($ident)) {
       
  1013                 $segments = array();
       
  1014                 foreach ($ident as $segment) {
       
  1015                     if ($segment instanceof Zend_Db_Expr) {
       
  1016                         $segments[] = $segment->__toString();
       
  1017                     } else {
       
  1018                         $segments[] = $this->_quoteIdentifier($segment, $auto);
       
  1019                     }
       
  1020                 }
       
  1021                 if ($alias !== null && end($ident) == $alias) {
       
  1022                     $alias = null;
       
  1023                 }
       
  1024                 $quoted = implode('.', $segments);
       
  1025             } else {
       
  1026                 $quoted = $this->_quoteIdentifier($ident, $auto);
       
  1027             }
       
  1028         }
       
  1029         if ($alias !== null) {
       
  1030             $quoted .= $as . $this->_quoteIdentifier($alias, $auto);
       
  1031         }
       
  1032         return $quoted;
       
  1033     }
       
  1034 
       
  1035     /**
       
  1036      * Quote an identifier.
       
  1037      *
       
  1038      * @param  string $value The identifier or expression.
       
  1039      * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
       
  1040      * @return string        The quoted identifier and alias.
       
  1041      */
       
  1042     protected function _quoteIdentifier($value, $auto=false)
       
  1043     {
       
  1044         if ($auto === false || $this->_autoQuoteIdentifiers === true) {
       
  1045             $q = $this->getQuoteIdentifierSymbol();
       
  1046             return ($q . str_replace("$q", "$q$q", $value) . $q);
       
  1047         }
       
  1048         return $value;
       
  1049     }
       
  1050 
       
  1051     /**
       
  1052      * Returns the symbol the adapter uses for delimited identifiers.
       
  1053      *
       
  1054      * @return string
       
  1055      */
       
  1056     public function getQuoteIdentifierSymbol()
       
  1057     {
       
  1058         return '"';
       
  1059     }
       
  1060 
       
  1061     /**
       
  1062      * Return the most recent value from the specified sequence in the database.
       
  1063      * This is supported only on RDBMS brands that support sequences
       
  1064      * (e.g. Oracle, PostgreSQL, DB2).  Other RDBMS brands return null.
       
  1065      *
       
  1066      * @param string $sequenceName
       
  1067      * @return string
       
  1068      */
       
  1069     public function lastSequenceId($sequenceName)
       
  1070     {
       
  1071         return null;
       
  1072     }
       
  1073 
       
  1074     /**
       
  1075      * Generate a new value from the specified sequence in the database, and return it.
       
  1076      * This is supported only on RDBMS brands that support sequences
       
  1077      * (e.g. Oracle, PostgreSQL, DB2).  Other RDBMS brands return null.
       
  1078      *
       
  1079      * @param string $sequenceName
       
  1080      * @return string
       
  1081      */
       
  1082     public function nextSequenceId($sequenceName)
       
  1083     {
       
  1084         return null;
       
  1085     }
       
  1086 
       
  1087     /**
       
  1088      * Helper method to change the case of the strings used
       
  1089      * when returning result sets in FETCH_ASSOC and FETCH_BOTH
       
  1090      * modes.
       
  1091      *
       
  1092      * This is not intended to be used by application code,
       
  1093      * but the method must be public so the Statement class
       
  1094      * can invoke it.
       
  1095      *
       
  1096      * @param string $key
       
  1097      * @return string
       
  1098      */
       
  1099     public function foldCase($key)
       
  1100     {
       
  1101         switch ($this->_caseFolding) {
       
  1102             case Zend_Db::CASE_LOWER:
       
  1103                 $value = strtolower((string) $key);
       
  1104                 break;
       
  1105             case Zend_Db::CASE_UPPER:
       
  1106                 $value = strtoupper((string) $key);
       
  1107                 break;
       
  1108             case Zend_Db::CASE_NATURAL:
       
  1109             default:
       
  1110                 $value = (string) $key;
       
  1111         }
       
  1112         return $value;
       
  1113     }
       
  1114 
       
  1115     /**
       
  1116      * called when object is getting serialized
       
  1117      * This disconnects the DB object that cant be serialized
       
  1118      *
       
  1119      * @throws Zend_Db_Adapter_Exception
       
  1120      * @return array
       
  1121      */
       
  1122     public function __sleep()
       
  1123     {
       
  1124         if ($this->_allowSerialization == false) {
       
  1125             /** @see Zend_Db_Adapter_Exception */
       
  1126             require_once 'Zend/Db/Adapter/Exception.php';
       
  1127             throw new Zend_Db_Adapter_Exception(get_class($this) ." is not allowed to be serialized");
       
  1128         }
       
  1129         $this->_connection = false;
       
  1130         return array_keys(array_diff_key(get_object_vars($this), array('_connection'=>false)));
       
  1131     }
       
  1132 
       
  1133     /**
       
  1134      * called when object is getting unserialized
       
  1135      *
       
  1136      * @return void
       
  1137      */
       
  1138     public function __wakeup()
       
  1139     {
       
  1140         if ($this->_autoReconnectOnUnserialize == true) {
       
  1141             $this->getConnection();
       
  1142         }
       
  1143     }
       
  1144 
       
  1145     /**
       
  1146      * Abstract Methods
       
  1147      */
       
  1148 
       
  1149     /**
       
  1150      * Returns a list of the tables in the database.
       
  1151      *
       
  1152      * @return array
       
  1153      */
       
  1154     abstract public function listTables();
       
  1155 
       
  1156     /**
       
  1157      * Returns the column descriptions for a table.
       
  1158      *
       
  1159      * The return value is an associative array keyed by the column name,
       
  1160      * as returned by the RDBMS.
       
  1161      *
       
  1162      * The value of each array element is an associative array
       
  1163      * with the following keys:
       
  1164      *
       
  1165      * SCHEMA_NAME => string; name of database or schema
       
  1166      * TABLE_NAME  => string;
       
  1167      * COLUMN_NAME => string; column name
       
  1168      * COLUMN_POSITION => number; ordinal position of column in table
       
  1169      * DATA_TYPE   => string; SQL datatype name of column
       
  1170      * DEFAULT     => string; default expression of column, null if none
       
  1171      * NULLABLE    => boolean; true if column can have nulls
       
  1172      * LENGTH      => number; length of CHAR/VARCHAR
       
  1173      * SCALE       => number; scale of NUMERIC/DECIMAL
       
  1174      * PRECISION   => number; precision of NUMERIC/DECIMAL
       
  1175      * UNSIGNED    => boolean; unsigned property of an integer type
       
  1176      * PRIMARY     => boolean; true if column is part of the primary key
       
  1177      * PRIMARY_POSITION => integer; position of column in primary key
       
  1178      *
       
  1179      * @param string $tableName
       
  1180      * @param string $schemaName OPTIONAL
       
  1181      * @return array
       
  1182      */
       
  1183     abstract public function describeTable($tableName, $schemaName = null);
       
  1184 
       
  1185     /**
       
  1186      * Creates a connection to the database.
       
  1187      *
       
  1188      * @return void
       
  1189      */
       
  1190     abstract protected function _connect();
       
  1191 
       
  1192     /**
       
  1193      * Test if a connection is active
       
  1194      *
       
  1195      * @return boolean
       
  1196      */
       
  1197     abstract public function isConnected();
       
  1198 
       
  1199     /**
       
  1200      * Force the connection to close.
       
  1201      *
       
  1202      * @return void
       
  1203      */
       
  1204     abstract public function closeConnection();
       
  1205 
       
  1206     /**
       
  1207      * Prepare a statement and return a PDOStatement-like object.
       
  1208      *
       
  1209      * @param string|Zend_Db_Select $sql SQL query
       
  1210      * @return Zend_Db_Statement|PDOStatement
       
  1211      */
       
  1212     abstract public function prepare($sql);
       
  1213 
       
  1214     /**
       
  1215      * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
       
  1216      *
       
  1217      * As a convention, on RDBMS brands that support sequences
       
  1218      * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
       
  1219      * from the arguments and returns the last id generated by that sequence.
       
  1220      * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
       
  1221      * returns the last value generated for such a column, and the table name
       
  1222      * argument is disregarded.
       
  1223      *
       
  1224      * @param string $tableName   OPTIONAL Name of table.
       
  1225      * @param string $primaryKey  OPTIONAL Name of primary key column.
       
  1226      * @return string
       
  1227      */
       
  1228     abstract public function lastInsertId($tableName = null, $primaryKey = null);
       
  1229 
       
  1230     /**
       
  1231      * Begin a transaction.
       
  1232      */
       
  1233     abstract protected function _beginTransaction();
       
  1234 
       
  1235     /**
       
  1236      * Commit a transaction.
       
  1237      */
       
  1238     abstract protected function _commit();
       
  1239 
       
  1240     /**
       
  1241      * Roll-back a transaction.
       
  1242      */
       
  1243     abstract protected function _rollBack();
       
  1244 
       
  1245     /**
       
  1246      * Set the fetch mode.
       
  1247      *
       
  1248      * @param integer $mode
       
  1249      * @return void
       
  1250      * @throws Zend_Db_Adapter_Exception
       
  1251      */
       
  1252     abstract public function setFetchMode($mode);
       
  1253 
       
  1254     /**
       
  1255      * Adds an adapter-specific LIMIT clause to the SELECT statement.
       
  1256      *
       
  1257      * @param mixed $sql
       
  1258      * @param integer $count
       
  1259      * @param integer $offset
       
  1260      * @return string
       
  1261      */
       
  1262     abstract public function limit($sql, $count, $offset = 0);
       
  1263 
       
  1264     /**
       
  1265      * Check if the adapter supports real SQL parameters.
       
  1266      *
       
  1267      * @param string $type 'positional' or 'named'
       
  1268      * @return bool
       
  1269      */
       
  1270     abstract public function supportsParameters($type);
       
  1271 
       
  1272     /**
       
  1273      * Retrieve server version in PHP style
       
  1274      *
       
  1275      * @return string
       
  1276      */
       
  1277     abstract public function getServerVersion();
       
  1278 }