167 lines
6.7 KiB
PHP
Executable File
167 lines
6.7 KiB
PHP
Executable File
<?php
|
|
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
|
|
/*********************************************************************************
|
|
* SugarCRM is a customer relationship management program developed by
|
|
* SugarCRM, Inc. Copyright (C) 2004-2010 SugarCRM Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it under
|
|
* the terms of the GNU Affero General Public License version 3 as published by the
|
|
* Free Software Foundation with the addition of the following permission added
|
|
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
|
|
* IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
|
|
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License along with
|
|
* this program; if not, see http://www.gnu.org/licenses or write to the Free
|
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301 USA.
|
|
*
|
|
* You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
|
|
* SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
|
|
*
|
|
* The interactive user interfaces in modified source and object code versions
|
|
* of this program must display Appropriate Legal Notices, as required under
|
|
* Section 5 of the GNU Affero General Public License version 3.
|
|
*
|
|
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
|
|
* these Appropriate Legal Notices must retain the display of the "Powered by
|
|
* SugarCRM" logo. If the display of the logo is not reasonably feasible for
|
|
* technical reasons, the Appropriate Legal Notices must display the words
|
|
* "Powered by SugarCRM".
|
|
********************************************************************************/
|
|
|
|
include_once('include/database/MssqlManager.php');
|
|
|
|
class FreeTDSManager extends MssqlManager
|
|
{
|
|
|
|
public $isFreeTDS = true;
|
|
|
|
/**
|
|
* @see DBManager::query()
|
|
*/
|
|
public function query(
|
|
$sql,
|
|
$dieOnError = false,
|
|
$msg = '',
|
|
$suppress = false
|
|
)
|
|
{
|
|
$sql = $this->appendN($sql);
|
|
parent::countQuery($sql);
|
|
$GLOBALS['log']->info('Query:' . $sql);
|
|
$this->checkConnection();
|
|
$this->query_time = microtime(true);
|
|
|
|
if ($suppress) {
|
|
}
|
|
else {
|
|
$result = @mssql_query($sql,$this->database);
|
|
}
|
|
|
|
if (!$result) {
|
|
|
|
// awu Bug 10657: ignoring mssql error message 'Changed database context to' - an intermittent
|
|
// and difficult to reproduce error. The message is only a warning, and does
|
|
// not affect the functionality of the query
|
|
$sqlmsg = mssql_get_last_message();
|
|
$sqlpos = strpos($sqlmsg, 'Changed database context to');
|
|
|
|
if($dieOnError)
|
|
if ($sqlpos !== false)
|
|
// if sqlmsg has 'Changed database context to', just log it
|
|
$GLOBALS['log']->debug(mssql_get_last_message() . ": " . $sql );
|
|
else
|
|
sugar_die('SQL Error : ' . mssql_get_last_message());
|
|
else
|
|
echo 'SQL Error : ' . mssql_get_last_message();
|
|
|
|
$GLOBALS['log']->fatal(mssql_get_last_message() . ": " . $sql );
|
|
}
|
|
$this->lastmysqlrow = -1;
|
|
|
|
$this->query_time = microtime(true) - $this->query_time;
|
|
$GLOBALS['log']->info('Query Execution Time:'.$this->query_time);
|
|
|
|
|
|
$this->checkError($msg.' Query Failed:' . $sql . '::', $dieOnError);
|
|
|
|
return $result;
|
|
}
|
|
|
|
|
|
/**
|
|
* This is a utility function to prepend the "N" character in front of SQL values that are
|
|
* surrounded by single quotes.
|
|
*
|
|
* @param $sql string SQL statement
|
|
* @return string SQL statement with single quote values prepended with "N" character for nvarchar columns
|
|
*/
|
|
public function appendN(
|
|
$sql
|
|
)
|
|
{
|
|
// If there are no single quotes, don't bother, will just assume there is no character data
|
|
if (strpos($sql, '\'') === false)
|
|
return $sql;
|
|
|
|
$sql = str_replace('\\\'', '<@#@#@ESCAPED_QUOTE@#@#@>', $sql);
|
|
|
|
//The only location of three subsequent ' will be at the begning or end of a value.
|
|
$sql = preg_replace('/(?<!\')(\'{3})(?!\')/', "'<@#@#@PAIR@#@#@>", $sql);
|
|
|
|
// Flag if there are odd number of single quotes, just continue w/o trying to append N
|
|
if ((substr_count($sql, '\'') & 1)) {
|
|
$GLOBALS['log']->error('SQL statement[' . $sql . '] has odd number of single quotes.');
|
|
return $sql;
|
|
}
|
|
|
|
// Remove any remaining '' and do not parse... replace later (hopefully we don't even have any)
|
|
$pairs = array();
|
|
$regexp = '/(\'{2})/';
|
|
$pair_matches = array();
|
|
preg_match_all($regexp, $sql, $pair_matches);
|
|
if ($pair_matches) {
|
|
foreach (array_unique($pair_matches[0]) as $key=>$value) {
|
|
$pairs['<@PAIR-'.$key.'@>'] = $value;
|
|
}
|
|
if (!empty($pairs)) {
|
|
$sql = str_replace($pairs, array_keys($pairs), $sql);
|
|
}
|
|
}
|
|
|
|
$regexp = "/(N?\'.+?\')/is";
|
|
$matches = array();
|
|
preg_match_all($regexp, $sql, $matches);
|
|
$replace = array();
|
|
if (!empty($matches)) {
|
|
foreach ($matches[0] as $key=>$value) {
|
|
// We are assuming that all nvarchar columns are no more than 200 characters in length
|
|
// One problem we face is the image column type in reports which cannot accept nvarchar data
|
|
if (!empty($value) && !is_numeric(trim(str_replace(array('\'', ','), '', $value))) && !preg_match('/^\'[\,]\'$/', $value)) {
|
|
$replace[$value] = 'N' . trim($value, 'N');
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!empty($replace))
|
|
$sql = str_replace(array_keys($replace), $replace, $sql);
|
|
|
|
if (!empty($pairs))
|
|
$sql = str_replace(array_keys($pairs), $pairs, $sql);
|
|
|
|
if(strpos($sql, '<@#@#@PAIR@#@#@>'))
|
|
$sql = str_replace(array('<@#@#@PAIR@#@#@>'), array('\'\''), $sql);
|
|
|
|
if(strpos($sql, '<@#@#@ESCAPED_QUOTE@#@#@>'))
|
|
$sql = str_replace(array('<@#@#@ESCAPED_QUOTE@#@#@>'), array('\\\''), $sql);
|
|
|
|
return $sql;
|
|
}
|
|
}
|