diff options
Diffstat (limited to 'Zotlabs/Lib/PConfig.php')
-rw-r--r-- | Zotlabs/Lib/PConfig.php | 189 |
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 |