Premiere commit - Omika
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
namespace Omika.Tests.Repositories;
|
||||
|
||||
/// <summary>
|
||||
/// Lecture des paramètres positionnels d'un <c>INSERT</c> capturé par un fake
|
||||
/// <c>IHfsqlConnection</c> : les <c>?</c> suivent l'ordre de la liste de colonnes,
|
||||
/// ce qui permet d'assertir une colonne précise sans dépendre de son rang.
|
||||
/// </summary>
|
||||
internal static class HfsqlInsertParameters
|
||||
{
|
||||
/// <summary>
|
||||
/// Retourne la valeur du paramètre correspondant à <paramref name="column"/>
|
||||
/// dans l'<c>INSERT</c> décrit par <paramref name="sql"/>.
|
||||
/// </summary>
|
||||
public static object? ValueFor(string sql, IReadOnlyList<object?> parameters, string column)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(sql);
|
||||
ArgumentNullException.ThrowIfNull(parameters);
|
||||
|
||||
int open = sql.IndexOf('(');
|
||||
int close = open < 0 ? -1 : sql.IndexOf(')', open);
|
||||
|
||||
if (open < 0 || close <= open)
|
||||
{
|
||||
throw new InvalidOperationException($"Instruction sans liste de colonnes : {sql}");
|
||||
}
|
||||
|
||||
string[] columns = sql[(open + 1)..close]
|
||||
.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
int index = Array.FindIndex(
|
||||
columns,
|
||||
name => string.Equals(name, column, StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
if (index < 0)
|
||||
{
|
||||
throw new InvalidOperationException($"Colonne « {column} » absente de l'instruction : {sql}");
|
||||
}
|
||||
|
||||
return parameters[index];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user