X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FUser.php;h=916524b8e8ac90ceef33992780a70e46e261a67f;hb=1e8d26baecad6ca1088ea7815fe2615fb520a10e;hp=cef4769f33e2e8dafe13c8cbfa7dbdfc6a24d758;hpb=ab68c61a1212bca02686d54615d34699a853bb63;p=quix0rs-gnu-social.git diff --git a/classes/User.php b/classes/User.php index cef4769f33..916524b8e8 100644 --- a/classes/User.php +++ b/classes/User.php @@ -19,19 +19,13 @@ if (!defined('LACONICA')) { exit(1); } -/* We keep the first three 20-notice pages, plus one for pagination check, - * in the memcached cache. */ - -define('WITHFRIENDS_CACHE_WINDOW', 61); - /** * Table Definition for user */ -require_once 'DB/DataObject.php'; +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; require_once 'Validate.php'; -require_once(INSTALLDIR.'/lib/noticewrapper.php'); -class User extends DB_DataObject +class User extends Memcached_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -44,6 +38,7 @@ class User extends DB_DataObject public $incomingemail; // varchar(255) unique_key public $emailnotifysub; // tinyint(1) default_1 public $emailnotifyfav; // tinyint(1) default_1 + public $emailnotifymsg; // tinyint(1) default_1 public $emailmicroid; // tinyint(1) default_1 public $language; // varchar(50) public $timezone; // varchar(50) @@ -64,27 +59,21 @@ class User extends DB_DataObject public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP /* Static get */ - function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('User',$k,$v); } + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User',$k,$v); } /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE function getProfile() { - $profile = DB_DataObject::factory('profile'); - $profile->id = $this->id; - if ($profile->find()) { - $profile->fetch(); - return $profile; - } - return NULL; + return Profile::staticGet('id', $this->id); } function isSubscribed($other) { assert(!is_null($other)); - $sub = DB_DataObject::factory('subscription'); - $sub->subscriber = $this->id; - $sub->subscribed = $other->id; - return $sub->find(); + # XXX: cache results of this query + $sub = Subscription::pkeyGet(array('subscriber' => $this->id, + 'subscribed' => $other->id)); + return (is_null($sub)) ? false : true; } # 'update' won't write key columns, so we have to do it ourselves. @@ -108,7 +97,12 @@ class User extends DB_DataObject } $qry = 'UPDATE ' . $table . ' SET ' . $toupdate . ' WHERE id = ' . $this->id; - return $this->query($qry); + $orig->decache(); + $result = $this->query($qry); + if ($result) { + $this->encache(); + } + return $result; } function allowed_nickname($nickname) { @@ -116,7 +110,7 @@ class User extends DB_DataObject static $blacklist = array('rss', 'xrds', 'doc', 'main', 'settings', 'notice', 'user', 'search', 'avatar', 'tag', 'tags', - 'api'); + 'api', 'message'); $merged = array_merge($blacklist, common_config('nickname', 'blacklist')); return !in_array($nickname, $merged); } @@ -130,7 +124,7 @@ class User extends DB_DataObject } function getCarrier() { - return Sms_carrier::staticGet($this->carrier); + return Sms_carrier::staticGet('id', $this->carrier); } function subscribeTo($other) { @@ -147,65 +141,6 @@ class User extends DB_DataObject return true; } - function noticesWithFriends($offset=0, $limit=20) { - - $notice = new Notice(); - - $notice->query('SELECT notice.* ' . - 'FROM notice JOIN subscription on notice.profile_id = subscription.subscribed ' . - 'WHERE subscription.subscriber = ' . $this->id . ' ' . - 'ORDER BY created DESC, notice.id DESC ' . - 'LIMIT ' . $offset . ', ' . $limit); - - return $notice; - } - - function favoriteNotices($offset=0, $limit=20) { - - $notice = new Notice(); - - $notice->query('SELECT notice.* ' . - 'FROM notice JOIN fave on notice.id = fave.notice_id ' . - 'WHERE fave.user_id = ' . $this->id . ' ' . - 'ORDER BY notice.created DESC, notice.id DESC ' . - 'LIMIT ' . $offset . ', ' . $limit); - - return $notice; - } - - function noticesWithFriendsWindow() { - - $cache = new Memcache(); - $res = $cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port')); - - if (!$res) { - return NULL; - } - - $notices = $cache->get(common_cache_key('user:notices_with_friends:' . $this->id)); - - if ($notices) { - return $notices; - } - - $notice = new Notice(); - - $notice->query('SELECT notice.* ' . - 'FROM notice JOIN subscription on notice.profile_id = subscription.subscribed ' . - 'WHERE subscription.subscriber = ' . $this->id . ' ' . - 'ORDER BY created DESC, notice.id DESC ' . - 'LIMIT 0, ' . WITHFRIENDS_CACHE_WINDOW); - - $notices = array(); - - while ($notice->fetch()) { - $notices[] = clone($notice); - } - - $cache->set(common_cache_key('user:notices_with_friends:' . $this->id), $notices); - return $notices; - } - static function register($fields) { # MAGICALLY put fields into current scope @@ -318,7 +253,7 @@ class User extends DB_DataObject function emailChanged() { $invites = new Invitation(); - $invites->address = $user->email; + $invites->address = $this->email; $invites->address_type = 'email'; if ($invites->find()) { @@ -330,16 +265,83 @@ class User extends DB_DataObject } function hasFave($notice) { - $fave = new Fave(); - $fave->user_id = $this->id; - $fave->notice_id = $notice->id; - if ($fave->find()) { - $result = true; - } else { - $result = false; + $fave = Fave::pkeyGet(array('user_id' => $this->id, + 'notice_id' => $notice->id)); + return ((is_null($fave)) ? false : true); + } + + function mutuallySubscribed($other) { + return $this->isSubscribed($other) && + $other->isSubscribed($this); + } + + function mutuallySubscribedUsers() { + + # 3-way join; probably should get cached + + $qry = 'SELECT user.* ' . + 'FROM subscription sub1 JOIN user ON sub1.subscribed = user.id ' . + 'JOIN subscription sub2 ON user.id = sub2.subscriber ' . + 'WHERE sub1.subscriber = %d and sub2.subscribed = %d ' . + 'ORDER BY user.nickname'; + + $user = new User(); + $user->query(sprintf($qry, $this->id, $this->id)); + + return $user; + } + + function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) { + $qry = + 'SELECT notice.* ' . + 'FROM notice JOIN reply ON notice.id = reply.notice_id ' . + 'WHERE reply.profile_id = %d '; + + return Notice::getStream(sprintf($qry, $this->id), + 'user:replies:'.$this->id, + $offset, $limit, $since_id, $before_id); + } + + function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) { + $qry = + 'SELECT * ' . + 'FROM notice ' . + 'WHERE profile_id = %d '; + + return Notice::getStream(sprintf($qry, $this->id), + 'user:notices:'.$this->id, + $offset, $limit, $since_id, $before_id); + } + + function favoriteNotices($offset=0, $limit=NOTICES_PER_PAGE) { + $qry = + 'SELECT notice.* ' . + 'FROM notice JOIN fave ON notice.id = fave.notice_id ' . + 'WHERE fave.user_id = %d '; + + return Notice::getStream(sprintf($qry, $this->id), + 'user:faves:'.$this->id, + $offset, $limit); + } + + function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) { + $qry = + 'SELECT notice.* ' . + 'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' . + 'WHERE notice_inbox.user_id = %d '; + + # NOTE: we override ORDER + + return Notice::getStream(sprintf($qry, $this->id), + 'user:notices_with_friends:' . $this->id, + $offset, $limit, $since_id, $before_id, + 'ORDER BY notice_inbox.created DESC, notice_inbox.notice_id DESC '); + } + + function blowFavesCache() { + $cache = common_memcache(); + if ($cache) { + $cache->delete(common_cache_key('user:faves:'.$this->id)); } - $fave->free(); - unset($fave); - return $result; } }