From 15013dfca167ec336ba05cdf4550204ee69cc8f5 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horikyoga.ntt@gmail.com>
Date: Fri, 13 Mar 2020 12:01:56 +0900
Subject: [PATCH 06/11] Add new libpq-event PGEVT_CONNDISCONNECTION

Add an event to detect closure of the underlying socket.
---
 src/interfaces/libpq/fe-connect.c   | 14 ++++++++++++++
 src/interfaces/libpq/libpq-events.h |  6 ++++++
 2 files changed, 20 insertions(+)

diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 0157c619aa..8de5304600 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -457,6 +457,8 @@ pgthreadlock_t pg_g_threadlock = default_threadlock;
 void
 pqDropConnection(PGconn *conn, bool flushInput)
 {
+	int i;
+
 	/* Drop any SSL state */
 	pqsecure_close(conn);
 
@@ -465,6 +467,18 @@ pqDropConnection(PGconn *conn, bool flushInput)
 		closesocket(conn->sock);
 	conn->sock = PGINVALID_SOCKET;
 
+	/* let any event procs notice of disconnection */
+	for (i = 0; i < conn->nEvents; i++)
+	{
+		PGEventConnDisconnection evt;
+
+		evt.conn = conn;
+
+		/* ignoring failure */
+		(void) conn->events[i].proc(PGEVT_CONNDISCONNECTION, &evt,
+									conn->events[i].passThrough);
+	}
+	
 	/* Optionally discard any unread data */
 	if (flushInput)
 		conn->inStart = conn->inCursor = conn->inEnd = 0;
diff --git a/src/interfaces/libpq/libpq-events.h b/src/interfaces/libpq/libpq-events.h
index 7b07537c11..ffcd604b82 100644
--- a/src/interfaces/libpq/libpq-events.h
+++ b/src/interfaces/libpq/libpq-events.h
@@ -38,6 +38,7 @@ typedef enum
 {
 	PGEVT_REGISTER,
 	PGEVT_CONNRESET,
+	PGEVT_CONNDISCONNECTION,
 	PGEVT_CONNDESTROY,
 	PGEVT_RESULTCREATE,
 	PGEVT_RESULTCOPY,
@@ -59,6 +60,11 @@ typedef struct
 	PGconn	   *conn;
 } PGEventConnDestroy;
 
+typedef struct
+{
+	PGconn	   *conn;
+} PGEventConnDisconnection;
+
 typedef struct
 {
 	PGconn	   *conn;
-- 
2.18.2

