mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
Don't store xxHash caches in binary format
This commit is contained in:
@ -3,6 +3,8 @@
|
|||||||
#### Version - 0.9.20.0
|
#### Version - 0.9.20.0
|
||||||
* Don't reuse HTTP request objects (#532)
|
* Don't reuse HTTP request objects (#532)
|
||||||
* Block popups in the in-app browser (#535)
|
* Block popups in the in-app browser (#535)
|
||||||
|
* Don't print API keys in logs (#532)
|
||||||
|
* Store xxHash caches in binary format (#530)
|
||||||
|
|
||||||
|
|
||||||
#### Version - 0.9.19.0
|
#### Version - 0.9.19.0
|
||||||
|
@ -229,27 +229,53 @@ namespace Wabbajack.Common
|
|||||||
|
|
||||||
public static string FileHashCached(this string file, bool nullOnIOError = false)
|
public static string FileHashCached(this string file, bool nullOnIOError = false)
|
||||||
{
|
{
|
||||||
var hashPath = file + Consts.HashFileExtension;
|
if (TryGetHashCache(file, out var foundHash)) return foundHash;
|
||||||
if (File.Exists(hashPath) && File.GetLastWriteTime(file) <= File.GetLastWriteTime(hashPath))
|
|
||||||
{
|
|
||||||
return File.ReadAllText(hashPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
var hash = file.FileHash(nullOnIOError);
|
var hash = file.FileHash(nullOnIOError);
|
||||||
File.WriteAllText(hashPath, hash);
|
if (hash != null)
|
||||||
|
WriteHashCache(file, hash);
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool TryGetHashCache(string file, out string hash)
|
||||||
|
{
|
||||||
|
var hashFile = file + Consts.HashFileExtension;
|
||||||
|
hash = null;
|
||||||
|
if (!File.Exists(hashFile)) return false;
|
||||||
|
|
||||||
|
var fi = new FileInfo(hashFile);
|
||||||
|
if (fi.Length != 20) return false;
|
||||||
|
|
||||||
|
using var fs = File.OpenRead(hashFile);
|
||||||
|
using var br = new BinaryReader(fs);
|
||||||
|
var version = br.ReadUInt32();
|
||||||
|
if (version != HashCacheVersion) return false;
|
||||||
|
|
||||||
|
var lastModified = br.ReadUInt64();
|
||||||
|
if (lastModified != fi.LastWriteTimeUtc.AsUnixTime()) return false;
|
||||||
|
hash = BitConverter.GetBytes(br.ReadUInt64()).ToBase64();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private const uint HashCacheVersion = 0x01;
|
||||||
|
private static void WriteHashCache(string file, string hash)
|
||||||
|
{
|
||||||
|
using var fs = File.Create(file + Consts.HashFileExtension);
|
||||||
|
using var bw = new BinaryWriter(fs);
|
||||||
|
bw.Write(HashCacheVersion);
|
||||||
|
var lastModified = File.GetLastWriteTimeUtc(file).AsUnixTime();
|
||||||
|
bw.Write(lastModified);
|
||||||
|
bw.Write(BitConverter.ToUInt64(hash.FromBase64()));
|
||||||
|
}
|
||||||
|
|
||||||
public static async Task<string> FileHashCachedAsync(this string file, bool nullOnIOError = false)
|
public static async Task<string> FileHashCachedAsync(this string file, bool nullOnIOError = false)
|
||||||
{
|
{
|
||||||
var hashPath = file + Consts.HashFileExtension;
|
if (TryGetHashCache(file, out var foundHash)) return foundHash;
|
||||||
if (File.Exists(hashPath) && File.GetLastWriteTime(file) <= File.GetLastWriteTime(hashPath))
|
|
||||||
{
|
|
||||||
return File.ReadAllText(hashPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
var hash = await file.FileHashAsync(nullOnIOError);
|
var hash = await file.FileHashAsync(nullOnIOError);
|
||||||
File.WriteAllText(hashPath, hash);
|
if (hash != null)
|
||||||
|
WriteHashCache(file, hash);
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,6 +371,12 @@ namespace Wabbajack.Common
|
|||||||
dtDateTime = dtDateTime.AddSeconds(timestamp);
|
dtDateTime = dtDateTime.AddSeconds(timestamp);
|
||||||
return dtDateTime;
|
return dtDateTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ulong AsUnixTime(this DateTime timestamp)
|
||||||
|
{
|
||||||
|
var diff = timestamp - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
|
||||||
|
return (ulong)diff.TotalSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns data from a base64 stream
|
/// Returns data from a base64 stream
|
||||||
|
@ -228,7 +228,7 @@ namespace Wabbajack.Lib.NexusApi
|
|||||||
UpdateRemaining(response);
|
UpdateRemaining(response);
|
||||||
if (!response.IsSuccessStatusCode)
|
if (!response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
Utils.Log($"Nexus call failed: {response.RequestMessage}");
|
Utils.Log($"Nexus call failed: {response.RequestMessage.RequestUri}");
|
||||||
throw new HttpRequestException($"{response.StatusCode} - {response.ReasonPhrase}");
|
throw new HttpRequestException($"{response.StatusCode} - {response.ReasonPhrase}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using Wabbajack.Common;
|
using Alphaleonis.Win32.Filesystem;
|
||||||
|
using Wabbajack.Common;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
using Utils = Wabbajack.Common.Utils;
|
using Utils = Wabbajack.Common.Utils;
|
||||||
|
|
||||||
@ -14,6 +15,17 @@ namespace Wabbajack.Test
|
|||||||
{
|
{
|
||||||
var speed = Utils.TestDiskSpeed(queue, @".\");
|
var speed = Utils.TestDiskSpeed(queue, @".\");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void TestHash()
|
||||||
|
{
|
||||||
|
const string data = "Cheese for Everyone!";
|
||||||
|
File.WriteAllText("test.data", data);
|
||||||
|
Assert.AreEqual("eSIyd+KOG3s=", "test.data".FileHashCached(), "Hash is cached");
|
||||||
|
Assert.IsTrue(Utils.TryGetHashCache("test.data", out var fileHash), "New caching method is invoked");
|
||||||
|
Assert.AreEqual("eSIyd+KOG3s=", fileHash, "The correct hash value is cached");
|
||||||
|
Assert.AreNotEqual("eSIyd+KOG3s=", File.ReadAllText("test.data" + Consts.HashFileExtension), "We don't store the hash in plaintext");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user