diff options
author | Robin Appelman <robin@icewind.nl> | 2016-08-08 15:50:15 +0200 |
---|---|---|
committer | Robin Appelman <robin@icewind.nl> | 2016-11-16 15:30:36 +0100 |
commit | eefd0597166b26b85690fba784d843486badefef (patch) | |
tree | a5219f4337ead2e52edf749692e6cbf41d2d1e45 /lib/private | |
parent | 64e896cc0d9624718ec4e8753b6b58b242a7a2d5 (diff) | |
download | nextcloud-server-eefd0597166b26b85690fba784d843486badefef.tar.gz nextcloud-server-eefd0597166b26b85690fba784d843486badefef.zip |
add amazon s3 objectstore backend
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'lib/private')
-rw-r--r-- | lib/private/Files/ObjectStore/S3.php | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/lib/private/Files/ObjectStore/S3.php b/lib/private/Files/ObjectStore/S3.php new file mode 100644 index 00000000000..641c1722b58 --- /dev/null +++ b/lib/private/Files/ObjectStore/S3.php @@ -0,0 +1,116 @@ +<?php +/** + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * 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 + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OC\Files\ObjectStore; + +use Guzzle\Http\EntityBody; +use Guzzle\Http\Message\RequestInterface; +use Guzzle\Service\Command\CommandInterface; +use Guzzle\Stream\PhpStreamRequestFactory; +use Icewind\Streams\CallbackWrapper; +use OCP\Files\ObjectStore\IObjectStore; + +// TODO: proper composer +set_include_path(get_include_path() . PATH_SEPARATOR . + \OC_App::getAppPath('files_external') . '/3rdparty/aws-sdk-php'); +require_once 'aws-autoloader.php'; + +class S3 implements IObjectStore { + use S3ConnectionTrait; + + public function __construct($parameters) { + $this->parseParams($parameters); + } + + /** + * @return string the container or bucket name where objects are stored + * @since 7.0.0 + */ + function getStorageId() { + return $this->id; + } + + /** + * Serialize and sign a command, returning a request object + * + * @param CommandInterface $command Command to sign + * + * @return RequestInterface + */ + protected function getSignedRequest($command) { + $request = $command->prepare(); + $request->dispatch('request.before_send', array('request' => $request)); + + return $request; + } + + /** + * @param string $urn the unified resource name used to identify the object + * @return resource stream with the read data + * @throws \Exception when something goes wrong, message will be logged + * @since 7.0.0 + */ + function readObject($urn) { + // Create the command and serialize the request + $request = $this->getSignedRequest($this->getConnection()->getCommand('GetObject', [ + 'Bucket' => $this->bucket, + 'Key' => $urn + ])); + // Create a stream that uses the EntityBody object + $factory = new PhpStreamRequestFactory(); + /** @var EntityBody $body */ + $body = $factory->fromRequest($request, array(), array('stream_class' => 'Guzzle\Http\EntityBody')); + $stream = $body->getStream(); + + // we need to keep the guzzle request in scope untill the stream is closed + return CallbackWrapper::wrap($stream, null, null, function () use ($body) { + $body->close(); + }); + } + + /** + * @param string $urn the unified resource name used to identify the object + * @param resource $stream stream with the data to write + * @throws \Exception when something goes wrong, message will be logged + * @since 7.0.0 + */ + function writeObject($urn, $stream) { + $this->getConnection()->putObject([ + 'Bucket' => $this->bucket, + 'Key' => $urn, + 'Body' => $stream + ]); + } + + /** + * @param string $urn the unified resource name used to identify the object + * @return void + * @throws \Exception when something goes wrong, message will be logged + * @since 7.0.0 + */ + function deleteObject($urn) { + $this->getConnection()->deleteObject([ + 'Bucket' => $this->bucket, + 'Key' => $urn + ]); + } + +} |