| .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).