-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSQLiteDataAccess.cs
139 lines (124 loc) · 6.21 KB
/
SQLiteDataAccess.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
using System.Collections.Generic;
using System.Data;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using ApDownloader.Model;
using Dapper;
using Microsoft.Data.Sqlite;
namespace ApDownloader.DataAccess;
[SuppressMessage("ReSharper", "RedundantAnonymousTypePropertyName")]
public class SQLiteDataAccess
{
private readonly string _ProdDbConnectionString;
private readonly string _SettingsDbConnectionString;
public SQLiteDataAccess(string appFilepath)
{
_ProdDbConnectionString = Path.Combine(appFilepath, Path.GetFileName("./ProductsDb.db"));
_SettingsDbConnectionString = Path.Combine(appFilepath, Path.GetFileName("./Settings.db"));
}
public async Task<IEnumerable<Product>> GetProductsOnly()
{
using IDbConnection conn = new SqliteConnection($"Data Source={_ProdDbConnectionString}");
var products = await conn.QueryAsync<Product>("SELECT * FROM Product", new DynamicParameters());
return products;
}
public async Task<IEnumerable<Product>> GetDownloadedProductsOnly(IEnumerable<string>? productIds)
{
if (productIds == null) return new List<Product>();
using IDbConnection conn = new SqliteConnection($"Data Source={_ProdDbConnectionString}");
var products = await conn.QueryAsync<Product>("SELECT * FROM Product WHERE ProductID IN @productIds",
new {productIds});
return products;
}
public async Task<IEnumerable<Product>> GetDownloadedProductsByName(IEnumerable<string> productNames)
{
using IDbConnection conn = new SqliteConnection($"Data Source={_ProdDbConnectionString}");
var products = await conn.QueryAsync<Product>("SELECT * FROM Product WHERE Filename IN @productNames",
new {productNames});
return products;
}
public async Task<IEnumerable<string>> GetExtras(string dbName, IEnumerable<int> productList)
{
using IDbConnection conn = new SqliteConnection($"Data Source={_ProdDbConnectionString}");
var products =
await conn.QueryAsync<string>("SELECT Filename FROM @DbName WHERE ProductID IN @ProductList",
new {DbName = dbName, ProductList = productList});
return products;
}
public async Task<DownloadManifest> GetDownloadManifest(ApDownloaderConfig options,
IEnumerable<int> productList)
{
var manifest = new DownloadManifest();
using IDbConnection conn = new SqliteConnection($"Data Source={_ProdDbConnectionString}");
if (options.GetExtraStock)
manifest.EsFilenames =
await conn.QueryAsync<string>("SELECT Filename FROM ExtraStock WHERE ProductID IN @ProductList",
new {ProductList = productList});
if (options.GetBrandingPatch)
manifest.BpFilenames =
await conn.QueryAsync<string>("SELECT Filename FROM BrandingPatch WHERE ProductID IN @ProductList",
new {ProductList = productList});
if (options.GetLiveryPack)
manifest.LpFilenames =
await conn.QueryAsync<string>("SELECT Filename FROM LiveryPack WHERE ProductID IN @ProductList",
new {ProductList = productList});
manifest.PrFilenames =
await conn.QueryAsync<string>("SELECT Filename FROM Product WHERE ProductID IN @ProductList",
new {ProductList = productList});
manifest.ProductIds = productList.Select(p => p.ToString());
return manifest;
}
public async Task<int> GetTotalFileCount(ApDownloaderConfig downloadOption, List<int> productIds)
{
var manifest = await GetDownloadManifest(downloadOption, productIds);
return productIds.Count +
(manifest.EsFilenames?.Count() ?? 0) +
(manifest.BpFilenames?.Count() ?? 0) +
(manifest.LpFilenames?.Count() ?? 0);
}
public ApDownloaderConfig GetUserOptions()
{
using IDbConnection conn = new SqliteConnection($"Data Source={_SettingsDbConnectionString}");
var product =
conn.QueryFirst<ApDownloaderConfig>("SELECT * FROM Settings") ?? new ApDownloaderConfig();
return product;
}
public async Task SetUserOptions(ApDownloaderConfig downloadOption)
{
using IDbConnection conn = new SqliteConnection($"Data Source={_SettingsDbConnectionString}");
await conn.ExecuteAsync(@"UPDATE Settings
SET GetExtraStock = @GetExtraStock,
GetLiveryPack = @GetLiveryPack,
GetBrandingPatch = @GetBrandingPatch,
DownloadFilepath = @DownloadFilepath,
InstallFilepath = @InstallFilepath
WHERE 1 = 1", new
{
GetExtraStock = downloadOption.GetExtraStock,
GetLiveryPack = downloadOption.GetLiveryPack,
GetBrandingPatch = downloadOption.GetBrandingPatch,
DownloadFilepath = downloadOption.DownloadFilepath,
InstallFilepath = downloadOption.InstallFilePath
});
}
public async Task<Dictionary<string, string>> GetFilesFolders()
{
var fileSet = new Dictionary<string, string>();
using IDbConnection conn = new SqliteConnection($"Data Source={_ProdDbConnectionString}");
var products = await conn.QueryAsync<string>("SELECT Filename FROM Product");
foreach (var file in products) fileSet.Add(file, "Products");
var extraStock = await conn.QueryAsync<string>("SELECT Filename FROM ExtraStock");
foreach (var file in extraStock) fileSet.Add(file, "ExtraStock");
var brandingPatches = await conn.QueryAsync<string>("SELECT Filename FROM BrandingPatch");
foreach (var file in brandingPatches) fileSet.Add(file, "BrandingPatches");
var liveryPacks = await conn.QueryAsync<string>("SELECT Filename FROM LiveryPack");
foreach (var file in liveryPacks) fileSet.Add(file, "LiveryPacks");
return fileSet;
}
public void ImportProductDb(string filename)
{
File.Copy(filename, _ProdDbConnectionString, true);
}
}