Source for file Mssql.php

Documentation is available at Mssql.php

  1. <?php
  2. /*
  3.  *  $Id: Mssql.php 1178 2007-03-18 20:00:45Z zYne $
  4.  *
  5.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9.  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15.  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16.  *
  17.  * This software consists of voluntary contributions made by many individuals
  18.  * and is licensed under the LGPL. For more information, see
  19.  * <http://www.phpdoctrine.com>.
  20.  */
  21. Doctrine::autoload('Doctrine_Connection');
  22. /**
  23.  * Doctrine_Connection_Mssql
  24.  *
  25.  * @package     Doctrine
  26.  * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
  27.  * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
  28.  * @author      Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
  29.  * @version     $Revision: 1178 $
  30.  * @category    Object Relational Mapping
  31.  * @link        www.phpdoctrine.com
  32.  * @since       1.0
  33.  */
  34. {
  35.     /**
  36.      * @var string $driverName                  the name of this connection driver
  37.      */
  38.     protected $driverName = 'Mssql';
  39.     /**
  40.      * the constructor
  41.      *
  42.      * @param Doctrine_Manager $manager 
  43.      * @param PDO $pdo                          database handle
  44.      */
  45.     public function __construct(Doctrine_Manager $manager$adapter)
  46.     {
  47.         // initialize all driver options
  48.         $this->supported = array(
  49.                           'sequences'             => 'emulated',
  50.                           'indexes'               => true,
  51.                           'affected_rows'         => true,
  52.                           'transactions'          => true,
  53.                           'summary_functions'     => true,
  54.                           'order_by_text'         => true,
  55.                           'current_id'            => 'emulated',
  56.                           'limit_queries'         => 'emulated',
  57.                           'LOBs'                  => true,
  58.                           'replace'               => 'emulated',
  59.                           'sub_selects'           => true,
  60.                           'auto_increment'        => true,
  61.                           'primary_key'           => true,
  62.                           'result_introspection'  => true,
  63.                           'prepared_statements'   => 'emulated',
  64.                           );
  65.  
  66.         parent::__construct($manager$adapter);
  67.     }
  68.     /**
  69.      * quoteIdentifier
  70.      * Quote a string so it can be safely used as a table / column name
  71.      *
  72.      * Quoting style depends on which database driver is being used.
  73.      *
  74.      * @param string $identifier    identifier name to be quoted
  75.      * @param bool   $checkOption   check the 'quote_identifier' option
  76.      *
  77.      * @return string  quoted identifier string
  78.      */
  79.     public function quoteIdentifier($identifier$checkOption false)
  80.     {
  81.         if ($checkOption && $this->getAttribute(Doctrine::ATTR_QUOTE_IDENTIFIER)) {
  82.             return $identifier;
  83.         }
  84.         return '[' str_replace(']'']]'$identifier']';
  85.     }
  86.     /**
  87.      * Adds an adapter-specific LIMIT clause to the SELECT statement.
  88.      * [ borrowed from Zend Framework ]
  89.      *
  90.      * @param string $query 
  91.      * @param mixed $limit 
  92.      * @param mixed $offset 
  93.      * @link http://lists.bestpractical.com/pipermail/rt-devel/2005-June/007339.html
  94.      * @return string 
  95.      */
  96.     public function modifyLimitQuery($query$limit$offset$isManip false)
  97.     {
  98.         if ($limit 0{
  99.             $count intval($limit);
  100.  
  101.             $offset intval($offset);
  102.             if ($offset 0{
  103.                 throw new Doctrine_Connection_Exception("LIMIT argument offset=$offset is not valid");
  104.             }
  105.     
  106.             $orderby stristr($query'ORDER BY');
  107.             if ($orderby !== false{
  108.                 $sort (stripos($orderby'desc'!== false'desc' 'asc';
  109.                 $order str_ireplace('ORDER BY'''$orderby);
  110.                 $order trim(preg_replace('/ASC|DESC/i'''$order));
  111.             }
  112.     
  113.             $query preg_replace('/^SELECT\s/i''SELECT TOP ' ($count+$offset' '$query);
  114.     
  115.             $query 'SELECT * FROM (SELECT TOP ' $count ' * FROM (' $query ') AS inner_tbl';
  116.             if ($orderby !== false{
  117.                 $query .= ' ORDER BY ' $order ' ';
  118.                 $query .= (stripos($sort'asc'!== false'DESC' 'ASC';
  119.             }
  120.             $query .= ') AS outer_tbl';
  121.             if ($orderby !== false{
  122.                 $query .= ' ORDER BY ' $order ' ' $sort;
  123.             }
  124.     
  125.             return $query;
  126.  
  127.         }
  128.  
  129.         return $query;
  130.     }
  131.     /**
  132.      * return version information about the server
  133.      *
  134.      * @param bool   $native  determines if the raw version string should be returned
  135.      * @return mixed array/string with version information or MDB2 error object
  136.      */
  137.     public function getServerVersion($native false)
  138.     {
  139.         if ($this->serverInfo{
  140.             $serverInfo $this->serverInfo;
  141.         else {
  142.             $query      'SELECT @@VERSION';
  143.             $serverInfo $this->fetchOne($query);
  144.         }
  145.         // cache server_info
  146.         $this->serverInfo = $serverInfo;
  147.         if $native{
  148.             if (preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/'$serverInfo$tmp)) {
  149.                 $serverInfo array(
  150.                     'major' => $tmp[1],
  151.                     'minor' => $tmp[2],
  152.                     'patch' => $tmp[3],
  153.                     'extra' => null,
  154.                     'native' => $serverInfo,
  155.                 );
  156.             else {
  157.                 $serverInfo array(
  158.                     'major' => null,
  159.                     'minor' => null,
  160.                     'patch' => null,
  161.                     'extra' => null,
  162.                     'native' => $serverInfo,
  163.                 );
  164.             }
  165.         }
  166.         return $serverInfo;
  167.     }
  168.     /**
  169.      * Checks if there's a sequence that exists.
  170.      *
  171.      * @param  string $seq_name     The sequence name to verify.
  172.      * @return boolean              The value if the table exists or not
  173.      */
  174.     public function checkSequence($seqName)
  175.     {
  176.         $query 'SELECT * FROM ' $seqName;
  177.         try {
  178.             $this->exec($query);
  179.         catch(Doctrine_Connection_Exception $e{
  180.             if ($e->getPortableCode(== Doctrine::ERR_NOSUCHTABLE{
  181.                 return false;
  182.             }
  183.  
  184.             throw $e;
  185.         }
  186.         return true;
  187.     }
  188. }