.vscode | ||
source/cdcdb | ||
test | ||
tools | ||
.gitignore | ||
CHANGELOG.md | ||
dub.json | ||
dub.selections.json | ||
LICENSE | ||
README.md |
cdcdb
Библиотека для версионирования и хранения данных в SQLite с опорой на content-defined chunking (CDC). Алгоритм FastCDC используется для разбиения входного потока на чанки переменного размера, что обеспечивает эффективную дедупликацию и экономию места. Поддерживаются опциональное сжатие Zstd, транзакции и проверка целостности на основе SHA-256. Дополнительно фиксируется контекст выполнения при создании снимков (UID, RUID, процесс). Основные сценарии применения — резервное копирование и контроль версий файлов.
Алгоритм FastCDC
FastCDC — это алгоритм разделения данных на чанки переменной длины, основанный на скользящем хэшировании содержимого. Он использует таблицу Gear для вычисления "отпечатков" данных и выбирает точки разреза с учётом минимального, целевого и максимального размеров чанка. Такой подход позволяет эффективно выявлять изменения и сохранять только уникальные части данных.
Архитектура и основные компоненты
Библиотека разделена на несколько уровней:
- Storage — фасад для работы с БД SQLite. Отвечает за разбиение данных (FastCDC), сохранение/удаление снимков, управление блобами и транзакциями.
- Snapshot — объект-ссылка на конкретный снимок. Предоставляет доступ к данным (буфером или потоково), а также к метаданным и операциям удаления.
- Context — структура с параметрами окружения (UID, RUID, имена пользователей, процесс), передаваемыми при создании снимка.
Пример использования
import cdcdb;
import std.stdio : writeln, File;
void main()
{
string dbPath = "example.db";
// Storage с Zstd-сжатием
auto storage = new Storage(dbPath, true, 22);
// Контекст
Context ctx = Context(1000, 1000, "user", "user", "example");
// Новый снимок
ubyte[] data = cast(ubyte[]) "Hello, cdcdb!".dup;
auto snap = storage.newSnapshot("example_file", data, ctx, "Версия 1.0");
if (snap)
{
writeln("Создан снимок: ID=", snap.id, ", Файл=", snap.file);
}
// Восстановление через потоковую запись
auto snapshots = storage.getSnapshots("example_file");
if (snapshots.length > 0)
{
auto lastSnap = snapshots[0];
File outFile = File("restored.txt", "wb");
lastSnap.data((const(ubyte)[] chunk) => outFile.rawWrite(chunk));
outFile.close();
writeln("Данные восстановлены в restored.txt");
}
// Удаление
long deleted = storage.removeSnapshots("example_file");
writeln("Удалено снимков: ", deleted);
}
Инструменты
В директории tools
есть скрипт на D для генерации таблицы Gear, используемой FastCDC.
Чтобы создать новую таблицу:
chmod +x ./tools/gen.d
./tools/gen.d > ./source/gear.d
Лицензия
Boost Software License 1.0 (BSL-1.0).