mirror of
https://github.com/friendica/friendica
synced 2024-11-09 16:22:56 +00:00
Change key-value table
- Make "k" as primary key - Added "updated_at"
This commit is contained in:
parent
f944a2a620
commit
7c4c409060
5 changed files with 68 additions and 21 deletions
22
database.sql
22
database.sql
|
@ -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
|
||||||
--
|
--
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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()));
|
||||||
|
|
|
@ -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" => [
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue