From: Aaron Schulz Date: Tue, 24 Jan 2012 02:46:21 +0000 (+0000) Subject: * Moved FSFile classes from file/ to backend/ X-Git-Tag: 1.31.0-rc.0~25105 X-Git-Url: http://git.cyclocoop.org//%27%40script%40/%27?a=commitdiff_plain;h=0fc544635d8b98dae2a0055a728a87dd657cd40d;p=lhc%2Fweb%2Fwiklou.git * Moved FSFile classes from file/ to backend/ * Improved $this->lockCount check in LockServerDaemon --- diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index c4153d36d5..6c3b233afc 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -489,8 +489,8 @@ $wgAutoloadLocalClasses = array( 'LocalFileRestoreBatch' => 'includes/filerepo/file/LocalFile.php', 'OldLocalFile' => 'includes/filerepo/file/OldLocalFile.php', 'UnregisteredLocalFile' => 'includes/filerepo/file/UnregisteredLocalFile.php', - 'FSFile' => 'includes/filerepo/file/FSFile.php', - 'TempFSFile' => 'includes/filerepo/file/TempFSFile.php', + 'FSFile' => 'includes/filerepo/backend/FSFile.php', + 'TempFSFile' => 'includes/filerepo/backend/TempFSFile.php', # includes/filerepo/backend 'FileBackendGroup' => 'includes/filerepo/backend/FileBackendGroup.php', diff --git a/includes/filerepo/backend/FSFile.php b/includes/filerepo/backend/FSFile.php new file mode 100644 index 0000000000..38dfbac0b0 --- /dev/null +++ b/includes/filerepo/backend/FSFile.php @@ -0,0 +1,235 @@ +path = $path; + } + + /** + * Returns the file system path + * + * @return String + */ + public function getPath() { + return $this->path; + } + + /** + * Checks if the file exists + * + * @return bool + */ + public function exists() { + return is_file( $this->path ); + } + + /** + * Get the file size in bytes + * + * @return int|false + */ + public function getSize() { + return filesize( $this->path ); + } + + /** + * Get the file's last-modified timestamp + * + * @return string|false TS_MW timestamp or false on failure + */ + public function getTimestamp() { + wfSuppressWarnings(); + $timestamp = filemtime( $this->path ); + wfRestoreWarnings(); + if ( $timestamp !== false ) { + $timestamp = wfTimestamp( TS_MW, $timestamp ); + } + return $timestamp; + } + + /** + * Guess the MIME type from the file contents alone + * + * @return string + */ + public function getMimeType() { + return MimeMagic::singleton()->guessMimeType( $this->path, false ); + } + + /** + * Get an associative array containing information about + * a file with the given storage path. + * + * @param $ext Mixed: the file extension, or true to extract it from the filename. + * Set it to false to ignore the extension. + * + * @return array + */ + public function getProps( $ext = true ) { + wfProfileIn( __METHOD__ ); + wfDebug( __METHOD__.": Getting file info for $this->path\n" ); + + $info = self::placeholderProps(); + $info['fileExists'] = $this->exists(); + + if ( $info['fileExists'] ) { + $magic = MimeMagic::singleton(); + + # get the file extension + if ( $ext === true ) { + $ext = self::extensionFromPath( $this->path ); + } + + # mime type according to file contents + $info['file-mime'] = $this->getMimeType(); + # logical mime type + $info['mime'] = $magic->improveTypeFromExtension( $info['file-mime'], $ext ); + + list( $info['major_mime'], $info['minor_mime'] ) = File::splitMime( $info['mime'] ); + $info['media_type'] = $magic->getMediaType( $this->path, $info['mime'] ); + + # Get size in bytes + $info['size'] = $this->getSize(); + + # Height, width and metadata + $handler = MediaHandler::getHandler( $info['mime'] ); + if ( $handler ) { + $tempImage = (object)array(); + $info['metadata'] = $handler->getMetadata( $tempImage, $this->path ); + $gis = $handler->getImageSize( $tempImage, $this->path, $info['metadata'] ); + if ( is_array( $gis ) ) { + $info = $this->extractImageSizeInfo( $gis ) + $info; + } + } + $info['sha1'] = $this->getSha1Base36(); + + wfDebug(__METHOD__.": $this->path loaded, {$info['size']} bytes, {$info['mime']}.\n"); + } else { + wfDebug(__METHOD__.": $this->path NOT FOUND!\n"); + } + + wfProfileOut( __METHOD__ ); + return $info; + } + + /** + * Placeholder file properties to use for files that don't exist + * + * @return Array + */ + public static function placeholderProps() { + $info = array(); + $info['fileExists'] = false; + $info['mime'] = null; + $info['media_type'] = MEDIATYPE_UNKNOWN; + $info['metadata'] = ''; + $info['sha1'] = ''; + $info['width'] = 0; + $info['height'] = 0; + $info['bits'] = 0; + return $info; + } + + /** + * Exract image size information + * + * @return Array + */ + protected function extractImageSizeInfo( array $gis ) { + $info = array(); + # NOTE: $gis[2] contains a code for the image type. This is no longer used. + $info['width'] = $gis[0]; + $info['height'] = $gis[1]; + if ( isset( $gis['bits'] ) ) { + $info['bits'] = $gis['bits']; + } else { + $info['bits'] = 0; + } + return $info; + } + + /** + * Get a SHA-1 hash of a file in the local filesystem, in base-36 lower case + * encoding, zero padded to 31 digits. + * + * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36 + * fairly neatly. + * + * @return false|string False on failure + */ + public function getSha1Base36() { + wfProfileIn( __METHOD__ ); + + wfSuppressWarnings(); + $hash = sha1_file( $this->path ); + wfRestoreWarnings(); + if ( $hash !== false ) { + $hash = wfBaseConvert( $hash, 16, 36, 31 ); + } + + wfProfileOut( __METHOD__ ); + return $hash; + } + + /** + * Get the final file extension from a file system path + * + * @param $path string + * @return string + */ + public static function extensionFromPath( $path ) { + $i = strrpos( $path, '.' ); + return strtolower( $i ? substr( $path, $i + 1 ) : '' ); + } + + /** + * Get an associative array containing information about a file in the local filesystem. + * + * @param $path String: absolute local filesystem path + * @param $ext Mixed: the file extension, or true to extract it from the filename. + * Set it to false to ignore the extension. + * + * @return array + */ + public static function getPropsFromPath( $path, $ext = true ) { + $fsFile = new self( $path ); + return $fsFile->getProps( $ext ); + } + + /** + * Get a SHA-1 hash of a file in the local filesystem, in base-36 lower case + * encoding, zero padded to 31 digits. + * + * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36 + * fairly neatly. + * + * @param $path string + * + * @return false|string False on failure + */ + public static function getSha1Base36FromPath( $path ) { + $fsFile = new self( $path ); + return $fsFile->getSha1Base36(); + } +} diff --git a/includes/filerepo/backend/TempFSFile.php b/includes/filerepo/backend/TempFSFile.php new file mode 100644 index 0000000000..bee00fa784 --- /dev/null +++ b/includes/filerepo/backend/TempFSFile.php @@ -0,0 +1,96 @@ += 15 ) { + return null; // give up + } + } + $tmpFile = new self( $path ); + if ( php_sapi_name() != 'cli' ) { + self::$instances[] = $tmpFile; // defer purge till shutdown + } + return $tmpFile; + } + + /** + * Purge this file off the file system + * + * @return bool Success + */ + public function purge() { + $this->canDelete = false; // done + wfSuppressWarnings(); + $ok = unlink( $this->path ); + wfRestoreWarnings(); + return $ok; + } + + /** + * Clean up the temporary file only after an object goes out of scope + * + * @param $object Object + * @return void + */ + public function bind( $object ) { + if ( is_object( $object ) ) { + $object->tempFSFileReferences[] = $this; + } + } + + /** + * Set flag to not clean up after the temporary file + * + * @return void + */ + public function preserve() { + $this->canDelete = false; + } + + /** + * Cleans up after the temporary file by deleting it + */ + function __destruct() { + if ( $this->canDelete ) { + wfSuppressWarnings(); + unlink( $this->path ); + wfRestoreWarnings(); + } + } +} diff --git a/includes/filerepo/file/FSFile.php b/includes/filerepo/file/FSFile.php deleted file mode 100644 index 38dfbac0b0..0000000000 --- a/includes/filerepo/file/FSFile.php +++ /dev/null @@ -1,235 +0,0 @@ -path = $path; - } - - /** - * Returns the file system path - * - * @return String - */ - public function getPath() { - return $this->path; - } - - /** - * Checks if the file exists - * - * @return bool - */ - public function exists() { - return is_file( $this->path ); - } - - /** - * Get the file size in bytes - * - * @return int|false - */ - public function getSize() { - return filesize( $this->path ); - } - - /** - * Get the file's last-modified timestamp - * - * @return string|false TS_MW timestamp or false on failure - */ - public function getTimestamp() { - wfSuppressWarnings(); - $timestamp = filemtime( $this->path ); - wfRestoreWarnings(); - if ( $timestamp !== false ) { - $timestamp = wfTimestamp( TS_MW, $timestamp ); - } - return $timestamp; - } - - /** - * Guess the MIME type from the file contents alone - * - * @return string - */ - public function getMimeType() { - return MimeMagic::singleton()->guessMimeType( $this->path, false ); - } - - /** - * Get an associative array containing information about - * a file with the given storage path. - * - * @param $ext Mixed: the file extension, or true to extract it from the filename. - * Set it to false to ignore the extension. - * - * @return array - */ - public function getProps( $ext = true ) { - wfProfileIn( __METHOD__ ); - wfDebug( __METHOD__.": Getting file info for $this->path\n" ); - - $info = self::placeholderProps(); - $info['fileExists'] = $this->exists(); - - if ( $info['fileExists'] ) { - $magic = MimeMagic::singleton(); - - # get the file extension - if ( $ext === true ) { - $ext = self::extensionFromPath( $this->path ); - } - - # mime type according to file contents - $info['file-mime'] = $this->getMimeType(); - # logical mime type - $info['mime'] = $magic->improveTypeFromExtension( $info['file-mime'], $ext ); - - list( $info['major_mime'], $info['minor_mime'] ) = File::splitMime( $info['mime'] ); - $info['media_type'] = $magic->getMediaType( $this->path, $info['mime'] ); - - # Get size in bytes - $info['size'] = $this->getSize(); - - # Height, width and metadata - $handler = MediaHandler::getHandler( $info['mime'] ); - if ( $handler ) { - $tempImage = (object)array(); - $info['metadata'] = $handler->getMetadata( $tempImage, $this->path ); - $gis = $handler->getImageSize( $tempImage, $this->path, $info['metadata'] ); - if ( is_array( $gis ) ) { - $info = $this->extractImageSizeInfo( $gis ) + $info; - } - } - $info['sha1'] = $this->getSha1Base36(); - - wfDebug(__METHOD__.": $this->path loaded, {$info['size']} bytes, {$info['mime']}.\n"); - } else { - wfDebug(__METHOD__.": $this->path NOT FOUND!\n"); - } - - wfProfileOut( __METHOD__ ); - return $info; - } - - /** - * Placeholder file properties to use for files that don't exist - * - * @return Array - */ - public static function placeholderProps() { - $info = array(); - $info['fileExists'] = false; - $info['mime'] = null; - $info['media_type'] = MEDIATYPE_UNKNOWN; - $info['metadata'] = ''; - $info['sha1'] = ''; - $info['width'] = 0; - $info['height'] = 0; - $info['bits'] = 0; - return $info; - } - - /** - * Exract image size information - * - * @return Array - */ - protected function extractImageSizeInfo( array $gis ) { - $info = array(); - # NOTE: $gis[2] contains a code for the image type. This is no longer used. - $info['width'] = $gis[0]; - $info['height'] = $gis[1]; - if ( isset( $gis['bits'] ) ) { - $info['bits'] = $gis['bits']; - } else { - $info['bits'] = 0; - } - return $info; - } - - /** - * Get a SHA-1 hash of a file in the local filesystem, in base-36 lower case - * encoding, zero padded to 31 digits. - * - * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36 - * fairly neatly. - * - * @return false|string False on failure - */ - public function getSha1Base36() { - wfProfileIn( __METHOD__ ); - - wfSuppressWarnings(); - $hash = sha1_file( $this->path ); - wfRestoreWarnings(); - if ( $hash !== false ) { - $hash = wfBaseConvert( $hash, 16, 36, 31 ); - } - - wfProfileOut( __METHOD__ ); - return $hash; - } - - /** - * Get the final file extension from a file system path - * - * @param $path string - * @return string - */ - public static function extensionFromPath( $path ) { - $i = strrpos( $path, '.' ); - return strtolower( $i ? substr( $path, $i + 1 ) : '' ); - } - - /** - * Get an associative array containing information about a file in the local filesystem. - * - * @param $path String: absolute local filesystem path - * @param $ext Mixed: the file extension, or true to extract it from the filename. - * Set it to false to ignore the extension. - * - * @return array - */ - public static function getPropsFromPath( $path, $ext = true ) { - $fsFile = new self( $path ); - return $fsFile->getProps( $ext ); - } - - /** - * Get a SHA-1 hash of a file in the local filesystem, in base-36 lower case - * encoding, zero padded to 31 digits. - * - * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36 - * fairly neatly. - * - * @param $path string - * - * @return false|string False on failure - */ - public static function getSha1Base36FromPath( $path ) { - $fsFile = new self( $path ); - return $fsFile->getSha1Base36(); - } -} diff --git a/includes/filerepo/file/TempFSFile.php b/includes/filerepo/file/TempFSFile.php deleted file mode 100644 index bee00fa784..0000000000 --- a/includes/filerepo/file/TempFSFile.php +++ /dev/null @@ -1,96 +0,0 @@ -= 15 ) { - return null; // give up - } - } - $tmpFile = new self( $path ); - if ( php_sapi_name() != 'cli' ) { - self::$instances[] = $tmpFile; // defer purge till shutdown - } - return $tmpFile; - } - - /** - * Purge this file off the file system - * - * @return bool Success - */ - public function purge() { - $this->canDelete = false; // done - wfSuppressWarnings(); - $ok = unlink( $this->path ); - wfRestoreWarnings(); - return $ok; - } - - /** - * Clean up the temporary file only after an object goes out of scope - * - * @param $object Object - * @return void - */ - public function bind( $object ) { - if ( is_object( $object ) ) { - $object->tempFSFileReferences[] = $this; - } - } - - /** - * Set flag to not clean up after the temporary file - * - * @return void - */ - public function preserve() { - $this->canDelete = false; - } - - /** - * Cleans up after the temporary file by deleting it - */ - function __destruct() { - if ( $this->canDelete ) { - wfSuppressWarnings(); - unlink( $this->path ); - wfRestoreWarnings(); - } - } -} diff --git a/maintenance/locking/LockServerDaemon.php b/maintenance/locking/LockServerDaemon.php index 986ce99859..cba0454659 100644 --- a/maintenance/locking/LockServerDaemon.php +++ b/maintenance/locking/LockServerDaemon.php @@ -278,6 +278,8 @@ class LockServerDaemon { } /** + * Get the current timestamp and memory usage + * * @return string */ protected function stat() { @@ -317,7 +319,7 @@ class LockHolder { * @return string */ public function lock( $session, $type, array $keys ) { - if ( $this->lockCount >= $this->maxLocks ) { + if ( ( $this->lockCount + count( $keys ) ) > $this->maxLocks ) { return 'TOO_MANY_LOCKS'; } if ( $type === 'SH' ) {