Skip to content

Commit 669ba61

Browse files
committed
Revert over-optimisations that hurt readability, preallocate query string builder buffer
1 parent 5aeeaa2 commit 669ba61

File tree

2 files changed

+12
-79
lines changed

2 files changed

+12
-79
lines changed

PowerSync/PowerSync.Common/MDSQLite/MDSQLiteConnection.cs

Lines changed: 11 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ public void FlushUpdates()
5656
}
5757

5858
var groupedUpdates = updateBuffer
59-
.GroupBy(update => update.Table)
60-
.ToDictionary(
61-
group => group.Key,
62-
group => group.Select(update => new TableUpdateOperation(update.OpType, update.RowId)).ToArray()
63-
);
59+
.GroupBy(update => update.Table)
60+
.ToDictionary(
61+
group => group.Key,
62+
group => group.Select(update => new TableUpdateOperation(update.OpType, update.RowId)).ToArray()
63+
);
6464

6565
var batchedUpdate = new BatchedUpdateNotification
6666
{
@@ -81,19 +81,15 @@ private static List<string> PrepareQueryString(ref string query, int parameterCo
8181
return parameterList;
8282
}
8383

84-
int placeholderCount = query.Count(c => c == '?');
85-
if (placeholderCount != parameterCount)
86-
{
87-
throw new ArgumentException($"Number of parameters ({parameterCount}) does not match the number of `?` placeholders ({placeholderCount}) in the query.");
88-
}
89-
9084
// Replace `?` sequentially with named parameters
91-
var sb = new StringBuilder();
85+
var sb = new StringBuilder(query.Length + parameterCount * 7);
9286
int lastPos = 0;
9387
int currentPos;
9488
for (int i = 0; i < parameterCount; i++)
9589
{
9690
currentPos = query.IndexOf('?', lastPos);
91+
if (currentPos == -1)
92+
throw new ArgumentException($"Not enough `?` placeholders for {parameterCount} parameters.");
9793

9894
string paramName = $"@param{i}";
9995
parameterList.Add(paramName);
@@ -137,43 +133,14 @@ private static List<string> PrepareQueryString(ref string query, int parameterCo
137133

138134
private static void PrepareCommandParameters(SqliteCommand command, ref string query, int parameterCount)
139135
{
140-
if (parameterCount == 0)
141-
{
142-
command.CommandText = query;
143-
return;
144-
}
145-
146-
int placeholderCount = query.Count(c => c == '?');
147-
if (placeholderCount != parameterCount)
148-
{
149-
throw new ArgumentException($"Number of parameters ({parameterCount}) does not match the number of `?` placeholders ({placeholderCount}) in the query.");
150-
}
151-
152-
var sb = new StringBuilder();
153-
int lastPos = 0;
154-
int currentPos;
155-
for (int i = 0; i < parameterCount; i++)
136+
var parameterNames = PrepareQueryString(ref query, parameterCount);
137+
command.CommandText = query;
138+
foreach (var paramName in parameterNames)
156139
{
157-
currentPos = query.IndexOf('?', lastPos);
158-
159-
string paramName = $"@param{i}";
160-
161-
sb.Append(query, lastPos, currentPos - lastPos);
162-
sb.Append(paramName);
163-
164140
var parameter = command.CreateParameter();
165141
parameter.ParameterName = paramName;
166142
command.Parameters.Add(parameter);
167-
168-
lastPos = currentPos + 1;
169-
}
170-
171-
if (lastPos < query.Length)
172-
{
173-
sb.Append(query, lastPos, query.Length - lastPos);
174143
}
175-
176-
command.CommandText = sb.ToString();
177144
}
178145

179146
private static void PrepareCommand(SqliteCommand command, ref string query, object?[]? parameters)
@@ -190,41 +157,6 @@ private static void PrepareCommand(SqliteCommand command, ref string query, obje
190157
}
191158
}
192159

193-
private static List<DynamicParameters>? PrepareQuery(ref string query, object?[][]? parameters)
194-
{
195-
if (parameters == null || parameters.Length == 0)
196-
{
197-
return null;
198-
}
199-
200-
var parameterCount = parameters[0].Length;
201-
if (parameterCount == 0)
202-
{
203-
return null;
204-
}
205-
206-
var parameterNames = PrepareQueryString(ref query, parameterCount);
207-
208-
var preparedParamsList = new List<DynamicParameters>();
209-
210-
foreach (var paramSet in parameters)
211-
{
212-
if (paramSet.Length != parameterCount)
213-
{
214-
throw new ArgumentException("Parameter sets have different number of arguments.");
215-
}
216-
217-
var preparedParams = new DynamicParameters();
218-
for (int i = 0; i < parameterCount; i++)
219-
{
220-
preparedParams.Add(parameterNames[i], paramSet[i]);
221-
}
222-
preparedParamsList.Add(preparedParams);
223-
}
224-
225-
return preparedParamsList;
226-
}
227-
228160
public Task<T[]> GetAll<T>(string query, object?[]? parameters = null)
229161
{
230162
var preparedParams = PrepareQuery(ref query, parameters);

Tests/PowerSync/PowerSync.Common.Tests/Utils/TestUtils.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Runtime.CompilerServices;
2+
23
using PowerSync.Common.Client;
34

45
namespace PowerSync.Common.Tests.Utils;

0 commit comments

Comments
 (0)