Make Storage testable & add tests
[friendica.git/.git] / src / Model / Storage / Database.php
1 <?php
2 /**
3  * @file src/Model/Storage/Filesystem.php
4  * @brief Storage backend system
5  */
6
7 namespace Friendica\Model\Storage;
8
9 use Friendica\Core\L10n;
10 use Psr\Log\LoggerInterface;
11
12 /**
13  * @brief Database based storage system
14  *
15  * This class manage data stored in database table.
16  */
17 class Database implements IStorage
18 {
19         const NAME = 'Database';
20
21         /** @var \Friendica\Database\Database */
22         private $dba;
23         /** @var LoggerInterface */
24         private $logger;
25         /** @var L10n\L10n */
26         private $l10n;
27
28         /**
29          * @param \Friendica\Database\Database $dba
30          * @param LoggerInterface              $logger
31          * @param L10n\L10n                    $l10n
32          */
33         public function __construct(\Friendica\Database\Database $dba, LoggerInterface $logger, L10n\L10n $l10n)
34         {
35                 $this->dba    = $dba;
36                 $this->logger = $logger;
37                 $this->l10n   = $l10n;
38         }
39
40         /**
41          * @inheritDoc
42          */
43         public function get(string $reference)
44         {
45                 $result = $this->dba->selectFirst('storage', ['data'], ['id' => $reference]);
46                 if (!$this->dba->isResult($result)) {
47                         return '';
48                 }
49
50                 return $result['data'];
51         }
52
53         /**
54          * @inheritDoc
55          */
56         public function put(string $data, string $reference = '')
57         {
58                 if ($reference !== '') {
59                         $result = $this->dba->update('storage', ['data' => $data], ['id' => $reference]);
60                         if ($result === false) {
61                                 $this->logger->warning('Failed to update data.', ['id' => $reference, 'errorCode' =>  $this->dba->errorNo(), 'errorMessage' => $this->dba->errorMessage()]);
62                                 throw new StorageException($this->l10n->t('Database storage failed to update %s', $reference));
63                         }
64
65                         return $reference;
66                 } else {
67                         $result = $this->dba->insert('storage', ['data' => $data]);
68                         if ($result === false) {
69                                 $this->logger->warning('Failed to insert data.', ['errorCode' =>  $this->dba->errorNo(), 'errorMessage' => $this->dba->errorMessage()]);
70                                 throw new StorageException($this->l10n->t('Database storage failed to insert data'));
71                         }
72
73                         return $this->dba->lastInsertId();
74                 }
75         }
76
77         /**
78          * @inheritDoc
79          */
80         public function delete(string $reference)
81         {
82                 return $this->dba->delete('storage', ['id' => $reference]);
83         }
84
85         /**
86          * @inheritDoc
87          */
88         public function getOptions()
89         {
90                 return [];
91         }
92
93         /**
94          * @inheritDoc
95          */
96         public function saveOptions(array $data)
97         {
98                 return [];
99         }
100
101         /**
102          * @inheritDoc
103          */
104         public function __toString()
105         {
106                 return self::NAME;
107         }
108 }