48ea6bb33d
CI / unit (8.2) (push) Has been cancelled
CI / unit (8.3) (push) Has been cancelled
CI / unit (8.4) (push) Has been cancelled
CI / integration (mariadb, 32) (push) Has been cancelled
CI / integration (mariadb, 33) (push) Has been cancelled
CI / integration (mariadb, 34) (push) Has been cancelled
CI / integration (mariadb, 35) (push) Has been cancelled
CI / integration (pgsql, 32) (push) Has been cancelled
CI / integration (pgsql, 33) (push) Has been cancelled
CI / integration (pgsql, 34) (push) Has been cancelled
CI / integration (pgsql, 35) (push) Has been cancelled
CI / integration (sqlite, 32) (push) Has been cancelled
CI / integration (sqlite, 33) (push) Has been cancelled
CI / integration (sqlite, 34) (push) Has been cancelled
CI / integration (sqlite, 35) (push) Has been cancelled
CI / integration-targets (push) Has been cancelled
Added tests/integration/targets-matrix.sh, which runs the full backup/restore round trip through files_external's AmazonS3 and SFTP backend classes (S3 via a disposable s3mock container, SFTP via atmoz/sftp), since the existing matrix only ever exercised the local backend. This caught a real bug: moving a snapshot to the trash read it from the location and streamed it straight back into a write on the same connection, which SFTP can't do reliably (phpseclib fails to interleave a read and a write on one connection). Backends now expose a native move() and the id-bound snapshot object is moved with that instead of a read+write copy; the path-bound database dump still goes through decrypt/re-encrypt, since its AEAD authentication is tied to its path.
42 lines
1.5 KiB
PHP
42 lines
1.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
// SPDX-FileCopyrightText: 2026 Dillard Blom
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
namespace OCA\NgBackup\Backend;
|
|
|
|
/**
|
|
* Minimal object store used by the repository. Paths are relative, '/'-separated.
|
|
* Implementations: a local directory (spike, tests), and adapters over files_external storages.
|
|
*/
|
|
interface IBackend {
|
|
/**
|
|
* Store an object; the stream is read to EOF. Takes ownership of the stream: it is always
|
|
* closed afterwards (some storages, like files_external's S3, close it themselves).
|
|
* Must not leave a partial object behind on failure.
|
|
*/
|
|
public function put(string $path, $stream): void;
|
|
|
|
/** @return resource readable stream of the whole object */
|
|
public function get(string $path);
|
|
|
|
/** @return string bytes [$offset, $offset + $length) of the object (used to fetch single blobs from a pack) */
|
|
public function getRange(string $path, int $offset, int $length): string;
|
|
|
|
public function exists(string $path): bool;
|
|
|
|
/**
|
|
* Move an object within the same location (used for the trash). Backends must use a native
|
|
* rename, not a read+write copy: some storages (e.g. SFTP) cannot reliably read and write on
|
|
* the same connection at once, since the read side is a lazily-pulled stream.
|
|
*/
|
|
public function move(string $from, string $to): void;
|
|
|
|
/** @return list<string> object paths below $prefix (recursive) */
|
|
public function list(string $prefix): array;
|
|
|
|
public function delete(string $path): void;
|
|
}
|