merged master
[lhc/web/wiklou.git] / includes / filerepo / backend / FileBackend.php
index 77e78b0..3cc9021 100644 (file)
@@ -88,6 +88,7 @@ abstract class FileBackend {
         *     'concurrency' : How many file operations can be done in parallel.
         *
         * @param $config Array
+        * @throws MWException
         */
        public function __construct( array $config ) {
                $this->name = $config['name'];
@@ -286,8 +287,7 @@ abstract class FileBackend {
         * @return Status
         */
        final public function create( array $params, array $opts = array() ) {
-               $params['op'] = 'create';
-               return $this->doOperation( $params, $opts );
+               return $this->doOperation( array( 'op' => 'create' ) + $params, $opts );
        }
 
        /**
@@ -301,8 +301,7 @@ abstract class FileBackend {
         * @return Status
         */
        final public function store( array $params, array $opts = array() ) {
-               $params['op'] = 'store';
-               return $this->doOperation( $params, $opts );
+               return $this->doOperation( array( 'op' => 'store' ) + $params, $opts );
        }
 
        /**
@@ -316,8 +315,7 @@ abstract class FileBackend {
         * @return Status
         */
        final public function copy( array $params, array $opts = array() ) {
-               $params['op'] = 'copy';
-               return $this->doOperation( $params, $opts );
+               return $this->doOperation( array( 'op' => 'copy' ) + $params, $opts );
        }
 
        /**
@@ -331,8 +329,7 @@ abstract class FileBackend {
         * @return Status
         */
        final public function move( array $params, array $opts = array() ) {
-               $params['op'] = 'move';
-               return $this->doOperation( $params, $opts );
+               return $this->doOperation( array( 'op' => 'move' ) + $params, $opts );
        }
 
        /**
@@ -346,8 +343,7 @@ abstract class FileBackend {
         * @return Status
         */
        final public function delete( array $params, array $opts = array() ) {
-               $params['op'] = 'delete';
-               return $this->doOperation( $params, $opts );
+               return $this->doOperation( array( 'op' => 'delete' ) + $params, $opts );
        }
 
        /**
@@ -405,6 +401,7 @@ abstract class FileBackend {
         *
         * @param $ops Array Set of operations to execute
         * @return Status
+        * @since 1.20
         */
        final public function doQuickOperations( array $ops ) {
                if ( $this->isReadOnly() ) {
@@ -418,9 +415,94 @@ abstract class FileBackend {
 
        /**
         * @see FileBackend::doQuickOperations()
+        * @since 1.20
         */
        abstract protected function doQuickOperationsInternal( array $ops );
 
+       /**
+        * Same as doQuickOperations() except it takes a single operation.
+        * If you are doing a batch of operations, then use that function instead.
+        *
+        * @see FileBackend::doQuickOperations()
+        *
+        * @param $op Array Operation
+        * @return Status
+        * @since 1.20
+        */
+       final public function doQuickOperation( array $op ) {
+               return $this->doQuickOperations( array( $op ) );
+       }
+
+       /**
+        * Performs a single quick create operation.
+        * This sets $params['op'] to 'create' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickCreate( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'create' ) + $params );
+       }
+
+       /**
+        * Performs a single quick store operation.
+        * This sets $params['op'] to 'store' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickStore( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'store' ) + $params );
+       }
+
+       /**
+        * Performs a single quick copy operation.
+        * This sets $params['op'] to 'copy' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickCopy( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'copy' ) + $params );
+       }
+
+       /**
+        * Performs a single quick move operation.
+        * This sets $params['op'] to 'move' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickMove( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'move' ) + $params );
+       }
+
+       /**
+        * Performs a single quick delete operation.
+        * This sets $params['op'] to 'delete' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickDelete( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'delete' ) + $params );
+       }
+
        /**
         * Concatenate a list of storage files into a single file system file.
         * The target path should refer to a file that is already locked or
@@ -668,6 +750,7 @@ abstract class FileBackend {
         * $params include:
         *     dir : storage directory
         *
+        * @param $params array
         * @return bool|null Returns null on failure
         * @since 1.20
         */
@@ -687,6 +770,7 @@ abstract class FileBackend {
         *     dir     : storage directory
         *     topOnly : only return direct child dirs of the directory
         *
+        * @param $params array
         * @return Traversable|Array|null Returns null on failure
         * @since 1.20
         */
@@ -701,6 +785,7 @@ abstract class FileBackend {
         * $params include:
         *     dir : storage directory
         *
+        * @param $params array
         * @return Traversable|Array|null Returns null on failure
         * @since 1.20
         */
@@ -722,6 +807,7 @@ abstract class FileBackend {
         *     dir     : storage directory
         *     topOnly : only return direct child files of the directory (@since 1.20)
         *
+        * @param $params array
         * @return Traversable|Array|null Returns null on failure
         */
        abstract public function getFileList( array $params );
@@ -735,6 +821,7 @@ abstract class FileBackend {
         * $params include:
         *     dir : storage directory
         *
+        * @param $params array
         * @return Traversable|Array|null Returns null on failure
         * @since 1.20
         */
@@ -793,6 +880,24 @@ abstract class FileBackend {
                return ScopedLock::factory( $this->lockManager, $paths, $type, $status );
        }
 
+       /**
+        * Get an array of scoped locks needed for a batch of file operations.
+        *
+        * Normally, FileBackend::doOperations() handles locking, unless
+        * the 'nonLocking' param is passed in. This function is useful if you
+        * want the files to be locked for a broader scope than just when the
+        * files are changing. For example, if you need to update DB metadata,
+        * you may want to keep the files locked until finished.
+        *
+        * @see FileBackend::doOperations()
+        *
+        * @param $ops Array List of file operations to FileBackend::doOperations()
+        * @param $status Status Status to update on lock/unlock
+        * @return Array List of ScopedFileLocks or null values
+        * @since 1.20
+        */
+       abstract public function getScopedLocksForOps( array $ops, Status $status );
+
        /**
         * Get the root storage path of this backend.
         * All container paths are "subdirectories" of this path.
@@ -804,6 +909,15 @@ abstract class FileBackend {
                return "mwstore://{$this->name}";
        }
 
+       /**
+        * Get the file journal object for this backend
+        *
+        * @return FileJournal
+        */
+       final public function getJournal() {
+               return $this->fileJournal;
+       }
+
        /**
         * Check if a given path is a "mwstore://" path.
         * This does not do any further validation or any existence checks.