Skip to content

Commit 9c65872

Browse files
authored
Merge pull request #221 from ylorph/state_change_event_handlers
Added support for DbConnection.StateChange event handler
2 parents 4f88227 + 9512a3d commit 9c65872

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

DuckDB.NET.Data/DuckDBConnection.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ public partial class DuckDBConnection : DbConnection
1717
private DuckDBConnectionString? parsedConnection;
1818
private ConnectionReference? connectionReference;
1919
private bool inMemoryDuplication = false;
20+
21+
private static readonly StateChangeEventArgs FromClosedToOpenEventArgs = new(ConnectionState.Closed, ConnectionState.Open);
22+
private static readonly StateChangeEventArgs FromOpenToClosedEventArgs = new(ConnectionState.Open, ConnectionState.Closed);
2023

2124
#region Protected Properties
2225

@@ -107,6 +110,7 @@ public override void Open()
107110
: connectionManager.GetConnectionReference(ParsedConnection);
108111

109112
connectionState = ConnectionState.Open;
113+
OnStateChange(FromClosedToOpenEventArgs);
110114
}
111115

112116
protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel)
@@ -185,6 +189,7 @@ protected override void Dispose(bool disposing)
185189
connectionManager.ReturnConnectionReference(connectionReference);
186190
}
187191
connectionState = ConnectionState.Closed;
192+
OnStateChange(FromOpenToClosedEventArgs);
188193
}
189194
}
190195

DuckDB.NET.Test/DuckDBConnectionTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,4 +494,46 @@ public void ConnectionStringSetThreadsAndAccessModeOption(string accessMode, int
494494
value.Should().Be(threads);
495495
}
496496
}
497+
498+
[Fact]
499+
public void ConnectionStateHandlerIsCalledOnOpen()
500+
{
501+
using var dbInfo = DisposableFile.GenerateInTemp("db");
502+
using var connection = new DuckDBConnection(dbInfo.ConnectionString);
503+
var handlerCalled = false;
504+
connection.StateChange += Assert;
505+
connection.Open();
506+
connection.StateChange -= Assert; // otherwise the dispose/close will trigger the assert
507+
508+
handlerCalled.Should().BeTrue();
509+
return;
510+
511+
void Assert(object sender, StateChangeEventArgs args)
512+
{
513+
args.OriginalState.Should().Be(ConnectionState.Closed);
514+
args.CurrentState.Should().Be(ConnectionState.Open);
515+
handlerCalled = true;
516+
}
517+
}
518+
519+
[Fact]
520+
public async Task ConnectionStateHandlerIsCalledOnClose()
521+
{
522+
using var dbInfo = DisposableFile.GenerateInTemp("db");
523+
await using var connection = new DuckDBConnection(dbInfo.ConnectionString);
524+
var handlerCalled = false;
525+
await connection.OpenAsync();
526+
connection.StateChange += Assert;
527+
await connection.CloseAsync();
528+
529+
handlerCalled.Should().BeTrue();
530+
return;
531+
532+
void Assert(object sender, StateChangeEventArgs args)
533+
{
534+
args.OriginalState.Should().Be(ConnectionState.Open);
535+
args.CurrentState.Should().Be(ConnectionState.Closed);
536+
handlerCalled = true;
537+
}
538+
}
497539
}

0 commit comments

Comments
 (0)