diff --git a/src/Database/Database.php b/src/Database/Database.php index b1e31bda7..f4959bf7e 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -1357,6 +1357,15 @@ class Database } $fields = $this->castFields($table, $fields); + $direct_fields = []; + + foreach ($fields as $key => $value) { + if (is_numeric($key)) { + $direct_fields[] = $value; + unset($fields[$key]); + } + } + $table_string = DBA::buildTableString([$table]); @@ -1369,7 +1378,8 @@ class Database } $sql = "UPDATE " . $ignore . $table_string . " SET " - . implode(" = ?, ", array_map([DBA::class, 'quoteIdentifier'], array_keys($fields))) . " = ?" + . ((count($fields) > 0) ? implode(" = ?, ", array_map([DBA::class, 'quoteIdentifier'], array_keys($fields))) . " = ?" : "") + . ((count($direct_fields) > 0) ? ((count($fields) > 0) ? " , " : "") . implode(" , ", $direct_fields) : "") . $condition_string; // Combines the updated fields parameter values with the condition parameter values diff --git a/src/Database/DatabaseException.php b/src/Database/DatabaseException.php index ba1ccfce5..9473e5808 100644 --- a/src/Database/DatabaseException.php +++ b/src/Database/DatabaseException.php @@ -38,22 +38,25 @@ class DatabaseException extends Exception * * @link https://php.net/manual/en/exception.construct.php * - * @param string $message The Database error message. - * @param int $code The Database error code. - * @param string $query The Database error query. - * @param Throwable $previous [optional] The previous throwable used for the exception chaining. + * @param string $message The Database error message. + * @param int $code The Database error code. + * @param string $query The Database error query. + * @param Throwable|null $previous [optional] The previous throwable used for the exception chaining. */ public function __construct(string $message, int $code, string $query, Throwable $previous = null) { - parent::__construct($message, $code, $previous); $this->query = $query; + + parent::__construct(sprintf('"%s" at "%s"', $message, $query) , $code, $previous); } /** - * {@inheritDoc} + * Returns the query, which caused the exception + * + * @return string */ - public function __toString() + public function getQuery(): string { - return sprintf('Database error %d "%s" at "%s"', $this->message, $this->code, $this->query); + return $this->query; } } diff --git a/src/Federation/Repository/DeliveryQueueItem.php b/src/Federation/Repository/DeliveryQueueItem.php index 59afd5a3a..5d5198adf 100644 --- a/src/Federation/Repository/DeliveryQueueItem.php +++ b/src/Federation/Repository/DeliveryQueueItem.php @@ -88,7 +88,8 @@ final class DeliveryQueueItem extends \Friendica\BaseRepository public function remove(Entity\DeliveryQueueItem $deliveryQueueItem): bool { - return $this->db->delete(self::$table_name, ['uri-id' => $deliveryQueueItem->postUriId, 'gsid' => $deliveryQueueItem->targetServerId]); + return $this->db->delete(self::$table_name, ['uri-id' => $deliveryQueueItem->postUriId, + 'gsid' => $deliveryQueueItem->targetServerId]); } public function removeFailedByServerId(int $gsid, int $failedThreshold): bool @@ -98,12 +99,11 @@ final class DeliveryQueueItem extends \Friendica\BaseRepository public function incrementFailed(Entity\DeliveryQueueItem $deliveryQueueItem): bool { - return $this->db->e(" - UPDATE " . DBA::buildTableString([self::$table_name]) . " - SET `failed` = `failed` + 1 - WHERE `uri-id` = ? AND `gsid` = ?", - $deliveryQueueItem->postUriId, $deliveryQueueItem->targetServerId - ); + return $this->db->update(self::$table_name, ["`failed` = `failed` + 1"], + ["`uri-id` = ? AND `gsid` = ?", + $deliveryQueueItem->postUriId, + $deliveryQueueItem->targetServerId + ]); } public function optimizeStorage(): bool diff --git a/tests/datasets/api.fixture.php b/tests/datasets/api.fixture.php index b50f70625..f5b16f9c6 100644 --- a/tests/datasets/api.fixture.php +++ b/tests/datasets/api.fixture.php @@ -35,6 +35,15 @@ return [ 'workerqueue', 'mail', 'post-delivery-data', + 'gserver' => [ + [ + 'url' => 'https://friendica.local', + 'nurl' => 'http://friendica.local', + 'register_policy' => 0, + 'registered-users' => 0, + 'network' => 'unkn', + ], + ], // Base test config to avoid notice messages 'user' => [ [ diff --git a/tests/src/Database/DatabaseTest.php b/tests/src/Database/DatabaseTest.php new file mode 100644 index 000000000..e95d655f1 --- /dev/null +++ b/tests/src/Database/DatabaseTest.php @@ -0,0 +1,45 @@ +setUpVfsDir(); + + parent::setUp(); + + $this->configCache = new Cache(); + $this->configFileManager = new ConfigFileManager($this->root->url(), $this->root->url() . '/config/', $this->root->url() . '/static/'); + } + + public function testUpdateIncrease() + { + $db = $this->getDbInstance(); + + self::assertTrue($db->insert('config', ['cat' => 'test', 'k' => 'inc', 'v' => 0])); + self::assertTrue($db->update('config', ["`v` = `v` + 1"], ['cat' => 'test', 'k' => 'inc'])); + self::assertEquals(1, $db->selectFirst('config', ['v'], ['cat' => 'test', 'k' => 'inc'])['v']); + } + + public function testUpdateWithField() + { + $db = $this->getDbInstance(); + + self::assertEquals('https://friendica.local', $db->selectFirst('gserver', ['url'], ['nurl' => 'http://friendica.local'])['url']); + self::assertTrue($db->update('gserver', ['site_name' => 'test', "`registered-users` = `registered-users` + 1", 'info' => 'another test'], ['nurl' => 'http://friendica.local'])); + self::assertEquals(1, $db->selectFirst('gserver', ['registered-users'], ['nurl' => 'http://friendica.local'])['registered-users']); + self::assertTrue($db->update('gserver', ['site_name' => 'test', "`registered-users` = `registered-users` + 1", 'info' => 'another test'], ['nurl' => 'http://friendica.local'])); + self::assertEquals(2, $db->selectFirst('gserver', ['registered-users'], ['nurl' => 'http://friendica.local'])['registered-users']); + self::assertTrue($db->update('gserver', ['site_name' => 'test', "`registered-users` = `registered-users` - 1", 'info' => 'another test'], ['nurl' => 'http://friendica.local'])); + self::assertEquals(1, $db->selectFirst('gserver', ['registered-users'], ['nurl' => 'http://friendica.local'])['registered-users']); + } +}