Merge branch '0.8.x' into userdesign

Conflicts:
	actions/designsettings.php
This commit is contained in:
Evan Prodromou
2009-06-09 21:51:24 -07:00
66 changed files with 2641 additions and 799 deletions

View File

@@ -46,7 +46,7 @@ class Fave extends Memcached_DataObject
return $ids;
}
function _streamDirect($user_id, $offset, $limit, $since_id, $before_id, $since)
function _streamDirect($user_id, $offset, $limit, $since_id, $max_id, $since)
{
$fav = new Fave();
@@ -59,8 +59,8 @@ class Fave extends Memcached_DataObject
$fav->whereAdd('notice_id > ' . $since_id);
}
if ($before_id != 0) {
$fav->whereAdd('notice_id < ' . $before_id);
if ($max_id != 0) {
$fav->whereAdd('notice_id <= ' . $max_id);
}
if (!is_null($since)) {

View File

@@ -120,4 +120,30 @@ class File extends Memcached_DataObject
File_to_post::processNew($file_id, $notice_id);
return $x;
}
function isRespectsQuota($user) {
if ($_FILES['attach']['size'] > common_config('attachments', 'file_quota')) {
return sprintf(_('No file may be larger than %d bytes ' .
'and the file you sent was %d bytes. Try to upload a smaller version.'),
common_config('attachments', 'file_quota'), $_FILES['attach']['size']);
}
$query = "select sum(size) as total from file join file_to_post on file_to_post.file_id = file.id join notice on file_to_post.post_id = notice.id where profile_id = {$user->id} and file.url like '%/notice/%/file'";
$this->query($query);
$this->fetch();
$total = $this->total + $_FILES['attach']['size'];
if ($total > common_config('attachments', 'user_quota')) {
return sprintf(_('A file this large would exceed your user quota of %d bytes.'), common_config('attachments', 'user_quota'));
}
$query .= ' month(modified) = month(now()) and year(modified) = year(now())';
$this->query($query);
$this->fetch();
$total = $this->total + $_FILES['attach']['size'];
if ($total > common_config('attachments', 'monthly_quota')) {
return sprintf(_('A file this large would exceed your monthly quota of %d bytes.'), common_config('attachments', 'monthly_quota'));
}
return true;
}
}

View File

@@ -133,7 +133,7 @@ class File_redirection extends Memcached_DataObject
$file->limit(1);
$file->orderBy('len');
$file->find(true);
if (!empty($file->id)) {
if (!empty($file->url) && (strlen($file->url) < strlen($long_url))) {
return $file->url;
}

View File

@@ -11,7 +11,7 @@ class Foreign_link extends Memcached_DataObject
public $__table = 'foreign_link'; // table name
public $user_id; // int(4) primary_key not_null
public $foreign_id; // int(4) primary_key not_null
public $foreign_id; // bigint(8) primary_key not_null unsigned
public $service; // int(4) primary_key not_null
public $credentials; // varchar(255)
public $noticesync; // tinyint(1) not_null default_1

View File

@@ -227,4 +227,28 @@ class Memcached_DataObject extends DB_DataObject
$c->set($ckey, $cached, MEMCACHE_COMPRESSED, $expiry);
return new ArrayWrapper($cached);
}
// We overload so that 'SET NAMES "utf8"' is called for
// each connection
function _connect()
{
global $_DB_DATAOBJECT;
$exists = !empty($this->_database_dsn_md5) &&
isset($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]);
$result = parent::_connect();
if (!$exists) {
$DB = &$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5];
if (common_config('db', 'type') == 'mysql' &&
common_config('db', 'utf8')) {
$conn = $DB->connection;
if ($DB instanceof DB_mysqli) {
mysqli_set_charset($conn, 'utf8');
} else if ($DB instanceof DB_mysql) {
mysql_set_charset('utf8', $conn);
}
}
}
return $result;
}
}

View File

@@ -124,6 +124,8 @@ class Notice extends Memcached_DataObject
$profile = Profile::staticGet($profile_id);
$final = common_shorten_links($content);
if (!$profile) {
common_log(LOG_ERR, 'Problem saving notice. Unknown user.');
return _('Problem saving notice. Unknown user.');
@@ -134,7 +136,7 @@ class Notice extends Memcached_DataObject
return _('Too many notices too fast; take a breather and post again in a few minutes.');
}
if (common_config('site', 'dupelimit') > 0 && !Notice::checkDupes($profile_id, $content)) {
if (common_config('site', 'dupelimit') > 0 && !Notice::checkDupes($profile_id, $final)) {
common_log(LOG_WARNING, 'Dupe posting by profile #' . $profile_id . '; throttled.');
return _('Too many duplicate messages too quickly; take a breather and post again in a few minutes.');
}
@@ -165,8 +167,8 @@ class Notice extends Memcached_DataObject
$notice->reply_to = $reply_to;
$notice->created = common_sql_now();
$notice->content = $content;
$notice->rendered = common_render_content($content, $notice);
$notice->content = $final;
$notice->rendered = common_render_content($final, $notice);
$notice->source = $source;
$notice->uri = $uri;
@@ -202,13 +204,9 @@ class Notice extends Memcached_DataObject
$notice->saveReplies();
$notice->saveTags();
$notice->saveGroups();
if (common_config('queue', 'enabled')) {
$notice->addToAuthorInbox();
} else {
$notice->addToInboxes();
}
$notice->addToInboxes();
$notice->saveGroups();
$notice->query('COMMIT');
@@ -218,13 +216,7 @@ class Notice extends Memcached_DataObject
# Clear the cache for subscribed users, so they'll update at next request
# XXX: someone clever could prepend instead of clearing the cache
if (common_config('memcached', 'enabled')) {
if (common_config('queue', 'enabled')) {
$notice->blowAuthorCaches();
} else {
$notice->blowCaches();
}
}
$notice->blowCaches();
return $notice;
}
@@ -277,6 +269,18 @@ class Notice extends Memcached_DataObject
return true;
}
function getUploadedAttachment() {
$post = clone $this;
$query = 'select file.url as uploaded from file join file_to_post on file.id = file_id where post_id=' . $post->escape($post->id) . ' and url like "%/notice/%/file"';
$post->query($query);
$post->fetch();
$ret = $post->uploaded;
// var_dump($post);
$post->free();
// die();
return $ret;
}
function hasAttachments() {
$post = clone $this;
$query = "select count(file_id) as n_attachments from file join file_to_post on (file_id = file.id) join notice on (post_id = notice.id) where post_id = " . $post->escape($post->id);
@@ -297,17 +301,6 @@ class Notice extends Memcached_DataObject
$this->blowGroupCache($blowLast);
}
function blowAuthorCaches($blowLast=false)
{
// Clear the user's cache
$cache = common_memcache();
if (!empty($cache)) {
$cache->delete(common_cache_key('notice_inbox:by_user:'.$this->profile_id));
}
$this->blowNoticeCache($blowLast);
$this->blowPublicCache($blowLast);
}
function blowGroupCache($blowLast=false)
{
$cache = common_memcache();
@@ -443,22 +436,22 @@ class Notice extends Memcached_DataObject
# XXX: too many args; we need to move to named params or even a separate
# class for notice streams
static function getStream($qry, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $order=null, $since=null) {
static function getStream($qry, $cachekey, $offset=0, $limit=20, $since_id=0, $max_id=0, $order=null, $since=null) {
if (common_config('memcached', 'enabled')) {
# Skip the cache if this is a since, since_id or before_id qry
if ($since_id > 0 || $before_id > 0 || $since) {
return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
# Skip the cache if this is a since, since_id or max_id qry
if ($since_id > 0 || $max_id > 0 || $since) {
return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $max_id, $order, $since);
} else {
return Notice::getCachedStream($qry, $cachekey, $offset, $limit, $order);
}
}
return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $max_id, $order, $since);
}
static function getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since) {
static function getStreamDirect($qry, $offset, $limit, $since_id, $max_id, $order, $since) {
$needAnd = false;
$needWhere = true;
@@ -480,7 +473,7 @@ class Notice extends Memcached_DataObject
$qry .= ' notice.id > ' . $since_id;
}
if ($before_id > 0) {
if ($max_id > 0) {
if ($needWhere) {
$qry .= ' WHERE ';
@@ -489,7 +482,7 @@ class Notice extends Memcached_DataObject
$qry .= ' AND ';
}
$qry .= ' notice.id < ' . $before_id;
$qry .= ' notice.id <= ' . $max_id;
}
if ($since) {
@@ -647,17 +640,17 @@ class Notice extends Memcached_DataObject
}
}
function publicStream($offset=0, $limit=20, $since_id=0, $before_id=0, $since=null)
function publicStream($offset=0, $limit=20, $since_id=0, $max_id=0, $since=null)
{
$ids = Notice::stream(array('Notice', '_publicStreamDirect'),
array(),
'public',
$offset, $limit, $since_id, $before_id, $since);
$offset, $limit, $since_id, $max_id, $since);
return Notice::getStreamByIds($ids);
}
function _publicStreamDirect($offset=0, $limit=20, $since_id=0, $before_id=0, $since=null)
function _publicStreamDirect($offset=0, $limit=20, $since_id=0, $max_id=0, $since=null)
{
$notice = new Notice();
@@ -681,8 +674,8 @@ class Notice extends Memcached_DataObject
$notice->whereAdd('id > ' . $since_id);
}
if ($before_id != 0) {
$notice->whereAdd('id < ' . $before_id);
if ($max_id != 0) {
$notice->whereAdd('id <= ' . $max_id);
}
if (!is_null($since)) {
@@ -726,33 +719,6 @@ class Notice extends Memcached_DataObject
return;
}
function addToAuthorInbox()
{
$enabled = common_config('inboxes', 'enabled');
if ($enabled === true || $enabled === 'transitional') {
$user = User::staticGet('id', $this->profile_id);
if (empty($user)) {
return;
}
$inbox = new Notice_inbox();
$UT = common_config('db','type')=='pgsql'?'"user"':'user';
$qry = 'INSERT INTO notice_inbox (user_id, notice_id, created) ' .
"SELECT $UT.id, " . $this->id . ", '" . $this->created . "' " .
"FROM $UT " .
"WHERE $UT.id = " . $this->profile_id . ' ' .
'AND NOT EXISTS (SELECT user_id, notice_id ' .
'FROM notice_inbox ' .
"WHERE user_id = " . $this->profile_id . ' '.
'AND notice_id = ' . $this->id . ' )';
if ($enabled === 'transitional') {
$qry .= " AND $UT.inboxed = 1";
}
$inbox->query($qry);
}
return;
}
function saveGroups()
{
$enabled = common_config('inboxes', 'enabled');
@@ -1024,15 +990,15 @@ class Notice extends Memcached_DataObject
}
}
function stream($fn, $args, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $since=null, $tag=null)
function stream($fn, $args, $cachekey, $offset=0, $limit=20, $since_id=0, $max_id=0, $since=null)
{
$cache = common_memcache();
if (empty($cache) ||
$since_id != 0 || $before_id != 0 || !is_null($since) ||
$since_id != 0 || $max_id != 0 || (!is_null($since) && $since > 0) ||
($offset + $limit) > NOTICE_CACHE_WINDOW) {
return call_user_func_array($fn, array_merge($args, array($offset, $limit, $since_id,
$before_id, $since, $tag)));
$max_id, $since)));
}
$idkey = common_cache_key($cachekey);

View File

@@ -43,15 +43,15 @@ class Notice_inbox extends Memcached_DataObject
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
function stream($user_id, $offset, $limit, $since_id, $before_id, $since)
function stream($user_id, $offset, $limit, $since_id, $max_id, $since)
{
return Notice::stream(array('Notice_inbox', '_streamDirect'),
array($user_id),
'notice_inbox:by_user:'.$user_id,
$offset, $limit, $since_id, $before_id, $since);
$offset, $limit, $since_id, $max_id, $since);
}
function _streamDirect($user_id, $offset, $limit, $since_id, $before_id, $since)
function _streamDirect($user_id, $offset, $limit, $since_id, $max_id, $since)
{
$inbox = new Notice_inbox();
@@ -61,8 +61,8 @@ class Notice_inbox extends Memcached_DataObject
$inbox->whereAdd('notice_id > ' . $since_id);
}
if ($before_id != 0) {
$inbox->whereAdd('notice_id < ' . $before_id);
if ($max_id != 0) {
$inbox->whereAdd('notice_id <= ' . $max_id);
}
if (!is_null($since)) {

View File

@@ -46,7 +46,7 @@ class Notice_tag extends Memcached_DataObject
return Notice::getStreamByIds($ids);
}
function _streamDirect($tag, $offset, $limit, $since_id, $before_id, $since)
function _streamDirect($tag, $offset, $limit, $since_id, $max_id, $since)
{
$nt = new Notice_tag();
@@ -59,8 +59,8 @@ class Notice_tag extends Memcached_DataObject
$nt->whereAdd('notice_id > ' . $since_id);
}
if ($before_id != 0) {
$nt->whereAdd('notice_id < ' . $before_id);
if ($max_id != 0) {
$nt->whereAdd('notice_id < ' . $max_id);
}
if (!is_null($since)) {

View File

@@ -170,7 +170,7 @@ class Profile extends Memcached_DataObject
$ids = Notice::stream(array($this, '_streamDirect'),
array(),
'profile:notice_ids:' . $this->id,
$offset, $limit, $since_id, $before_id, $since);
$offset, $limit, $since_id, $max_id, $since);
return Notice::getStreamByIds($ids);
}
@@ -225,8 +225,8 @@ class Profile extends Memcached_DataObject
$notice->whereAdd('id > ' . $since_id);
}
if ($before_id != 0) {
$notice->whereAdd('id < ' . $before_id);
if ($max_id != 0) {
$notice->whereAdd('id <= ' . $max_id);
}
if (!is_null($since)) {

View File

@@ -22,16 +22,16 @@ class Reply extends Memcached_DataObject
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0, $since=null)
{
$ids = Notice::stream(array('Reply', '_streamDirect'),
array($user_id),
'reply:stream:' . $user_id,
$offset, $limit, $since_id, $before_id, $since);
$offset, $limit, $since_id, $max_id, $since);
return $ids;
}
function _streamDirect($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
function _streamDirect($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0, $since=null)
{
$reply = new Reply();
$reply->profile_id = $user_id;
@@ -40,8 +40,8 @@ class Reply extends Memcached_DataObject
$reply->whereAdd('notice_id > ' . $since_id);
}
if ($before_id != 0) {
$reply->whereAdd('notice_id < ' . $before_id);
if ($max_id != 0) {
$reply->whereAdd('notice_id < ' . $max_id);
}
if (!is_null($since)) {

View File

@@ -402,7 +402,6 @@ class User extends Memcached_DataObject
function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
{
$ids = Reply::stream($this->id, $offset, $limit, $since_id, $before_id, $since);
common_debug("Ids = " . implode(',', $ids));
return Notice::getStreamByIds($ids);
}

View File

@@ -58,7 +58,7 @@ class User_group extends Memcached_DataObject
return Notice::getStreamByIds($ids);
}
function _streamDirect($offset, $limit, $since_id, $before_id, $since)
function _streamDirect($offset, $limit, $since_id, $max_id, $since)
{
$inbox = new Group_inbox();
@@ -71,8 +71,8 @@ class User_group extends Memcached_DataObject
$inbox->whereAdd('notice_id > ' . $since_id);
}
if ($before_id != 0) {
$inbox->whereAdd('notice_id < ' . $before_id);
if ($max_id != 0) {
$inbox->whereAdd('notice_id <= ' . $max_id);
}
if (!is_null($since)) {