Change key-value table

- Make "k" as primary key
- Added "updated_at"
This commit is contained in:
Philipp 2022-12-29 22:36:08 +01:00
parent f944a2a620
commit 7c4c409060
No known key found for this signature in database
GPG key ID: 24A7501396EB5432
5 changed files with 68 additions and 21 deletions

View file

@ -843,11 +843,10 @@ CREATE TABLE IF NOT EXISTS `intro` (
-- TABLE key-value -- TABLE key-value
-- --
CREATE TABLE IF NOT EXISTS `key-value` ( CREATE TABLE IF NOT EXISTS `key-value` (
`id` int unsigned NOT NULL auto_increment COMMENT '', `k` varbinary(50) NOT NULL COMMENT '',
`k` varbinary(50) NOT NULL DEFAULT '' COMMENT '',
`v` mediumtext COMMENT '', `v` mediumtext COMMENT '',
PRIMARY KEY(`id`), `updated_at` int unsigned NOT NULL COMMENT 'timestamp of the last update',
UNIQUE INDEX `k` (`k`) PRIMARY KEY(`k`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='A key value storage'; ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='A key value storage';
-- --
@ -1843,6 +1842,21 @@ CREATE TABLE IF NOT EXISTS `worker-ipc` (
PRIMARY KEY(`key`) PRIMARY KEY(`key`)
) ENGINE=MEMORY DEFAULT COLLATE utf8mb4_general_ci COMMENT='Inter process communication between the frontend and the worker'; ) ENGINE=MEMORY DEFAULT COLLATE utf8mb4_general_ci COMMENT='Inter process communication between the frontend and the worker';
--
-- TABLE advancedcontentfilter_rules
--
CREATE TABLE IF NOT EXISTS `advancedcontentfilter_rules` (
`id` int unsigned NOT NULL auto_increment COMMENT 'Auto incremented rule id',
`uid` int unsigned NOT NULL COMMENT 'Owner user id',
`name` varchar(255) NOT NULL COMMENT 'Rule name',
`expression` mediumtext NOT NULL COMMENT 'Expression text',
`serialized` mediumtext NOT NULL COMMENT 'Serialized parsed expression',
`active` boolean NOT NULL DEFAULT '1' COMMENT 'Whether the rule is active or not',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Creation date',
PRIMARY KEY(`id`),
INDEX `uid_active` (`uid`,`active`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Advancedcontentfilter addon rules';
-- --
-- VIEW application-view -- VIEW application-view
-- --

View file

@ -6,19 +6,18 @@ A key value storage
Fields Fields
------ ------
| Field | Description | Type | Null | Key | Default | Extra | | Field | Description | Type | Null | Key | Default | Extra |
| ----- | ----------- | ------------- | ---- | --- | ------- | -------------- | | ---------- | ---------------------------- | ------------- | ---- | --- | ------- | ----- |
| id | | int unsigned | NO | PRI | NULL | auto_increment | | k | | varbinary(50) | NO | PRI | NULL | |
| k | | varbinary(50) | NO | | | | | v | | mediumtext | YES | | NULL | |
| v | | mediumtext | YES | | NULL | | | updated_at | timestamp of the last update | int unsigned | YES | | NULL | |
Indexes Indexes
------------ ------------
| Name | Fields | | Name | Fields |
| ------- | --------- | | ------- | ------ |
| PRIMARY | id | | PRIMARY | k |
| k | UNIQUE, k |
Return to [database documentation](help/database) Return to [database documentation](help/database)

View file

@ -89,7 +89,10 @@ class DBKeyValueStorage extends AbstractKeyValueStorage
$dbValue = ValueConversion::toDbValue($value); $dbValue = ValueConversion::toDbValue($value);
$return = $this->database->update(self::DB_KEY_VALUE_TABLE, ['v' => $dbValue], ['k' => $offset], true); $return = $this->database->update(self::DB_KEY_VALUE_TABLE, [
'v' => $dbValue,
'updated_at' => time()
], ['k' => $offset], true);
if (!$return) { if (!$return) {
throw new \Exception(sprintf('database update failed: %s', $this->database->errorMessage())); throw new \Exception(sprintf('database update failed: %s', $this->database->errorMessage()));

View file

@ -892,13 +892,12 @@ return [
"key-value" => [ "key-value" => [
"comment" => "A key value storage", "comment" => "A key value storage",
"fields" => [ "fields" => [
"id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""], "k" => ["type" => "varbinary(50)", "not null" => "1", "primary" => "1", "comment" => ""],
"k" => ["type" => "varbinary(50)", "not null" => "1", "default" => "", "comment" => ""],
"v" => ["type" => "mediumtext", "comment" => ""], "v" => ["type" => "mediumtext", "comment" => ""],
"updated_at" => ["type" => "int unsigned", "not null" => "0", "comment" => "timestamp of the last update"],
], ],
"indexes" => [ "indexes" => [
"PRIMARY" => ["id"], "PRIMARY" => ["k"],
"k" => ["UNIQUE", "k"],
], ],
], ],
"locks" => [ "locks" => [

View file

@ -24,6 +24,7 @@ namespace Friendica\Test\src\Core\KeyValueStorage;
use Friendica\Core\Config\ValueObject\Cache; use Friendica\Core\Config\ValueObject\Cache;
use Friendica\Core\KeyValueStorage\Capabilities\ICanManageKeyValuePairs; use Friendica\Core\KeyValueStorage\Capabilities\ICanManageKeyValuePairs;
use Friendica\Core\KeyValueStorage\Type\DBKeyValueStorage; use Friendica\Core\KeyValueStorage\Type\DBKeyValueStorage;
use Friendica\Database\Database;
use Friendica\Database\Definition\DbaDefinition; use Friendica\Database\Definition\DbaDefinition;
use Friendica\Database\Definition\ViewDefinition; use Friendica\Database\Definition\ViewDefinition;
use Friendica\Test\DatabaseTestTrait; use Friendica\Test\DatabaseTestTrait;
@ -35,6 +36,9 @@ class DBKeyValueStorageTest extends KeyValueStorageTest
{ {
use DatabaseTestTrait; use DatabaseTestTrait;
/** @var Database */
protected $database;
protected function setUp(): void protected function setUp(): void
{ {
parent::setUp(); parent::setUp();
@ -56,9 +60,37 @@ class DBKeyValueStorageTest extends KeyValueStorageTest
$basePath = new BasePath(dirname(__FILE__, 5), $_SERVER); $basePath = new BasePath(dirname(__FILE__, 5), $_SERVER);
$database = new StaticDatabase($cache, new Profiler($cache), (new DbaDefinition($basePath->getPath()))->load(), (new ViewDefinition($basePath->getPath()))->load()); $this->database = new StaticDatabase($cache, new Profiler($cache), (new DbaDefinition($basePath->getPath()))->load(), (new ViewDefinition($basePath->getPath()))->load());
$database->setTestmode(true); $this->database->setTestmode(true);
return new DBKeyValueStorage($database); return new DBKeyValueStorage($this->database);
}
/** @dataProvider dataTests */
public function testUpdatedAt($k, $v)
{
$instance = $this->getInstance();
$instance->set($k, $v);
self::assertEquals($v, $instance->get($k));
self::assertEquals($v, $instance[$k]);
$entry = $this->database->selectFirst(DBKeyValueStorage::DB_KEY_VALUE_TABLE, ['updated_at'], ['k' => $k]);
self::assertNotEmpty($entry);
$updateAt = $entry['updated_at'];
$instance->set($k, 'another_value');
self::assertEquals('another_value', $instance->get($k));
self::assertEquals('another_value', $instance[$k]);
$entry = $this->database->selectFirst(DBKeyValueStorage::DB_KEY_VALUE_TABLE, ['updated_at'], ['k' => $k]);
self::assertNotEmpty($entry);
$updateAtAfter = $entry['updated_at'];
self::assertLessThanOrEqual($updateAt, $updateAtAfter);
} }
} }