Skip to content

Commit bff72ba

Browse files
Optimize performance of MSGraphDb generation (#1375)
* Prevent MSGraphDb generation every run from IDE * Disable journaling while filling data * Wrap multiple INSERT statements within a single transaction * Adjust parameterized insert-command * Fix filestream resource leak * Remove unnecessary blank lines --------- Co-authored-by: Waldek Mastykarz <waldek@mastykarz.nl>
1 parent 1679698 commit bff72ba

File tree

2 files changed

+32
-8
lines changed

2 files changed

+32
-8
lines changed

DevProxy.Abstractions/Data/MSGraphDb.cs

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,10 @@ public async Task<int> GenerateDbAsync(bool skipIfUpdatedToday, CancellationToke
6565
}
6666

6767
await CreateDbAsync(cancellationToken);
68+
69+
SetDbJournaling(false);
6870
await FillDataAsync(cancellationToken);
71+
SetDbJournaling(true);
6972

7073
_logger.LogInformation("Microsoft Graph database successfully updated");
7174

@@ -107,6 +110,8 @@ private async Task FillDataAsync(CancellationToken cancellationToken)
107110
{
108111
_logger.LogInformation("Filling database...");
109112

113+
await using var transaction = await Connection.BeginTransactionAsync(cancellationToken);
114+
110115
var i = 0;
111116

112117
foreach (var openApiDocument in _openApiDocuments)
@@ -120,9 +125,10 @@ private async Task FillDataAsync(CancellationToken cancellationToken)
120125

121126
var insertEndpoint = Connection.CreateCommand();
122127
insertEndpoint.CommandText = "INSERT INTO endpoints (path, graphVersion, hasSelect) VALUES (@path, @graphVersion, @hasSelect)";
123-
_ = insertEndpoint.Parameters.Add(new("@path", null));
124-
_ = insertEndpoint.Parameters.Add(new("@graphVersion", null));
125-
_ = insertEndpoint.Parameters.Add(new("@hasSelect", null));
128+
var pathParam = insertEndpoint.Parameters.Add(new("@path", null));
129+
var graphVersionParam = insertEndpoint.Parameters.Add(new("@graphVersion", null));
130+
var hasSelectParam = insertEndpoint.Parameters.Add(new("@hasSelect", null));
131+
await insertEndpoint.PrepareAsync(cancellationToken);
126132

127133
foreach (var path in document.Paths)
128134
{
@@ -142,14 +148,16 @@ private async Task FillDataAsync(CancellationToken cancellationToken)
142148
var hasSelect = getOperation.Parameters.Any(p => p.Name == "$select");
143149

144150
_logger.LogTrace("Inserting endpoint {GraphVersion}{Key} with hasSelect={HasSelect}...", graphVersion, path.Key, hasSelect);
145-
insertEndpoint.Parameters["@path"].Value = path.Key;
146-
insertEndpoint.Parameters["@graphVersion"].Value = graphVersion;
147-
insertEndpoint.Parameters["@hasSelect"].Value = hasSelect;
151+
pathParam.Value = path.Key;
152+
graphVersionParam.Value = graphVersion;
153+
hasSelectParam.Value = hasSelect;
148154
_ = await insertEndpoint.ExecuteNonQueryAsync(cancellationToken);
149155
i++;
150156
}
151157
}
152158

159+
await transaction.CommitAsync(cancellationToken);
160+
153161
_logger.LogInformation("Inserted {EndpointCount} endpoints in the database", i);
154162
}
155163

@@ -202,7 +210,8 @@ private async Task LoadOpenAPIFilesAsync(string folder, CancellationToken cancel
202210

203211
try
204212
{
205-
var openApiDocument = await new OpenApiStreamReader().ReadAsync(file.OpenRead(), cancellationToken);
213+
await using var fileStream = file.OpenRead();
214+
var openApiDocument = await new OpenApiStreamReader().ReadAsync(fileStream, cancellationToken);
206215
_openApiDocuments[version] = openApiDocument.OpenApiDocument;
207216

208217
_logger.LogDebug("Added OpenAPI file {FilePath} for {Version}", filePath, version);
@@ -214,6 +223,21 @@ private async Task LoadOpenAPIFilesAsync(string folder, CancellationToken cancel
214223
}
215224
}
216225

226+
private void SetDbJournaling(bool enabled)
227+
{
228+
using var command = Connection.CreateCommand();
229+
if (enabled)
230+
{
231+
command.CommandText = "PRAGMA journal_mode = DELETE;";
232+
_ = command.ExecuteNonQuery();
233+
}
234+
else
235+
{
236+
command.CommandText = "PRAGMA journal_mode = OFF;";
237+
_ = command.ExecuteNonQuery();
238+
}
239+
}
240+
217241
public void Dispose()
218242
{
219243
_connection?.Dispose();

DevProxy/DevProxy.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757

5858
<ItemGroup>
5959
<None Update="msgraph-openapi-v1.db">
60-
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
60+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
6161
</None>
6262
<None Update="devproxyrc.json">
6363
<CopyToOutputDirectory>Always</CopyToOutputDirectory>

0 commit comments

Comments
 (0)