Merge pull request #2937 from nextcloud/remove-static-stream-wrapper

remove static:// stream wrapper
This commit is contained in:
Robin Appelman 2017-01-04 18:13:28 +01:00 committed by GitHub
commit 6a0f0403d0
8 changed files with 22 additions and 250 deletions

View file

@ -667,7 +667,6 @@ class OC {
}
// register the stream wrappers
stream_wrapper_register('static', 'OC\Files\Stream\StaticStream');
stream_wrapper_register('close', 'OC\Files\Stream\Close');
stream_wrapper_register('quota', 'OC\Files\Stream\Quota');

View file

@ -556,7 +556,6 @@ return array(
'OC\\Files\\Stream\\Close' => $baseDir . '/lib/private/Files/Stream/Close.php',
'OC\\Files\\Stream\\Encryption' => $baseDir . '/lib/private/Files/Stream/Encryption.php',
'OC\\Files\\Stream\\Quota' => $baseDir . '/lib/private/Files/Stream/Quota.php',
'OC\\Files\\Stream\\StaticStream' => $baseDir . '/lib/private/Files/Stream/StaticStream.php',
'OC\\Files\\Type\\Detection' => $baseDir . '/lib/private/Files/Type/Detection.php',
'OC\\Files\\Type\\Loader' => $baseDir . '/lib/private/Files/Type/Loader.php',
'OC\\Files\\Type\\TemplateManager' => $baseDir . '/lib/private/Files/Type/TemplateManager.php',

View file

@ -586,7 +586,6 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Files\\Stream\\Close' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Close.php',
'OC\\Files\\Stream\\Encryption' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Encryption.php',
'OC\\Files\\Stream\\Quota' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Quota.php',
'OC\\Files\\Stream\\StaticStream' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/StaticStream.php',
'OC\\Files\\Type\\Detection' => __DIR__ . '/../../..' . '/lib/private/Files/Type/Detection.php',
'OC\\Files\\Type\\Loader' => __DIR__ . '/../../..' . '/lib/private/Files/Type/Loader.php',
'OC\\Files\\Type\\TemplateManager' => __DIR__ . '/../../..' . '/lib/private/Files/Type/TemplateManager.php',

View file

@ -1,171 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <robin@icewind.nl>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
namespace OC\Files\Stream;
class StaticStream {
const MODE_FILE = 0100000;
public $context;
protected static $data = array();
protected $path = '';
protected $pointer = 0;
protected $writable = false;
public function stream_close() {
}
public function stream_eof() {
return $this->pointer >= strlen(self::$data[$this->path]);
}
public function stream_flush() {
}
public static function clear() {
self::$data = array();
}
public function stream_open($path, $mode, $options, &$opened_path) {
switch ($mode[0]) {
case 'r':
if (!isset(self::$data[$path])) return false;
$this->path = $path;
$this->writable = isset($mode[1]) && $mode[1] == '+';
break;
case 'w':
self::$data[$path] = '';
$this->path = $path;
$this->writable = true;
break;
case 'a':
if (!isset(self::$data[$path])) self::$data[$path] = '';
$this->path = $path;
$this->writable = true;
$this->pointer = strlen(self::$data[$path]);
break;
case 'x':
if (isset(self::$data[$path])) return false;
$this->path = $path;
$this->writable = true;
break;
case 'c':
if (!isset(self::$data[$path])) self::$data[$path] = '';
$this->path = $path;
$this->writable = true;
break;
default:
return false;
}
$opened_path = $this->path;
return true;
}
public function stream_read($count) {
$bytes = min(strlen(self::$data[$this->path]) - $this->pointer, $count);
$data = substr(self::$data[$this->path], $this->pointer, $bytes);
$this->pointer += $bytes;
return $data;
}
public function stream_seek($offset, $whence = SEEK_SET) {
$len = strlen(self::$data[$this->path]);
switch ($whence) {
case SEEK_SET:
if ($offset <= $len) {
$this->pointer = $offset;
return true;
}
break;
case SEEK_CUR:
if ($this->pointer + $offset <= $len) {
$this->pointer += $offset;
return true;
}
break;
case SEEK_END:
if ($len + $offset <= $len) {
$this->pointer = $len + $offset;
return true;
}
break;
}
return false;
}
public function stream_stat() {
return $this->url_stat($this->path);
}
public function stream_tell() {
return $this->pointer;
}
public function stream_write($data) {
if (!$this->writable) return 0;
$size = strlen($data);
if ($this->stream_eof()) {
self::$data[$this->path] .= $data;
} else {
self::$data[$this->path] = substr_replace(
self::$data[$this->path],
$data,
$this->pointer
);
}
$this->pointer += $size;
return $size;
}
public function unlink($path) {
if (isset(self::$data[$path])) {
unset(self::$data[$path]);
}
return true;
}
public function url_stat($path) {
if (isset(self::$data[$path])) {
$size = strlen(self::$data[$path]);
$time = time();
$data = array(
'dev' => 0,
'ino' => 0,
'mode' => self::MODE_FILE | 0777,
'nlink' => 1,
'uid' => 0,
'gid' => 0,
'rdev' => '',
'size' => $size,
'atime' => $time,
'mtime' => $time,
'ctime' => $time,
'blksize' => -1,
'blocks' => -1,
);
return array_values($data) + $data;
}
return false;
}
}

View file

@ -10,6 +10,7 @@ namespace Test\DB;
use Doctrine\DBAL\Platforms\SqlitePlatform;
use OC_DB;
use OCP\ITempManager;
use OCP\Security\ISecureRandom;
use Test\TestCase;
@ -19,14 +20,20 @@ use Test\TestCase;
* @group DB
*/
class DBSchemaTest extends TestCase {
protected $schema_file = 'static://test_db_scheme';
protected $schema_file2 = 'static://test_db_scheme2';
protected $schema_file;
protected $schema_file2;
protected $table1;
protected $table2;
/** @var ITempManager */
protected $tempManager;
protected function setUp() {
parent::setUp();
$this->tempManager = \OC::$server->getTempManager();
$this->schema_file = $this->tempManager->getTemporaryFile();
$this->schema_file2 = $this->tempManager->getTemporaryFile();
$dbfile = \OC::$SERVERROOT.'/tests/data/db_structure.xml';
$dbfile2 = \OC::$SERVERROOT.'/tests/data/db_structure2.xml';
@ -73,7 +80,7 @@ class DBSchemaTest extends TestCase {
}
public function doTestSchemaDumping() {
$outfile = 'static://db_out.xml';
$outfile = $this->tempManager->getTemporaryFile();
OC_DB::getDbStructure($outfile);
$content = file_get_contents($outfile);
$this->assertContains($this->table1, $content);

View file

@ -18,9 +18,14 @@ use OC_DB;
class LegacyDBTest extends \Test\TestCase {
protected $backupGlobals = FALSE;
protected static $schema_file = 'static://test_db_scheme';
protected static $schema_file;
protected $test_prefix;
public static function setUpBeforeClass() {
self::$schema_file = \OC::$server->getTempManager()->getTemporaryFile();
}
/**
* @var string
*/

View file

@ -47,9 +47,13 @@ class SchemaDiffTest extends TestCase {
/** @var string */
private $testPrefix;
private $schemaFile;
protected function setUp() {
parent::setUp();
$this->schemaFile = \OC::$server->getTempManager()->getTemporaryFile();
$this->config = \OC::$server->getConfig();
$this->connection = \OC::$server->getDatabaseConnection();
$this->manager = new MDB2SchemaManager($this->connection);
@ -57,7 +61,7 @@ class SchemaDiffTest extends TestCase {
}
protected function tearDown() {
$this->manager->removeDBStructure('static://test_db_scheme');
$this->manager->removeDBStructure($this->schemaFile);
parent::tearDown();
}
@ -68,7 +72,7 @@ class SchemaDiffTest extends TestCase {
public function testZeroChangeOnSchemaMigrations($xml) {
$xml = str_replace( '*dbprefix*', $this->testPrefix, $xml );
$schemaFile = 'static://test_db_scheme';
$schemaFile = $this->schemaFile;
file_put_contents($schemaFile, $xml);
// apply schema

View file

@ -1,70 +0,0 @@
<?php
/**
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace Test\Files\Stream;
class StaticStreamTest extends \Test\TestCase {
private $sourceFile;
private $sourceText;
protected function setUp() {
parent::setUp();
$this->sourceFile = \OC::$SERVERROOT . '/tests/data/lorem.txt';
$this->sourceText = file_get_contents($this->sourceFile);
}
protected function tearDown() {
\OC\Files\Stream\StaticStream::clear();
parent::tearDown();
}
public function testContent() {
file_put_contents('static://foo', $this->sourceText);
$this->assertEquals($this->sourceText, file_get_contents('static://foo'));
}
public function testMultipleFiles() {
file_put_contents('static://foo', $this->sourceText);
file_put_contents('static://bar', strrev($this->sourceText));
$this->assertEquals($this->sourceText, file_get_contents('static://foo'));
$this->assertEquals(strrev($this->sourceText), file_get_contents('static://bar'));
}
public function testOverwrite() {
file_put_contents('static://foo', $this->sourceText);
file_put_contents('static://foo', 'qwerty');
$this->assertEquals('qwerty', file_get_contents('static://foo'));
}
public function testIsFile() {
$this->assertFalse(is_file('static://foo'));
file_put_contents('static://foo', $this->sourceText);
$this->assertTrue(is_file('static://foo'));
}
public function testIsDir() {
$this->assertFalse(is_dir('static://foo'));
file_put_contents('static://foo', $this->sourceText);
$this->assertFalse(is_dir('static://foo'));
}
public function testFileType() {
file_put_contents('static://foo', $this->sourceText);
$this->assertEquals('file', filetype('static://foo'));
}
public function testUnlink() {
$this->assertFalse(file_exists('static://foo'));
file_put_contents('static://foo', $this->sourceText);
$this->assertTrue(file_exists('static://foo'));
unlink('static://foo');
clearstatcache();
$this->assertFalse(file_exists('static://foo'));
}
}