Subversion-Projekte lars-tiefland.php_share

Revision

Blame | Letzte Änderung | Log anzeigen | RSS feed

<?php

/**
 * dblib doesn't support transactions so we need to add a workaround for transactions, last insert ID, and quoting
 *
 * @package    propel.adapter.MSSQL
 */
class MssqlDebugPDO extends DebugPDO
{
        /**
         * Begin a transaction.
         *
         * It is necessary to override the abstract PDO transaction functions here, as
         * the PDO driver for MSSQL does not support transactions.
         */
        public function beginTransaction()
        {
                $return = true;
                $opcount = $this->getNestedTransactionCount();
                if ( $opcount === 0 ) {
                        $return = self::exec('BEGIN TRANSACTION');
                        $this->isUncommitable = false;
                }
                $this->incrementNestedTransactionCount();
                return $return;
        }
        
        /**
         * Commit a transaction.
         *
         * It is necessary to override the abstract PDO transaction functions here, as
         * the PDO driver for MSSQL does not support transactions.
         */
  public function commit()
        {
                $return = true;
                $opcount = $this->getNestedTransactionCount();
                if ($opcount > 0) {
                        if ($opcount === 1) {
                                if ($this->isUncommitable) {
                                        throw new PropelException('Cannot commit because a nested transaction was rolled back');
                                } else {
                                        $return = self::exec('COMMIT TRANSACTION');
                                }
                        }
                        $this->decrementNestedTransactionCount();
                }
                return $return;
        }

        /**
         * Roll-back a transaction.
         *
         * It is necessary to override the abstract PDO transaction functions here, as
         * the PDO driver for MSSQL does not support transactions.
         */
        public function rollBack()
        {
                $return = true;
                $opcount = $this->getNestedTransactionCount();
                if ($opcount > 0) {
                        if ($opcount === 1) { 
                                $return = self::exec('ROLLBACK TRANSACTION'); 
                        } else {
                                $this->isUncommitable = true;
                        }
                        $this->decrementNestedTransactionCount(); 
                }
                return $return;
        }

        /**
         * Rollback the whole transaction, even if this is a nested rollback
         * and reset the nested transaction count to 0.
         *
         * It is necessary to override the abstract PDO transaction functions here, as
         * the PDO driver for MSSQL does not support transactions.
         */
        public function forceRollBack()
        {
                $return = true;
                $opcount = $this->getNestedTransactionCount();
                if ($opcount > 0) {
                        // If we're in a transaction, always roll it back
                        // regardless of nesting level.
                        $return = self::exec('ROLLBACK TRANSACTION');
                        
                        // reset nested transaction count to 0 so that we don't
                        // try to commit (or rollback) the transaction outside this scope.
                        $this->nestedTransactionCount = 0;
                }
                return $return;
        }

        public function lastInsertId($seqname = null)
        {
                $result = self::query('SELECT SCOPE_IDENTITY()');
                return (int)$result->fetchColumn();
        }
        
        public function quoteIdentifier($text)
        {
                return '[' . $text . ']';
        }
        
        public function useQuoteIdentifier()
        {
                return true;
        }
}