# cdcdb Библиотека для хранения и управления снимками текстовых данных в базе SQLite. Использует механизм content-defined chunking (CDC) на основе алгоритма FastCDC для разделения данных на чанки переменного размера, что обеспечивает эффективную дедупликацию. Поддерживает опциональную компрессию Zstd, транзакции и проверку целостности данных через SHA-256. Основное применение — резервное копирование и версионирование текстовых файлов с минимизацией занимаемого пространства. ## Алгоритм FastCDC FastCDC — это алгоритм разделения данных на чанки переменного размера, основанный на хэшировании содержимого. Он использует таблицу Gear для вычисления "отпечатков" данных, определяя точки разделения с учетом минимального, целевого и максимального размеров чанка. Это позволяет эффективно выявлять изменения в данных и хранить только уникальные чанки, снижая объем хранилища. ## Основные классы ### Storage Класс для работы с базой SQLite и управления снимками. - **Конструктор**: Инициализирует подключение к базе SQLite. - **Методы**: - `newSnapshot`: Создает снимок данных. Возвращает объект `Snapshot` или `null`, если данные совпадают с последним снимком. - `getSnapshots`: Получает список снимков (все или по метке). Возвращает массив объектов `Snapshot`. - `getSnapshot`: Получает снимок по ID. Возвращает объект `Snapshot`. - `setupCDC`: Настраивает параметры разделения данных CDC. Ничего не возвращает. - `getVersion`: Возвращает строку с версией библиотеки (например, "0.0.2"). - `removeSnapshots`: Удаляет снимки по метке, ID или объекту Snapshot. Возвращает количество удаленных снимков (для метки) или `true`/`false` (для ID или объекта). ### Snapshot Класс для работы с отдельным снимком данных. - **Конструктор**: Создает объект снимка для работы с данными по его ID. - **Методы**: - `data`: Извлекает полные данные снимка. Возвращает массив байтов (`ubyte[]`). - `data`: Извлекает данные снимка потоково через делегат. Ничего не возвращает. - `remove`: Удаляет снимок из базы. Возвращает `true` при успешном удалении, иначе `false`. - **Свойства**: - `id`: ID снимка (long). - `label`: Метка снимка (string). - `created`: Временная метка создания (UTC, `DateTime`). - `length`: Длина исходных данных (long). - `sha256`: Хэш SHA-256 данных (ubyte[32]). - `status`: Статус снимка ("pending" или "ready"). - `description`: Описание снимка (string). ## Пример использования ```d import cdcdb; import std.stdio : writeln, File; import std.file : exists, remove; import zstd : Level; void main() { // Создаем базу string dbPath = "example.db"; // Инициализация Storage с компрессией Zstd auto storage = new Storage(dbPath, true, Level.speed); // Создание снимка ubyte[] data = cast(ubyte[]) "Hello, cdcdb!".dup; auto snap = storage.newSnapshot("example_file", data, "Версия 1.0"); if (snap) { writeln("Создан снимок: ID=", snap.id, ", Метка=", snap.label); } // Восстановление данных 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 ``` ## Установка - **В `dub.json`**: ```json "dependencies": { "cdcdb": "~>0.1.0" } ``` - **Сборка**: `dub build`. ## Лицензия Boost Software License 1.0 (BSL-1.0).