Добавлены описания
This commit is contained in:
		
							parent
							
								
									8716a90463
								
							
						
					
					
						commit
						8639c36f46
					
				
					 8 changed files with 388 additions and 34 deletions
				
			
		
							
								
								
									
										80
									
								
								test/app.d
									
										
									
									
									
								
							
							
						
						
									
										80
									
								
								test/app.d
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,27 +1,69 @@
 | 
			
		|||
import std.stdio;
 | 
			
		||||
 | 
			
		||||
import cdcdb;
 | 
			
		||||
 | 
			
		||||
import std.file : read, write;
 | 
			
		||||
import std.stdio : File, writeln;
 | 
			
		||||
import std.conv : to;
 | 
			
		||||
 | 
			
		||||
import std.stdio : writeln, File;
 | 
			
		||||
import std.file : exists, remove, read;
 | 
			
		||||
import zstd : Level;
 | 
			
		||||
 | 
			
		||||
void main()
 | 
			
		||||
{
 | 
			
		||||
	auto storage = new Storage("/tmp/base.db", true, 22);
 | 
			
		||||
	storage.newSnapshot("/tmp/text", cast(ubyte[]) read("/tmp/text"));
 | 
			
		||||
	// Создаем временную базу для примера
 | 
			
		||||
	string dbPath = "./bin/example.db";
 | 
			
		||||
 | 
			
		||||
	// if (snapshot !is null) {
 | 
			
		||||
	// 	writeln(cast(string) snapshot.data);
 | 
			
		||||
	// 	snapshot.remove();
 | 
			
		||||
	// }
 | 
			
		||||
	// Инициализация Storage с компрессией Zstd
 | 
			
		||||
	auto storage = new Storage(dbPath, true, Level.speed);
 | 
			
		||||
 | 
			
		||||
	foreach (snapshot; storage.getSnapshots()) {
 | 
			
		||||
		auto file = File("/tmp/restore" ~ snapshot.id.to!string, "wb");
 | 
			
		||||
		snapshot.data((const(ubyte)[] content) {
 | 
			
		||||
			file.rawWrite(content);
 | 
			
		||||
		});
 | 
			
		||||
		file.close();
 | 
			
		||||
	// Настройка параметров CDC (опционально)
 | 
			
		||||
	storage.setupCDC(256, 512, 1024, 0xFF, 0x0F);
 | 
			
		||||
 | 
			
		||||
	// Тестовые данные
 | 
			
		||||
	ubyte[] data1 = cast(ubyte[]) "Hello, cdcdb!".dup;
 | 
			
		||||
	ubyte[] data2 = cast(ubyte[]) "Hello, updated cdcdb!".dup;
 | 
			
		||||
 | 
			
		||||
	// Создание первого снимка
 | 
			
		||||
	auto snap1 = storage.newSnapshot("example_file", data1, "Версия 1.0");
 | 
			
		||||
	if (snap1)
 | 
			
		||||
	{
 | 
			
		||||
		writeln("Создан снимок с ID: ", snap1.id);
 | 
			
		||||
		writeln("Метка: ", snap1.label);
 | 
			
		||||
		writeln("Размер: ", snap1.length, " байт");
 | 
			
		||||
		writeln("Статус: ", snap1.status);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Создание второго снимка (обновление)
 | 
			
		||||
	auto snap2 = storage.newSnapshot("example_file", data2, "Версия 2.0");
 | 
			
		||||
	if (snap2)
 | 
			
		||||
	{
 | 
			
		||||
		writeln("Создан обновленный снимок с ID: ", snap2.id);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Получение всех снимков по метке
 | 
			
		||||
	auto snapshots = storage.getSnapshots("example_file");
 | 
			
		||||
	writeln("Найдено снимков: ", snapshots.length);
 | 
			
		||||
 | 
			
		||||
	// Восстановление данных из последнего снимка (потоково, для экономии памяти)
 | 
			
		||||
	if (snapshots.length > 0)
 | 
			
		||||
	{
 | 
			
		||||
		auto lastSnap = snapshots[$ - 1]; // Последний снимок
 | 
			
		||||
		File outFile = File("./bin/restored.txt", "wb");
 | 
			
		||||
		lastSnap.data((const(ubyte)[] chunk) { outFile.rawWrite(chunk); });
 | 
			
		||||
		outFile.close();
 | 
			
		||||
		writeln("Данные восстановлены в restored.txt");
 | 
			
		||||
 | 
			
		||||
		// Проверка хэша (опционально)
 | 
			
		||||
		import std.digest.sha : digest, SHA256;
 | 
			
		||||
 | 
			
		||||
		auto restoredData = cast(ubyte[]) read("./bin/restored.txt");
 | 
			
		||||
		assert(restoredData == data2);
 | 
			
		||||
		writeln("Хэш совпадает: ", lastSnap.sha256 == digest!SHA256(restoredData));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Удаление снимков по метке
 | 
			
		||||
	long deleted = storage.removeSnapshots("example_file");
 | 
			
		||||
	writeln("Удалено снимков: ", deleted);
 | 
			
		||||
 | 
			
		||||
	// Проверка: снимки удалены
 | 
			
		||||
	auto remaining = storage.getSnapshots("example_file");
 | 
			
		||||
	assert(remaining.length == 0);
 | 
			
		||||
	writeln("Все снимки удалены.");
 | 
			
		||||
 | 
			
		||||
	writeln("Версия библиотеки: ", storage.getVersion());
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										72
									
								
								test/unittest.d
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								test/unittest.d
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,72 @@
 | 
			
		|||
import cdcdb;
 | 
			
		||||
 | 
			
		||||
import std.file : read, write, remove, exists;
 | 
			
		||||
import std.path : buildPath;
 | 
			
		||||
import std.digest.sha : digest, SHA256;
 | 
			
		||||
import std.exception : assertThrown, assertNotThrown;
 | 
			
		||||
import std.datetime : DateTime;
 | 
			
		||||
import core.thread : Thread;
 | 
			
		||||
import core.time : msecs, seconds;
 | 
			
		||||
 | 
			
		||||
unittest
 | 
			
		||||
{
 | 
			
		||||
	const string dbPath = "./bin/test_cdcdb.db";
 | 
			
		||||
 | 
			
		||||
	if (exists(dbPath)) {
 | 
			
		||||
		remove(dbPath);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Тест конструктора Storage
 | 
			
		||||
	auto storage = new Storage(dbPath, true, 22);
 | 
			
		||||
 | 
			
		||||
	// Тест настройки CDC
 | 
			
		||||
	storage.setupCDC(128, 256, 512, 0xFF, 0x0F);
 | 
			
		||||
 | 
			
		||||
	// Тест создания снимка
 | 
			
		||||
	ubyte[] data1 = cast(ubyte[]) "Hello, World!".dup;
 | 
			
		||||
	auto snap1 = storage.newSnapshot("test_label", data1, "First snapshot");
 | 
			
		||||
	assert(snap1 !is null);
 | 
			
		||||
	assert(snap1.label == "test_label");
 | 
			
		||||
	assert(snap1.length == data1.length);
 | 
			
		||||
	assert(snap1.sha256 == digest!SHA256(data1));
 | 
			
		||||
	assert(snap1.status == "ready");
 | 
			
		||||
	assert(snap1.description == "First snapshot");
 | 
			
		||||
 | 
			
		||||
	// Тест дубликата (не должен создать новый)
 | 
			
		||||
	auto snapDup = storage.newSnapshot("test_label", data1);
 | 
			
		||||
	assert(snapDup is null);
 | 
			
		||||
 | 
			
		||||
	// Тест изменения данных
 | 
			
		||||
	ubyte[] data2 = cast(ubyte[]) "Hello, Changed World!".dup;
 | 
			
		||||
	auto snap2 = storage.newSnapshot("test_label", data2);
 | 
			
		||||
	assert(snap2 !is null);
 | 
			
		||||
	assert(snap2.sha256 == digest!SHA256(data2));
 | 
			
		||||
 | 
			
		||||
	// Тест восстановления данных
 | 
			
		||||
	auto restored = snap1.data();
 | 
			
		||||
	assert(restored == data1);
 | 
			
		||||
	bool streamedOk = false;
 | 
			
		||||
	snap2.data((const(ubyte)[] chunk) {
 | 
			
		||||
		assert(chunk == data2); // Поскольку маленький файл — один фрагмент
 | 
			
		||||
		streamedOk = true;
 | 
			
		||||
	});
 | 
			
		||||
	assert(streamedOk);
 | 
			
		||||
 | 
			
		||||
	// Тест getSnapshots
 | 
			
		||||
	auto snaps = storage.getSnapshots("test_label");
 | 
			
		||||
	assert(snaps.length == 2);
 | 
			
		||||
	assert(snaps[0].id == snap1.id);
 | 
			
		||||
	assert(snaps[1].id == snap2.id);
 | 
			
		||||
 | 
			
		||||
	auto allSnaps = storage.getSnapshots();
 | 
			
		||||
	assert(allSnaps.length == 2);
 | 
			
		||||
 | 
			
		||||
	// Тест удаления
 | 
			
		||||
	assert(snap1.remove());
 | 
			
		||||
	snaps = storage.getSnapshots("test_label");
 | 
			
		||||
	assert(snaps.length == 1);
 | 
			
		||||
	assert(snaps[0].id == snap2.id);
 | 
			
		||||
 | 
			
		||||
	// Тест пустых данных
 | 
			
		||||
	assertThrown!Exception(storage.newSnapshot("empty", []));
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue