Add direct field possibility
This commit is contained in:
parent
db5078d51c
commit
557d0e3aeb
5 changed files with 83 additions and 16 deletions
|
@ -1357,6 +1357,15 @@ class Database
|
||||||
}
|
}
|
||||||
|
|
||||||
$fields = $this->castFields($table, $fields);
|
$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]);
|
$table_string = DBA::buildTableString([$table]);
|
||||||
|
|
||||||
|
@ -1369,7 +1378,8 @@ class Database
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql = "UPDATE " . $ignore . $table_string . " SET "
|
$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;
|
. $condition_string;
|
||||||
|
|
||||||
// Combines the updated fields parameter values with the condition parameter values
|
// Combines the updated fields parameter values with the condition parameter values
|
||||||
|
|
|
@ -38,22 +38,25 @@ class DatabaseException extends Exception
|
||||||
*
|
*
|
||||||
* @link https://php.net/manual/en/exception.construct.php
|
* @link https://php.net/manual/en/exception.construct.php
|
||||||
*
|
*
|
||||||
* @param string $message The Database error message.
|
* @param string $message The Database error message.
|
||||||
* @param int $code The Database error code.
|
* @param int $code The Database error code.
|
||||||
* @param string $query The Database error query.
|
* @param string $query The Database error query.
|
||||||
* @param Throwable $previous [optional] The previous throwable used for the exception chaining.
|
* @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)
|
public function __construct(string $message, int $code, string $query, Throwable $previous = null)
|
||||||
{
|
{
|
||||||
parent::__construct($message, $code, $previous);
|
|
||||||
$this->query = $query;
|
$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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,7 +88,8 @@ final class DeliveryQueueItem extends \Friendica\BaseRepository
|
||||||
|
|
||||||
public function remove(Entity\DeliveryQueueItem $deliveryQueueItem): bool
|
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 removeFailedByServerId(int $gsid, int $failedThreshold): bool
|
||||||
|
@ -98,12 +99,11 @@ final class DeliveryQueueItem extends \Friendica\BaseRepository
|
||||||
|
|
||||||
public function incrementFailed(Entity\DeliveryQueueItem $deliveryQueueItem): bool
|
public function incrementFailed(Entity\DeliveryQueueItem $deliveryQueueItem): bool
|
||||||
{
|
{
|
||||||
return $this->db->e("
|
return $this->db->update(self::$table_name, ["`failed` = `failed` + 1"],
|
||||||
UPDATE " . DBA::buildTableString([self::$table_name]) . "
|
["`uri-id` = ? AND `gsid` = ?",
|
||||||
SET `failed` = `failed` + 1
|
$deliveryQueueItem->postUriId,
|
||||||
WHERE `uri-id` = ? AND `gsid` = ?",
|
$deliveryQueueItem->targetServerId
|
||||||
$deliveryQueueItem->postUriId, $deliveryQueueItem->targetServerId
|
]);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function optimizeStorage(): bool
|
public function optimizeStorage(): bool
|
||||||
|
|
|
@ -35,6 +35,15 @@ return [
|
||||||
'workerqueue',
|
'workerqueue',
|
||||||
'mail',
|
'mail',
|
||||||
'post-delivery-data',
|
'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
|
// Base test config to avoid notice messages
|
||||||
'user' => [
|
'user' => [
|
||||||
[
|
[
|
||||||
|
|
45
tests/src/Database/DatabaseTest.php
Normal file
45
tests/src/Database/DatabaseTest.php
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
<?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']);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue