postpone the cost of setting up some of the external storage backends untill we actually need it

This commit is contained in:
Robin Appelman 2012-10-21 22:04:45 +02:00
parent 5217ca219a
commit 33cabcf590
6 changed files with 81 additions and 8 deletions

View File

@ -50,6 +50,7 @@ class FTP extends \OC\Files\Storage\StreamWrapper{
return $url;
}
public function fopen($path,$mode) {
$this->init();
switch($mode) {
case 'r':
case 'rb':
@ -86,6 +87,7 @@ class FTP extends \OC\Files\Storage\StreamWrapper{
}
public function writeBack($tmpFile) {
$this->init();
if(isset(self::$tempFiles[$tmpFile])) {
$this->uploadFile($tmpFile,self::$tempFiles[$tmpFile]);
unlink($tmpFile);

View File

@ -35,11 +35,6 @@ class SMB extends \OC\Files\Storage\StreamWrapper{
if(substr($this->share,-1,1)=='/') {
$this->share=substr($this->share,0,-1);
}
//create the root folder if necesary
if(!$this->is_dir('')) {
$this->mkdir('');
}
}
public function getId(){
@ -54,6 +49,7 @@ class SMB extends \OC\Files\Storage\StreamWrapper{
}
public function stat($path) {
$this->init();
if(!$path and $this->root=='/') {//mtime doesn't work for shares
$mtime=$this->shareMTime();
$stat=stat($this->constructUrl($path));
@ -75,6 +71,7 @@ class SMB extends \OC\Files\Storage\StreamWrapper{
* @return bool
*/
public function hasUpdated($path,$time) {
$this->init();
if(!$path and $this->root=='/') {
//mtime doesn't work for shares, but giving the nature of the backend, doing a full update is still just fast enough
return true;

View File

@ -9,13 +9,29 @@
namespace OC\Files\Storage;
abstract class StreamWrapper extends \OC\Files\Storage\Common{
private $ready = false;
protected function init(){
if($this->ready){
return;
}
$this->ready = true;
//create the root folder if necesary
if(!$this->is_dir('')) {
$this->mkdir('');
}
}
abstract public function constructUrl($path);
public function mkdir($path) {
$this->init();
return mkdir($this->constructUrl($path));
}
public function rmdir($path) {
$this->init();
if($this->file_exists($path)) {
$succes=rmdir($this->constructUrl($path));
clearstatcache();
@ -26,10 +42,12 @@ abstract class StreamWrapper extends \OC\Files\Storage\Common{
}
public function opendir($path) {
$this->init();
return opendir($this->constructUrl($path));
}
public function filetype($path) {
$this->init();
return filetype($this->constructUrl($path));
}
@ -42,16 +60,19 @@ abstract class StreamWrapper extends \OC\Files\Storage\Common{
}
public function file_exists($path) {
$this->init();
return file_exists($this->constructUrl($path));
}
public function unlink($path) {
$this->init();
$succes=unlink($this->constructUrl($path));
clearstatcache();
return $succes;
}
public function fopen($path,$mode) {
$this->init();
return fopen($this->constructUrl($path),$mode);
}
@ -60,6 +81,7 @@ abstract class StreamWrapper extends \OC\Files\Storage\Common{
}
public function touch($path,$mtime=null) {
$this->init();
if(is_null($mtime)) {
$fh=$this->fopen($path,'a');
fwrite($fh,'');
@ -70,18 +92,22 @@ abstract class StreamWrapper extends \OC\Files\Storage\Common{
}
public function getFile($path,$target) {
$this->init();
return copy($this->constructUrl($path),$target);
}
public function uploadFile($path,$target) {
$this->init();
return copy($path,$this->constructUrl($target));
}
public function rename($path1,$path2) {
$this->init();
return rename($this->constructUrl($path1),$this->constructUrl($path2));
}
public function stat($path) {
$this->init();
return stat($this->constructUrl($path));
}

View File

@ -17,6 +17,7 @@ class SWIFT extends \OC\Files\Storage\Common{
private $user;
private $token;
private $secure;
private $ready = false;
/**
* @var \CF_Authentication auth
*/
@ -188,7 +189,7 @@ class SWIFT extends \OC\Files\Storage\Common{
/**
* add an emulated sub container
* @param CF_Container $container
* @param \CF_Container $container
* @param string $name
* @return bool
*/
@ -222,7 +223,7 @@ class SWIFT extends \OC\Files\Storage\Common{
/**
* remove an emulated sub container
* @param CF_Container $container
* @param \CF_Container $container
* @param string $name
* @return bool
*/
@ -279,6 +280,15 @@ class SWIFT extends \OC\Files\Storage\Common{
if(!$this->root || $this->root[0]!='/') {
$this->root='/'.$this->root;
}
}
private function init(){
if($this->ready){
return;
}
$this->ready = true;
$this->auth = new \CF_Authentication($this->user, $this->token, null, $this->host);
$this->auth->authenticate();
@ -297,6 +307,7 @@ class SWIFT extends \OC\Files\Storage\Common{
public function mkdir($path) {
$this->init();
if($this->containerExists($path)) {
return false;
}else{
@ -306,6 +317,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
public function rmdir($path) {
$this->init();
if(!$this->containerExists($path)) {
return false;
}else{
@ -343,6 +355,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
public function opendir($path) {
$this->init();
$container=$this->getContainer($path);
$files=$this->getObjects($container);
$i=array_search(self::SUBCONTAINER_FILE,$files);
@ -357,6 +370,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
public function filetype($path) {
$this->init();
if($this->containerExists($path)) {
return 'dir';
}else{
@ -373,6 +387,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
public function file_exists($path) {
$this->init();
if($this->is_dir($path)) {
return true;
}else{
@ -381,6 +396,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
public function file_get_contents($path) {
$this->init();
$obj=$this->getObject($path);
if(is_null($obj)) {
return false;
@ -389,6 +405,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
public function file_put_contents($path,$content) {
$this->init();
$obj=$this->getObject($path);
if(is_null($obj)) {
$container=$this->getContainer(dirname($path));
@ -402,6 +419,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
public function unlink($path) {
$this->init();
if($this->containerExists($path)) {
return $this->rmdir($path);
}
@ -415,6 +433,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
public function fopen($path,$mode) {
$this->init();
switch($mode) {
case 'r':
case 'rb':
@ -458,6 +477,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
public function touch($path,$mtime=null) {
$this->init();
$obj=$this->getObject($path);
if(is_null($obj)) {
return false;
@ -472,6 +492,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
public function rename($path1,$path2) {
$this->init();
$sourceContainer=$this->getContainer(dirname($path1));
$targetContainer=$this->getContainer(dirname($path2));
$result=$sourceContainer->move_object_to(basename($path1),$targetContainer,basename($path2));
@ -484,6 +505,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
public function copy($path1,$path2) {
$this->init();
$sourceContainer=$this->getContainer(dirname($path1));
$targetContainer=$this->getContainer(dirname($path2));
$result=$sourceContainer->copy_object_to(basename($path1),$targetContainer,basename($path2));
@ -495,6 +517,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
public function stat($path) {
$this->init();
$container=$this->getContainer($path);
if (!is_null($container)) {
return array(
@ -521,6 +544,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
private function getTmpFile($path) {
$this->init();
$obj=$this->getObject($path);
if(!is_null($obj)) {
$tmpFile=\OCP\Files::tmpFile();
@ -532,6 +556,7 @@ class SWIFT extends \OC\Files\Storage\Common{
}
private function fromTmpFile($tmpFile,$path) {
$this->init();
$obj=$this->getObject($path);
if(is_null($obj)) {
$obj=$this->createObject($path);

View File

@ -14,6 +14,7 @@ class DAV extends \OC\Files\Storage\Common{
private $host;
private $secure;
private $root;
private $ready;
/**
* @var \Sabre_DAV_Client
*/
@ -37,6 +38,13 @@ class DAV extends \OC\Files\Storage\Common{
if(substr($this->root,-1,1)!='/') {
$this->root.='/';
}
}
private function init(){
if($this->ready){
return;
}
$this->ready = true;
$settings = array(
'baseUri' => $this->createBaseUri(),
@ -70,16 +78,19 @@ class DAV extends \OC\Files\Storage\Common{
}
public function mkdir($path) {
$this->init();
$path=$this->cleanPath($path);
return $this->simpleResponse('MKCOL',$path,null,201);
}
public function rmdir($path) {
$this->init();
$path=$this->cleanPath($path);
return $this->simpleResponse('DELETE',$path,null,204);
}
public function opendir($path) {
$this->init();
$path=$this->cleanPath($path);
try{
$response=$this->client->propfind($path, array(),1);
@ -98,6 +109,7 @@ class DAV extends \OC\Files\Storage\Common{
}
public function filetype($path) {
$this->init();
$path=$this->cleanPath($path);
try{
$response=$this->client->propfind($path, array('{DAV:}resourcetype'));
@ -119,6 +131,7 @@ class DAV extends \OC\Files\Storage\Common{
}
public function file_exists($path) {
$this->init();
$path=$this->cleanPath($path);
try{
$this->client->propfind($path, array('{DAV:}resourcetype'));
@ -129,10 +142,12 @@ class DAV extends \OC\Files\Storage\Common{
}
public function unlink($path) {
$this->init();
return $this->simpleResponse('DELETE',$path,null,204);
}
public function fopen($path,$mode) {
$this->init();
$path=$this->cleanPath($path);
switch($mode) {
case 'r':
@ -187,6 +202,7 @@ class DAV extends \OC\Files\Storage\Common{
}
public function free_space($path) {
$this->init();
$path=$this->cleanPath($path);
try{
$response=$this->client->propfind($path, array('{DAV:}quota-available-bytes'));
@ -201,6 +217,7 @@ class DAV extends \OC\Files\Storage\Common{
}
public function touch($path,$mtime=null) {
$this->init();
if(is_null($mtime)) {
$mtime=time();
}
@ -209,11 +226,13 @@ class DAV extends \OC\Files\Storage\Common{
}
public function getFile($path,$target) {
$this->init();
$source=$this->fopen($path,'r');
file_put_contents($target,$source);
}
public function uploadFile($path,$target) {
$this->init();
$source=fopen($path,'r');
$curl = curl_init();
@ -228,6 +247,7 @@ class DAV extends \OC\Files\Storage\Common{
}
public function rename($path1,$path2) {
$this->init();
$path1=$this->cleanPath($path1);
$path2=$this->root.$this->cleanPath($path2);
try{
@ -239,6 +259,7 @@ class DAV extends \OC\Files\Storage\Common{
}
public function copy($path1,$path2) {
$this->init();
$path1=$this->cleanPath($path1);
$path2=$this->root.$this->cleanPath($path2);
try{
@ -250,6 +271,7 @@ class DAV extends \OC\Files\Storage\Common{
}
public function stat($path) {
$this->init();
$path=$this->cleanPath($path);
try{
$response=$this->client->propfind($path, array('{DAV:}getlastmodified','{DAV:}getcontentlength'));
@ -263,6 +285,7 @@ class DAV extends \OC\Files\Storage\Common{
}
public function getMimeType($path) {
$this->init();
$path=$this->cleanPath($path);
try{
$response=$this->client->propfind($path, array('{DAV:}getcontenttype','{DAV:}resourcetype'));

View File

@ -30,7 +30,7 @@ return array(
'root'=>'/',
),
'smb'=>array(
'run'=>false,
'run'=>true,
'user'=>'test',
'password'=>'test',
'host'=>'localhost',