public inbox for [email protected]
help / color / mirror / Atom feedFrom: Kyotaro Horiguchi <[email protected]>
Subject: [PATCH 05/11] Fix interface of PQregisterEventProc
Date: Fri, 13 Mar 2020 12:00:23 +0900
The function returns false for all kind of failures so the caller
cannot identify the cause of failure. Change the return value from
int(bool) to an enum.
---
src/interfaces/libpq/libpq-events.c | 34 ++++++++++++++++++++++-------
src/interfaces/libpq/libpq-events.h | 15 +++++++++++--
2 files changed, 39 insertions(+), 10 deletions(-)
diff --git a/src/interfaces/libpq/libpq-events.c b/src/interfaces/libpq/libpq-events.c
index d050d7f3f2..6b594d910a 100644
--- a/src/interfaces/libpq/libpq-events.c
+++ b/src/interfaces/libpq/libpq-events.c
@@ -36,20 +36,31 @@
* The function returns a non-zero if successful. If the function fails,
* zero is returned.
*/
-int
+PGRegEventResult
PQregisterEventProc(PGconn *conn, PGEventProc proc,
const char *name, void *passThrough)
{
int i;
PGEventRegister regevt;
- if (!proc || !conn || !name || !*name)
- return false; /* bad arguments */
+ if (!conn)
+ return PGEVTREG_BADARG;
+
+ if (!proc || !name || !*name)
+ {
+ printfPQExpBuffer(&conn->errorMessage,
+ "bad argument in PQregisterEventProc");
+ return PGEVTREG_BADARG;
+ }
for (i = 0; i < conn->nEvents; i++)
{
if (conn->events[i].proc == proc)
- return false; /* already registered */
+ {
+ printfPQExpBuffer(&conn->errorMessage,
+ "proc is already registered in PQregisterEventProc");
+ return PGEVTREG_ALREADY_REAGISTERED;
+ }
}
if (conn->nEvents >= conn->eventArraySize)
@@ -64,7 +75,10 @@ PQregisterEventProc(PGconn *conn, PGEventProc proc,
e = (PGEvent *) malloc(newSize * sizeof(PGEvent));
if (!e)
- return false;
+ {
+ printfPQExpBuffer(&conn->errorMessage, "out of memory");
+ return PGEVTREG_OUT_OF_MEMORY;
+ }
conn->eventArraySize = newSize;
conn->events = e;
@@ -73,7 +87,10 @@ PQregisterEventProc(PGconn *conn, PGEventProc proc,
conn->events[conn->nEvents].proc = proc;
conn->events[conn->nEvents].name = strdup(name);
if (!conn->events[conn->nEvents].name)
- return false;
+ {
+ printfPQExpBuffer(&conn->errorMessage, "out of memory");
+ return PGEVTREG_OUT_OF_MEMORY;
+ }
conn->events[conn->nEvents].passThrough = passThrough;
conn->events[conn->nEvents].data = NULL;
conn->events[conn->nEvents].resultInitialized = false;
@@ -84,10 +101,11 @@ PQregisterEventProc(PGconn *conn, PGEventProc proc,
{
conn->nEvents--;
free(conn->events[conn->nEvents].name);
- return false;
+ printfPQExpBuffer(&conn->errorMessage, "proc rejected");
+ return PGEVTREG_PROC_REJECTED;
}
- return true;
+ return PGEVTREG_SUCCESS;
}
/*
diff --git a/src/interfaces/libpq/libpq-events.h b/src/interfaces/libpq/libpq-events.h
index 5108a55cf6..7b07537c11 100644
--- a/src/interfaces/libpq/libpq-events.h
+++ b/src/interfaces/libpq/libpq-events.h
@@ -23,6 +23,16 @@ extern "C"
{
#endif
+/* PQregisterEventProc return value */
+typedef enum
+{
+ PGEVTREG_SUCCESS,
+ PGEVTREG_BADARG,
+ PGEVTREG_ALREADY_REAGISTERED,
+ PGEVTREG_OUT_OF_MEMORY,
+ PGEVTREG_PROC_REJECTED
+} PGRegEventResult;
+
/* Callback Event Ids */
typedef enum
{
@@ -69,8 +79,9 @@ typedef struct
typedef int (*PGEventProc) (PGEventId evtId, void *evtInfo, void *passThrough);
/* Registers an event proc with the given PGconn. */
-extern int PQregisterEventProc(PGconn *conn, PGEventProc proc,
- const char *name, void *passThrough);
+extern PGRegEventResult PQregisterEventProc(PGconn *conn, PGEventProc proc,
+ const char *name,
+ void *passThrough);
/* Sets the PGconn instance data for the provided proc to data. */
extern int PQsetInstanceData(PGconn *conn, PGEventProc proc, void *data);
--
2.18.2
----Next_Part(Fri_Mar_13_16_21_13_2020_620)--
Content-Type: Text/X-Patch; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="0006-Add-new-libpq-event-PGEVT_CONNDISCONNECTION.patch"
view thread (107+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [PATCH 05/11] Fix interface of PQregisterEventProc
In-Reply-To: <no-message-id-1882515@localhost>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox