Browse Source

Add Database storage backend

This storage store files data in a separate database table
tags/2019.03^2
fabrixxm 1 year ago
committed by Hypolite Petovan
parent
commit
e5c2d4e2f8
3 changed files with 76 additions and 1 deletions
  1. +12
    -1
      config/dbstructure.config.php
  2. +10
    -0
      database.sql
  3. +54
    -0
      src/Model/Storage/Database.php

+ 12
- 1
config/dbstructure.config.php View File

@@ -34,7 +34,7 @@
use Friendica\Database\DBA;

if (!defined('DB_UPDATE_VERSION')) {
define('DB_UPDATE_VERSION', 1294);
define('DB_UPDATE_VERSION', 1295);
}

return [
@@ -1380,5 +1380,16 @@ return [
"done_priority_next_try" => ["done", "priority", "next_try"],
"done_next_try" => ["done", "next_try"]
]
],
"storage" => [
"comment" => "Data stored by Database storage backend",
"fields" => [
"id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => "Auto incremented image data id"],
"data" => ["type" => "longblob", "not null" => "1", "comment" => "file data"]
],
"indexes" => [
"PRIMARY" => ["id"]
]
]
];


+ 10
- 0
database.sql View File

@@ -1,6 +1,6 @@
-- ------------------------------------------
-- Friendica 2019.03-dev (The Tazmans Flax-lily)
-- DB_UPDATE_VERSION 1295
-- ------------------------------------------


@@ -1274,4 +1274,13 @@ CREATE TABLE IF NOT EXISTS `workerqueue` (
INDEX `done_next_try` (`done`,`next_try`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Background tasks queue entries';

--
-- TABLE storage
--
CREATE TABLE IF NOT EXISTS `storage` (
`id` int unsigned NOT NULL auto_increment COMMENT 'Auto incremented image data id',
`data` longblob NOT NULL COMMENT 'file data',
PRIMARY KEY(`id`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Data stored by Database storage backend';



+ 54
- 0
src/Model/Storage/Database.php View File

@@ -0,0 +1,54 @@
<?php
/**
* @file src/Model/Storage/Filesystem.php
* @brief Storage backend system
*/

namespace Friendica\Model\Storage;

use Friendica\Core\Logger;
use Friendica\Core\L10n;
use Friendica\Core\System;
use Friendica\Database\DBA;

/**
* @brief Database based storage system
*
* This class manage data stored in database table.
*/
class Database implements IStorage
{
public static function get($ref)
{
$r = DBA::selectFirst('storage', ['data'], ['id' => $ref]);
if (!DBA::isResult($r)) {
return '';
}

return $r['data'];
}

public static function put($data, $ref = '')
{
if ($ref !== '') {
$r = DBA::update('storage', ['data' => $data], ['id' => $ref]);
if ($r === false) {
Logger::log('Failed to update data with id ' . $ref . ': ' . DBA::errorNo() . ' : ' . DBA::errorMessage());
throw new StorageException(L10n::t('Database storage failed to update %s', $ref));
}
return $ref;
} else {
$r = DBA::insert('storage', ['data' => $data]);
if ($r === false) {
Logger::log('Failed to insert data: ' . DBA::errorNo() . ' : ' . DBA::errorMessage());
throw new StorageException(L10n::t('Database storage failed to insert data'));
}
return DBA::lastInsertId();
}
}

public static function delete($ref)
{
return DBA::delete('storage', ['id' => $ref]);
}
}

Loading…
Cancel
Save