ShellBanner
System:Linux MiraNet 3.0.0-14-generic-pae #23-Ubuntu SMP Mon Nov 21 22:07:10 UTC 2011 i686
Software:Apache. PHP/5.3.6-13ubuntu3.10
ID:uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
Safe Mode:OFF
Open_Basedir:OFF
Freespace:20.79 GB of 70.42 GB (29.53%)
MySQL: ON MSSQL: OFF Oracle: OFF PostgreSQL: OFF Curl: OFF Sockets: ON Fetch: OFF Wget: ON Perl: ON
Disabled Functions: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,

/ http/ yalagina/ libraries/ joomla/ database/ database/ - drwxr-xr-x

Directory:
Viewing file:     sqlsrv.php (27.8 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
/**
 * @package     Joomla.Platform
 * @subpackage  Database
 *
 * @copyright   Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('JPATH_PLATFORM') or die;

JLoader::register('JDatabaseQuerySQLSrv'dirname(__FILE__) . '/sqlsrvquery.php');

/**
 * SQL Server database driver
 *
 * @package     Joomla.Platform
 * @subpackage  Database
 * @see         http://msdn.microsoft.com/en-us/library/cc296152(SQL.90).aspx
 * @since       11.1
 */
class JDatabaseSQLSrv extends JDatabase
{
    
/**
     * The name of the database driver.
     *
     * @var    string
     * @since  11.1
     */
    
public $name 'sqlsrv';

    
/**
     * The character(s) used to quote SQL statement names such as table names or field names,
     * etc.  The child classes should define this as necessary.  If a single character string the
     * same character is used for both sides of the quoted name, else the first character will be
     * used for the opening quote and the second for the closing quote.
     *
     * @var    string
     * @since  11.1
     */
    
protected $nameQuote '[]';

    
/**
     * The null or zero representation of a timestamp for the database driver.  This should be
     * defined in child classes to hold the appropriate value for the engine.
     *
     * @var    string
     * @since  11.1
     */
    
protected $nullDate '1900-01-01 00:00:00';

    
/**
     * Test to see if the SQLSRV connector is available.
     *
     * @return  boolean  True on success, false otherwise.
     *
     * @since   11.1
     */
    
public static function test()
    {
        return (
function_exists('sqlsrv_connect'));
    }

    
/**
     * Constructor.
     *
     * @param   array  $options  List of options used to configure the connection
     *
     * @since   11.1
     */
    
protected function __construct($options)
    {
        
// Get some basic values from the options.
        
$options['host'] = (isset($options['host'])) ? $options['host'] : 'localhost';
        
$options['user'] = (isset($options['user'])) ? $options['user'] : '';
        
$options['password'] = (isset($options['password'])) ? $options['password'] : '';
        
$options['database'] = (isset($options['database'])) ? $options['database'] : '';
        
$options['select'] = (isset($options['select'])) ? (bool) $options['select'] : true;

        
// Build the connection configuration array.
        
$config = array(
            
'Database' => $options['database'],
            
'uid' => $options['user'],
            
'pwd' => $options['password'],
            
'CharacterSet' => 'UTF-8',
            
'ReturnDatesAsStrings' => true);

        
// Make sure the SQLSRV extension for PHP is installed and enabled.
        
if (!function_exists('sqlsrv_connect'))
        {

            
// Legacy error handling switch based on the JError::$legacy switch.
            // @deprecated  12.1
            
if (JError::$legacy)
            {
                
$this->errorNum 1;
                
$this->errorMsg JText::_('JLIB_DATABASE_ERROR_ADAPTER_SQLSRV');
                return;
            }
            else
            {
                throw new 
JDatabaseException(JText::_('JLIB_DATABASE_ERROR_ADAPTER_SQLSRV'));
            }
        }

        
// Attempt to connect to the server.
        
if (!($this->connection = @ sqlsrv_connect($options['host'], $config)))
        {

            
// Legacy error handling switch based on the JError::$legacy switch.
            // @deprecated  12.1
            
if (JError::$legacy)
            {
                
$this->errorNum 2;
                
$this->errorMsg JText::_('JLIB_DATABASE_ERROR_CONNECT_SQLSRV');
                return;
            }
            else
            {
                throw new 
JDatabaseException(JText::_('JLIB_DATABASE_ERROR_CONNECT_SQLSRV'));
            }
        }

        
// Make sure that DB warnings are not returned as errors.
        
sqlsrv_configure('WarningsReturnAsErrors'0);

        
// Finalize initialisation
        
parent::__construct($options);

        
// If auto-select is enabled select the given database.
        
if ($options['select'] && !empty($options['database']))
        {
            
$this->select($options['database']);
        }
    }

    
/**
     * Destructor.
     *
     * @since   11.1
     */
    
public function __destruct()
    {
        if (
is_resource($this->connection))
        {
            
sqlsrv_close($this->connection);
        }
    }

    
/**
     * Get table constraints
     *
     * @param   string  $tableName  The name of the database table.
     *
     * @return  array  Any constraints available for the table.
     *
     * @since   11.1
     */
    
protected function getTableConstraints($tableName)
    {
        
$query $this->getQuery(true);

        
$this->setQuery(
            
'SELECT CONSTRAINT_NAME FROM' ' INFORMATION_SCHEMA.TABLE_CONSTRAINTS' ' WHERE TABLE_NAME = ' $query->quote($tableName)
        );

        return 
$this->loadColumn();
    }

    
/**
     * Rename constraints.
     *
     * @param   array   $constraints  Array(strings) of table constraints
     * @param   string  $prefix       A string
     * @param   string  $backup       A string
     *
     * @return  void
     *
     * @since   11.1
     */
    
protected function renameConstraints($constraints = array(), $prefix null$backup null)
    {
        foreach (
$constraints as $constraint)
        {
            
$this->setQuery('sp_rename ' $constraint ',' str_replace($prefix$backup$constraint));
            
$this->query();
        }
    }

    
/**
     * Method to escape a string for usage in an SQL statement.
     *
     * The escaping for MSSQL isn't handled in the driver though that would be nice.  Because of this we need
     * to handle the escaping ourselves.
     *
     * @param   string   $text   The string to be escaped.
     * @param   boolean  $extra  Optional parameter to provide extra escaping.
     *
     * @return  string  The escaped string.
     *
     * @since   11.1
     */
    
public function escape($text$extra false)
    {
        
$result addslashes($text);
        
$result str_replace("\'""''"$result);
        
$result str_replace('\"''"'$result);
        
$result str_replace('\\\/''/'$result);
        
$result str_replace('\\\\''\\'$result);
        

        if (
$extra)
        {
            
// We need the below str_replace since the search in sql server doesn't recognize _ character.
            
$result str_replace('_''[_]'$result);
        }

        return 
$result;
    }

    
/**
     * Determines if the connection to the server is active.
     *
     * @return  boolean  True if connected to the database engine.
     *
     * @since   11.1
     */
    
public function connected()
    {
        
// TODO: Run a blank query here
        
return true;
    }

    
/**
     * Drops a table from the database.
     *
     * @param   string   $tableName  The name of the database table to drop.
     * @param   boolean  $ifExists   Optionally specify that the table must exist before it is dropped.
     *
     * @return  JDatabaseSQLSrv  Returns this object to support chaining.
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function dropTable($tableName$ifExists true)
    {
        
$query $this->getQuery(true);

        if (
$ifExists)
        {
            
$this->setQuery(
                
'IF EXISTS(SELECT TABLE_NAME FROM' ' INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ' $query->quote($tableName) . ') DROP TABLE ' $tableName
            
);
        }
        else
        {
            
$this->setQuery('DROP TABLE ' $tableName);
        }

        
$this->query();

        return 
$this;
    }

    
/**
     * Get the number of affected rows for the previous executed SQL statement.
     *
     * @return  integer  The number of affected rows.
     *
     * @since   11.1
     */
    
public function getAffectedRows()
    {
        return 
sqlsrv_rows_affected($this->cursor);
    }

    
/**
     * Method to get the database collation in use by sampling a text field of a table in the database.
     *
     * @return  mixed  The collation in use by the database or boolean false if not supported.
     *
     * @since   11.1
     */
    
public function getCollation()
    {
        
// TODO: Not fake this
        
return 'MSSQL UTF-8 (UCS2)';
    }

    
/**
     * Gets an exporter class object.
     *
     * @return  JDatabaseExporterSQLAzure  An exporter object.
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function getExporter()
    {
        
// Make sure we have an exporter class for this driver.
        
if (!class_exists('JDatabaseExporterSQLAzure'))
        {
            throw new 
JDatabaseException(JText::_('JLIB_DATABASE_ERROR_MISSING_EXPORTER'));
        }

        
$o = new JDatabaseExporterSQLAzure;
        
$o->setDbo($this);

        return 
$o;
    }

    
/**
     * Gets an importer class object.
     *
     * @return  JDatabaseImporterSQLAzure  An importer object.
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function getImporter()
    {
        
// Make sure we have an importer class for this driver.
        
if (!class_exists('JDatabaseImporterSQLAzure'))
        {
            throw new 
JDatabaseException(JText::_('JLIB_DATABASE_ERROR_MISSING_IMPORTER'));
        }

        
$o = new JDatabaseImporterSQLAzure;
        
$o->setDbo($this);

        return 
$o;
    }

    
/**
     * Get the number of returned rows for the previous executed SQL statement.
     *
     * @param   resource  $cursor  An optional database cursor resource to extract the row count from.
     *
     * @return  integer   The number of returned rows.
     *
     * @since   11.1
     */
    
public function getNumRows($cursor null)
    {
        return 
sqlsrv_num_rows($cursor $cursor $this->cursor);
    }

    
/**
     * Get the current or query, or new JDatabaseQuery object.
     *
     * @param   boolean  $new  False to return the last query set, True to return a new JDatabaseQuery object.
     *
     * @return  mixed  The current value of the internal SQL variable or a new JDatabaseQuery object.
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function getQuery($new false)
    {
        if (
$new)
        {
            
// Make sure we have a query class for this driver.
            
if (!class_exists('JDatabaseQuerySQLSrv'))
            {
                throw new 
JDatabaseException(JText::_('JLIB_DATABASE_ERROR_MISSING_QUERY'));
            }
            return new 
JDatabaseQuerySQLSrv($this);
        }
        else
        {
            return 
$this->sql;
        }
    }

    
/**
     * Retrieves field information about the given tables.
     *
     * @param   mixed    $table     A table name
     * @param   boolean  $typeOnly  True to only return field types.
     *
     * @return  array  An array of fields.
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function getTableColumns($table$typeOnly true)
    {
        
// Initialise variables.
        
$result = array();

        
$table_temp $this->replacePrefix((string) $table);
        
// Set the query to get the table fields statement.
        
$this->setQuery(
            
'SELECT column_name as Field, data_type as Type, is_nullable as \'Null\', column_default as \'Default\'' .
            
' FROM information_schema.columns' ' WHERE table_name = ' $this->quote($table_temp)
        );
        
$fields $this->loadObjectList();
        
// If we only want the type as the value add just that to the list.
        
if ($typeOnly)
        {
            foreach (
$fields as $field)
            {
                
$result[$field->Field] = preg_replace("/[(0-9)]/"''$field->Type);
            }
        }
        
// If we want the whole field data object add that to the list.
        
else
        {
            foreach (
$fields as $field)
            {
                
$result[$field->Field] = $field;
            }
        }

        return 
$result;
    }

    
/**
     * Shows the table CREATE statement that creates the given tables.
     *
     * This is unsupported by MSSQL.
     *
     * @param   mixed  $tables  A table name or a list of table names.
     *
     * @return  array  A list of the create SQL for the tables.
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function getTableCreate($tables)
    {
        return 
'';
    }

    
/**
     * Get the details list of keys for a table.
     *
     * @param   string  $table  The name of the table.
     *
     * @return  array  An array of the column specification for the table.
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function getTableKeys($table)
    {
        
// TODO To implement.
        
return array();
    }

    
/**
    * Method to quote and optionally escape a string to database requirements for insertion into the database.
    *
    * @param   string   $text    The string to quote.
    * @param   boolean  $escape  True to escape the string, false to leave it unchanged.
    *
    * @return  string  The quoted input string.
    *
    * @since   11.1
    */
    
public function quote($text$escape true)
    {
        return 
'N' '\'' . ($escape $this->escape($text) : $text) . '\'';
    }

    
/**
     * Method to get an array of all tables in the database.
     *
     * @return  array  An array of all the tables in the database.
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function getTableList()
    {
        
// Set the query to get the tables statement.
        
$this->setQuery('SELECT name FROM ' $this->getDatabase() . '.sys.Tables WHERE type = \'U\';');
        
$tables $this->loadColumn();

        return 
$tables;
    }

    
/**
     * Get the version of the database connector.
     *
     * @return  string  The database connector version.
     *
     * @since   11.1
     */
    
public function getVersion()
    {
        
//TODO: Don't hardcode this.
        
return '5.1.0';
    }

    
/**
     * Determines if the database engine supports UTF-8 character encoding.
     *
     * @return  boolean  True if supported.
     *
     * @since   11.1
     */
    
public function hasUTF()
    {
        return 
true;
    }

    
/**
     * Inserts a row into a table based on an object's properties.
     *
     * @param   string  $table    The name of the database table to insert into.
     * @param   object  &$object  A reference to an object whose public properties match the table fields.
     * @param   string  $key      The name of the primary key. If provided the object property is updated.
     *
     * @return  boolean    True on success.
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function insertObject($table, &$object$key null)
    {
        
$fields = array();
        
$values = array();
        
$statement 'INSERT INTO ' $this->quoteName($table) . ' (%s) VALUES (%s)';
        foreach (
get_object_vars($object) as $k => $v)
        {
            if (
is_array($v) or is_object($v))
            {
                continue;
            }
            if (!
$this->checkFieldExists($table$k))
            {
                continue;
            }
            if (
$k[0] == '_')
            {
                
// internal field
                
continue;
            }
            if (
$k == $key && $key == 0)
            {
                continue;
            }
            
$fields[] = $this->quoteName($k);
            
$values[] = $this->Quote($v);
        }
        
// Set the query and execute the insert.
        
$this->setQuery(sprintf($statementimplode(','$fields), implode(','$values)));
        if (!
$this->query())
        {
            return 
false;
        }
        
$id $this->insertid();
        if (
$key && $id)
        {
            
$object->$key $id;
        }
        return 
true;
    }

    
/**
     * Method to get the auto-incremented value from the last INSERT statement.
     *
     * @return  integer  The value of the auto-increment field from the last inserted row.
     *
     * @since   11.1
     */
    
public function insertid()
    {
        
// TODO: SELECT IDENTITY
        
$this->setQuery('SELECT @@IDENTITY');
        return (int) 
$this->loadResult();
    }

    
/**
     * Method to get the first field of the first row of the result set from the database query.
     *
     * @return  mixed  The return value or null if the query failed.
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function loadResult()
    {
        
// Initialise variables.
        
$ret null;

        
// Execute the query and get the result set cursor.
        
if (!($cursor $this->query()))
        {
            return 
null;
        }

        
// Get the first row from the result set as an array.
        
if ($row sqlsrv_fetch_array($cursorSQLSRV_FETCH_NUMERIC))
        {
            
$ret $row[0];
        }
        
// Free up system resources and return.
        
$this->freeResult($cursor);
        
//For SQLServer - we need to strip slashes
        
$ret stripslashes($ret);

        return 
$ret;
    }

    
/**
     * Execute the SQL statement.
     *
     * @return  mixed  A database cursor resource on success, boolean false on failure.
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function query()
    {
        if (!
is_resource($this->connection))
        {

            
// Legacy error handling switch based on the JError::$legacy switch.
            // @deprecated  12.1
            
if (JError::$legacy)
            {

                if (
$this->debug)
                {
                    
JError::raiseError(500'JDatabaseDriverSQLAzure::query: ' $this->errorNum ' - ' $this->errorMsg);
                }
                return 
false;
            }
            else
            {
                
JLog::add(JText::sprintf('JLIB_DATABASE_QUERY_FAILED'$this->errorNum$this->errorMsg), JLog::ERROR'database');
                throw new 
JDatabaseException($this->errorMsg$this->errorNum);
            }
        }

        
// Take a local copy so that we don't modify the original query and cause issues later
        
$sql $this->replacePrefix((string) $this->sql);
        if (
$this->limit || $this->offset 0)
        {
            
$sql $this->limit($sql$this->limit$this->offset);
        }

        
// If debugging is enabled then let's log the query.
        
if ($this->debug)
        {

            
// Increment the query counter and add the query to the object queue.
            
$this->count++;
            
$this->log[] = $sql;

            
JLog::add($sqlJLog::DEBUG'databasequery');
        }

        
// Reset the error values.
        
$this->errorNum 0;
        
$this->errorMsg '';

        
// sqlsrv_num_rows requires a static or keyset cursor.
        
if (strncmp(ltrim(strtoupper($sql)), 'SELECT'strlen('SELECT')) == 0)
        {
            
$array = array('Scrollable' => SQLSRV_CURSOR_KEYSET);
        }
        else
        {
            
$array = array();
        }

        
// Execute the query.
        
$this->cursor sqlsrv_query($this->connection$sql, array(), $array);

        
// If an error occurred handle it.
        
if (!$this->cursor)
        {

            
// Populate the errors.
            
$errors sqlsrv_errors();
            
$this->errorNum $errors[0]['SQLSTATE'];
            
$this->errorMsg $errors[0]['message'] . 'SQL=' $sql;

            
// Legacy error handling switch based on the JError::$legacy switch.
            // @deprecated  12.1
            
if (JError::$legacy)
            {

                if (
$this->debug)
                {
                    
JError::raiseError(500'JDatabaseDriverSQLAzure::query: ' $this->errorNum ' - ' $this->errorMsg);
                }
                return 
false;
            }
            else
            {
                
JLog::add(JText::sprintf('JLIB_DATABASE_QUERY_FAILED'$this->errorNum$this->errorMsg), JLog::ERROR'databasequery');
                throw new 
JDatabaseException($this->errorMsg$this->errorNum);
            }
        }

        return 
$this->cursor;
    }
    
/**
     * This function replaces a string identifier <var>$prefix</var> with the string held is the
     * <var>tablePrefix</var> class variable.
     *
     * @param   string  $sql     The SQL statement to prepare.
     * @param   string  $prefix  The common table prefix.
     *
     * @return  string  The processed SQL statement.
     *
     * @since   11.1
     */
    
public function replacePrefix($sql$prefix '#__')
    {
        
$tablePrefix 'jos_';
        
// Initialize variables.
        
$escaped false;
        
$startPos 0;
        
$quoteChar '';
        
$literal '';

        
$sql trim($sql);
        
$n strlen($sql);

        while (
$startPos $n)
        {
            
$ip strpos($sql$prefix$startPos);
            if (
$ip === false)
            {
                break;
            }

            
$j strpos($sql"N'"$startPos);
            
$k strpos($sql'"'$startPos);
            if ((
$k !== false) && (($k $j) || ($j === false)))
            {
                
$quoteChar '"';
                
$j $k;
            }
            else
            {
                
$quoteChar "'";
            }

            if (
$j === false)
            {
                
$j $n;
            }

            
$literal .= str_replace($prefix$this->tablePrefixsubstr($sql$startPos$j $startPos));
            
$startPos $j;

            
$j $startPos 1;

            if (
$j >= $n)
            {
                break;
            }

            
// quote comes first, find end of quote
            
while (true)
            {
                
$k strpos($sql$quoteChar$j);
                
$escaped false;
                if (
$k === false)
                {
                    break;
                }
                
$l $k 1;
                while (
$l >= && $sql{$l} == '\\')
                {
                    
$l--;
                    
$escaped = !$escaped;
                }
                if (
$escaped)
                {
                    
$j $k 1;
                    continue;
                }
                break;
            }
            if (
$k === false)
            {
                
// error in the query - no end quote; ignore it
                
break;
            }
            
$literal .= substr($sql$startPos$k $startPos 1);
            
$startPos $k 1;
        }
        if (
$startPos $n)
        {
            
$literal .= substr($sql$startPos$n $startPos);
        }

        return 
$literal;
    }

    
/**
     * Select a database for use.
     *
     * @param   string  $database  The name of the database to select for use.
     *
     * @return  boolean  True if the database was successfully selected.
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function select($database)
    {
        if (!
$database)
        {
            return 
false;
        }

        if (!
sqlsrv_query($this->connection'USE ' $databasenull, array('scrollable' => SQLSRV_CURSOR_STATIC)))
        {

            
// Legacy error handling switch based on the JError::$legacy switch.
            // @deprecated  12.1
            
if (JError::$legacy)
            {
                
$this->errorNum 3;
                
$this->errorMsg JText::_('JLIB_DATABASE_ERROR_DATABASE_CONNECT');
                return 
false;
            }
            else
            {
                throw new 
JDatabaseException(JText::_('JLIB_DATABASE_ERROR_DATABASE_CONNECT'));
            }
        }

        return 
true;
    }

    
/**
     * Set the connection to use UTF-8 character encoding.
     *
     * @return  boolean  True on success.
     *
     * @since   11.1
     */
    
public function setUTF()
    {
        
// TODO: Remove this?
    
}

    
/**
     * Method to commit a transaction.
     *
     * @return  void
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function transactionCommit()
    {
        
$this->setQuery('COMMIT TRANSACTION');
        
$this->query();
    }

    
/**
     * Method to roll back a transaction.
     *
     * @return  void
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function transactionRollback()
    {
        
$this->setQuery('ROLLBACK TRANSACTION');
        
$this->query();
    }

    
/**
     * Method to initialize a transaction.
     *
     * @return  void
     *
     * @since   11.1
     * @throws  JDatabaseException
     */
    
public function transactionStart()
    {
        
$this->setQuery('START TRANSACTION');
        
$this->query();
    }

    
/**
     * Method to fetch a row from the result set cursor as an array.
     *
     * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
     *
     * @return  mixed  Either the next row from the result set or false if there are no more rows.
     *
     * @since   11.1
     */
    
protected function fetchArray($cursor null)
    {
        return 
sqlsrv_fetch_array($cursor $cursor $this->cursorSQLSRV_FETCH_NUMERIC);
    }

    
/**
     * Method to fetch a row from the result set cursor as an associative array.
     *
     * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
     *
     * @return  mixed  Either the next row from the result set or false if there are no more rows.
     *
     * @since   11.1
     */
    
protected function fetchAssoc($cursor null)
    {
        return 
sqlsrv_fetch_array($cursor $cursor $this->cursorSQLSRV_FETCH_ASSOC);
    }

    
/**
     * Method to fetch a row from the result set cursor as an object.
     *
     * @param   mixed   $cursor  The optional result set cursor from which to fetch the row.
     * @param   string  $class   The class name to use for the returned row object.
     *
     * @return  mixed   Either the next row from the result set or false if there are no more rows.
     *
     * @since   11.1
     */
    
protected function fetchObject($cursor null$class 'stdClass')
    {
        return 
sqlsrv_fetch_object($cursor $cursor $this->cursor$class);
    }

    
/**
     * Method to free up the memory used for the result set.
     *
     * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
     *
     * @return  void
     *
     * @since   11.1
     */
    
protected function freeResult($cursor null)
    {
        
sqlsrv_free_stmt($cursor $cursor $this->cursor);
    }

    
/**
     * Diagnostic method to return explain information for a query.
     *
     * @return      string  The explain output.
     *
     * @deprecated  12.1
     * @see         http://msdn.microsoft.com/en-us/library/aa259203%28SQL.80%29.aspx
     * @since       11.1
     */
    
public function explain()
    {
        
// Deprecation warning.
        
JLog::add('JDatabase::explain() is deprecated.'JLog::WARNING'deprecated');

        
// Backup the current query so we can reset it later.
        
$backup $this->sql;

        
// SET SHOWPLAN_ALL ON - will make sqlsrv to show some explain of query instead of run it
        
$this->setQuery('SET SHOWPLAN_ALL ON');
        
$this->query();

        
// Execute the query and get the result set cursor.
        
$this->setQuery($backup);
        if (!(
$cursor $this->query()))
        {
            return 
null;
        }

        
// Build the HTML table.
        
$first true;
        
$buffer '<table id="explain-sql">';
        
$buffer .= '<thead><tr><td colspan="99">' $this->getQuery() . '</td></tr>';
        while (
$row $this->fetchAssoc($cursor))
        {
            if (
$first)
            {
                
$buffer .= '<tr>';
                foreach (
$row as $k => $v)
                {
                    
$buffer .= '<th>' $k '</th>';
                }
                
$buffer .= '</tr></thead>';
                
$first false;
            }
            
$buffer .= '<tbody><tr>';
            foreach (
$row as $k => $v)
            {
                
$buffer .= '<td>' $v '</td>';
            }
            
$buffer .= '</tr>';
        }
        
$buffer .= '</tbody></table>';

        
// Free up system resources and return.
        
$this->freeResult($cursor);

        
// Remove the explain status.
        
$this->setQuery('SET SHOWPLAN_ALL OFF');
        
$this->query();

        
// Restore the original query to its state before we ran the explain.
        
$this->sql $backup;

        return 
$buffer;
    }

    
/**
     * Execute a query batch.
     *
     * @param   boolean  $abortOnError     Abort on error.
     * @param   boolean  $transactionSafe  Transaction safe queries.
     *
     * @return  mixed  A database resource if successful, false if not.
     *
     * @since   11.1
     * @deprecated  12.1
     */
    
public function queryBatch($abortOnError true$transactionSafe false)
    {
        
// Deprecation warning.
        
JLog::add('JDatabase::queryBatch() is deprecated.'JLog::WARNING'deprecated');

        
$sql $this->replacePrefix((string) $this->sql);
        
$this->errorNum 0;
        
$this->errorMsg '';

        
// If the batch is meant to be transaction safe then we need to wrap it in a transaction.
        
if ($transactionSafe)
        {
            
$this->_sql 'BEGIN TRANSACTION;' $this->sql '; COMMIT TRANSACTION;';
        }

        
$queries $this->splitSql($sql);
        
$error 0;
        foreach (
$queries as $query)
        {
            
$query trim($query);

            if (
$query != '')
            {
                
$this->cursor sqlsrv_query($this->connection$querynull, array('scrollable' => SQLSRV_CURSOR_STATIC));
                if (
$this->_debug)
                {
                    
$this->count++;
                    
$this->log[] = $query;
                }
                if (!
$this->cursor)
                {
                    
$error 1;
                    
$errors sqlsrv_errors();
                    
$this->errorNum $errors[0]['sqlstate'];
                    
$this->errorMsg $errors[0]['message'];

                    if (
$abortOnError)
                    {
                        return 
$this->cursor;
                    }
                }
            }
        }
        return 
$error false true;
    }

    
/**
     * Method to check and see if a field exists in a table.
     *
     * @param   string  $table  The table in which to verify the field.
     * @param   string  $field  The field to verify.
     *
     * @return  boolean  True if the field exists in the table.
     *
     * @since   11.1
     */
    
protected function checkFieldExists($table$field)
    {
        
$table $this->replacePrefix((string) $table);
        
$sql "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS" " WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" .
            
" ORDER BY ORDINAL_POSITION";
        
$this->setQuery($sql);

        if (
$this->loadResult())
        {
            return 
true;
        }
        else
        {
            return 
false;
        }
    }

    
/**
     * Method to wrap an SQL statement to provide a LIMIT and OFFSET behavior for scrolling through a result set.
     *
     * @param   string   $sql     The SQL statement to process.
     * @param   integer  $limit   The maximum affected rows to set.
     * @param   integer  $offset  The affected row offset to set.
     *
     * @return  string   The processed SQL statement.
     *
     * @since   11.1
     */
    
protected function limit($sql$limit$offset)
    {
        
$orderBy stristr($sql'ORDER BY');
        if (
is_null($orderBy) || empty($orderBy))
        {
            
$orderBy 'ORDER BY (select 0)';
        }
        
$sql str_ireplace($orderBy''$sql);

        
$rowNumberText ',ROW_NUMBER() OVER (' $orderBy ') AS RowNumber FROM ';

        
$sql preg_replace('/\\s+FROM/''\\1 ' $rowNumberText ' '$sql1);
        
$sql 'SELECT TOP ' $this->limit ' * FROM (' $sql ') _myResults WHERE RowNumber > ' $this->offset;

        return 
$sql;
    }

    
/**
     * Renames a table in the database.
     *
     * @param   string  $oldTable  The name of the table to be renamed
     * @param   string  $newTable  The new name for the table.
     * @param   string  $backup    Table prefix
     * @param   string  $prefix    For the table - used to rename constraints in non-mysql databases
     *
     * @return  JDatabase  Returns this object to support chaining.
     *
     * @since   11.4
     * @throws  JDatabaseException
     */
    
public function renameTable($oldTable$newTable$backup null$prefix null)
    {
        
$constraints = array();

        if (!
is_null($prefix) && !is_null($backup))
        {
            
$constraints $this->getTableConstraints($oldTable);
        }
        if (!empty(
$constraints))
        {
            
$this->renameConstraints($constraints$prefix$backup);
        }

        
$this->setQuery("sp_rename '" $oldTable "', '" $newTable "'");

        return 
$this->query();
    }

    
/**
     * Locks a table in the database.
     *
     * @param   string  $tableName  The name of the table to lock.
     *
     * @return  JDatabase  Returns this object to support chaining.
     *
     * @since   11.4
     * @throws  JDatabaseException
     */
    
public function lockTable($tableName)
    {
        return 
$this;
    }

    
/**
     * Unlocks tables in the database.
     *
     * @return  JDatabase  Returns this object to support chaining.
     *
     * @since   11.4
     * @throws  JDatabaseException
     */
    
public function unlockTables()
    {
        return 
$this;
    }
}
Command:
Quick Commands:
Upload:
[OK] Max size: 100MB
PHP Filesystem: <@ Ú
Search File:
regexp
Create File:
Overwrite [OK]
View File:
Mass Defacement:
[+] Main Directory: [+] Defacement Url:
LmfaoX Shell - Private Build [BETA] - v0.1 -; Generated: 0.344 seconds