gnu-social/classes/Profile_tag.php
2011-04-14 14:01:10 -04:00

317 lines
10 KiB
PHP

<?php
/**
* Table Definition for profile_tag
*/
require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
class Profile_tag extends Memcached_DataObject
{
###START_AUTOCODE
/* the code below is auto generated do not remove the above tag */
public $__table = 'profile_tag'; // table name
public $tagger; // int(4) primary_key not_null
public $tagged; // int(4) primary_key not_null
public $tag; // varchar(64) primary_key not_null
public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP
/* Static get */
function staticGet($k,$v=null)
{ return Memcached_DataObject::staticGet('Profile_tag',$k,$v); }
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
function pkeyGet($kv) {
return Memcached_DataObject::pkeyGet('Profile_tag', $kv);
}
function links()
{
return array('tagger,tag' => 'profile_list:tagger,tag');
}
function getMeta()
{
return Profile_list::pkeyGet(array('tagger' => $this->tagger, 'tag' => $this->tag));
}
static function getTags($tagger, $tagged, $auth_user=null) {
$profile_list = new Profile_list();
$include_priv = 1;
if (!($auth_user instanceof User ||
$auth_user instanceof Profile) ||
($auth_user->id !== $tagger)) {
$profile_list->private = false;
$include_priv = 0;
}
$key = sprintf('profile_tag:tagger_tagged_privacy:%d-%d-%d', $tagger, $tagged, $include_priv);
$tags = Profile_list::getCached($key);
if ($tags !== false) {
return $tags;
}
$profile_tag = new Profile_tag();
$profile_list->tagger = $tagger;
$profile_tag->tagged = $tagged;
$profile_list->selectAdd();
// only fetch id, tag, mainpage and
// private hoping this will be faster
$profile_list->selectAdd('profile_list.id, ' .
'profile_list.tag, ' .
'profile_list.mainpage, ' .
'profile_list.private');
$profile_list->joinAdd($profile_tag);
$profile_list->find();
Profile_list::setCache($key, $profile_list);
return $profile_list;
}
static function getTagsArray($tagger, $tagged, $auth_user_id=null)
{
$ptag = new Profile_tag();
$ptag->tagger = $tagger;
$ptag->tagged = $tagged;
if ($tagger != $auth_user_id) {
$list = new Profile_list();
$list->private = false;
$ptag->joinAdd($list);
$ptag->selectAdd();
$ptag->selectAdd('profile_tag.tag');
}
$tags = array();
$ptag->find();
while ($ptag->fetch()) {
$tags[] = $ptag->tag;
}
$ptag->free();
return $tags;
}
static function setTags($tagger, $tagged, $newtags, $privacy=array()) {
$newtags = array_unique($newtags);
$oldtags = self::getTagsArray($tagger, $tagged, $tagger);
$ptag = new Profile_tag();
// Delete stuff that's in old and not in new
$to_delete = array_diff($oldtags, $newtags);
// Insert stuff that's in new and not in old
$to_insert = array_diff($newtags, $oldtags);
foreach ($to_delete as $deltag) {
self::unTag($tagger, $tagged, $deltag);
}
foreach ($to_insert as $instag) {
$private = isset($privacy[$instag]) ? $privacy[$instag] : false;
self::setTag($tagger, $tagged, $instag, null, $private);
}
return true;
}
# set a single tag
static function setTag($tagger, $tagged, $tag, $desc=null, $private=false) {
$ptag = Profile_tag::pkeyGet(array('tagger' => $tagger,
'tagged' => $tagged,
'tag' => $tag));
# if tag already exists, return it
if(!empty($ptag)) {
return $ptag;
}
$tagger_profile = Profile::staticGet('id', $tagger);
$tagged_profile = Profile::staticGet('id', $tagged);
if (Event::handle('StartTagProfile', array($tagger_profile, $tagged_profile, $tag))) {
if (!$tagger_profile->canTag($tagged_profile)) {
// TRANS: Client exception thrown trying to set a tag for a user that cannot be tagged.
throw new ClientException(_('You cannot tag this user.'));
return false;
}
$tags = new Profile_list();
$tags->tagger = $tagger;
$count = (int) $tags->count('distinct tag');
if ($count >= common_config('peopletag', 'maxtags')) {
// TRANS: Client exception thrown trying to set more tags than allowed.
throw new ClientException(sprintf(_('You already have created %d or more tags ' .
'which is the maximum allowed number of tags. ' .
'Try using or deleting some existing tags.'),
common_config('peopletag', 'maxtags')));
return false;
}
$plist = new Profile_list();
$plist->query('BEGIN');
$profile_list = Profile_list::ensureTag($tagger, $tag, $desc, $private);
if ($profile_list->taggedCount() >= common_config('peopletag', 'maxpeople')) {
// TRANS: Client exception thrown trying to set one tag for more people than allowed.
throw new ClientException(sprintf(_('You already have %1$d or more people tagged %2$s, ' .
'which is the maximum allowed number.' .
'Try untagging others with the same tag first.'),
common_config('peopletag', 'maxpeople'), $tag));
return false;
}
$newtag = new Profile_tag();
$newtag->tagger = $tagger;
$newtag->tagged = $tagged;
$newtag->tag = $tag;
$result = $newtag->insert();
if (!$result) {
common_log_db_error($newtag, 'INSERT', __FILE__);
return false;
}
try {
$plist->query('COMMIT');
Event::handle('EndTagProfile', array($newtag));
} catch (Exception $e) {
$newtag->delete();
$profile_list->delete();
throw $e;
return false;
}
$profile_list->taggedCount(true);
self::blowCaches($tagger, $tagged);
}
return $newtag;
}
static function unTag($tagger, $tagged, $tag) {
$ptag = Profile_tag::pkeyGet(array('tagger' => $tagger,
'tagged' => $tagged,
'tag' => $tag));
if (!$ptag) {
return true;
}
if (Event::handle('StartUntagProfile', array($ptag))) {
$orig = clone($ptag);
$result = $ptag->delete();
if (!$result) {
common_log_db_error($this, 'DELETE', __FILE__);
return false;
}
Event::handle('EndUntagProfile', array($orig));
if ($result) {
$profile_list = Profile_list::pkeyGet(array('tag' => $tag, 'tagger' => $tagger));
if (!empty($profile_list)) {
$profile_list->taggedCount(true);
}
self::blowCaches($tagger, $tagged);
return true;
}
return false;
}
}
// @fixme: move this to Profile_list?
static function cleanup($profile_list) {
$ptag = new Profile_tag();
$ptag->tagger = $profile_list->tagger;
$ptag->tag = $profile_list->tag;
$ptag->find();
while($ptag->fetch()) {
if (Event::handle('StartUntagProfile', array($ptag))) {
$orig = clone($ptag);
$result = $ptag->delete();
if (!$result) {
common_log_db_error($this, 'DELETE', __FILE__);
}
Event::handle('EndUntagProfile', array($orig));
}
}
}
// move a tag!
static function moveTag($orig, $new) {
$tags = new Profile_tag();
$qry = 'UPDATE profile_tag SET ' .
'tag = "%s", tagger = "%s" ' .
'WHERE tag = "%s" ' .
'AND tagger = "%s"';
$result = $tags->query(sprintf($qry, $new->tag, $new->tagger,
$orig->tag, $orig->tagger));
if (!$result) {
common_log_db_error($tags, 'UPDATE', __FILE__);
return false;
}
return true;
}
static function blowCaches($tagger, $tagged) {
foreach (array(0, 1) as $perm) {
self::blow(sprintf('profile_tag:tagger_tagged_privacy:%d-%d-%d', $tagger, $tagged, $perm));
}
return true;
}
// Return profiles with a given tag
static function getTagged($tagger, $tag) {
$profile = new Profile();
$profile->query('SELECT profile.* ' .
'FROM profile JOIN profile_tag ' .
'ON profile.id = profile_tag.tagged ' .
'WHERE profile_tag.tagger = ' . $tagger . ' ' .
'AND profile_tag.tag = "' . $tag . '" ');
$tagged = array();
while ($profile->fetch()) {
$tagged[] = clone($profile);
}
return true;
}
function insert()
{
$result = parent::insert();
if ($result) {
self::blow('profile_list:tagged_count:%d:%s',
$this->tagger,
$this->tag);
}
return $result;
}
function delete()
{
$result = parent::delete();
if ($result) {
self::blow('profile_list:tagged_count:%d:%s',
$this->tagger,
$this->tag);
}
return $result;
}
}