X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FProfile_tag.php;h=39095aeddedeb07f47bbac8c419e0599e625fdb6;hb=fcf47f315bd7df92c0befb7a0caa26e107ceac29;hp=183f79145a136463472eb3dec305131ff22809b0;hpb=31c1177970124cee31823cab3a11542c23b4126d;p=quix0rs-gnu-social.git diff --git a/classes/Profile_tag.php b/classes/Profile_tag.php index 183f79145a..39095aedde 100644 --- a/classes/Profile_tag.php +++ b/classes/Profile_tag.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Profile_tag extends Memcached_DataObject +class Profile_tag extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -15,15 +15,31 @@ class Profile_tag extends Memcached_DataObject 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); + public static function schemaDef() + { + return array( + + 'fields' => array( + 'tagger' => array('type' => 'int', 'not null' => true, 'description' => 'user making the tag'), + 'tagged' => array('type' => 'int', 'not null' => true, 'description' => 'profile tagged'), + 'tag' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'hash tag associated with this notice'), + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date the tag was added'), + ), + 'primary key' => array('tagger', 'tagged', 'tag'), + 'foreign keys' => array( + 'profile_tag_tagger_fkey' => array('profile', array('tagger' => 'id')), + 'profile_tag_tagged_fkey' => array('profile', array('tagged' => 'id')), + 'profile_tag_tag_fkey' => array('profile_list', array('tag' => 'tag')), + ), + 'indexes' => array( + 'profile_tag_modified_idx' => array('modified'), + 'profile_tag_tagger_tag_idx' => array('tagger', 'tag'), + 'profile_tag_tagged_idx' => array('tagged'), + ), + ); } function links() @@ -55,20 +71,17 @@ class Profile_tag extends Memcached_DataObject return $tags; } - $profile_tag = new Profile_tag(); - $profile_list->tagger = $tagger; - $profile_tag->tagged = $tagged; + $qry = 'select profile_list.* from profile_list left join '. + 'profile_tag on (profile_list.tag = profile_tag.tag and '. + 'profile_list.tagger = profile_tag.tagger) where '. + 'profile_tag.tagger = %d and profile_tag.tagged = %d '; + $qry = sprintf($qry, $tagger, $tagged); - $profile_list->selectAdd(); + if (!$include_priv) { + $qry .= ' and profile_list.private = 0'; + } - // 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->query($qry); Profile_list::setCache($key, $profile_list); @@ -78,23 +91,26 @@ class Profile_tag extends Memcached_DataObject 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'); + + $qry = sprintf('select profile_tag.tag '. + 'from profile_tag join profile_list '. + ' on (profile_tag.tagger = profile_list.tagger ' . + ' and profile_tag.tag = profile_list.tag) ' . + 'where profile_tag.tagger = %d ' . + 'and profile_tag.tagged = %d ', + $tagger, $tagged); + + if ($auth_user_id != $tagger) { + $qry .= 'and profile_list.private = 0'; } $tags = array(); - $ptag->find(); + + $ptag->query($qry); + while ($ptag->fetch()) { $tags[] = $ptag->tag; } - $ptag->free(); return $tags; } @@ -106,11 +122,11 @@ class Profile_tag extends Memcached_DataObject $ptag = new Profile_tag(); - # Delete stuff that's in old and not in new + // 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 + // Insert stuff that's in new and not in old $to_insert = array_diff($newtags, $oldtags); @@ -137,12 +153,13 @@ class Profile_tag extends Memcached_DataObject return $ptag; } - $tagger_profile = Profile::staticGet('id', $tagger); - $tagged_profile = Profile::staticGet('id', $tagged); + $tagger_profile = Profile::getKV('id', $tagger); + $tagged_profile = Profile::getKV('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; } @@ -152,6 +169,7 @@ class Profile_tag extends Memcached_DataObject $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.'), @@ -165,9 +183,10 @@ class Profile_tag extends Memcached_DataObject $profile_list = Profile_list::ensureTag($tagger, $tag, $desc, $private); if ($profile_list->taggedCount() >= common_config('peopletag', 'maxpeople')) { - throw new ClientException(sprintf(_('You already have %d or more people tagged %s ' . - 'which is the maximum allowed number.' . - 'Try untagging others with the same tag first.'), + // TRANS: Client exception thrown when trying to add more people than allowed to a list. + throw new ClientException(sprintf(_('You already have %1$d or more people in list %2$s, ' . + 'which is the maximum allowed number. ' . + 'Try unlisting others first.'), common_config('peopletag', 'maxpeople'), $tag)); return false; } @@ -221,7 +240,9 @@ class Profile_tag extends Memcached_DataObject Event::handle('EndUntagProfile', array($orig)); if ($result) { $profile_list = Profile_list::pkeyGet(array('tag' => $tag, 'tagger' => $tagger)); - $profile_list->taggedCount(true); + if (!empty($profile_list)) { + $profile_list->taggedCount(true); + } self::blowCaches($tagger, $tagged); return true; } @@ -255,8 +276,11 @@ class Profile_tag extends Memcached_DataObject 'tag = "%s", tagger = "%s" ' . 'WHERE tag = "%s" ' . 'AND tagger = "%s"'; - $result = $tags->query(sprintf($qry, $new->tag, $new->tagger, - $orig->tag, $orig->tagger)); + $result = $tags->query(sprintf($qry, + $tags->escape($new->tag), + $tags->escape($new->tagger), + $tags->escape($orig->tag), + $tags->escape($orig->tagger))); if (!$result) { common_log_db_error($tags, 'UPDATE', __FILE__); @@ -271,4 +295,41 @@ class Profile_tag extends Memcached_DataObject } 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 = ' . $profile->escape($tagger) . ' ' . + 'AND profile_tag.tag = "' . $profile->escape($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; + } }