Source for file mssql.dbconnection.php

Documentation is available at mssql.dbconnection.php

  1. <?php
  2. /**
  3.  * @package    jelix
  4.  * @subpackage db_driver
  5.  * @author     Yann Lecommandoux
  6.  * @contributor Laurent Jouanneau, Louis S.
  7.  * @copyright  2008 Yann Lecommandoux, 2011-2012 Laurent Jouanneau, Louis S.
  8.  * @link     http://www.jelix.org
  9.  * @licence  http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  10.  */
  11. require_once(dirname(__FILE__).'/mssql.dbresultset.php');
  12.  
  13. /**
  14.  * @experimental
  15.  */
  16. class mssqlDbConnection extends jDbConnection {
  17.  
  18.     /**
  19.      * Default constructor
  20.      * @param array $profile profile de connexion
  21.      * @return unknown_type 
  22.      */
  23.     function __construct($profile){
  24.         if(!function_exists('mssql_connect')){
  25.             throw new jException('jelix~db.error.nofunction','mssql');
  26.         }
  27.         parent::__construct($profile);
  28.     }
  29.  
  30.     /**
  31.      * begin a transaction
  32.      */
  33.     public function beginTransaction (){
  34.         $this->_doExec ('SET IMPLICIT_TRANSACTIONS OFF');
  35.         $this->_doExec ('BEGIN TRANSACTION');
  36.     }
  37.  
  38.     /**
  39.      * Commit since the last begin
  40.      */
  41.     public function commit (){
  42.         $this->_doExec ('COMMIT TRANSACTION');
  43.         $this->_doExec ('SET IMPLICIT_TRANSACTIONS ON');
  44.     }
  45.  
  46.     /**
  47.      * Rollback since the last BEGIN
  48.      */
  49.     public function rollback (){
  50.         $this->_doExec ('ROLLBACK TRANSACTION');
  51.         $this->_doExec ('SET IMPLICIT_TRANSACTIONS ON');
  52.     }
  53.  
  54.     /**
  55.      *
  56.      */
  57.     public function prepare ($query){
  58.         throw new jException('jelix~db.error.feature.unsupported'array('mssql','prepare'));
  59.     }
  60.  
  61.     public function errorInfo(){
  62.         return array'HY000'mssql_get_last_message());
  63.     }
  64.  
  65.     public function errorCode(){
  66.         return mssql_get_last_message();
  67.     }
  68.  
  69.     /**
  70.      * initialize the connection to the database
  71.      * @see lib/jelix/db/jDbConnection#_connect()
  72.      */
  73.     protected function _connect (){
  74.         $funcconnect ($this->profile['persistent']'mssql_pconnect':'mssql_connect');
  75.         if($cnx @$funcconnect ($this->profile['host']$this->profile['user']$this->profile['password'])){
  76.             /*if(isset($this->profile['force_encoding']) && $this->profile['force_encoding'] == true
  77.             && isset($this->_charsets[jApp::config()->charset])){
  78.                 mssql_query("SET ANSI_DEFAULTS ON", $cnx);
  79.             }*/
  80.             return $cnx;
  81.         }else{
  82.             throw new jException('jelix~db.error.connection',$this->profile['host']);
  83.         }
  84.     }
  85.  
  86.     /**
  87.      *     close the connection to the database
  88.      * @see lib/jelix/db/jDbConnection#_disconnect()
  89.      */
  90.     protected function _disconnect (){
  91.         return mssql_close ($this->_connection);
  92.     }
  93.  
  94.     /**
  95.      *     execute an SQL instruction
  96.      * @see lib/jelix/db/jDbConnection#_doQuery()
  97.      */
  98.     protected function _doQuery ($query){
  99.         if(!mssql_select_db ($this->profile['database']$this->_connection)){
  100.             if(mssql_get_last_message()){
  101.                 throw new jException('jelix~db.error.database.unknown',$this->profile['database']);
  102.             else {
  103.                 throw new jException('jelix~db.error.connection.closed',$this->profile['name']);
  104.             }
  105.         }
  106.  
  107.         if ($qI mssql_query ($query$this->_connection)){
  108.             return new mssqlDbResultSet ($qI);
  109.         else{
  110.             throw new jException('jelix~db.error.query.bad',  mssql_get_last_message());
  111.         }
  112.     }
  113.  
  114.     /**
  115.      * @see lib/jelix/db/jDbConnection#_doExec()
  116.      */
  117.     protected function _doExec($query){
  118.         if(!mssql_select_db ($this->profile['database']$this->_connection))
  119.         throw new jException('jelix~db.error.database.unknown',$this->profile['database']);
  120.  
  121.         if ($qI mssql_query ($query$this->_connection)){
  122.             return mssql_rows_affected($this->_connection);
  123.         }else{
  124.             throw new jException('jelix~db.error.query.bad'mssql_get_last_message());
  125.         }
  126.     }
  127.     /**
  128.      * @see lib/jelix/db/jDbConnection#_doLimitQuery()
  129.      */
  130.     protected function _doLimitQuery ($queryString$offset$number){
  131.  
  132.         // we suppress existing 'TOP XX'
  133.         $queryString preg_replace('/^SELECT TOP[ ]\d*\s*/i''SELECT 'trim($queryString));
  134.  
  135.         $distinct false;
  136.  
  137.         // we retrieve the select part and the from part
  138.         list($select$frompreg_split('/\sFROM\s/mi'$queryString2);
  139.  
  140.         $fields preg_split('/\s*,\s*/'$select);
  141.         $firstField preg_replace('/^\s*SELECT\s+/'''array_shift($fields));
  142.  
  143.         // is there a distinct?
  144.         if (stripos($firstField'DISTINCT'!== false{
  145.             $firstField preg_replace('/DISTINCT/i'''$firstField);
  146.             $distinct true;
  147.         }
  148.  
  149.         // is there an order by? if not, we order with the first field
  150.         $orderby stristr($from'ORDER BY');
  151.         if ($orderby === false{
  152.             if (stripos($firstField' as '!== false{
  153.                 list($field$keypreg_split('/ as /'$firstField);
  154.             }
  155.             else {
  156.                 $key $firstField;
  157.             }
  158.  
  159.             $orderby ' ORDER BY '.$key.' ASC';
  160.             $from .= $orderby;
  161.         }
  162.  
  163.         // first we select all records from the begining to the last record of the selection
  164.         if(!$distinct)
  165.             $queryString 'SELECT TOP ';
  166.         else
  167.             $queryString 'SELECT DISTINCT TOP ';
  168.  
  169.         $queryString .= ($number+$offset' '.$firstField.','.implode(','$fields).' FROM '.$from;
  170.  
  171.         // then we select the last $number records, by retrieving the first $number record in the reverse order
  172.         $queryString 'SELECT TOP ' $number ' * FROM (' $queryString ') AS inner_tbl ';
  173.         $order_inner preg_replace(array('/\bASC\b/i''/\bDESC\b/i')array('_DESC''_ASC')$orderby);
  174.         $order_inner str_replace(array('_DESC''_ASC')array('DESC''ASC')$order_inner);
  175.         $queryString .= $order_inner;
  176.  
  177.         // finally, we retrieve the result in the expected order
  178.         $queryString 'SELECT TOP ' $number ' * FROM (' $queryString ') AS outer_tbl '.$orderby;
  179.  
  180.         $this->lastQuery = $queryString;
  181.         $result $this->_doQuery($queryString);
  182.         return $result;
  183.     }
  184.  
  185.     /**
  186.      * (non-PHPdoc)
  187.      *     return the last inserted ID incremented in database
  188.      * @see lib/jelix/db/jDbConnection#lastInsertId()
  189.      */
  190.     public function lastInsertId($fromSequence=''){
  191.         $queryString 'SELECT @@IDENTITY AS id';
  192.         $result $this->_doQuery($queryString);
  193.         return $result;
  194.     }
  195.  
  196.     /**
  197.      * tell mssql to be implicit commit or not
  198.      * @param boolean $state the state of the autocommit value
  199.      * @return void 
  200.      */
  201.     protected function _autoCommitNotify ($state){
  202.         if ($state == ){
  203.             $this->query ('SET IMPLICIT_TRANSACTIONS ON');
  204.         else {
  205.             $this->query ('SET IMPLICIT_TRANSACTIONS OFF');
  206.         }
  207.     }
  208.  
  209.     /**
  210.      * escape special characters
  211.      * @todo support of binary strings
  212.      */
  213.     protected function _quote($text$binary){
  214.         return str_replace"'""''"$text );
  215.     }
  216.  
  217.     /**
  218.      *
  219.      * @param integer $id the attribut id
  220.      * @return string the attribute value
  221.      * @see PDO::getAttribute()
  222.      */
  223.     public function getAttribute($id{
  224.         return "";
  225.     }
  226.  
  227.     /**
  228.      *
  229.      * @param integer $id the attribut id
  230.      * @param string $value the attribute value
  231.      * @see PDO::setAttribute()
  232.      */
  233.     public function setAttribute($id$value{
  234.     }
  235. }

Documentation generated on Mon, 26 Oct 2015 21:57:27 +0100 by phpDocumentor 1.4.3