}
$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]);
}
$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
*
* @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;
}
}
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
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
'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' => [
[
--- /dev/null
+<?php
+
+namespace Friendica\Test\src\Database;
+
+use Friendica\Core\Config\Util\ConfigFileManager;
+use Friendica\Core\Config\ValueObject\Cache;
+use Friendica\Test\FixtureTest;
+use Friendica\Test\Util\CreateDatabaseTrait;
+
+class DatabaseTest extends FixtureTest
+{
+ use CreateDatabaseTrait;
+
+ protected function setUp(): void
+ {
+ $this->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']);
+ }
+}