X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FFile.php;h=7e59bf2b8a7a4656c2247fce4e9f558fbb60a511;hb=b0dfc70a54e5e184023ed982dfaf5439041e9708;hp=681c33f9cd4f788c962ed6379cfb8ed19d4b2d5c;hpb=c1a27922ba738f71b100a520e5db6f32985a307b;p=quix0rs-gnu-social.git diff --git a/classes/File.php b/classes/File.php index 681c33f9cd..7e59bf2b8a 100644 --- a/classes/File.php +++ b/classes/File.php @@ -29,7 +29,7 @@ require_once INSTALLDIR.'/classes/File_to_post.php'; /** * Table Definition for file */ -class File extends Memcached_DataObject +class File extends Managed_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -45,31 +45,33 @@ class File extends Memcached_DataObject public $filename; // varchar(255) public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP - /* Static get */ - function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('File',$k,$v); } - /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - function isProtected($url) { - return 'http://www.facebook.com/login.php' === $url; + public static function schemaDef() + { + return array( + 'fields' => array( + 'id' => array('type' => 'serial', 'not null' => true), + 'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'destination URL after following redirections'), + 'mimetype' => array('type' => 'varchar', 'length' => 50, 'description' => 'mime type of resource'), + 'size' => array('type' => 'int', 'description' => 'size of resource when available'), + 'title' => array('type' => 'varchar', 'length' => 255, 'description' => 'title of resource when available'), + 'date' => array('type' => 'int', 'description' => 'date of resource according to http query'), + 'protected' => array('type' => 'int', 'description' => 'true when URL is private (needs login)'), + 'filename' => array('type' => 'varchar', 'length' => 255, 'description' => 'if a local file, name of the file'), + + 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'file_url_key' => array('url'), + ), + ); } - /** - * Get the attachments for a particlar notice. - * - * @param int $post_id - * @return array of File objects - */ - static function getAttachments($post_id) { - $file = new File(); - $query = "select file.* from file join file_to_post on (file_id = file.id) where post_id = " . $file->escape($post_id); - $file = Memcached_DataObject::cachedQuery('File', $query); - $att = array(); - while ($file->fetch()) { - $att[] = clone($file); - } - return $att; + function isProtected($url) { + return 'http://www.facebook.com/login.php' === $url; } /** @@ -80,14 +82,22 @@ class File extends Memcached_DataObject * @return File */ function saveNew(array $redir_data, $given_url) { - $x = new File; - $x->url = $given_url; - if (!empty($redir_data['protected'])) $x->protected = $redir_data['protected']; - if (!empty($redir_data['title'])) $x->title = $redir_data['title']; - if (!empty($redir_data['type'])) $x->mimetype = $redir_data['type']; - if (!empty($redir_data['size'])) $x->size = intval($redir_data['size']); - if (isset($redir_data['time']) && $redir_data['time'] > 0) $x->date = intval($redir_data['time']); - $file_id = $x->insert(); + + // I don't know why we have to keep doing this but I'm adding this last check to avoid + // uniqueness bugs. + + $x = File::getKV('url', $given_url); + + if (empty($x)) { + $x = new File; + $x->url = $given_url; + if (!empty($redir_data['protected'])) $x->protected = $redir_data['protected']; + if (!empty($redir_data['title'])) $x->title = $redir_data['title']; + if (!empty($redir_data['type'])) $x->mimetype = $redir_data['type']; + if (!empty($redir_data['size'])) $x->size = intval($redir_data['size']); + if (isset($redir_data['time']) && $redir_data['time'] > 0) $x->date = intval($redir_data['time']); + $file_id = $x->insert(); + } $x->saveOembed($redir_data, $given_url); return $x; @@ -103,13 +113,13 @@ class File extends Memcached_DataObject * @param string $given_url * @return boolean success */ - public function saveOembed($redir_data, $given_url) + public function saveOembed(array $redir_data, $given_url) { if (isset($redir_data['type']) && (('text/html' === substr($redir_data['type'], 0, 9) || 'application/xhtml+xml' === substr($redir_data['type'], 0, 21))) && ($oembed_data = File_oembed::_getOembed($given_url))) { - $fo = File_oembed::staticGet('file_id', $this->id); + $fo = File_oembed::getKV('file_id', $this->id); if (empty($fo)) { File_oembed::saveNew($oembed_data, $this->id); @@ -143,9 +153,9 @@ class File extends Memcached_DataObject if (empty($given_url)) return -1; // error, no url to process $given_url = File_redirection::_canonUrl($given_url); if (empty($given_url)) return -1; // error, no url to process - $file = File::staticGet('url', $given_url); + $file = File::getKV('url', $given_url); if (empty($file)) { - $file_redir = File_redirection::staticGet('url', $given_url); + $file_redir = File_redirection::getKV('url', $given_url); if (empty($file_redir)) { // @fixme for new URLs this also looks up non-redirect data // such as target content type, size, etc, which we need @@ -187,7 +197,7 @@ class File extends Memcached_DataObject } if (empty($x)) { - $x = File::staticGet($file_id); + $x = File::getKV('id', $file_id); if (empty($x)) { // @todo FIXME: This could possibly be a clearer message :) // TRANS: Server exception thrown when... Robin thinks something is impossible! @@ -204,13 +214,20 @@ class File extends Memcached_DataObject function isRespectsQuota($user,$fileSize) { if ($fileSize > common_config('attachments', 'file_quota')) { + // TRANS: Message used to be inserted as %2$s in the text "No file may + // TRANS: be larger than %1$d byte and the file you sent was %2$s.". + // TRANS: %1$d is the number of bytes of an uploaded file. + $fileSizeText = sprintf(_m('%1$d byte','%1$d bytes',$fileSize),$fileSize); + + $fileQuota = common_config('attachments', 'file_quota'); // TRANS: Message given if an upload is larger than the configured maximum. - // TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file. - // TRANS: %1$s is used for plural. - return sprintf(_m('No file may be larger than %1$d byte and the file you sent was %2$d bytes. Try to upload a smaller version.', - 'No file may be larger than %1$d bytes and the file you sent was %2$d bytes. Try to upload a smaller version.', - common_config('attachments', 'file_quota')), - common_config('attachments', 'file_quota'), $fileSize); + // TRANS: %1$d (used for plural) is the byte limit for uploads, + // TRANS: %2$s is the proper form of "n bytes". This is the only ways to have + // TRANS: gettext support multiple plurals in the same message, unfortunately... + return sprintf(_m('No file may be larger than %1$d byte and the file you sent was %2$s. Try to upload a smaller version.', + 'No file may be larger than %1$d bytes and the file you sent was %2$s. Try to upload a smaller version.', + $fileQuota), + $fileQuota, $fileSizeText); } $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'"; @@ -374,7 +391,7 @@ class File extends Memcached_DataObject if(in_array($mimetype,$notEnclosureMimeTypes)){ // Never treat generic HTML links as an enclosure type! // But if we have oEmbed info, we'll consider it golden. - $oembed = File_oembed::staticGet('file_id',$this->id); + $oembed = File_oembed::getKV('file_id',$this->id); if($oembed && in_array($oembed->type, array('photo', 'video'))){ $mimetype = strtolower($oembed->mimetype); $semicolon = strpos($mimetype,';'); @@ -416,7 +433,7 @@ class File extends Memcached_DataObject */ function getThumbnail() { - return File_thumbnail::staticGet('file_id', $this->id); + return File_thumbnail::getKV('file_id', $this->id); } /** @@ -449,53 +466,10 @@ class File extends Memcached_DataObject function stream($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0) { - $stream = new NoticeStream(array($this, '_streamDirect'), - array(), - 'file:notice-ids:'.$this->url); - + $stream = new FileNoticeStream($this); return $stream->getNotices($offset, $limit, $since_id, $max_id); } - /** - * Stream of notices linking to this URL - * - * @param integer $offset Offset to show; default is 0 - * @param integer $limit Limit of notices to show - * @param integer $since_id Since this notice - * @param integer $max_id Before this notice - * - * @return array ids of notices that link to this file - */ - - function _streamDirect($offset, $limit, $since_id, $max_id) - { - $f2p = new File_to_post(); - - $f2p->selectAdd(); - $f2p->selectAdd('post_id'); - - $f2p->file_id = $this->id; - - Notice::addWhereSinceId($f2p, $since_id, 'post_id', 'modified'); - Notice::addWhereMaxId($f2p, $max_id, 'post_id', 'modified'); - - $f2p->orderBy('modified DESC, post_id DESC'); - - if (!is_null($offset)) { - $f2p->limit($offset, $limit); - } - - $ids = array(); - - if ($f2p->find()) { - while ($f2p->fetch()) { - $ids[] = $f2p->post_id; - } - } - - return $ids; - } - function noticeCount() { $cacheKey = sprintf('file:notice-count:%d', $this->id);