# cdcdb Библиотека для версионирования и хранения данных в SQLite с опорой на content-defined chunking (CDC). Алгоритм **FastCDC** используется для разбиения входного потока на чанки переменного размера, что обеспечивает эффективную дедупликацию и экономию места. Поддерживаются опциональное сжатие **Zstd**, транзакции и проверка целостности на основе **SHA-256**. Дополнительно фиксируется контекст выполнения при создании снимков (UID, RUID, процесс). Основные сценарии применения — резервное копирование и контроль версий файлов. ## Алгоритм FastCDC **FastCDC** — это алгоритм разделения данных на чанки переменной длины, основанный на скользящем хэшировании содержимого. Он использует таблицу **Gear** для вычисления "отпечатков" данных и выбирает точки разреза с учётом минимального, целевого и максимального размеров чанка. Такой подход позволяет эффективно выявлять изменения и сохранять только уникальные части данных. ## Архитектура и основные компоненты Библиотека разделена на несколько уровней: - **Storage** — фасад для работы с БД SQLite. Отвечает за разбиение данных (FastCDC), сохранение/удаление снимков, управление блобами и транзакциями. - **Snapshot** — объект-ссылка на конкретный снимок. Предоставляет доступ к данным (буфером или потоково), а также к метаданным и операциям удаления. - **Context** — структура с параметрами окружения (UID, RUID, имена пользователей, процесс), передаваемыми при создании снимка. ## Пример использования ```d 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. Чтобы создать новую таблицу: ```bash chmod +x ./tools/gen.d ./tools/gen.d > ./source/gear.d ``` ## Лицензия Boost Software License 1.0 (BSL-1.0).