Skip to content

Commit 6e5a368

Browse files
authored
Reduced calls to NpgsqlStatement.PreparedStatement property (#3915)
1 parent ca57e06 commit 6e5a368

2 files changed

Lines changed: 18 additions & 9 deletions

File tree

src/Npgsql/NpgsqlBatchCommand.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,15 @@ internal PreparedStatement? PreparedStatement
139139
/// </summary>
140140
internal bool IsPrepared => PreparedStatement?.IsPrepared == true;
141141

142+
/// <summary>
143+
/// Returns a prepared statement for this statement (including automatic preparation).
144+
/// </summary>
145+
internal bool TryGetPrepared([NotNullWhen(true)] out PreparedStatement? preparedStatement)
146+
{
147+
preparedStatement = PreparedStatement;
148+
return preparedStatement?.IsPrepared == true;
149+
}
150+
142151
/// <summary>
143152
/// Initializes a new <see cref="NpgsqlBatchCommand"/>.
144153
/// </summary>
@@ -173,13 +182,13 @@ internal bool TryAutoPrepare(NpgsqlConnector connector)
173182
{
174183
// If this statement isn't prepared, see if it gets implicitly prepared.
175184
// Note that this may return null (not enough usages for automatic preparation).
176-
if (!IsPrepared)
177-
PreparedStatement = connector.PreparedStatementManager.TryGetAutoPrepared(this);
178-
if (PreparedStatement is PreparedStatement pStatement)
185+
if (!TryGetPrepared(out var preparedStatement))
186+
preparedStatement = PreparedStatement = connector.PreparedStatementManager.TryGetAutoPrepared(this);
187+
if (preparedStatement is not null)
179188
{
180-
if (pStatement?.State == PreparedState.NotPrepared)
189+
if (preparedStatement.State == PreparedState.NotPrepared)
181190
{
182-
pStatement.State = PreparedState.BeingPrepared;
191+
preparedStatement.State = PreparedState.BeingPrepared;
183192
IsPreparing = true;
184193
}
185194

src/Npgsql/NpgsqlDataReader.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -403,10 +403,10 @@ async Task<bool> NextResult(bool async, bool isConsuming = false, CancellationTo
403403
{
404404
var statement = _statements[StatementIndex];
405405

406-
if (statement.IsPrepared)
406+
if (statement.TryGetPrepared(out var preparedStatement))
407407
{
408408
Expect<BindCompleteMessage>(await Connector.ReadMessage(async), Connector);
409-
RowDescription = statement.Description;
409+
RowDescription = preparedStatement.Description;
410410
}
411411
else // Non-prepared/preparing flow
412412
{
@@ -602,11 +602,11 @@ async Task<bool> NextResultSchemaOnly(bool async, bool isConsuming = false, Canc
602602
for (StatementIndex++; StatementIndex < _statements.Count; StatementIndex++)
603603
{
604604
var statement = _statements[StatementIndex];
605-
if (statement.IsPrepared)
605+
if (statement.TryGetPrepared(out var preparedStatement))
606606
{
607607
// Row descriptions have already been populated in the statement objects at the
608608
// Prepare phase
609-
RowDescription = _statements[StatementIndex].Description;
609+
RowDescription = preparedStatement.Description;
610610
}
611611
else
612612
{

0 commit comments

Comments
 (0)