aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/libpq/fe-connect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/libpq/fe-connect.c')
-rw-r--r--src/interfaces/libpq/fe-connect.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 8011604e5cd..6593f21d55e 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -285,6 +285,7 @@ static bool connectOptions1(PGconn *conn, const char *conninfo);
static bool connectOptions2(PGconn *conn);
static int connectDBStart(PGconn *conn);
static int connectDBComplete(PGconn *conn);
+static PGPing internal_ping(PGconn *conn);
static PGconn *makeEmptyPGconn(void);
static void fillPGconn(PGconn *conn, PQconninfoOption *connOptions);
static void freePGconn(PGconn *conn);
@@ -375,6 +376,20 @@ PQconnectdbParams(const char **keywords,
}
+PGPing
+PQpingParams(const char **keywords,
+ const char **values,
+ int expand_dbname)
+{
+ PGconn *conn = PQconnectStartParams(keywords, values, expand_dbname);
+ PGPing ret;
+
+ ret = internal_ping(conn);
+ PQfinish(conn);
+
+ return ret;
+}
+
/*
* PQconnectdb
*
@@ -408,6 +423,18 @@ PQconnectdb(const char *conninfo)
return conn;
}
+PGPing
+PQping(const char *conninfo)
+{
+ PGconn *conn = PQconnectStart(conninfo);
+ PGPing ret;
+
+ ret = internal_ping(conn);
+ PQfinish(conn);
+
+ return ret;
+}
+
/*
* PQconnectStartParams
*
@@ -2514,6 +2541,32 @@ error_return:
/*
+ * internal_ping
+ * Determine if a server is running and if we can connect to it.
+ */
+PGPing
+internal_ping(PGconn *conn)
+{
+ if (conn && conn->status != CONNECTION_BAD)
+ {
+ (void) connectDBComplete(conn);
+
+ /*
+ * If the connection needs a password, we can consider the
+ * server as accepting connections.
+ */
+ if (conn && (conn->status != CONNECTION_BAD ||
+ PQconnectionNeedsPassword(conn)))
+ return PQACCESS;
+ else
+ return PQREJECT;
+ }
+ else
+ return PQNORESPONSE;
+}
+
+
+/*
* makeEmptyPGconn
* - create a PGconn data structure with (as yet) no interesting data
*/