Merge branch '0.8.x' of git@gitorious.org:laconica/dev into 0.8.x

This commit is contained in:
Sarven Capadisli 2009-06-25 19:00:26 +00:00
commit 28b4e85af0
7 changed files with 121 additions and 72 deletions

View File

@ -21,20 +21,40 @@ if (!defined('LACONICA')) { exit(1); }
require_once(INSTALLDIR.'/actions/shownotice.php'); require_once(INSTALLDIR.'/actions/shownotice.php');
class FileAction extends ShowNoticeAction class FileAction extends Action
{ {
function showPage() { var $id = null;
$source_url = common_local_url('file', array('notice' => $this->notice->id)); var $filerec = null;
$query = "select file_redirection.url as url from file join file_redirection on file.id = file_redirection.file_id where file.url = '$source_url'";
$file = new File_redirection; function prepare($args)
$file->query($query); {
$file->fetch(); parent::prepare($args);
if (empty($file->url)) { $this->id = $this->trimmed('notice');
die('nothing attached here'); if (empty($this->id)) {
} else { $this->clientError(_('No notice id'));
header("Location: {$file->url}");
die();
} }
$notice = Notice::staticGet('id', $this->id);
if (empty($notice)) {
$this->clientError(_('No notice'));
}
$atts = $notice->attachments();
if (empty($atts)) {
$this->clientError(_('No attachments'));
}
foreach ($atts as $att) {
if (!empty($att->filename)) {
$this->filerec = $att;
break;
}
}
if (empty($this->filerec)) {
$this->clientError(_('No uploaded attachments'));
}
return true;
}
function handle() {
common_redirect($this->filerec->url);
} }
} }

View File

@ -236,6 +236,7 @@ class NewnoticeAction extends Action
$this->deleteFile($filename); $this->deleteFile($filename);
$this->clientError(_('Max notice size is 140 chars, including attachment URL.')); $this->clientError(_('Max notice size is 140 chars, including attachment URL.'));
} }
$fileRecord = $this->rememberFile($filename, $mimetype, $short_fileurl);
} }
$notice = Notice::saveNew($user->id, $content_shortened, 'web', 1, $notice = Notice::saveNew($user->id, $content_shortened, 'web', 1,
@ -249,7 +250,7 @@ class NewnoticeAction extends Action
} }
if (isset($mimetype)) { if (isset($mimetype)) {
$this->attachFile($notice, $filename, $mimetype, $short_fileurl); $this->attachFile($notice, $fileRecord);
} }
common_broadcast_notice($notice); common_broadcast_notice($notice);
@ -304,12 +305,12 @@ class NewnoticeAction extends Action
@unlink($filepath); @unlink($filepath);
} }
function attachFile($notice, $filename, $mimetype, $short) function rememberFile($filename, $mimetype, $short)
{ {
$file = new File; $file = new File;
$file->filename = $filename; $file->filename = $filename;
$file->url = common_local_url('file', array('notice' => $notice->id)); $file->url = File::url($filename);
$filepath = File::path($filename); $filepath = File::path($filename);
@ -324,26 +325,32 @@ class NewnoticeAction extends Action
$this->clientError(_('There was a database error while saving your file. Please try again.')); $this->clientError(_('There was a database error while saving your file. Please try again.'));
} }
$file_redir = new File_redirection; $this->maybeAddRedir($file_id, $short);
$file_redir->url = File::url($filename); }
$file_redir->file_id = $file_id;
$result = $file_redir->insert(); function maybeAddRedir($file_id, $url)
{
$file_redir = File_redirection::staticGet('url', $url);
if (!$result) { if (empty($file_redir)) {
common_log_db_error($file_redir, "INSERT", __FILE__); $file_redir = new File_redirection;
$this->clientError(_('There was a database error while saving your file. Please try again.')); $file_redir->url = $url;
$file_redir->file_id = $file_id;
$result = $file_redir->insert();
if (!$result) {
common_log_db_error($file_redir, "INSERT", __FILE__);
$this->clientError(_('There was a database error while saving your file. Please try again.'));
}
} }
}
$f2p = new File_to_post; function attachFile($notice, $filerec)
$f2p->file_id = $file_id; {
$f2p->post_id = $notice->id; File_to_post::processNew($filerec->id, $notice->id);
$f2p->insert();
if (!$result) { $this->maybeAddRedir($filerec->id, common_local_url('file', array('notice' => $this->notice->id)));
common_log_db_error($f2p, "INSERT", __FILE__);
$this->clientError(_('There was a database error while saving your file. Please try again.'));
}
} }
/** /**

View File

@ -91,9 +91,10 @@ class File extends Memcached_DataObject
$given_url = File_redirection::_canonUrl($given_url); $given_url = File_redirection::_canonUrl($given_url);
if (empty($given_url)) return -1; // error, no url to process if (empty($given_url)) return -1; // error, no url to process
$file = File::staticGet('url', $given_url); $file = File::staticGet('url', $given_url);
if (empty($file->id)) { if (empty($file)) {
$file_redir = File_redirection::staticGet('url', $given_url); $file_redir = File_redirection::staticGet('url', $given_url);
if (empty($file_redir->id)) { if (empty($file_redir)) {
common_debug("processNew() '$given_url' not a known redirect.\n");
$redir_data = File_redirection::where($given_url); $redir_data = File_redirection::where($given_url);
$redir_url = $redir_data['url']; $redir_url = $redir_data['url'];
if ($redir_url === $given_url) { if ($redir_url === $given_url) {

View File

@ -66,21 +66,17 @@ class File_redirection extends Memcached_DataObject
// let's see if we know this... // let's see if we know this...
$a = File::staticGet('url', $short_url); $a = File::staticGet('url', $short_url);
if (empty($a->id)) {
$b = File_redirection::staticGet('url', $short_url); if (!empty($a)) {
if (empty($b->id)) {
// we'll have to figure it out
} else {
// this is a redirect to $b->file_id
$a = File::staticGet($b->file_id);
$url = $a->url;
}
} else {
// this is a direct link to $a->url // this is a direct link to $a->url
$url = $a->url; return $a->url;
} } else {
if (isset($url)) { $b = File_redirection::staticGet('url', $short_url);
return $url; if (!empty($b)) {
// this is a redirect to $b->file_id
$a = File::staticGet('id', $b->file_id);
return $a->url;
}
} }
$curlh = File_redirection::_commonCurl($short_url, $redirs); $curlh = File_redirection::_commonCurl($short_url, $redirs);
@ -118,28 +114,22 @@ class File_redirection extends Memcached_DataObject
} }
function makeShort($long_url) { function makeShort($long_url) {
$long_url = File_redirection::_canonUrl($long_url);
// do we already know this long_url and have a short redirection for it?
$file = new File;
$file_redir = new File_redirection;
$file->url = $long_url;
$file->joinAdd($file_redir);
$file->selectAdd('length(file_redirection.url) as len');
$file->limit(1);
$file->orderBy('len');
$file->find(true);
if (!empty($file->url) && (strlen($file->url) < strlen($long_url))) {
return $file->url;
}
// if yet unknown, we must find a short url according to user settings $canon = File_redirection::_canonUrl($long_url);
$short_url = File_redirection::_userMakeShort($long_url, common_current_user());
return $short_url; $short_url = File_redirection::_userMakeShort($canon);
// Did we get one? Is it shorter?
if (!empty($short_url) && mb_strlen($short_url) < mb_strlen($long_url)) {
return $short_url;
} else {
return $long_url;
}
} }
function _userMakeShort($long_url, $user) { function _userMakeShort($long_url) {
$short_url = common_shorten_url($long_url); $short_url = common_shorten_url($long_url);
if ($short_url) { if (!empty($short_url) && $short_url != $long_url) {
$short_url = (string)$short_url; $short_url = (string)$short_url;
// store it // store it
$file = File::staticGet('url', $long_url); $file = File::staticGet('url', $long_url);
@ -162,7 +152,7 @@ class File_redirection extends Memcached_DataObject
} }
return $short_url; return $short_url;
} }
return $long_url; return null;
} }
function _canonUrl($in_url, $default_scheme = 'http://') { function _canonUrl($in_url, $default_scheme = 'http://') {

View File

@ -25,7 +25,7 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
* Table Definition for file_to_post * Table Definition for file_to_post
*/ */
class File_to_post extends Memcached_DataObject class File_to_post extends Memcached_DataObject
{ {
###START_AUTOCODE ###START_AUTOCODE
/* the code below is auto generated do not remove the above tag */ /* the code below is auto generated do not remove the above tag */
@ -44,17 +44,27 @@ class File_to_post extends Memcached_DataObject
function processNew($file_id, $notice_id) { function processNew($file_id, $notice_id) {
static $seen = array(); static $seen = array();
if (empty($seen[$notice_id]) || !in_array($file_id, $seen[$notice_id])) { if (empty($seen[$notice_id]) || !in_array($file_id, $seen[$notice_id])) {
$f2p = new File_to_post;
$f2p->file_id = $file_id; $f2p = File_to_post::pkeyGet(array('post_id' => $notice_id,
$f2p->post_id = $notice_id; 'file_id' => $file_id));
$f2p->insert(); if (empty($f2p)) {
$f2p = new File_to_post;
$f2p->file_id = $file_id;
$f2p->post_id = $notice_id;
$f2p->insert();
}
if (empty($seen[$notice_id])) { if (empty($seen[$notice_id])) {
$seen[$notice_id] = array($file_id); $seen[$notice_id] = array($file_id);
} else { } else {
$seen[$notice_id][] = $file_id; $seen[$notice_id][] = $file_id;
} }
} }
}
function &pkeyGet($kv)
{
return Memcached_DataObject::pkeyGet('File_to_post', $kv);
} }
} }

View File

@ -331,6 +331,20 @@ class Notice extends Memcached_DataObject
return $n_attachments; return $n_attachments;
} }
function attachments() {
// XXX: cache this
$att = array();
$f2p = new File_to_post;
$f2p->post_id = $this->id;
if ($f2p->find()) {
while ($f2p->fetch()) {
$f = File::staticGet($f2p->file_id);
$att[] = clone($f);
}
}
return $att;
}
function blowCaches($blowLast=false) function blowCaches($blowLast=false)
{ {
$this->blowSubsCache($blowLast); $this->blowSubsCache($blowLast);
@ -346,7 +360,7 @@ class Notice extends Memcached_DataObject
{ {
$cache = common_memcache(); $cache = common_memcache();
if ($cache) { if ($cache) {
$ck = 'notice:conversation_ids:'.$this->conversation; $ck = common_cache_key('notice:conversation_ids:'.$this->conversation);
$cache->delete($ck); $cache->delete($ck);
if ($blowLast) { if ($blowLast) {
$cache->delete($ck.';last'); $cache->delete($ck.';last');

View File

@ -48,7 +48,14 @@ function handleError($error)
$logmsg .= " : ". $error->getDebugInfo(); $logmsg .= " : ". $error->getDebugInfo();
} }
common_log(LOG_ERR, $logmsg); common_log(LOG_ERR, $logmsg);
if ($error instanceof DB_DataObject_Error) { if(common_config('site', 'logdebug')) {
$bt = $error->getBacktrace();
foreach ($bt as $line) {
common_log(LOG_ERR, $line);
}
}
if ($error instanceof DB_DataObject_Error ||
$error instanceof DB_Error) {
$msg = sprintf(_('The database for %s isn\'t responding correctly, '. $msg = sprintf(_('The database for %s isn\'t responding correctly, '.
'so the site won\'t work properly. '. 'so the site won\'t work properly. '.
'The site admins probably know about the problem, '. 'The site admins probably know about the problem, '.