Оптимизация
This commit is contained in:
		
							parent
							
								
									d93dc4d81b
								
							
						
					
					
						commit
						8716a90463
					
				
					 1 changed files with 30 additions and 30 deletions
				
			
		| 
						 | 
				
			
			@ -4,7 +4,7 @@ import cdcdb.dblite;
 | 
			
		|||
 | 
			
		||||
import zstd : uncompress;
 | 
			
		||||
 | 
			
		||||
import std.digest.sha : SHA256, digest, SHA256Digest;
 | 
			
		||||
import std.digest.sha : SHA256, digest;
 | 
			
		||||
import std.datetime : DateTime;
 | 
			
		||||
import std.exception : enforce;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -13,6 +13,25 @@ final class Snapshot
 | 
			
		|||
private:
 | 
			
		||||
	DBLite _db;
 | 
			
		||||
	DBSnapshot _snapshot;
 | 
			
		||||
 | 
			
		||||
	const(ubyte)[] getBytes(const ref DBSnapshotChunkData chunk)
 | 
			
		||||
	{
 | 
			
		||||
		ubyte[] bytes;
 | 
			
		||||
		if (chunk.zstd)
 | 
			
		||||
		{
 | 
			
		||||
			enforce(chunk.zSize == chunk.content.length, "Размер сжатого фрагмента не соответствует ожидаемому");
 | 
			
		||||
			bytes = cast(ubyte[]) uncompress(chunk.content);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			bytes = chunk.content.dup;
 | 
			
		||||
		}
 | 
			
		||||
		enforce(chunk.size == bytes.length, "Оригинальный размер не соответствует ожидаемому");
 | 
			
		||||
		enforce(chunk.sha256 == digest!SHA256(bytes), "Хеш-сумма фрагмента не совпадает");
 | 
			
		||||
 | 
			
		||||
		return bytes;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	this(DBLite dblite, DBSnapshot dbSnapshot)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -30,25 +49,18 @@ public:
 | 
			
		|||
	{
 | 
			
		||||
		auto chunks = _db.getChunks(_snapshot.id);
 | 
			
		||||
		ubyte[] content;
 | 
			
		||||
		content.reserve(_snapshot.sourceLength);
 | 
			
		||||
 | 
			
		||||
		auto fctx = SHA256();
 | 
			
		||||
 | 
			
		||||
		foreach (chunk; chunks)
 | 
			
		||||
		{
 | 
			
		||||
			ubyte[] bytes;
 | 
			
		||||
			if (chunk.zstd)
 | 
			
		||||
			{
 | 
			
		||||
				enforce(chunk.zSize == chunk.content.length, "Размер сжатого фрагмента не соответствует ожидаемому");
 | 
			
		||||
				bytes = cast(ubyte[]) uncompress(chunk.content);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				bytes = chunk.content;
 | 
			
		||||
			}
 | 
			
		||||
			enforce(chunk.size == bytes.length, "Оригинальный размер не соответствует ожидаемому");
 | 
			
		||||
			enforce(chunk.sha256 == digest!SHA256(bytes), "Хеш-сумма фрагмента не совпадает");
 | 
			
		||||
			const(ubyte)[] bytes = getBytes(chunk);
 | 
			
		||||
			content ~= bytes;
 | 
			
		||||
			fctx.put(bytes);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		enforce(_snapshot.sha256 == digest!SHA256(content), "Хеш-сумма файла не совпадает");
 | 
			
		||||
		enforce(_snapshot.sha256 == fctx.finish(), "Хеш-сумма файла не совпадает");
 | 
			
		||||
 | 
			
		||||
		return content;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -56,29 +68,16 @@ public:
 | 
			
		|||
	void data(void delegate(const(ubyte)[]) sink)
 | 
			
		||||
	{
 | 
			
		||||
		auto chunks = _db.getChunks(_snapshot.id);
 | 
			
		||||
		auto fctx = new SHA256Digest();
 | 
			
		||||
		auto fctx = SHA256();
 | 
			
		||||
 | 
			
		||||
		foreach (chunk; chunks)
 | 
			
		||||
		{
 | 
			
		||||
			ubyte[] bytes;
 | 
			
		||||
			if (chunk.zstd)
 | 
			
		||||
			{
 | 
			
		||||
				enforce(chunk.zSize == chunk.content.length, "Размер сжатого фрагмента не соответствует ожидаемому");
 | 
			
		||||
				bytes = cast(ubyte[]) uncompress(chunk.content);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				bytes = chunk.content;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			enforce(chunk.size == bytes.length, "Оригинальный размер не соответствует ожидаемому");
 | 
			
		||||
			enforce(chunk.sha256 == digest!SHA256(bytes), "Хеш-сумма фрагмента не совпадает");
 | 
			
		||||
 | 
			
		||||
			const(ubyte)[] bytes = getBytes(chunk);
 | 
			
		||||
			sink(bytes);
 | 
			
		||||
			fctx.put(bytes);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		enforce(_snapshot.sha256 = fctx.finish(), "Хеш-сумма файла не совпадает");
 | 
			
		||||
		enforce(_snapshot.sha256 == fctx.finish(), "Хеш-сумма файла не совпадает");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool remove()
 | 
			
		||||
| 
						 | 
				
			
			@ -132,6 +131,7 @@ public:
 | 
			
		|||
	@property string status() const
 | 
			
		||||
	{
 | 
			
		||||
		import std.conv : to;
 | 
			
		||||
 | 
			
		||||
		return _snapshot.status.to!string;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue