/// <summary>
/// Releases the connection to the database. If the connection is pooled, it will be
/// made available for re-use. If it is non-pooled, the actual connection will be shutdown.
/// </summary>
public override void Close()
{
NpgsqlEventLog.LogMethodEnter(LogLevel.Debug, CLASSNAME, "Close");
if (connector != null)
{
Promotable.Prepare();
// clear the way for another promotable transaction
promotable = null;
connector.Notification -= NotificationDelegate;
connector.Notice -= NoticeDelegate;
connector.StateChanged -= connector_StateChanged;
if (SyncNotification)
{
connector.RemoveNotificationThread();
}
if (Pooling)
{
NpgsqlConnectorPool.ConnectorPoolMgr.ReleaseConnector(this, connector);
}
else
{
Connector.ProvideClientCertificatesCallback -= ProvideClientCertificatesCallbackDelegate;
Connector.CertificateSelectionCallback -= CertificateSelectionCallbackDelegate;
Connector.CertificateValidationCallback -= CertificateValidationCallbackDelegate;
Connector.PrivateKeySelectionCallback -= PrivateKeySelectionCallbackDelegate;
if (Connector.Transaction != null)
{
Connector.Transaction.Cancel();
}
Connector.Close();
}
connector = null;
this.OnStateChange(new StateChangeEventArgs(ConnectionState.Open, ConnectionState.Closed));
}
}