. * * @category Data * @package GNUsocial * @author Mikael Nordfeldth * @copyright 2013 Free Software Foundation, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://www.gnu.org/software/social/ */ class Notice_prefs extends Managed_DataObject { public $__table = 'notice_prefs'; // table name public $notice_id; // int(4) primary_key not_null public $namespace; // varchar(191) not_null public $topic; // varchar(191) not_null public $data; // text public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00 public $modified; // timestamp not_null default_CURRENT_TIMESTAMP public static function schemaDef() { return array( 'fields' => array( 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'user'), 'namespace' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'namespace, like pluginname or category'), 'topic' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'preference key, i.e. description, age...'), 'data' => array('type' => 'blob', 'description' => 'topic data, may be anything'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), ), 'primary key' => array('notice_id', 'namespace', 'topic'), 'foreign keys' => array( 'notice_prefs_notice_id_fkey' => array('notice', array('notice_id' => 'id')), ), 'indexes' => array( 'notice_prefs_notice_id_idx' => array('notice_id'), ), ); } static function getNamespacePrefs(Notice $notice, $namespace, array $topic=array()) { if (empty($topic)) { $prefs = new Notice_prefs(); $prefs->notice_id = $notice->getID(); $prefs->namespace = $namespace; $prefs->find(); } else { $prefs = self::pivotGet('notice_id', $notice->getID(), array('namespace'=>$namespace, 'topic'=>$topic)); } if (empty($prefs->N)) { throw new NoResultException($prefs); } return $prefs; } static function getNamespace(Notice $notice, $namespace, array $topic=array()) { $prefs = self::getNamespacePrefs($notice, $namespace, $topic); return $prefs->fetchAll(); } static function getAll(Notice $notice) { try { $prefs = self::listFind('notice_id', array($notice->getID())); } catch (NoResultException $e) { return array(); } $list = array(); while ($prefs->fetch()) { if (!isset($list[$prefs->namespace])) { $list[$prefs->namespace] = array(); } $list[$prefs->namespace][$prefs->topic] = $prefs->data; } return $list; } static function getTopic(Notice $notice, $namespace, $topic) { return self::getByPK(array('notice_id' => $notice->getID(), 'namespace' => $namespace, 'topic' => $topic)); } static function getData(Notice $notice, $namespace, $topic, $def=null) { try { $pref = self::getTopic($notice, $namespace, $topic); } catch (NoResultException $e) { if ($def === null) { // If no default value was set, continue the exception. throw $e; } // If there was a default value, return that. return $def; } return $pref->data; } static function getConfigData(Notice $notice, $namespace, $topic) { try { $data = self::getData($notice, $namespace, $topic); } catch (NoResultException $e) { $data = common_config($namespace, $topic); } return $data; } /* * Sets a notice preference based on Notice, namespace and topic * * @param Notice $notice Which notice this is for * @param string $namespace Under which namespace (pluginname etc.) * @param string $topic Preference name (think key in key-val store) * @param string $data Data to be put into preference storage, null means delete * * @return true if changes are made, false if no action taken * @throws ServerException if preference could not be saved */ static function setData(Notice $notice, $namespace, $topic, $data=null) { try { $pref = self::getTopic($notice, $namespace, $topic); if (is_null($data)) { $pref->delete(); } else { $orig = clone($pref); $pref->data = $data; $pref->update($orig); } return true; } catch (NoResultException $e) { if (is_null($data)) { return false; // No action taken } } $pref = new Notice_prefs(); $pref->notice_id = $notice->getID(); $pref->namespace = $namespace; $pref->topic = $topic; $pref->data = $data; $pref->created = common_sql_now(); if ($pref->insert() === false) { throw new ServerException('Could not save notice preference.'); } return true; } }