1
0
Fork 0
forked from dlang/cdcdb
cdcdb/README.md

3.9 KiB
Raw Permalink Blame History

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