Update API for 3.2 release

Fix bug with literal question mark in conditions
See https://github.com/silverstripe/silverstripe-framework/pull/4288
This commit is contained in:
Damian Mooyman 2015-06-17 13:50:36 +12:00
parent 31abb29c5d
commit a596d9d343
2 changed files with 25 additions and 21 deletions

View File

@ -161,6 +161,7 @@ class PostgreSQLConnector extends DBConnector {
$segments = preg_split('/\?/', $sql); $segments = preg_split('/\?/', $sql);
$joined = ''; $joined = '';
$inString = false; $inString = false;
$num = 0;
for($i = 0; $i < count($segments); $i++) { for($i = 0; $i < count($segments); $i++) {
// Append next segment // Append next segment
$joined .= $segments[$i]; $joined .= $segments[$i];
@ -174,12 +175,19 @@ class PostgreSQLConnector extends DBConnector {
} }
// Append placeholder replacement // Append placeholder replacement
$joined .= $inString ? "?" : ('$'.($i+1)); if($inString) {
$joined .= "?";
} else {
$joined .= '$' . ++$num;
}
} }
return $joined; return $joined;
} }
public function preparedQuery($sql, $parameters, $errorLevel = E_USER_ERROR) { public function preparedQuery($sql, $parameters, $errorLevel = E_USER_ERROR) {
// Reset state
$this->lastQuery = null;
$this->lastRows = 0;
// Replace question mark placeholders with numeric placeholders // Replace question mark placeholders with numeric placeholders
if(!empty($parameters)) { if(!empty($parameters)) {
@ -187,26 +195,22 @@ class PostgreSQLConnector extends DBConnector {
$parameters = $this->parameterValues($parameters); $parameters = $this->parameterValues($parameters);
} }
// Check if we should only preview this query // Execute query
if ($this->previewWrite($sql)) return;
// Benchmark query
$conn = $this->dbConn;
$this->lastQuery = $result = $this->benchmarkQuery($sql, function($sql) use($conn, $parameters) {
if(!empty($parameters)) { if(!empty($parameters)) {
return pg_query_params($conn, $sql, $parameters); $result = pg_query_params($this->dbConn, $sql, $parameters);
} else { } else {
return pg_query($conn, $sql); $result = pg_query($this->dbConn, $sql);
} }
});
$this->lastRows = 0; // Handle error
if ($result === false) { if ($result === false) {
$this->databaseError($this->getLastError(), $errorLevel, $sql, $parameters); $this->databaseError($this->getLastError(), $errorLevel, $sql, $parameters);
return null; return null;
} else {
$this->lastRows = pg_affected_rows($result);
} }
// Save and return results
$this->lastQuery = $result;
$this->lastRows = pg_affected_rows($result);
return new PostgreSQLQuery($result); return new PostgreSQLQuery($result);
} }

View File

@ -32,17 +32,17 @@ class PostgreSQLConnectorTest extends SapphireTest {
// Ignoring question mark placeholders within string literals with escaped slashes // Ignoring question mark placeholders within string literals with escaped slashes
$this->assertEquals( $this->assertEquals(
"SELECT * FROM Table WHERE ID = $1 AND Title = '\\'' AND Name = $2 AND Content = '<p>What is love?</p>'", "SELECT * FROM Table WHERE ID = $1 AND Title = '\\'' AND Content = '<p>What is love?</p>' AND Name = $2",
$connector->replacePlaceholders( $connector->replacePlaceholders(
"SELECT * FROM Table WHERE ID = ? AND Title = '\\'' AND Name = ? AND Content = '<p>What is love?</p>'" "SELECT * FROM Table WHERE ID = ? AND Title = '\\'' AND Content = '<p>What is love?</p>' AND Name = ?"
) )
); );
// same as above, but use double single quote escape syntax // same as above, but use double single quote escape syntax
$this->assertEquals( $this->assertEquals(
"SELECT * FROM Table WHERE ID = $1 AND Title = '''' AND Name = $2 AND Content = '<p>What is love?</p>'", "SELECT * FROM Table WHERE ID = $1 AND Title = '''' AND Content = '<p>What is love?</p>' AND Name = $2",
$connector->replacePlaceholders( $connector->replacePlaceholders(
"SELECT * FROM Table WHERE ID = ? AND Title = '''' AND Name = ? AND Content = '<p>What is love?</p>'" "SELECT * FROM Table WHERE ID = ? AND Title = '''' AND Content = '<p>What is love?</p>' AND Name = ?"
) )
); );
} }