mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-24 14:30:56 +01:00
Remove queryfx() from phabricator/
Summary: Seee D3057. Test Plan: Loaded site. Reviewers: vrana, btrahan Reviewed By: vrana CC: aran, chad Maniphest Tasks: T1283 Differential Revision: https://secure.phabricator.com/D3058
This commit is contained in:
parent
514ee3526c
commit
7ffe802671
4 changed files with 0 additions and 449 deletions
|
@ -1079,13 +1079,10 @@ phutil_register_library_map(array(
|
|||
'PhrictionEditController' => 'applications/phriction/controller/PhrictionEditController.php',
|
||||
'PhrictionHistoryController' => 'applications/phriction/controller/PhrictionHistoryController.php',
|
||||
'PhrictionListController' => 'applications/phriction/controller/PhrictionListController.php',
|
||||
'QueryFormattingTestCase' => 'infrastructure/storage/query/__tests__/QueryFormattingTestCase.php',
|
||||
),
|
||||
'function' =>
|
||||
array(
|
||||
'_phabricator_date_format' => 'view/viewutils.php',
|
||||
'_qsprintf_check_scalar_type' => 'infrastructure/storage/query/qsprintf.php',
|
||||
'_qsprintf_check_type' => 'infrastructure/storage/query/qsprintf.php',
|
||||
'celerity_generate_unique_node_id' => 'infrastructure/celerity/api.php',
|
||||
'celerity_get_resource_uri' => 'infrastructure/celerity/api.php',
|
||||
'celerity_register_resource_map' => 'infrastructure/celerity/map.php',
|
||||
|
@ -1104,15 +1101,7 @@ phutil_register_library_map(array(
|
|||
'phabricator_time' => 'view/viewutils.php',
|
||||
'phid_get_type' => 'applications/phid/utils.php',
|
||||
'phid_group_by_type' => 'applications/phid/utils.php',
|
||||
'qsprintf' => 'infrastructure/storage/query/qsprintf.php',
|
||||
'queryfx' => 'infrastructure/storage/query/queryfx.php',
|
||||
'queryfx_all' => 'infrastructure/storage/query/queryfx.php',
|
||||
'queryfx_one' => 'infrastructure/storage/query/queryfx.php',
|
||||
'require_celerity_resource' => 'infrastructure/celerity/api.php',
|
||||
'vqsprintf' => 'infrastructure/storage/query/qsprintf.php',
|
||||
'vqueryfx' => 'infrastructure/storage/query/queryfx.php',
|
||||
'vqueryfx_all' => 'infrastructure/storage/query/queryfx.php',
|
||||
'xsprintf_query' => 'infrastructure/storage/query/qsprintf.php',
|
||||
),
|
||||
'xmap' =>
|
||||
array(
|
||||
|
@ -2058,6 +2047,5 @@ phutil_register_library_map(array(
|
|||
'PhrictionEditController' => 'PhrictionController',
|
||||
'PhrictionHistoryController' => 'PhrictionController',
|
||||
'PhrictionListController' => 'PhrictionController',
|
||||
'QueryFormattingTestCase' => 'PhabricatorTestCase',
|
||||
),
|
||||
));
|
||||
|
|
|
@ -1,56 +0,0 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2011 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
final class QueryFormattingTestCase extends PhabricatorTestCase {
|
||||
|
||||
public function testQueryFormatting() {
|
||||
$conn_r = id(new PhabricatorUser())->establishConnection('r');
|
||||
|
||||
$this->assertEqual(
|
||||
'NULL',
|
||||
qsprintf($conn_r, '%nd', null));
|
||||
|
||||
$this->assertEqual(
|
||||
'0',
|
||||
qsprintf($conn_r, '%nd', 0));
|
||||
|
||||
$this->assertEqual(
|
||||
'0',
|
||||
qsprintf($conn_r, '%d', 0));
|
||||
|
||||
$raised = null;
|
||||
try {
|
||||
qsprintf($conn_r, '%d', 'derp');
|
||||
} catch (Exception $ex) {
|
||||
$raised = $ex;
|
||||
}
|
||||
$this->assertEqual(
|
||||
(bool)$raised,
|
||||
true,
|
||||
'qsprintf should raise exception for invalid %d conversion.');
|
||||
|
||||
$this->assertEqual(
|
||||
"'<S>'",
|
||||
qsprintf($conn_r, '%s', null));
|
||||
|
||||
$this->assertEqual(
|
||||
'NULL',
|
||||
qsprintf($conn_r, '%ns', null));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,314 +0,0 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Format an SQL query. This function behaves like sprintf(), except that
|
||||
* all the normal conversions (like %s) will be properly escaped, and
|
||||
* additional conversions are supported:
|
||||
*
|
||||
* %nd, %ns, %nf
|
||||
* "Nullable" versions of %d, %s and %f. Will produce 'NULL' if the
|
||||
* argument is a strict null.
|
||||
*
|
||||
* %=d, %=s, %=f
|
||||
* "Nullable Test" versions of %d, %s and %f. If you pass a value, you
|
||||
* get "= 3"; if you pass null, you get "IS NULL". For instance, this
|
||||
* will work properly if `hatID' is a nullable column and $hat is null.
|
||||
*
|
||||
* qsprintf($conn, 'WHERE hatID %=d', $hat);
|
||||
*
|
||||
* %Ld, %Ls, %Lf
|
||||
* "List" versions of %d, %s and %f. These are appropriate for use in
|
||||
* an "IN" clause. For example:
|
||||
*
|
||||
* qsprintf($conn, 'WHERE hatID IN(%Ld)', $list_of_hats);
|
||||
*
|
||||
* %T ("Table")
|
||||
* Escapes a table name.
|
||||
*
|
||||
* %C, %LC
|
||||
* Escapes a column name or a list of column names.
|
||||
*
|
||||
* %K ("Comment")
|
||||
* Escapes a comment.
|
||||
*
|
||||
* %Q ("Query Fragment")
|
||||
* Injects a raw query fragment. Extremely dangerous! Not escaped!
|
||||
*
|
||||
* %~ ("Substring")
|
||||
* Escapes a substring query for a LIKE (or NOT LIKE) clause. For example:
|
||||
*
|
||||
* // Find all rows with $search as a substing of `name`.
|
||||
* qsprintf($conn, 'WHERE name LIKE %~', $search);
|
||||
*
|
||||
* See also %> and %<.
|
||||
*
|
||||
* %> ("Prefix")
|
||||
* Escapes a prefix query for a LIKE clause. For example:
|
||||
*
|
||||
* // Find all rows where `name` starts with $prefix.
|
||||
* qsprintf($conn, 'WHERE name LIKE %>', $prefix);
|
||||
*
|
||||
* %< ("Suffix")
|
||||
* Escapes a suffix query for a LIKE clause. For example:
|
||||
*
|
||||
* // Find all rows where `name` ends with $suffix.
|
||||
* qsprintf($conn, 'WHERE name LIKE %<', $suffix);
|
||||
*
|
||||
* @group storage
|
||||
*/
|
||||
function qsprintf(AphrontDatabaseConnection $conn, $pattern/*, ... */) {
|
||||
$args = func_get_args();
|
||||
array_shift($args);
|
||||
return xsprintf('xsprintf_query', $conn, $args);
|
||||
}
|
||||
|
||||
/**
|
||||
* @group storage
|
||||
*/
|
||||
function vqsprintf(AphrontDatabaseConnection $conn, $pattern, array $argv) {
|
||||
array_unshift($argv, $pattern);
|
||||
return xsprintf('xsprintf_query', $conn, $argv);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* xsprintf() callback for encoding SQL queries. See qsprintf().
|
||||
* @group storage
|
||||
*/
|
||||
function xsprintf_query($userdata, &$pattern, &$pos, &$value, &$length) {
|
||||
$type = $pattern[$pos];
|
||||
$conn = $userdata;
|
||||
$next = (strlen($pattern) > $pos + 1) ? $pattern[$pos + 1] : null;
|
||||
|
||||
$nullable = false;
|
||||
$done = false;
|
||||
|
||||
$prefix = '';
|
||||
|
||||
if (!($conn instanceof AphrontDatabaseConnection)) {
|
||||
throw new Exception("Invalid database connection!");
|
||||
}
|
||||
|
||||
switch ($type) {
|
||||
case '=': // Nullable test
|
||||
switch ($next) {
|
||||
case 'd':
|
||||
case 'f':
|
||||
case 's':
|
||||
$pattern = substr_replace($pattern, '', $pos, 1);
|
||||
$length = strlen($pattern);
|
||||
$type = 's';
|
||||
if ($value === null) {
|
||||
$value = 'IS NULL';
|
||||
$done = true;
|
||||
} else {
|
||||
$prefix = '= ';
|
||||
$type = $next;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new Exception('Unknown conversion, try %=d, %=s, or %=f.');
|
||||
}
|
||||
break;
|
||||
|
||||
case 'n': // Nullable...
|
||||
switch ($next) {
|
||||
case 'd': // ...integer.
|
||||
case 'f': // ...float.
|
||||
case 's': // ...string.
|
||||
$pattern = substr_replace($pattern, '', $pos, 1);
|
||||
$length = strlen($pattern);
|
||||
$type = $next;
|
||||
$nullable = true;
|
||||
break;
|
||||
default:
|
||||
throw new Exception('Unknown conversion, try %nd or %ns.');
|
||||
}
|
||||
break;
|
||||
|
||||
case 'L': // List of..
|
||||
_qsprintf_check_type($value, "L{$next}", $pattern);
|
||||
$pattern = substr_replace($pattern, '', $pos, 1);
|
||||
$length = strlen($pattern);
|
||||
$type = 's';
|
||||
$done = true;
|
||||
|
||||
switch ($next) {
|
||||
case 'd': // ...integers.
|
||||
$value = implode(', ', array_map('intval', $value));
|
||||
break;
|
||||
case 's': // ...strings.
|
||||
foreach ($value as $k => $v) {
|
||||
$value[$k] = "'".$conn->escapeString($v)."'";
|
||||
}
|
||||
$value = implode(', ', $value);
|
||||
break;
|
||||
case 'C': // ...columns.
|
||||
foreach ($value as $k => $v) {
|
||||
$value[$k] = $conn->escapeColumnName($v);
|
||||
}
|
||||
$value = implode(', ', $value);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Unknown conversion %L{$next}.");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (!$done) {
|
||||
_qsprintf_check_type($value, $type, $pattern);
|
||||
switch ($type) {
|
||||
case 's': // String
|
||||
if ($nullable && $value === null) {
|
||||
$value = 'NULL';
|
||||
} else {
|
||||
$value = "'".$conn->escapeString($value)."'";
|
||||
}
|
||||
$type = 's';
|
||||
break;
|
||||
|
||||
case 'Q': // Query Fragment
|
||||
$type = 's';
|
||||
break;
|
||||
|
||||
case '~': // Like Substring
|
||||
case '>': // Like Prefix
|
||||
case '<': // Like Suffix
|
||||
$value = $conn->escapeStringForLikeClause($value);
|
||||
switch ($type) {
|
||||
case '~': $value = "'%".$value."%'"; break;
|
||||
case '>': $value = "'" .$value."%'"; break;
|
||||
case '<': $value = "'%".$value. "'"; break;
|
||||
}
|
||||
$type = 's';
|
||||
break;
|
||||
|
||||
case 'f': // Float
|
||||
if ($nullable && $value === null) {
|
||||
$value = 'NULL';
|
||||
} else {
|
||||
$value = (float)$value;
|
||||
}
|
||||
$type = 's';
|
||||
break;
|
||||
|
||||
case 'd': // Integer
|
||||
if ($nullable && $value === null) {
|
||||
$value = 'NULL';
|
||||
} else {
|
||||
$value = (int)$value;
|
||||
}
|
||||
$type = 's';
|
||||
break;
|
||||
|
||||
case 'T': // Table
|
||||
case 'C': // Column
|
||||
$value = $conn->escapeColumnName($value);
|
||||
$type = 's';
|
||||
break;
|
||||
|
||||
case 'K': // Komment
|
||||
$value = $conn->escapeMultilineComment($value);
|
||||
$type = 's';
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Exception("Unknown conversion '%{$type}'.");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if ($prefix) {
|
||||
$value = $prefix.$value;
|
||||
}
|
||||
$pattern[$pos] = $type;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @group storage
|
||||
*/
|
||||
function _qsprintf_check_type($value, $type, $query) {
|
||||
switch ($type) {
|
||||
case 'Ld': case 'Ls': case 'LC': case 'LA': case 'LO':
|
||||
if (!is_array($value)) {
|
||||
throw new AphrontQueryParameterException(
|
||||
$query,
|
||||
"Expected array argument for %{$type} conversion.");
|
||||
}
|
||||
if (empty($value)) {
|
||||
throw new AphrontQueryParameterException(
|
||||
$query,
|
||||
"Array for %{$type} conversion is empty.");
|
||||
}
|
||||
|
||||
foreach ($value as $scalar) {
|
||||
_qsprintf_check_scalar_type($scalar, $type, $query);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
_qsprintf_check_scalar_type($value, $type, $query);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @group storage
|
||||
*/
|
||||
function _qsprintf_check_scalar_type($value, $type, $query) {
|
||||
switch ($type) {
|
||||
case 'Q': case 'LC': case 'T': case 'C':
|
||||
if (!is_string($value)) {
|
||||
throw new AphrontQueryParameterException(
|
||||
$query,
|
||||
"Expected a string for %{$type} conversion.");
|
||||
}
|
||||
break;
|
||||
|
||||
case 'Ld': case 'd': case 'f':
|
||||
if (!is_null($value) && !is_numeric($value)) {
|
||||
throw new AphrontQueryParameterException(
|
||||
$query,
|
||||
"Expected a numeric scalar or null for %{$type} conversion.");
|
||||
}
|
||||
break;
|
||||
|
||||
case 'Ls': case 's':
|
||||
case '~': case '>': case '<': case 'K':
|
||||
if (!is_null($value) && !is_scalar($value)) {
|
||||
throw new AphrontQueryParameterException(
|
||||
$query,
|
||||
"Expected a scalar or null for %{$type} conversion.");
|
||||
}
|
||||
break;
|
||||
|
||||
case 'LA': case 'LO':
|
||||
if (!is_null($value) && !is_scalar($value) &&
|
||||
!(is_array($value) && !empty($value))) {
|
||||
throw new AphrontQueryParameterException(
|
||||
$query,
|
||||
"Expected a scalar or null or non-empty array for ".
|
||||
"%{$type} conversion.");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Unknown conversion '{$type}'.");
|
||||
}
|
||||
}
|
|
@ -1,67 +0,0 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @group storage
|
||||
*/
|
||||
function queryfx(AphrontDatabaseConnection $conn, $sql/*, ... */) {
|
||||
$argv = func_get_args();
|
||||
$query = call_user_func_array('qsprintf', $argv);
|
||||
$conn->executeRawQuery($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* @group storage
|
||||
*/
|
||||
function vqueryfx(AphrontDatabaseConnection $conn, $sql, array $argv) {
|
||||
array_unshift($argv, $conn, $sql);
|
||||
call_user_func_array('queryfx', $argv);
|
||||
}
|
||||
|
||||
/**
|
||||
* @group storage
|
||||
*/
|
||||
function queryfx_all(AphrontDatabaseConnection $conn, $sql/*, ... */) {
|
||||
$argv = func_get_args();
|
||||
call_user_func_array('queryfx', $argv);
|
||||
return $conn->selectAllResults();
|
||||
}
|
||||
|
||||
/**
|
||||
* @group storage
|
||||
*/
|
||||
function queryfx_one(AphrontDatabaseConnection $conn, $sql/*, ... */) {
|
||||
$argv = func_get_args();
|
||||
$ret = call_user_func_array('queryfx_all', $argv);
|
||||
if (count($ret) > 1) {
|
||||
throw new AphrontQueryCountException(
|
||||
'Query returned more than one row.');
|
||||
} else if (count($ret)) {
|
||||
return reset($ret);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @group storage
|
||||
*/
|
||||
function vqueryfx_all(AphrontDatabaseConnection $conn, $sql, array $argv) {
|
||||
array_unshift($argv, $conn, $sql);
|
||||
call_user_func_array('queryfx', $argv);
|
||||
return $conn->selectAllResults();
|
||||
}
|
Loading…
Reference in a new issue