1
0
Fork 0
forked from dlang/cdcdb

Добавлены описания

This commit is contained in:
Alexander Zhirov 2025-09-13 02:50:01 +03:00
parent 8716a90463
commit 8639c36f46
Signed by: alexander
GPG key ID: C8D8BE544A27C511
8 changed files with 388 additions and 34 deletions

View file

@ -1,27 +1,69 @@
import std.stdio;
import cdcdb;
import std.file : read, write;
import std.stdio : File, writeln;
import std.conv : to;
import std.stdio : writeln, File;
import std.file : exists, remove, read;
import zstd : Level;
void main()
{
auto storage = new Storage("/tmp/base.db", true, 22);
storage.newSnapshot("/tmp/text", cast(ubyte[]) read("/tmp/text"));
// Создаем временную базу для примера
string dbPath = "./bin/example.db";
// if (snapshot !is null) {
// writeln(cast(string) snapshot.data);
// snapshot.remove();
// }
// Инициализация Storage с компрессией Zstd
auto storage = new Storage(dbPath, true, Level.speed);
foreach (snapshot; storage.getSnapshots()) {
auto file = File("/tmp/restore" ~ snapshot.id.to!string, "wb");
snapshot.data((const(ubyte)[] content) {
file.rawWrite(content);
});
file.close();
// Настройка параметров CDC (опционально)
storage.setupCDC(256, 512, 1024, 0xFF, 0x0F);
// Тестовые данные
ubyte[] data1 = cast(ubyte[]) "Hello, cdcdb!".dup;
ubyte[] data2 = cast(ubyte[]) "Hello, updated cdcdb!".dup;
// Создание первого снимка
auto snap1 = storage.newSnapshot("example_file", data1, "Версия 1.0");
if (snap1)
{
writeln("Создан снимок с ID: ", snap1.id);
writeln("Метка: ", snap1.label);
writeln("Размер: ", snap1.length, " байт");
writeln("Статус: ", snap1.status);
}
// Создание второго снимка (обновление)
auto snap2 = storage.newSnapshot("example_file", data2, "Версия 2.0");
if (snap2)
{
writeln("Создан обновленный снимок с ID: ", snap2.id);
}
// Получение всех снимков по метке
auto snapshots = storage.getSnapshots("example_file");
writeln("Найдено снимков: ", snapshots.length);
// Восстановление данных из последнего снимка (потоково, для экономии памяти)
if (snapshots.length > 0)
{
auto lastSnap = snapshots[$ - 1]; // Последний снимок
File outFile = File("./bin/restored.txt", "wb");
lastSnap.data((const(ubyte)[] chunk) { outFile.rawWrite(chunk); });
outFile.close();
writeln("Данные восстановлены в restored.txt");
// Проверка хэша (опционально)
import std.digest.sha : digest, SHA256;
auto restoredData = cast(ubyte[]) read("./bin/restored.txt");
assert(restoredData == data2);
writeln("Хэш совпадает: ", lastSnap.sha256 == digest!SHA256(restoredData));
}
// Удаление снимков по метке
long deleted = storage.removeSnapshots("example_file");
writeln("Удалено снимков: ", deleted);
// Проверка: снимки удалены
auto remaining = storage.getSnapshots("example_file");
assert(remaining.length == 0);
writeln("Все снимки удалены.");
writeln("Версия библиотеки: ", storage.getVersion());
}

72
test/unittest.d Normal file
View file

@ -0,0 +1,72 @@
import cdcdb;
import std.file : read, write, remove, exists;
import std.path : buildPath;
import std.digest.sha : digest, SHA256;
import std.exception : assertThrown, assertNotThrown;
import std.datetime : DateTime;
import core.thread : Thread;
import core.time : msecs, seconds;
unittest
{
const string dbPath = "./bin/test_cdcdb.db";
if (exists(dbPath)) {
remove(dbPath);
}
// Тест конструктора Storage
auto storage = new Storage(dbPath, true, 22);
// Тест настройки CDC
storage.setupCDC(128, 256, 512, 0xFF, 0x0F);
// Тест создания снимка
ubyte[] data1 = cast(ubyte[]) "Hello, World!".dup;
auto snap1 = storage.newSnapshot("test_label", data1, "First snapshot");
assert(snap1 !is null);
assert(snap1.label == "test_label");
assert(snap1.length == data1.length);
assert(snap1.sha256 == digest!SHA256(data1));
assert(snap1.status == "ready");
assert(snap1.description == "First snapshot");
// Тест дубликата (не должен создать новый)
auto snapDup = storage.newSnapshot("test_label", data1);
assert(snapDup is null);
// Тест изменения данных
ubyte[] data2 = cast(ubyte[]) "Hello, Changed World!".dup;
auto snap2 = storage.newSnapshot("test_label", data2);
assert(snap2 !is null);
assert(snap2.sha256 == digest!SHA256(data2));
// Тест восстановления данных
auto restored = snap1.data();
assert(restored == data1);
bool streamedOk = false;
snap2.data((const(ubyte)[] chunk) {
assert(chunk == data2); // Поскольку маленький файл — один фрагмент
streamedOk = true;
});
assert(streamedOk);
// Тест getSnapshots
auto snaps = storage.getSnapshots("test_label");
assert(snaps.length == 2);
assert(snaps[0].id == snap1.id);
assert(snaps[1].id == snap2.id);
auto allSnaps = storage.getSnapshots();
assert(allSnaps.length == 2);
// Тест удаления
assert(snap1.remove());
snaps = storage.getSnapshots("test_label");
assert(snaps.length == 1);
assert(snaps[0].id == snap2.id);
// Тест пустых данных
assertThrown!Exception(storage.newSnapshot("empty", []));
}