PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / trunk
Matomo Analytics – Powerful, Privacy-First Insights for WordPress vtrunk
5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / core / Settings / Storage / Backend / MeasurableSettingsTable.php
matomo / app / core / Settings / Storage / Backend Last commit date
BackendInterface.php 1 year ago BaseSettingsTable.php 2 years ago Cache.php 2 years ago Config.php 2 years ago MeasurableSettingsTable.php 6 months ago NullBackend.php 2 years ago PluginSettingsTable.php 1 month ago SitesTable.php 1 month ago
MeasurableSettingsTable.php
169 lines
1 <?php
2
3 /**
4 * Matomo - free/libre analytics platform
5 *
6 * @link https://matomo.org
7 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
8 */
9 namespace Piwik\Settings\Storage\Backend;
10
11 use Piwik\Common;
12 use Piwik\Db;
13 use Exception;
14 /**
15 * Measurable settings backend. Stores all settings in a "site_setting" database table.
16 *
17 * If a value that needs to be stored is an array, will insert a new row for each value of this array.
18 */
19 class MeasurableSettingsTable extends \Piwik\Settings\Storage\Backend\BaseSettingsTable
20 {
21 /**
22 * @var int
23 */
24 private $idSite;
25 /**
26 * @var string
27 */
28 private $pluginName;
29 public function __construct($idSite, $pluginName)
30 {
31 parent::__construct();
32 if (empty($pluginName)) {
33 throw new Exception('No plugin name given for MeasurableSettingsTable backend');
34 }
35 if (empty($idSite)) {
36 throw new Exception('No idSite given for MeasurableSettingsTable backend');
37 }
38 $this->idSite = (int) $idSite;
39 $this->pluginName = $pluginName;
40 }
41 /**
42 * Saves (persists) the current setting values in the database.
43 * @param array $values Key/value pairs of setting values to be written
44 */
45 public function save($values)
46 {
47 $this->initDbIfNeeded();
48 $valuesKeep = array();
49 foreach ($values as $name => $value) {
50 if (!isset($value)) {
51 continue;
52 }
53 if (is_array($value) || is_object($value)) {
54 $jsonEncoded = 1;
55 $value = json_encode($value);
56 } else {
57 $jsonEncoded = 0;
58 if (is_bool($value)) {
59 // we are currently not storing booleans as json as it could result in trouble with the UI and regress
60 // preselecting the correct value
61 $value = (int) $value;
62 }
63 }
64 $valuesKeep[] = array($this->idSite, $this->pluginName, $name, $value, $jsonEncoded);
65 }
66 $columns = array('idsite', 'plugin_name', 'setting_name', 'setting_value', 'json_encoded');
67 $table = $this->getTableName();
68 $lockKey = $this->getStorageId();
69 $this->lock->execute($lockKey, function () use($valuesKeep, $table, $columns) {
70 $this->delete();
71 // No values = nothing to save
72 if (!empty($valuesKeep)) {
73 Db\BatchInsert::tableInsertBatchSql($table, $columns, $valuesKeep, \true);
74 }
75 });
76 }
77 /**
78 * @inheritdoc
79 */
80 public function getStorageId()
81 {
82 return 'MeasurableSettings_' . $this->idSite . '_' . $this->pluginName;
83 }
84 private function jsonEncodedMissingError(Exception $e)
85 {
86 return strpos($e->getMessage(), 'json_encoded') !== \false;
87 }
88 public function load()
89 {
90 $this->initDbIfNeeded();
91 $table = $this->getTableName();
92 $sql = "SELECT `setting_name`, `setting_value`, `json_encoded` FROM `{$table}` WHERE idsite = ? and plugin_name = ?";
93 $bind = array($this->idSite, $this->pluginName);
94 try {
95 $settings = $this->db->fetchAll($sql, $bind);
96 } catch (\Exception $e) {
97 // we catch an exception since json_encoded might not be present before matomo is updated to 3.5.0+ but the updater
98 // may run this query
99 if ($this->jsonEncodedMissingError($e)) {
100 $sql = "SELECT `setting_name`, `setting_value` FROM `{$table}` WHERE idsite = ? and plugin_name = ?";
101 $settings = $this->db->fetchAll($sql, $bind);
102 } else {
103 throw $e;
104 }
105 }
106 $flat = array();
107 foreach ($settings as $setting) {
108 $name = $setting['setting_name'];
109 if (!empty($setting['json_encoded'])) {
110 $flat[$name] = json_decode($setting['setting_value'], \true);
111 } elseif (array_key_exists($name, $flat)) {
112 if (!is_array($flat[$name])) {
113 $flat[$name] = array($flat[$name]);
114 }
115 $flat[$name][] = $setting['setting_value'];
116 } else {
117 $flat[$name] = $setting['setting_value'];
118 }
119 }
120 return $flat;
121 }
122 protected function getTableName()
123 {
124 return Common::prefixTable('site_setting');
125 }
126 public function delete()
127 {
128 $this->initDbIfNeeded();
129 $table = $this->getTableName();
130 $sql = "DELETE FROM `{$table}` WHERE `idsite` = ? and plugin_name = ?";
131 $bind = array($this->idSite, $this->pluginName);
132 $this->db->query($sql, $bind);
133 }
134 /**
135 * @internal
136 * @param int $idSite
137 * @throws \Exception
138 */
139 public static function removeAllSettingsForSite($idSite)
140 {
141 try {
142 $query = sprintf('DELETE FROM `%s` WHERE idsite = ?', Common::prefixTable('site_setting'));
143 Db::query($query, array($idSite));
144 } catch (Exception $e) {
145 if ($e->getCode() != 42) {
146 // ignore table not found error, which might occur when updating from an older version of Piwik
147 throw $e;
148 }
149 }
150 }
151 /**
152 * @internal
153 * @param string $pluginName
154 * @throws \Exception
155 */
156 public static function removeAllSettingsForPlugin($pluginName)
157 {
158 try {
159 $query = sprintf('DELETE FROM `%s` WHERE plugin_name = ?', Common::prefixTable('site_setting'));
160 Db::query($query, array($pluginName));
161 } catch (Exception $e) {
162 if ($e->getCode() != 42) {
163 // ignore table not found error, which might occur when updating from an older version of Piwik
164 throw $e;
165 }
166 }
167 }
168 }
169