Небольшая оптимизация
This commit is contained in:
		
							parent
							
								
									c8d21bc3ce
								
							
						
					
					
						commit
						4f735abae7
					
				
					 3 changed files with 52 additions and 34 deletions
				
			
		| 
						 | 
					@ -22,44 +22,42 @@ private:
 | 
				
			||||||
	DBLite _db;
 | 
						DBLite _db;
 | 
				
			||||||
	bool _zstd;
 | 
						bool _zstd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ubyte[] buildContent(const ref Snapshot snapshot)
 | 
						size_t _minSize;
 | 
				
			||||||
	{
 | 
						size_t _normalSize;
 | 
				
			||||||
		auto dataChunks = _db.getChunks(snapshot.id);
 | 
						size_t _maxSize;
 | 
				
			||||||
		ubyte[] content;
 | 
						size_t _maskS;
 | 
				
			||||||
 | 
						size_t _maskL;
 | 
				
			||||||
		foreach (chunk; dataChunks) {
 | 
						CDC _cdc;
 | 
				
			||||||
			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, "Оригинальный размер не соответствует ожидаемому");
 | 
					 | 
				
			||||||
			content ~= bytes;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		enforce(snapshot.fileSha256 == digest!SHA256(content), "Хеш-сумма файла не совпадает");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return content;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
	this(string database, bool zstd = false)
 | 
						this(
 | 
				
			||||||
	{
 | 
							string database,
 | 
				
			||||||
 | 
							bool zstd = false,
 | 
				
			||||||
 | 
							size_t minSize = 256,
 | 
				
			||||||
 | 
							size_t normalSize = 512,
 | 
				
			||||||
 | 
							size_t maxSize = 1024,
 | 
				
			||||||
 | 
							size_t maskS = 0xFF,
 | 
				
			||||||
 | 
							size_t maskL = 0x0F
 | 
				
			||||||
 | 
						) {
 | 
				
			||||||
		_db = new DBLite(database);
 | 
							_db = new DBLite(database);
 | 
				
			||||||
		_zstd = zstd;
 | 
							_zstd = zstd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							_minSize = minSize;
 | 
				
			||||||
 | 
							_normalSize = normalSize;
 | 
				
			||||||
 | 
							_maxSize = maxSize;
 | 
				
			||||||
 | 
							_maskS = maskS;
 | 
				
			||||||
 | 
							_maskL = maskL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							_cdc = new CDC(_minSize, _normalSize, _maxSize, _maskS, _maskL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	size_t newSnapshot(string filePath, string label, const(ubyte)[] data)
 | 
						size_t newSnapshot(string filePath, const(ubyte)[] data, string label = string.init)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ubyte[32] hashSource = digest!SHA256(data);
 | 
							ubyte[32] hashSource = digest!SHA256(data);
 | 
				
			||||||
		// Сделать запрос в БД по filePath и сверить хеш файлов
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Если последний снимок файла соответствует текущему
 | 
				
			||||||
		if (_db.isLast(filePath, hashSource)) return 0;
 | 
							if (_db.isLast(filePath, hashSource)) return 0;
 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Параметры для CDC вынести в отдельные настройки (продумать)
 | 
					 | 
				
			||||||
		auto cdc = new CDC(256, 512, 1024, 0xFF, 0x0F);
 | 
					 | 
				
			||||||
		// Разбить на фрагменты
 | 
							// Разбить на фрагменты
 | 
				
			||||||
		auto chunks = cdc.split(data);
 | 
							auto chunks = _cdc.split(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Snapshot snapshot;
 | 
							Snapshot snapshot;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,6 +65,11 @@ public:
 | 
				
			||||||
		snapshot.fileSha256 = hashSource;
 | 
							snapshot.fileSha256 = hashSource;
 | 
				
			||||||
		snapshot.label = label;
 | 
							snapshot.label = label;
 | 
				
			||||||
		snapshot.sourceLength = data.length;
 | 
							snapshot.sourceLength = data.length;
 | 
				
			||||||
 | 
							snapshot.algoMin = _minSize;
 | 
				
			||||||
 | 
							snapshot.algoNormal = _normalSize;
 | 
				
			||||||
 | 
							snapshot.algoMax = _maxSize;
 | 
				
			||||||
 | 
							snapshot.maskS = _maskS;
 | 
				
			||||||
 | 
							snapshot.maskL = _maskL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		_db.beginImmediate();
 | 
							_db.beginImmediate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -133,7 +136,22 @@ public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ubyte[] getSnapshotData(const ref Snapshot snapshot)
 | 
						ubyte[] getSnapshotData(const ref Snapshot snapshot)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		ubyte[] content = buildContent(snapshot);
 | 
							auto dataChunks = _db.getChunks(snapshot.id);
 | 
				
			||||||
 | 
							ubyte[] content;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							foreach (chunk; dataChunks) {
 | 
				
			||||||
 | 
								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, "Оригинальный размер не соответствует ожидаемому");
 | 
				
			||||||
 | 
								content ~= bytes;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							enforce(snapshot.fileSha256 == digest!SHA256(content), "Хеш-сумма файла не совпадает");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return content;
 | 
							return content;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -111,7 +111,7 @@ public:
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			snapshot.filePath,
 | 
								snapshot.filePath,
 | 
				
			||||||
			snapshot.fileSha256[],
 | 
								snapshot.fileSha256[],
 | 
				
			||||||
			snapshot.label,
 | 
								snapshot.label.length ? snapshot.label : null,
 | 
				
			||||||
			snapshot.sourceLength,
 | 
								snapshot.sourceLength,
 | 
				
			||||||
			snapshot.algoMin,
 | 
								snapshot.algoMin,
 | 
				
			||||||
			snapshot.algoNormal,
 | 
								snapshot.algoNormal,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,10 +7,10 @@ import std.file : read;
 | 
				
			||||||
void main()
 | 
					void main()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	auto cas = new CAS("/tmp/base.db", true);
 | 
						auto cas = new CAS("/tmp/base.db", true);
 | 
				
			||||||
	// cas.newSnapshot("/tmp/text", "Файл для тестирования", cast(ubyte[]) read("/tmp/text"));
 | 
						cas.newSnapshot("/tmp/text", cast(ubyte[]) read("/tmp/text"));
 | 
				
			||||||
	import std.stdio : writeln;
 | 
						// import std.stdio : writeln;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	writeln(cas.getSnapshotList("/tmp/text"));
 | 
						// writeln(cas.getSnapshotList("/tmp/text"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	writeln(cas.getVersion);
 | 
						// writeln(cas.getVersion);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue