diff options
Diffstat (limited to 'classes')
-rw-r--r-- | classes/Design.php | 2 | ||||
-rw-r--r-- | classes/Notice.php | 86 | ||||
-rw-r--r-- | classes/Session.php | 129 | ||||
-rw-r--r-- | classes/Status_network.php | 7 | ||||
-rw-r--r-- | classes/User_group.php | 24 | ||||
-rw-r--r--[-rwxr-xr-x] | classes/laconica.ini | 9 |
6 files changed, 223 insertions, 34 deletions
diff --git a/classes/Design.php b/classes/Design.php index da4b670be..0927fcda7 100644 --- a/classes/Design.php +++ b/classes/Design.php @@ -85,7 +85,7 @@ class Design extends Memcached_DataObject $css .= 'body { background-image:url(' . Design::url($this->backgroundimage) . - '); ' . $repeat . ' }' . "\n"; + '); ' . $repeat . ' background-attachment:fixed; }' . "\n"; } $out->element('style', array('type' => 'text/css'), $css); diff --git a/classes/Notice.php b/classes/Notice.php index fdcef1bc2..2ba2f31b1 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -34,6 +34,8 @@ define('NOTICE_REMOTE_OMB', 0); define('NOTICE_LOCAL_NONPUBLIC', -1); define('NOTICE_GATEWAY', -2); +define('MAX_BOXCARS', 128); + class Notice extends Memcached_DataObject { ###START_AUTOCODE @@ -221,7 +223,7 @@ class Notice extends Memcached_DataObject $notice->saveTags(); $notice->addToInboxes(); - $notice->saveGroups(); + $notice->saveUrls(); $orig2 = clone($notice); $notice->rendered = common_render_content($final, $notice); @@ -793,7 +795,7 @@ class Notice extends Memcached_DataObject $notice->selectAdd(); // clears it $notice->selectAdd('id'); - $notice->whereAdd('conversation = '.$id); + $notice->conversation = $id; $notice->orderBy('id DESC'); @@ -833,14 +835,55 @@ class Notice extends Memcached_DataObject if ($enabled === true || $enabled === 'transitional') { + // XXX: loads constants + + $inbox = new Notice_inbox(); + $users = $this->getSubscribedUsers(); // FIXME: kind of ignoring 'transitional'... // we'll probably stop supporting inboxless mode // in 0.9.x + $ni = array(); + foreach ($users as $id) { - $this->addToUserInbox($id, NOTICE_INBOX_SOURCE_SUB); + $ni[$id] = NOTICE_INBOX_SOURCE_SUB; + } + + $groups = $this->saveGroups(); + + foreach ($groups as $group) { + $users = $group->getUserMembers(); + foreach ($users as $id) { + if (!array_key_exists($id, $ni)) { + $ni[$id] = NOTICE_INBOX_SOURCE_GROUP; + } + } + } + + $cnt = 0; + + $qryhdr = 'INSERT INTO notice_inbox (user_id, notice_id, source, created) VALUES '; + $qry = $qryhdr; + + foreach ($ni as $id => $source) { + if ($cnt > 0) { + $qry .= ', '; + } + $qry .= '('.$id.', '.$this->id.', '.$source.', "'.$this->created.'") '; + $cnt++; + if ($cnt >= MAX_BOXCARS) { + $inbox = new Notice_inbox(); + $inbox->query($qry); + $qry = $qryhdr; + $cnt = 0; + } + } + + if ($cnt > 0) { + $inbox = new Notice_inbox(); + $inbox->query($qry); } } @@ -870,27 +913,13 @@ class Notice extends Memcached_DataObject return $ids; } - function addToUserInbox($user_id, $source) - { - $inbox = Notice_inbox::pkeyGet(array('user_id' => $user_id, - 'notice_id' => $this->id)); - if (empty($inbox)) { - $inbox = new Notice_inbox(); - $inbox->user_id = $user_id; - $inbox->notice_id = $this->id; - $inbox->source = $source; - $inbox->created = $this->created; - return $inbox->insert(); - } - - return true; - } - function saveGroups() { + $groups = array(); + $enabled = common_config('inboxes', 'enabled'); if ($enabled !== true && $enabled !== 'transitional') { - return; + return $groups; } /* extract all !group */ @@ -898,7 +927,7 @@ class Notice extends Memcached_DataObject strtolower($this->content), $match); if (!$count) { - return true; + return $groups; } $profile = $this->getProfile(); @@ -930,11 +959,11 @@ class Notice extends Memcached_DataObject common_log_db_error($gi, 'INSERT', __FILE__); } - // FIXME: do this in an offline daemon - - $this->addToGroupMemberInboxes($group); + $groups[] = clone($group); } } + + return $groups; } function addToGroupInbox($group) @@ -956,15 +985,6 @@ class Notice extends Memcached_DataObject return true; } - function addToGroupMemberInboxes($group) - { - $users = $group->getUserMembers(); - - foreach ($users as $id) { - $this->addToUserInbox($id, NOTICE_INBOX_SOURCE_GROUP); - } - } - function saveReplies() { // Alternative reply format diff --git a/classes/Session.php b/classes/Session.php new file mode 100644 index 000000000..93fd99baa --- /dev/null +++ b/classes/Session.php @@ -0,0 +1,129 @@ +<?php +/** + * Table Definition for session + * + * Laconica - a distributed open-source microblogging tool + * Copyright (C) 2009, Control Yourself, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class Session extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'session'; // table name + public $id; // varchar(32) primary_key not_null + public $session_data; // text() + public $created; // datetime() not_null + public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Session',$k,$v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE + + static function logdeb($msg) + { + if (common_config('sessions', 'debug')) { + common_debug("Session: " . $msg); + } + } + + static function open($save_path, $session_name) + { + return true; + } + + static function close() + { + return true; + } + + static function read($id) + { + self::logdeb("Fetching session '$id'"); + + $session = Session::staticGet('id', $id); + + if (empty($session)) { + return ''; + } else { + return (string)$session->session_data; + } + } + + static function write($id, $session_data) + { + self::logdeb("Writing session '$id'"); + + $session = Session::staticGet('id', $id); + + if (empty($session)) { + $session = new Session(); + + $session->id = $id; + $session->session_data = $session_data; + $session->created = common_sql_now(); + + return $session->insert(); + } else { + $session->session_data = $session_data; + + return $session->update(); + } + } + + static function destroy($id) + { + self::logdeb("Deleting session $id"); + + $session = Session::staticGet('id', $id); + + if (!empty($session)) { + return $session->delete(); + } + } + + static function gc($maxlifetime) + { + self::logdeb("garbage collection (maxlifetime = $maxlifetime)"); + + $epoch = time() - $maxlifetime; + + $qry = 'DELETE FROM session ' . + 'WHERE modified < "'.$epoch.'"'; + + $session = new Session(); + + $result = $session->query($qry); + + self::logdeb("garbage collection result = $result"); + } + + static function setSaveHandler() + { + self::logdeb("setting save handlers"); + $result = session_set_save_handler('Session::open', 'Session::close', 'Session::read', + 'Session::write', 'Session::destroy', 'Session::gc'); + self::logdeb("save handlers result = $result"); + return $result; + } +} diff --git a/classes/Status_network.php b/classes/Status_network.php index f8d6756b6..dbd722e88 100644 --- a/classes/Status_network.php +++ b/classes/Status_network.php @@ -132,6 +132,13 @@ class Status_network extends DB_DataObject } } else { $sn = self::memGet('hostname', strtolower($servername)); + + if (empty($sn)) { + // Try for a no-www address + if (0 == strncasecmp($servername, 'www.', 4)) { + $sn = self::memGet('hostname', strtolower(substr($servername, 4))); + } + } } if (!empty($sn)) { diff --git a/classes/User_group.php b/classes/User_group.php index 9b4b01ead..27b444705 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -126,6 +126,30 @@ class User_group extends Memcached_DataObject return $members; } + function getAdmins($offset=0, $limit=null) + { + $qry = + 'SELECT profile.* ' . + 'FROM profile JOIN group_member '. + 'ON profile.id = group_member.profile_id ' . + 'WHERE group_member.group_id = %d ' . + 'AND group_member.is_admin = 1 ' . + 'ORDER BY group_member.modified ASC '; + + if ($limit != null) { + if (common_config('db','type') == 'pgsql') { + $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; + } else { + $qry .= ' LIMIT ' . $offset . ', ' . $limit; + } + } + + $admins = new Profile(); + + $admins->query(sprintf($qry, $this->id)); + return $admins; + } + function getBlocked($offset=0, $limit=null) { $qry = diff --git a/classes/laconica.ini b/classes/laconica.ini index 7e9b2b791..766bed75d 100755..100644 --- a/classes/laconica.ini +++ b/classes/laconica.ini @@ -380,6 +380,15 @@ replied_id = 1 notice_id = K profile_id = K +[session] +id = 130 +session_data = 34 +created = 142 +modified = 384 + +[session__keys] +id = K + [sms_carrier] id = 129 name = 2 |