]> git.mxchange.org Git - friendica.git/commitdiff
Add direct field possibility
authorPhilipp <admin@philipp.info>
Sat, 13 May 2023 20:04:51 +0000 (22:04 +0200)
committerPhilipp <admin@philipp.info>
Sat, 13 May 2023 20:04:51 +0000 (22:04 +0200)
src/Database/Database.php
src/Database/DatabaseException.php
src/Federation/Repository/DeliveryQueueItem.php
tests/datasets/api.fixture.php
tests/src/Database/DatabaseTest.php [new file with mode: 0644]

index b1e31bda747dca7cdb6863c49f5e772d74a34b4b..f4959bf7e9028ea8818c569ac2f379f5a8e7fcfd 100644 (file)
@@ -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
index ba1ccfce54a0e24eb634b7705bd50642ecf1e714..9473e58081feaedfd33470c96f33f9c772da1fdc 100644 (file)
@@ -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;
        }
 }
index 59afd5a3ad512610c5f6097b67fee27cbc8a4247..5d5198adfbb333e519f624adb3e29bfdaad4f2f9 100644 (file)
@@ -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
index b50f706251e446111567f8ebfd9c1413459938c1..f5b16f9c6e610231b23d149224591cb3a93b5e09 100644 (file)
@@ -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 (file)
index 0000000..e95d655
--- /dev/null
@@ -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']);
+       }
+}