aboutsummaryrefslogtreecommitdiffstats
path: root/Zotlabs/Lib/PConfig.php
blob: 195321375f7f47d03431ca9d322621855fd9a27c (plain) (blame)
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<?php /** @file */

namespace Zotlabs\Lib;


class PConfig {

	/**
	 * @brief Loads all configuration values of a channel into a cached storage.
	 *
	 * All configuration values of the given channel are stored in global cache
	 * which is available under the global variable App::$config[$uid].
	 *
	 * @param string $uid
	 *  The channel_id
	 * @return void|false Nothing or false if $uid is false
	 */

	static public function Load($uid) {
		if($uid === false)
			return false;

		if(! array_key_exists($uid, \App::$config))
			\App::$config[$uid] = array();

		$r = q("SELECT * FROM pconfig WHERE uid = %d",
			intval($uid)
		);

		if($r) {
			foreach($r as $rr) {
				$k = $rr['k'];
				$c = $rr['cat'];
				if(! array_key_exists($c, \App::$config[$uid])) {
					\App::$config[$uid][$c] = array();
					\App::$config[$uid][$c]['config_loaded'] = true;
				}
				\App::$config[$uid][$c][$k] = $rr['v'];
			}
		}
	}

	/**
	 * @brief Get a particular channel's config variable given the category name
	 * ($family) and a key.
	 *
	 * Get a particular channel's config value from the given category ($family)
	 * and the $key from a cached storage in App::$config[$uid].
	 *
	 * Returns false if not set.
	 *
	 * @param string $uid
	 *  The channel_id
	 * @param string $family
	 *  The category of the configuration value
	 * @param string $key
	 *  The configuration key to query
	 * @param boolean $instore (deprecated, without function)
	 * @return mixed Stored value or false if it does not exist
	 */

	static public function Get($uid,$family,$key,$instore = false) {

		if($uid === false)
			return false;

		if(! array_key_exists($uid, \App::$config))
			self::Load($uid);

		if((! array_key_exists($family, \App::$config[$uid])) || (! array_key_exists($key, \App::$config[$uid][$family])))
			return false;

		return ((! is_array(\App::$config[$uid][$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', \App::$config[$uid][$family][$key])) 
			? unserialize(\App::$config[$uid][$family][$key])
			: \App::$config[$uid][$family][$key]
		);

	}

	/**
	 * @brief Sets a configuration value for a channel.
	 *
	 * Stores a config value ($value) in the category ($family) under the key ($key)
	 * for the channel_id $uid.
	 *
	 * @param string $uid
	 *  The channel_id
	 * @param string $family
	 *  The category of the configuration value
	 * @param string $key
	 *  The configuration key to set
	 * @param string $value
	 *  The value to store
	 * @return mixed Stored $value or false
	 */

	static public function Set($uid, $family, $key, $value) {

		// this catches subtle errors where this function has been called 
		// with local_channel() when not logged in (which returns false)
		// and throws an error in array_key_exists below. 
		// we provide a function backtrace in the logs so that we can find
		// and fix the calling function.

		if($uid === false) {
			btlogger('UID is FALSE!', LOGGER_NORMAL, LOG_ERR);
			return;
		}

		// manage array value
		$dbvalue = ((is_array($value))  ? serialize($value) : $value);
		$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue)  : $dbvalue);

		if(get_pconfig($uid, $family, $key) === false) {
			if(! array_key_exists($uid, \App::$config))
				\App::$config[$uid] = array();
			if(! array_key_exists($family, \App::$config[$uid]))
				\App::$config[$uid][$family] = array();

			$ret = q("INSERT INTO pconfig ( uid, cat, k, v ) VALUES ( %d, '%s', '%s', '%s' ) ",
				intval($uid),
				dbesc($family),
				dbesc($key),
				dbesc($dbvalue)
			);

		}
		else {

			$ret = q("UPDATE pconfig SET v = '%s' WHERE uid = %d and cat = '%s' AND k = '%s'",
				dbesc($dbvalue),
				intval($uid),
				dbesc($family),
				dbesc($key)
			);

		}

		// keep a separate copy for all variables which were
		// set in the life of this page. We need this to
		// synchronise channel clones.

		if(! array_key_exists('transient', \App::$config[$uid]))
			\App::$config[$uid]['transient'] = array();
		if(! array_key_exists($family, \App::$config[$uid]['transient']))
			\App::$config[$uid]['transient'][$family] = array();

		\App::$config[$uid][$family][$key] = $value;
		\App::$config[$uid]['transient'][$family][$key] = $value;

		if($ret)
			return $value;

		return $ret;
	}


	/**
	 * @brief Deletes the given key from the channel's configuration.
	 *
	 * Removes the configured value from the stored cache in App::$config[$uid]
	 * and removes it from the database.
	 *
	 * @param string $uid
	 *  The channel_id
	 * @param string $family
	 *  The category of the configuration value
	 * @param string $key
	 *  The configuration key to delete
	 * @return mixed
	 */
 
	static public function Delete($uid, $family, $key) {

		$ret = false;

		if(array_key_exists($key, \App::$config[$uid][$family]))
			unset(\App::$config[$uid][$family][$key]);
			$ret = q("DELETE FROM pconfig WHERE uid = %d AND cat = '%s' AND k = '%s'",
				intval($uid),
				dbesc($family),
				dbesc($key)
			);

		return $ret;
	}

}