libpq_repli_v0.diff
text/plain
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
Series: patch v0
| File | + | − |
|---|---|---|
| src/interfaces/libpq/fe-connect.c | 83 | 1 |
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 9eaf410..14e31b6 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -569,6 +569,81 @@ PQconnectStartParams(const char *const * keywords,
return conn;
}
+struct ConninfoRepli {
+ int n_conninfo;
+ char *conninfo_array[128];
+};
+
+static bool
+parse_conninfo_repli(char *conninfo, size_t len, const char *conninfo_repli)
+{
+ char buf[1024];
+ char *conninfo_ptr;
+ char *end_ptr;
+ struct ConninfoRepli conninfo_r;
+ static int conninfo_idx = 0;
+
+ int i;
+
+ memset(&conninfo_r, 0, sizeof(struct ConninfoRepli));
+
+ conninfo_r.n_conninfo = 0;
+
+#ifdef REPLI_DEBUG
+ printf("DEBUG: %s\n", conninfo_repli);
+#endif
+
+ conninfo_ptr = (char *)conninfo_repli;
+
+ while (1)
+ {
+ int len;
+
+ end_ptr = strchr(conninfo_ptr, ';');
+ if ( end_ptr )
+ len = end_ptr - conninfo_ptr;
+ else
+ len = strlen(conninfo_ptr);
+
+ memset(buf, 0, sizeof(buf));
+ strncpy(buf, conninfo_ptr, len);
+
+ conninfo_r.conninfo_array[conninfo_r.n_conninfo] = strdup(buf);
+ conninfo_r.n_conninfo++;
+
+ if ( !end_ptr )
+ break;
+
+ conninfo_ptr = end_ptr + 1;
+ }
+
+#ifdef REPLI_DEBUG
+ printf("DEBUG: n_conninfo = %d\n", conninfo_r.n_conninfo);
+
+ for (i=0 ; i<conninfo_r.n_conninfo ; i++)
+ {
+ printf("DEBUG: %s\n", conninfo_r.conninfo_array[i]);
+ }
+#endif
+
+ strncpy(conninfo, conninfo_r.conninfo_array[conninfo_idx], len);
+ conninfo_idx++;
+
+#ifdef REPLI_DEBUG
+ printf("DEBUG: conninfo = %s\n", conninfo);
+#endif
+
+ if ( conninfo_idx >= conninfo_r.n_conninfo )
+ conninfo_idx = 0;
+
+ for (i=0 ; i<conninfo_r.n_conninfo ; i++)
+ {
+ free(conninfo_r.conninfo_array[i]);
+ }
+
+ return true;
+}
+
/*
* PQconnectStart
*
@@ -592,6 +667,7 @@ PGconn *
PQconnectStart(const char *conninfo)
{
PGconn *conn;
+ char conninfo2[1024];
/*
* Allocate memory for the conn structure
@@ -601,9 +677,15 @@ PQconnectStart(const char *conninfo)
return NULL;
/*
+ * Parse an user-specified conninfo string that contains
+ * multiple conninfo strings, and pick one by round-robin basis.
+ */
+ parse_conninfo_repli(conninfo2, sizeof(conninfo2), conninfo);
+
+ /*
* Parse the conninfo string
*/
- if (!connectOptions1(conn, conninfo))
+ if (!connectOptions1(conn, conninfo2))
return conn;
/*