From 0526f2d6710c2d8fc62d447cda6aba31f73effc2 Mon Sep 17 00:00:00 2001 From: addshore Date: Sun, 4 Mar 2018 13:50:28 +0000 Subject: [PATCH] Introduce IDatabase::buildIntegerCast Change-Id: Ib24856d1ebe017ff07ae497972c764b4a3f3c7df --- includes/libs/rdbms/database/DBConnRef.php | 4 ++++ includes/libs/rdbms/database/Database.php | 4 ++++ includes/libs/rdbms/database/DatabaseMysqlBase.php | 9 +++++++++ includes/libs/rdbms/database/IDatabase.php | 7 +++++++ .../libs/rdbms/database/DatabaseMysqlBaseTest.php | 10 ++++++++++ .../includes/libs/rdbms/database/DatabaseSQLTest.php | 8 ++++++++ 6 files changed, 42 insertions(+) diff --git a/includes/libs/rdbms/database/DBConnRef.php b/includes/libs/rdbms/database/DBConnRef.php index 910d42f11d..f26b98546b 100644 --- a/includes/libs/rdbms/database/DBConnRef.php +++ b/includes/libs/rdbms/database/DBConnRef.php @@ -358,6 +358,10 @@ class DBConnRef implements IDatabase { return $this->__call( __FUNCTION__, func_get_args() ); } + public function buildIntegerCast( $field ) { + return $this->__call( __FUNCTION__, func_get_args() ); + } + public function databasesAreIndependent() { return $this->__call( __FUNCTION__, func_get_args() ); } diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php index fc0db57bef..2c59963c6d 100644 --- a/includes/libs/rdbms/database/Database.php +++ b/includes/libs/rdbms/database/Database.php @@ -1892,6 +1892,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware return $field; } + public function buildIntegerCast( $field ) { + return 'CAST( ' . $field . ' AS INTEGER )'; + } + public function databasesAreIndependent() { return false; } diff --git a/includes/libs/rdbms/database/DatabaseMysqlBase.php b/includes/libs/rdbms/database/DatabaseMysqlBase.php index a5220b9a2e..8fb8db5c16 100644 --- a/includes/libs/rdbms/database/DatabaseMysqlBase.php +++ b/includes/libs/rdbms/database/DatabaseMysqlBase.php @@ -1456,6 +1456,15 @@ abstract class DatabaseMysqlBase extends Database { return parent::isTransactableQuery( $sql ) && !preg_match( '/^SELECT\s+(GET|RELEASE|IS_FREE)_LOCK\(/', $sql ); } + + /** + * @param string $field Field or column to cast + * @return string + */ + public function buildIntegerCast( $field ) { + return 'CAST( ' . $field . ' AS SIGNED )'; + } + } class_alias( DatabaseMysqlBase::class, 'DatabaseMysqlBase' ); diff --git a/includes/libs/rdbms/database/IDatabase.php b/includes/libs/rdbms/database/IDatabase.php index 9311c074d7..28a812573e 100644 --- a/includes/libs/rdbms/database/IDatabase.php +++ b/includes/libs/rdbms/database/IDatabase.php @@ -1072,6 +1072,13 @@ interface IDatabase { */ public function buildStringCast( $field ); + /** + * @param string $field Field or column to cast + * @return string + * @since 1.31 + */ + public function buildIntegerCast( $field ); + /** * Returns true if DBs are assumed to be on potentially different servers * diff --git a/tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php b/tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php index 14c705734b..1d948d7d50 100644 --- a/tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php +++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php @@ -604,4 +604,14 @@ class DatabaseMysqlBaseTest extends PHPUnit\Framework\TestCase { ]; } + + /** + * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::buildIntegerCast + */ + public function testBuildIntegerCast() { + $db = new FakeDatabaseMysqlBase(); + $output = $db->buildIntegerCast( 'fieldName' ); + $this->assertSame( 'CAST( fieldName AS SIGNED )', $output ); + } + } diff --git a/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php b/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php index b3c8cce3b7..0f47595b40 100644 --- a/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php +++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php @@ -1249,4 +1249,12 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase { $this->database->buildSubstring( 'foo', $start, $length ); } + /** + * @covers \Wikimedia\Rdbms\Database::buildIntegerCast + */ + public function testBuildIntegerCast() { + $output = $this->database->buildIntegerCast( 'fieldName' ); + $this->assertSame( 'CAST( fieldName AS INTEGER )', $output ); + } + } -- 2.20.1