aboutsummaryrefslogtreecommitdiffstats
path: root/Zotlabs/Lib/PConfig.php
diff options
context:
space:
mode:
Diffstat (limited to 'Zotlabs/Lib/PConfig.php')
-rw-r--r--Zotlabs/Lib/PConfig.php189
1 files changed, 189 insertions, 0 deletions
diff --git a/Zotlabs/Lib/PConfig.php b/Zotlabs/Lib/PConfig.php
new file mode 100644
index 000000000..0cd65392e
--- /dev/null
+++ b/Zotlabs/Lib/PConfig.php
@@ -0,0 +1,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))
+ load_pconfig($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;
+ }
+
+}
+ \ No newline at end of file