2011-07-19 22:48:38 -07:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/**
|
|
|
|
* MySQL blob storage engine. This engine is the easiest to set up but doesn't
|
|
|
|
* scale very well.
|
|
|
|
*
|
|
|
|
* It uses the @{class:PhabricatorFileStorageBlob} to actually access the
|
|
|
|
* underlying database table.
|
|
|
|
*
|
|
|
|
* @task internal Internals
|
|
|
|
*/
|
|
|
|
final class PhabricatorMySQLFileStorageEngine
|
|
|
|
extends PhabricatorFileStorageEngine {
|
|
|
|
|
2015-03-12 13:28:53 -07:00
|
|
|
|
|
|
|
/* -( Engine Metadata )---------------------------------------------------- */
|
2011-07-19 22:48:38 -07:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* For historical reasons, this engine identifies as "blob".
|
|
|
|
*/
|
|
|
|
public function getEngineIdentifier() {
|
|
|
|
return 'blob';
|
|
|
|
}
|
|
|
|
|
2015-03-12 13:28:53 -07:00
|
|
|
public function getEnginePriority() {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function canWriteFiles() {
|
|
|
|
return ($this->getFilesizeLimit() > 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public function hasFilesizeLimit() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public function getFilesizeLimit() {
|
|
|
|
return PhabricatorEnv::getEnvConfig('storage.mysql-engine.max-size');
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* -( Managing File Data )------------------------------------------------- */
|
|
|
|
|
2011-07-19 22:48:38 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Write file data into the big blob store table in MySQL. Returns the row
|
|
|
|
* ID as the file data handle.
|
|
|
|
*/
|
|
|
|
public function writeFile($data, array $params) {
|
|
|
|
$blob = new PhabricatorFileStorageBlob();
|
|
|
|
$blob->setData($data);
|
|
|
|
$blob->save();
|
|
|
|
|
|
|
|
return $blob->getID();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Load a stored blob from MySQL.
|
|
|
|
*/
|
|
|
|
public function readFile($handle) {
|
|
|
|
return $this->loadFromMySQLFileStorage($handle)->getData();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete a blob from MySQL.
|
|
|
|
*/
|
|
|
|
public function deleteFile($handle) {
|
|
|
|
$this->loadFromMySQLFileStorage($handle)->delete();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* -( Internals )---------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Load the Lisk object that stores the file data for a handle.
|
|
|
|
*
|
|
|
|
* @param string File data handle.
|
|
|
|
* @return PhabricatorFileStorageBlob Data DAO.
|
|
|
|
* @task internal
|
|
|
|
*/
|
|
|
|
private function loadFromMySQLFileStorage($handle) {
|
|
|
|
$blob = id(new PhabricatorFileStorageBlob())->load($handle);
|
|
|
|
if (!$blob) {
|
2015-05-22 17:27:56 +10:00
|
|
|
throw new Exception(pht("Unable to load MySQL blob file '%s'!", $handle));
|
2011-07-19 22:48:38 -07:00
|
|
|
}
|
|
|
|
return $blob;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|