class UploadStash {
// Format of the key for files -- has to be suitable as a filename itself (e.g. ab12cd34ef.jpg)
const KEY_FORMAT_REGEX = '/^[\w-\.]+\.\w*$/';
+ const MAX_US_PROPS_SIZE = 65535;
/**
* repository that this uses to store temp files
public $repo;
// array of initialized repo objects
- protected $files = array();
+ protected $files = [];
// cache of the file metadata that's stored in the database
- protected $fileMetadata = array();
+ protected $fileMetadata = [];
// fileprops cache
- protected $fileProps = array();
+ protected $fileProps = [];
// current user
protected $user, $userId, $isLoggedIn;
// see: http://www.jwz.org/doc/mid.html
list( $usec, $sec ) = explode( ' ', microtime() );
$usec = substr( $usec, 2 );
- $key = wfBaseConvert( $sec . $usec, 10, 36 ) . '.' .
- wfBaseConvert( mt_rand(), 10, 36 ) . '.' .
+ $key = Wikimedia\base_convert( $sec . $usec, 10, 36 ) . '.' .
+ Wikimedia\base_convert( mt_rand(), 10, 36 ) . '.' .
$this->userId . '.' .
$extension;
$error = $storeStatus->getWarningsArray();
$error = reset( $error );
if ( !count( $error ) ) {
- $error = array( 'unknown', 'no error recorded' );
+ $error = [ 'unknown', 'no error recorded' ];
}
}
// At this point, $error should contain the single "most important"
// insert the file metadata into the db.
wfDebug( __METHOD__ . " inserting $stashPath under $key\n" );
- $dbw = $this->repo->getMasterDb();
+ $dbw = $this->repo->getMasterDB();
+
+ $serializedFileProps = serialize( $fileProps );
+ if ( strlen( $serializedFileProps ) > self::MAX_US_PROPS_SIZE ) {
+ // Database is going to truncate this and make the field invalid.
+ // Prioritize important metadata over file handler metadata.
+ // File handler should be prepared to regenerate invalid metadata if needed.
+ $fileProps['metadata'] = false;
+ $serializedFileProps = serialize( $fileProps );
+ }
- $this->fileMetadata[$key] = array(
+ $this->fileMetadata[$key] = [
'us_id' => $dbw->nextSequenceValue( 'uploadstash_us_id_seq' ),
'us_user' => $this->userId,
'us_key' => $key,
'us_orig_path' => $path,
'us_path' => $stashPath, // virtual URL
- 'us_props' => $dbw->encodeBlob( serialize( $fileProps ) ),
+ 'us_props' => $dbw->encodeBlob( $serializedFileProps ),
'us_size' => $fileProps['size'],
'us_sha1' => $fileProps['sha1'],
'us_mime' => $fileProps['mime'],
'us_source_type' => $sourceType,
'us_timestamp' => $dbw->timestamp(),
'us_status' => 'finished'
- );
+ ];
$dbw->insert(
'uploadstash',
}
wfDebug( __METHOD__ . ' clearing all rows for user ' . $this->userId . "\n" );
- $dbw = $this->repo->getMasterDb();
+ $dbw = $this->repo->getMasterDB();
$dbw->delete(
'uploadstash',
- array( 'us_user' => $this->userId ),
+ [ 'us_user' => $this->userId ],
__METHOD__
);
# destroy objects.
- $this->files = array();
- $this->fileMetadata = array();
+ $this->files = [];
+ $this->fileMetadata = [];
return true;
}
. ' No user is logged in, files must belong to users' );
}
- $dbw = $this->repo->getMasterDb();
+ $dbw = $this->repo->getMasterDB();
// this is a cheap query. it runs on the master so that this function
// still works when there's lag. It won't be called all that often.
$row = $dbw->selectRow(
'uploadstash',
'us_user',
- array( 'us_key' => $key ),
+ [ 'us_key' => $key ],
__METHOD__
);
// Ensure we have the UploadStashFile loaded for this key
$this->getFile( $key, true );
- $dbw = $this->repo->getMasterDb();
+ $dbw = $this->repo->getMasterDB();
$dbw->delete(
'uploadstash',
- array( 'us_key' => $key ),
+ [ 'us_key' => $key ],
__METHOD__
);
. ' No user is logged in, files must belong to users' );
}
- $dbr = $this->repo->getSlaveDb();
+ $dbr = $this->repo->getSlaveDB();
$res = $dbr->select(
'uploadstash',
'us_key',
- array( 'us_user' => $this->userId ),
+ [ 'us_user' => $this->userId ],
__METHOD__
);
}
// finish the read before starting writes.
- $keys = array();
+ $keys = [];
foreach ( $res as $row ) {
array_push( $keys, $row->us_key );
}
$dbr = null;
if ( $readFromDB === DB_MASTER ) {
// sometimes reading from the master is necessary, if there's replication lag.
- $dbr = $this->repo->getMasterDb();
+ $dbr = $this->repo->getMasterDB();
} else {
- $dbr = $this->repo->getSlaveDb();
+ $dbr = $this->repo->getSlaveDB();
}
$row = $dbr->selectRow(
'uploadstash',
'*',
- array( 'us_key' => $key ),
+ [ 'us_key' => $key ],
__METHOD__
);