/
DatabaseSaver.php
102 lines (88 loc) · 3.01 KB
/
DatabaseSaver.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
namespace Concrete\Core\Config;
use Concrete\Core\Database\Connection\Connection;
use Concrete\Core\Support\Facade\Database;
class DatabaseSaver implements SaverInterface
{
/**
* @var \Concrete\Core\Database\Connection\Connection
*/
protected $connection;
/**
* @return Connection
*/
public function getConnection()
{
if (!$this->connection) {
$this->connection = Database::connection();
}
return $this->connection;
}
/**
* @param Connection $connection
*/
public function setConnection($connection)
{
$this->connection = $connection;
}
/**
* Save config item.
*
* @param string $item
* @param string $value
* @param string $environment
* @param string $group
* @param string|null $namespace
*
* @return bool
*/
public function save($item, $value, $environment, $group, $namespace = null)
{
$builder = $this->getConnection()->createQueryBuilder();
$query = $builder->delete('Config')
->where('configNamespace = :namespace',
'configGroup = :group',
'configItem LIKE :item')
->setParameters(array(
':namespace' => $namespace ?: '',
':group' => $group,
':item' => "{$item}.%",
));
$amount_deleted = $query->execute();
$this->doSave($item, $value, $environment, $group, $namespace);
}
private function doSave($item, $value, $environment, $group, $namespace = null)
{
$connection = $this->getConnection();
$query = $connection->createQueryBuilder();
if (is_array($value)) {
foreach ($value as $key => $val) {
$key = ($item ? $item . '.' : '') . $key;
$this->doSave($key, $val, $environment, $group, $namespace);
}
return;
}
$query->update('Config', 'c')
->set('configValue', $query->expr()->literal($value))
->where($query->expr()->comparison('configGroup', '=', $query->expr()->literal($group)));
if ($item) {
$query->andWhere($query->expr()->comparison('configItem', '=', $query->expr()->literal($item)));
}
$query->andWhere($query->expr()->comparison('configNamespace', '=', $query->expr()->literal($namespace ?: '')));
if (!$query->execute()) {
try {
$query = "INSERT INTO Config (configItem, configValue, configGroup, configNamespace) VALUES (?, ?, ?, ?)";
\Database::executeQuery(
$query,
array(
$item,
$value,
$group,
$namespace ?: '',
));
} catch (\Exception $e) {
// This happens when the update succeeded, but didn't actually change anything on the row.
}
}
}
}