--- /dev/null
+<?php
+/**
+ * @author Robin Appelman <robin@icewind.nl>
+ *
+ * @license AGPL-3.0
+ *
+ * This code 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.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\DB\QueryBuilder\FunctionBuilder;
+
+use OC\DB\QueryBuilder\QueryFunction;
+use OC\DB\QueryBuilder\QuoteHelper;
+use OCP\DB\QueryBuilder\IFunctionBuilder;
+
+class FunctionBuilder implements IFunctionBuilder {
+ /** @var QuoteHelper */
+ protected $helper;
+
+ /**
+ * ExpressionBuilder constructor.
+ *
+ * @param QuoteHelper $helper
+ */
+ public function __construct(QuoteHelper $helper) {
+ $this->helper = $helper;
+ }
+
+ public function md5($input) {
+ return new QueryFunction('MD5(' . $this->helper->quoteColumnName($input) . ')');
+ }
+
+ public function concat($x, $y) {
+ return new QueryFunction('CONCAT(' . $this->helper->quoteColumnName($x) . ', ' . $this->helper->quoteColumnName($y) . ')');
+ }
+
+ public function substring($input, $start, $length = null) {
+ if ($length) {
+ return new QueryFunction('SUBSTR(' . $this->helper->quoteColumnName($input) . ', ' . $this->helper->quoteColumnName($start) . ', ' . $this->helper->quoteColumnName($length) . ')');
+ } else {
+ return new QueryFunction('SUBSTR(' . $this->helper->quoteColumnName($input) . ', ' . $this->helper->quoteColumnName($start) . ')');
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * @author Robin Appelman <robin@icewind.nl>
+ *
+ * @license AGPL-3.0
+ *
+ * This code 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.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\DB\QueryBuilder\FunctionBuilder;
+
+use OC\DB\QueryBuilder\QueryFunction;
+
+class OCIFunctionBuilder extends FunctionBuilder {
+ public function md5($input) {
+ return new QueryFunction('LOWER(DBMS_OBFUSCATION_TOOLKIT.md5 (input => UTL_RAW.cast_to_raw(' . $this->helper->quoteColumnName($input) .')))');
+ }
+}
--- /dev/null
+<?php
+/**
+ * @author Robin Appelman <robin@icewind.nl>
+ *
+ * @license AGPL-3.0
+ *
+ * This code 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.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\DB\QueryBuilder\FunctionBuilder;
+
+use OC\DB\QueryBuilder\QueryFunction;
+
+class PgSqlFunctionBuilder extends FunctionBuilder {
+ public function concat($x, $y) {
+ return new QueryFunction($this->helper->quoteColumnName($x) . ' || ' . $this->helper->quoteColumnName($y));
+ }
+}
--- /dev/null
+<?php
+/**
+ * @author Robin Appelman <robin@icewind.nl>
+ *
+ * @license AGPL-3.0
+ *
+ * This code 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.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\DB\QueryBuilder\FunctionBuilder;
+
+use OC\DB\QueryBuilder\QueryFunction;
+
+class SqliteFunctionBuilder extends FunctionBuilder {
+ public function concat($x, $y) {
+ return new QueryFunction($this->helper->quoteColumnName($x) . ' || ' . $this->helper->quoteColumnName($y));
+ }
+}
use OC\DB\QueryBuilder\ExpressionBuilder\PgSqlExpressionBuilder;
use OC\DB\QueryBuilder\ExpressionBuilder\SqliteExpressionBuilder;
use OC\DB\QueryBuilder\FunctionBuilder\FunctionBuilder;
+use OC\DB\QueryBuilder\FunctionBuilder\OCIFunctionBuilder;
+use OC\DB\QueryBuilder\FunctionBuilder\PgSqlFunctionBuilder;
use OC\DB\QueryBuilder\FunctionBuilder\SqliteFunctionBuilder;
use OC\SystemConfig;
use OCP\DB\QueryBuilder\IQueryBuilder;
}
}
+ /**
+ * Gets an FunctionBuilder used for object-oriented construction of query functions.
+ * This producer method is intended for convenient inline usage. Example:
+ *
+ * <code>
+ * $qb = $conn->getQueryBuilder()
+ * ->select('u')
+ * ->from('users', 'u')
+ * ->where($qb->fun()->md5('u.id'));
+ * </code>
+ *
+ * For more complex function construction, consider storing the function
+ * builder object in a local variable.
+ *
+ * @return \OCP\DB\QueryBuilder\IFunctionBuilder
+ */
+ public function fun() {
+ if ($this->connection instanceof OracleConnection) {
+ return new OCIFunctionBuilder($this->helper);
+ } else if ($this->connection->getDatabasePlatform() instanceof SqlitePlatform) {
+ return new SqliteFunctionBuilder($this->helper);
+ } else if ($this->connection->getDatabasePlatform() instanceof PostgreSqlPlatform) {
+ return new PgSqlFunctionBuilder($this->helper);
+ } else {
+ return new FunctionBuilder($this->helper);
+ }
+ }
+
/**
* Gets the type of the currently built query.
*
--- /dev/null
+<?php
+/**
+ * @author Robin Appelman <robin@icewind.nl>
+ *
+ * @license AGPL-3.0
+ *
+ * This code 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.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCP\DB\QueryBuilder;
+
+/**
+ * This class provides a builder for sql some functions
+ *
+ * @since 12.0.0
+ */
+interface IFunctionBuilder {
+ /**
+ * Calculates the MD5 hash of a given input
+ *
+ * @param mixed $input The input to be hashed
+ *
+ * @return IQueryFunction
+ * @since 12.0.0
+ */
+ public function md5($input);
+
+ /**
+ * Combines two input strings
+ *
+ * @param mixed $x The first input string
+ * @param mixed $y The seccond input string
+ *
+ * @return IQueryFunction
+ * @since 12.0.0
+ */
+ public function concat($x, $y);
+
+ /**
+ * Takes a substring from the input string
+ *
+ * @param mixed $input The input string
+ * @param mixed $start The start of the substring, note that counting starts at 1
+ * @param mixed $length The length of the substring
+ *
+ * @return IQueryFunction
+ * @since 12.0.0
+ */
+ public function substring($input, $start, $length = null);
+}
*/
public function expr();
+ /**
+ * Gets an FunctionBuilder used for object-oriented construction of query functions.
+ * This producer method is intended for convenient inline usage. Example:
+ *
+ * <code>
+ * $qb = $conn->getQueryBuilder()
+ * ->select('u')
+ * ->from('users', 'u')
+ * ->where($qb->fun()->md5('u.id'));
+ * </code>
+ *
+ * For more complex function construction, consider storing the function
+ * builder object in a local variable.
+ *
+ * @return \OCP\DB\QueryBuilder\IFunctionBuilder
+ * @since 12.0.0
+ */
+ public function fun();
+
/**
* Gets the type of the currently built query.
*
--- /dev/null
+<?php
+/**
+ * @author Robin Appelman <robin@icewind.nl>
+ *
+ * @license AGPL-3.0
+ *
+ * This code 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.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace Test\DB\QueryBuilder;
+
+use OC\DB\QueryBuilder\Literal;
+use Test\TestCase;
+
+/**
+ * Class FunctionBuilderTest
+ *
+ * @group DB
+ *
+ * @package Test\DB\QueryBuilder
+ */
+class FunctionBuilderTest extends TestCase {
+ /** @var \Doctrine\DBAL\Connection|\OCP\IDBConnection */
+ protected $connection;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->connection = \OC::$server->getDatabaseConnection();
+ }
+
+ public function testConcat() {
+ $query = $this->connection->getQueryBuilder();
+
+ $query->select($query->fun()->concat($query->createNamedParameter('foo'), new Literal("'bar'")));
+
+ $this->assertEquals('foobar', $query->execute()->fetchColumn());
+ }
+
+ public function testMd5() {
+ $query = $this->connection->getQueryBuilder();
+
+ $query->select($query->fun()->md5($query->createNamedParameter('foobar')));
+
+ $this->assertEquals(md5('foobar'), $query->execute()->fetchColumn());
+ }
+
+ public function testSubstring() {
+ $query = $this->connection->getQueryBuilder();
+
+ $query->select($query->fun()->substring($query->createNamedParameter('foobar'), new Literal(2), $query->createNamedParameter(2)));
+
+ $this->assertEquals('oo', $query->execute()->fetchColumn());
+ }
+
+ public function testSubstringNoLength() {
+ $query = $this->connection->getQueryBuilder();
+
+ $query->select($query->fun()->substring($query->createNamedParameter('foobar'), new Literal(2)));
+
+ $this->assertEquals('oobar', $query->execute()->fetchColumn());
+ }
+}