Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions SDMetaTool/Cache/IPngFileDataSource.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace SDMetaTool.Cache
{
public interface IPngFileDataSource : IDisposable
public interface IPngFileDataSource : IAsyncDisposable
{
IEnumerable<PngFile> GetAll();
PngFile ReadPngFile(string realFileName);
void WritePngFile(PngFile info);
void BeginTransaction();
void CommitTransaction();
Task<IEnumerable<PngFile>> GetAll();
Task<PngFile> ReadPngFile(string realFileName);
Task WritePngFile(PngFile info);
Task BeginTransaction();
Task CommitTransaction();
}
}
23 changes: 10 additions & 13 deletions SDMetaTool/Cache/JsonDataSource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
using System.Collections.Generic;
using System.IO.Abstractions;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text.Json;
using System.Threading.Tasks;

namespace SDMetaTool.Cache
{
Expand All @@ -21,7 +23,7 @@ public JsonDataSource(IFileSystem fileSystem)
cache = this.InitialGetAll().ToDictionary(p => p.FileName, p => p);
}

public IEnumerable<PngFile> GetAll()
public async Task<IEnumerable<PngFile>> GetAll()
{
return cache.Values;
}
Expand All @@ -43,7 +45,7 @@ private IEnumerable<PngFile> InitialGetAll()
}
}

private void WriteCache(IEnumerable<PngFile> cache)
private async Task WriteCache(IEnumerable<PngFile> cache)
{
var path = cachePath.GetPath();

Expand All @@ -62,28 +64,23 @@ private void WriteCache(IEnumerable<PngFile> cache)
fileSystem.File.WriteAllText(path, serialized);
}

public PngFile ReadPngFile(string realFileName)
public async Task<PngFile> ReadPngFile(string realFileName)
{
cache.TryGetValue(realFileName, out PngFile value);
return value;
}

public void WritePngFile(PngFile info)
public async Task WritePngFile(PngFile info)
{
if (info != null)
{
cache[info.FileName] = info;
}
}

public void Dispose()
public async ValueTask DisposeAsync()
{
Flush();
}

public void Flush()
{
this.WriteCache(cache.Values);
await this.WriteCache(cache.Values);
}

private static PngFile PngFileDTOToPngFile(PngFileDTO trackDTO)
Expand All @@ -110,11 +107,11 @@ private static PngFileDTO PngFileToPngFileDTO(PngFile track)
};
}

public void BeginTransaction()
public async Task BeginTransaction()
{
}

public void CommitTransaction()
public async Task CommitTransaction()
{
}

Expand Down
35 changes: 17 additions & 18 deletions SDMetaTool/Cache/SqliteDataSource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,18 @@
using NLog;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.IO.Abstractions;
using System.Linq;
using System.Threading.Tasks;

namespace SDMetaTool.Cache
{
public class SqliteDataSource : IPngFileDataSource
{
const string TableName = "PngFiles";
private readonly SqliteConnection connection;
private SqliteTransaction transaction;
private DbTransaction transaction;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();

private readonly string[] columns = new string[]
Expand Down Expand Up @@ -224,25 +226,25 @@ internal GenerationParams ToGenerationParams()
}
}

public void Dispose()
public async ValueTask DisposeAsync()
{
this.CommitTransaction();
connection.Dispose();
await this.CommitTransaction();
await connection.DisposeAsync();
}

public IEnumerable<PngFile> GetAll()
public async Task<IEnumerable<PngFile>> GetAll()
{
var reader = connection.Query<DataRow>(
var reader = await connection.QueryAsync<DataRow>(
$@"SELECT *
FROM {TableName}"
);

return reader.Select(p => p.ToModel());
}

public PngFile ReadPngFile(string realFileName)
public async Task<PngFile> ReadPngFile(string realFileName)
{
var reader = connection.QueryFirstOrDefault<DataRow>(
var reader = await connection.QueryFirstOrDefaultAsync<DataRow>(
$@"SELECT *
FROM {TableName}
WHERE FileName = @FileName
Expand All @@ -258,29 +260,26 @@ public PngFile ReadPngFile(string realFileName)
}
}

public void WritePngFile(PngFile info)
public async Task WritePngFile(PngFile info)
{
connection.Execute(
await connection.ExecuteAsync(
insertSql,
DataRow.FromModel(info),
this.transaction
);
}

public void BeginTransaction()
public async Task BeginTransaction()
{
if (this.transaction == null)
{
this.transaction = this.connection.BeginTransaction();
}
this.transaction ??= await this.connection.BeginTransactionAsync();
}

public void CommitTransaction()
public async Task CommitTransaction()
{
if (this.transaction != null)
{
this.transaction.Commit();
this.transaction.Dispose();
await this.transaction.CommitAsync();
await this.transaction.DisposeAsync();
this.transaction = null;
}
}
Expand Down
9 changes: 5 additions & 4 deletions SDMetaTool/CachedPngFileLoader.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using SDMetaTool.Cache;
using System.IO.Abstractions;
using System.Threading.Tasks;

namespace SDMetaTool
{
Expand All @@ -19,19 +20,19 @@ public CachedPngFileLoader(
this.fileSystem = fileSystem;
}

public PngFile GetPngFile(string filename)
public async Task<PngFile> GetPngFile(string filename)
{
var fileInfo = fileSystem.FileInfo.New(filename);
var pngFile = pngFileDataSource.ReadPngFile(filename);
var pngFile = await pngFileDataSource.ReadPngFile(filename);
if (pngFile != null && pngFile.LastUpdated == fileInfo.LastWriteTime)
{
return pngFile;
}
else
{
pngFile = inner.GetPngFile(filename);
pngFile = await inner.GetPngFile(filename);
pngFile.Exists = true;
pngFileDataSource.WritePngFile(pngFile);
await pngFileDataSource.WritePngFile(pngFile);
return pngFile;
}
}
Expand Down
3 changes: 2 additions & 1 deletion SDMetaTool/IPngFileListProcessor.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
using System.Collections.Generic;
using System.Threading.Tasks;

namespace SDMetaTool
{
public interface IPngFileListProcessor
{
void ProcessPngFiles(string root);
Task ProcessPngFiles(string root);
}
}
6 changes: 4 additions & 2 deletions SDMetaTool/IPngFileLoader.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
namespace SDMetaTool
using System.Threading.Tasks;

namespace SDMetaTool
{
public interface IPngFileLoader
{
PngFile GetPngFile(string filename);
Task<PngFile> GetPngFile(string filename);
}
}
7 changes: 4 additions & 3 deletions SDMetaTool/PngFileLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System;
using System.IO.Abstractions;
using System.Linq;
using System.Threading.Tasks;

namespace SDMetaTool
{
Expand All @@ -20,13 +21,13 @@ public PngFileLoader(IFileSystem fileSystem)

}

public PngFile GetPngFile(string filename)
public async Task<PngFile> GetPngFile(string filename)
{
logger.Info($"Indexing: {filename}");

try
{
return ReadPngFile(fileSystem, filename);
return await ReadPngFile(fileSystem, filename);
}
catch (Exception ex)
{
Expand All @@ -35,7 +36,7 @@ public PngFile GetPngFile(string filename)
}
}

public PngFile ReadPngFile(IFileSystem fileSystem, string filename)
private async Task<PngFile> ReadPngFile(IFileSystem fileSystem, string filename)
{
var fileInfo = fileSystem.FileInfo.New(filename);

Expand Down
8 changes: 6 additions & 2 deletions SDMetaTool/Processors/CSVPngFileLister.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

namespace SDMetaTool.Processors
{
Expand All @@ -22,13 +23,16 @@ public CSVPngFileLister(IFileLister fileLister, IPngFileLoader pngFileLoader, st
this.distinct = distinct;
}

public void ProcessPngFiles(string root)
public async Task ProcessPngFiles(string root)
{
using var writer = new StreamWriter(outfile);
using var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);

var fileNames = fileLister.GetList(root);
var pngFiles = fileNames.Select(p => pngFileLoader.GetPngFile(p)).Where(p => p != null).OrderBy(p => p.FileName).ToList();
var tasks = fileNames.Select(p => pngFileLoader.GetPngFile(p)).ToList();
await Task.WhenAll(tasks.ToArray());

var pngFiles = tasks.Select(p => p.Result).Where(p => p != null).OrderBy(p => p.FileName).ToList();

var csvs = distinct ? GetCSVDistinct(pngFiles) : GetCSVPerItem(pngFiles);
csv.WriteRecords(csvs);
Expand Down
21 changes: 13 additions & 8 deletions SDMetaTool/Processors/Rescan.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using NLog;
using SDMetaTool.Cache;
using System.Linq;
using System.Threading.Tasks;

namespace SDMetaTool.Processors
{
Expand All @@ -21,13 +22,13 @@ public Rescan(
this.pngFileLoader = pngFileLoader;
}

public void ProcessPngFiles(string root)
public async Task ProcessPngFiles(string root)
{
logger.Info("Rescan started");
pngFileDataSource.BeginTransaction();
await pngFileDataSource.BeginTransaction();
var fileNames = fileLister.GetList(root);

var knownFiles = pngFileDataSource.GetAll();
var knownFiles = await pngFileDataSource.GetAll();

var deleted = knownFiles.Where(p => p.Exists).Select(p => p.FileName).Except(fileNames);

Expand All @@ -36,18 +37,22 @@ public void ProcessPngFiles(string root)
{
var fileToDelete = knownFilesLookup[file].Single();
fileToDelete.Exists = false;
pngFileDataSource.WritePngFile(fileToDelete);
await pngFileDataSource.WritePngFile(fileToDelete);
logger.Info("Removing " + file);
}

var newFiles = fileNames.Except(knownFiles.Where(p => p.Exists).Select(p => p.FileName)).Select(p => pngFileLoader.GetPngFile(p)).Where(p => p != null).ToList(); ;
foreach (var file in newFiles.Where(p => p.Exists == false))
var newFileNames = fileNames.Except(knownFiles.Where(p => p.Exists).Select(p => p.FileName));
var newFileTasks = newFileNames.Select( p => pngFileLoader.GetPngFile(p)).ToList();

await Task.WhenAll(newFileTasks.ToArray());

foreach (var file in newFileTasks.Select(p => p.Result).Where(p => p != null && p.Exists == false))
{
file.Exists = true;
pngFileDataSource.WritePngFile(file);
await pngFileDataSource.WritePngFile(file);
logger.Info("Adding " + file.FileName);
}
pngFileDataSource.CommitTransaction();
await pngFileDataSource.CommitTransaction();
logger.Info("Rescan finished");
}
}
Expand Down
8 changes: 6 additions & 2 deletions SDMetaTool/Processors/SummaryInfo.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using BetterConsoleTables;
using System;
using System.Linq;
using System.Threading.Tasks;

namespace SDMetaTool.Processors
{
Expand All @@ -15,10 +16,13 @@ public SummaryInfo(IFileLister fileLister, IPngFileLoader pngFileLoader)
this.pngFileLoader = pngFileLoader;
}

public void ProcessPngFiles(string root)
public async Task ProcessPngFiles(string root)
{
var fileNames = fileLister.GetList(root);
var pngFiles = fileNames.Select(p => pngFileLoader.GetPngFile(p)).Where(p => p != null).OrderBy(p => p.FileName).ToList();
var tasks = fileNames.Select(p => pngFileLoader.GetPngFile(p)).ToList();
await Task.WhenAll(tasks.ToArray());

var pngFiles = tasks.Select(p => p.Result).Where(p => p != null).OrderBy(p => p.FileName).ToList();

var distinctPrompts = pngFiles.Select(p => p.Parameters?.PromptHash).Distinct().ToList();
var distinctFullPrompts = pngFiles.Select(p => new
Expand Down
2 changes: 1 addition & 1 deletion SDMetaTool/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class Program
static async Task<int> Main(string[] args)
{
var fileSystem = new FileSystem();
using var sqliteDataSource = new SqliteDataSource(fileSystem);
await using var sqliteDataSource = new SqliteDataSource(fileSystem);
var datasource = sqliteDataSource;
var loader = new CachedPngFileLoader(fileSystem, new PngFileLoader(fileSystem), datasource);
var fileLister = new FileLister(fileSystem);
Expand Down
Loading