From 2257ecb36be7402f1204f13ab47038a2854dcddb Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 9 Jul 2024 11:59:07 +0200 Subject: [PATCH] Try to workaround oracles primary key Signed-off-by: Joas Schilling --- lib/private/DB/AdapterOCI8.php | 7 ++++++ lib/private/DB/OracleConnection.php | 38 +++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/lib/private/DB/AdapterOCI8.php b/lib/private/DB/AdapterOCI8.php index 0a509090bca..81d3e38d778 100644 --- a/lib/private/DB/AdapterOCI8.php +++ b/lib/private/DB/AdapterOCI8.php @@ -26,6 +26,13 @@ class AdapterOCI8 extends Adapter { $statement = str_replace('`', '"', $statement); $statement = str_ireplace('NOW()', 'CURRENT_TIMESTAMP', $statement); $statement = str_ireplace('UNIX_TIMESTAMP()', self::UNIX_TIMESTAMP_REPLACEMENT, $statement); + + $statement = preg_replace( + '/^INSERT INTO (.*) VALUES (.*) INTO (.*)$/', + 'INSERT INTO ${1} VALUES ${2} RETURNING pk_id INTO ${3}', + $statement + ); + return $statement; } } diff --git a/lib/private/DB/OracleConnection.php b/lib/private/DB/OracleConnection.php index 182622a5f30..076e6f1cc44 100644 --- a/lib/private/DB/OracleConnection.php +++ b/lib/private/DB/OracleConnection.php @@ -8,6 +8,9 @@ namespace OC\DB; class OracleConnection extends Connection { + /** @var array */ + protected array $lastInsertId = []; + /** * Quote the keys of the array * @param array $data @@ -75,4 +78,39 @@ class OracleConnection extends Connection { $schema = $this->createSchemaManager(); return $schema->tablesExist([$table]); } + + /** + * Executes an SQL INSERT/UPDATE/DELETE query with the given parameters + * and returns the number of affected rows. + * + * This method supports PDO binding types as well as DBAL mapping types. + * + * @param string $sql The SQL query. + * @param array $params The query parameters. + * @param array $types The parameter types. + * + * @return int The number of affected rows, if the result is bigger than PHP_INT_MAX, PHP_INT_MAX is returned + * + * @throws \Doctrine\DBAL\Exception + */ + public function executeStatement($sql, array $params = [], array $types = []): int { + $returned = parent::executeStatement($sql, $params, $types); + + var_dump($sql); + if (preg_match('/^INSERT INTO (.*) VALUES (.*) INTO (.*)$/', $sql, $matches)) { + var_dump($returned); + $this->lastInsertId[$matches[1]] = $returned; + var_dump($this->lastInsertId); + $returned = 1; + } + + return $returned; + } + + public function lastInsertId($name = null): int { + if ($name) { + $name = $this->replaceTablePrefix($name); + } + return $this->lastInsertId[$name]; + } }