@@ -344,6 +344,28 @@ static void default_threadlock(int acquire);
344
344
pgthreadlock_t pg_g_threadlock = default_threadlock ;
345
345
346
346
347
+ /*
348
+ * pqDropConnection
349
+ *
350
+ * Close any physical connection to the server, and reset associated
351
+ * state inside the connection object. We don't release state that
352
+ * would be needed to reconnect, though.
353
+ */
354
+ void
355
+ pqDropConnection (PGconn * conn )
356
+ {
357
+ /* Drop any SSL state */
358
+ pqsecure_close (conn );
359
+ /* Close the socket itself */
360
+ if (conn -> sock >= 0 )
361
+ closesocket (conn -> sock );
362
+ conn -> sock = -1 ;
363
+ /* Discard any unread/unsent data */
364
+ conn -> inStart = conn -> inCursor = conn -> inEnd = 0 ;
365
+ conn -> outCount = 0 ;
366
+ }
367
+
368
+
347
369
/*
348
370
* Connecting to a Database
349
371
*
@@ -1416,12 +1438,7 @@ connectDBStart(PGconn *conn)
1416
1438
return 1 ;
1417
1439
1418
1440
connect_errReturn :
1419
- if (conn -> sock >= 0 )
1420
- {
1421
- pqsecure_close (conn );
1422
- closesocket (conn -> sock );
1423
- conn -> sock = -1 ;
1424
- }
1441
+ pqDropConnection (conn );
1425
1442
conn -> status = CONNECTION_BAD ;
1426
1443
return 0 ;
1427
1444
}
@@ -1644,8 +1661,7 @@ PQconnectPoll(PGconn *conn)
1644
1661
{
1645
1662
if (!connectNoDelay (conn ))
1646
1663
{
1647
- closesocket (conn -> sock );
1648
- conn -> sock = -1 ;
1664
+ pqDropConnection (conn );
1649
1665
conn -> addr_cur = addr_cur -> ai_next ;
1650
1666
continue ;
1651
1667
}
@@ -1655,8 +1671,7 @@ PQconnectPoll(PGconn *conn)
1655
1671
appendPQExpBuffer (& conn -> errorMessage ,
1656
1672
libpq_gettext ("could not set socket to non-blocking mode: %s\n" ),
1657
1673
SOCK_STRERROR (SOCK_ERRNO , sebuf , sizeof (sebuf )));
1658
- closesocket (conn -> sock );
1659
- conn -> sock = -1 ;
1674
+ pqDropConnection (conn );
1660
1675
conn -> addr_cur = addr_cur -> ai_next ;
1661
1676
continue ;
1662
1677
}
@@ -1667,8 +1682,7 @@ PQconnectPoll(PGconn *conn)
1667
1682
appendPQExpBuffer (& conn -> errorMessage ,
1668
1683
libpq_gettext ("could not set socket to close-on-exec mode: %s\n" ),
1669
1684
SOCK_STRERROR (SOCK_ERRNO , sebuf , sizeof (sebuf )));
1670
- closesocket (conn -> sock );
1671
- conn -> sock = -1 ;
1685
+ pqDropConnection (conn );
1672
1686
conn -> addr_cur = addr_cur -> ai_next ;
1673
1687
continue ;
1674
1688
}
@@ -1715,8 +1729,7 @@ PQconnectPoll(PGconn *conn)
1715
1729
1716
1730
if (err )
1717
1731
{
1718
- closesocket (conn -> sock );
1719
- conn -> sock = -1 ;
1732
+ pqDropConnection (conn );
1720
1733
conn -> addr_cur = addr_cur -> ai_next ;
1721
1734
continue ;
1722
1735
}
@@ -1802,11 +1815,7 @@ PQconnectPoll(PGconn *conn)
1802
1815
* failure and keep going if there are more addresses.
1803
1816
*/
1804
1817
connectFailureMessage (conn , SOCK_ERRNO );
1805
- if (conn -> sock >= 0 )
1806
- {
1807
- closesocket (conn -> sock );
1808
- conn -> sock = -1 ;
1809
- }
1818
+ pqDropConnection (conn );
1810
1819
1811
1820
/*
1812
1821
* Try the next address, if any.
@@ -1851,18 +1860,14 @@ PQconnectPoll(PGconn *conn)
1851
1860
* error message.
1852
1861
*/
1853
1862
connectFailureMessage (conn , optval );
1863
+ pqDropConnection (conn );
1854
1864
1855
1865
/*
1856
1866
* If more addresses remain, keep trying, just as in the
1857
1867
* case where connect() returned failure immediately.
1858
1868
*/
1859
1869
if (conn -> addr_cur -> ai_next != NULL )
1860
1870
{
1861
- if (conn -> sock >= 0 )
1862
- {
1863
- closesocket (conn -> sock );
1864
- conn -> sock = -1 ;
1865
- }
1866
1871
conn -> addr_cur = conn -> addr_cur -> ai_next ;
1867
1872
conn -> status = CONNECTION_NEEDED ;
1868
1873
goto keep_going ;
@@ -2137,12 +2142,8 @@ PQconnectPoll(PGconn *conn)
2137
2142
/* only retry once */
2138
2143
conn -> allow_ssl_try = false;
2139
2144
/* Must drop the old connection */
2140
- closesocket (conn -> sock );
2141
- conn -> sock = -1 ;
2145
+ pqDropConnection (conn );
2142
2146
conn -> status = CONNECTION_NEEDED ;
2143
- /* Discard any unread/unsent data */
2144
- conn -> inStart = conn -> inCursor = conn -> inEnd = 0 ;
2145
- conn -> outCount = 0 ;
2146
2147
goto keep_going ;
2147
2148
}
2148
2149
}
@@ -2252,13 +2253,8 @@ PQconnectPoll(PGconn *conn)
2252
2253
{
2253
2254
conn -> pversion = PG_PROTOCOL (2 , 0 );
2254
2255
/* Must drop the old connection */
2255
- pqsecure_close (conn );
2256
- closesocket (conn -> sock );
2257
- conn -> sock = -1 ;
2256
+ pqDropConnection (conn );
2258
2257
conn -> status = CONNECTION_NEEDED ;
2259
- /* Discard any unread/unsent data */
2260
- conn -> inStart = conn -> inCursor = conn -> inEnd = 0 ;
2261
- conn -> outCount = 0 ;
2262
2258
goto keep_going ;
2263
2259
}
2264
2260
@@ -2323,12 +2319,8 @@ PQconnectPoll(PGconn *conn)
2323
2319
/* only retry once */
2324
2320
conn -> wait_ssl_try = false;
2325
2321
/* Must drop the old connection */
2326
- closesocket (conn -> sock );
2327
- conn -> sock = -1 ;
2322
+ pqDropConnection (conn );
2328
2323
conn -> status = CONNECTION_NEEDED ;
2329
- /* Discard any unread/unsent data */
2330
- conn -> inStart = conn -> inCursor = conn -> inEnd = 0 ;
2331
- conn -> outCount = 0 ;
2332
2324
goto keep_going ;
2333
2325
}
2334
2326
@@ -2343,13 +2335,8 @@ PQconnectPoll(PGconn *conn)
2343
2335
/* only retry once */
2344
2336
conn -> allow_ssl_try = false;
2345
2337
/* Must drop the old connection */
2346
- pqsecure_close (conn );
2347
- closesocket (conn -> sock );
2348
- conn -> sock = -1 ;
2338
+ pqDropConnection (conn );
2349
2339
conn -> status = CONNECTION_NEEDED ;
2350
- /* Discard any unread/unsent data */
2351
- conn -> inStart = conn -> inCursor = conn -> inEnd = 0 ;
2352
- conn -> outCount = 0 ;
2353
2340
goto keep_going ;
2354
2341
}
2355
2342
#endif
@@ -2509,13 +2496,8 @@ PQconnectPoll(PGconn *conn)
2509
2496
PQclear (res );
2510
2497
conn -> send_appname = false;
2511
2498
/* Must drop the old connection */
2512
- pqsecure_close (conn );
2513
- closesocket (conn -> sock );
2514
- conn -> sock = -1 ;
2499
+ pqDropConnection (conn );
2515
2500
conn -> status = CONNECTION_NEEDED ;
2516
- /* Discard any unread/unsent data */
2517
- conn -> inStart = conn -> inCursor = conn -> inEnd = 0 ;
2518
- conn -> outCount = 0 ;
2519
2501
goto keep_going ;
2520
2502
}
2521
2503
}
@@ -2909,12 +2891,7 @@ closePGconn(PGconn *conn)
2909
2891
/*
2910
2892
* Close the connection, reset all transient state, flush I/O buffers.
2911
2893
*/
2912
- if (conn -> sock >= 0 )
2913
- {
2914
- pqsecure_close (conn );
2915
- closesocket (conn -> sock );
2916
- }
2917
- conn -> sock = -1 ;
2894
+ pqDropConnection (conn );
2918
2895
conn -> status = CONNECTION_BAD ; /* Well, not really _bad_ - just
2919
2896
* absent */
2920
2897
conn -> asyncStatus = PGASYNC_IDLE ;
@@ -2943,8 +2920,6 @@ closePGconn(PGconn *conn)
2943
2920
if (conn -> lobjfuncs )
2944
2921
free (conn -> lobjfuncs );
2945
2922
conn -> lobjfuncs = NULL ;
2946
- conn -> inStart = conn -> inCursor = conn -> inEnd = 0 ;
2947
- conn -> outCount = 0 ;
2948
2923
#ifdef ENABLE_GSS
2949
2924
{
2950
2925
OM_uint32 min_s ;
0 commit comments