42 lines
1.5 KiB
C#
42 lines
1.5 KiB
C#
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];
|
|
}
|
|
}
|