libpq_params_parse_merge.diff
application/octet-stream
Filename: libpq_params_parse_merge.diff
Type: application/octet-stream
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/interfaces/libpq/exports.txt | 0 | 0 |
| src/interfaces/libpq/fe-connect.c | 0 | 0 |
| src/interfaces/libpq/libpq-fe.h | 0 | 0 |
diff --git a/src/interfaces/libpq/exports.txt b/src/interfaces/libpq/exports.txt
new file mode 100644
index 93da50d..5566943
*** a/src/interfaces/libpq/exports.txt
--- b/src/interfaces/libpq/exports.txt
*************** lo_lseek64 162
*** 165,167 ****
--- 165,169 ----
lo_tell64 163
lo_truncate64 164
PQconninfo 165
+ PQconninfoParseParams 166
+ PQconninfodefaultsMerge 167
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
new file mode 100644
index eea9c6b..5546c38
*** a/src/interfaces/libpq/fe-connect.c
--- b/src/interfaces/libpq/fe-connect.c
*************** PQconninfoParse(const char *conninfo, ch
*** 4002,4007 ****
--- 4002,4085 ----
}
/*
+ * PQconninfoParseParams
+ *
+ * Parse a string like PQconnectdbParams() would do and return the
+ * resulting connection options array. NULL is returned on failure.
+ * The result contains only options specified directly in the array,
+ * not any possible default values.
+ *
+ * If errmsg isn't NULL, *errmsg is set to NULL on success, or a malloc'd
+ * string on failure (use PQfreemem to free it). In out-of-memory conditions
+ * both *errmsg and the result could be NULL.
+ *
+ * NOTE: the returned array is dynamically allocated and should
+ * be freed when no longer needed via PQconninfoFree().
+ */
+ PQconninfoOption *PQconninfoParseParams(const char *const * keywords,
+ const char *const * values, int expand_dbname,
+ char **errmsg)
+ {
+ PQExpBufferData errorBuf;
+ PQconninfoOption *connOptions;
+
+ if (errmsg)
+ *errmsg = NULL; /* default */
+ initPQExpBuffer(&errorBuf);
+ if (PQExpBufferDataBroken(errorBuf))
+ return NULL; /* out of memory already :-( */
+ connOptions = conninfo_array_parse(keywords, values,
+ &errorBuf,
+ false, expand_dbname);
+
+ if (connOptions == NULL && errmsg)
+ *errmsg = errorBuf.data;
+ else
+ termPQExpBuffer(&errorBuf);
+ return connOptions;
+ }
+
+ /*
+ * PQconninfodefaultsMerge
+ *
+ * Add the default values for any unspecified options to the connection
+ * options array.
+ *
+ * Defaults are obtained from a service file, environment variables, etc.
+ *
+ * Returns 1 if successful, otherwise 0; connOptions is freed and errmsg is
+ * filled in upon failure. Note that failure to locate a default value is
+ * not an error condition here --- we just leave the option's value as NULL.
+ *
+ * If errmsg isn't NULL, *errmsg is set to NULL on success, or a malloc'd
+ * string on failure (use PQfreemem to free it). In out-of-memory conditions
+ * both *errmsg and the result could be NULL.
+ */
+ int
+ PQconninfodefaultsMerge(PQconninfoOption *connOptions, char **errmsg)
+ {
+ PQExpBufferData errorBuf;
+
+ if (errmsg)
+ *errmsg = NULL;
+ initPQExpBuffer(&errorBuf);
+ if (PQExpBufferDataBroken(errorBuf))
+ {
+ PQconninfoFree(connOptions);
+ return 0;
+ }
+ if (!conninfo_add_defaults(connOptions, &errorBuf))
+ {
+ if (errmsg)
+ *errmsg = errorBuf.data;
+ PQconninfoFree(connOptions);
+ return 0;
+ }
+ termPQExpBuffer(&errorBuf);
+ return 1;
+ }
+
+ /*
* Build a working copy of the constant PQconninfoOptions array.
*/
static PQconninfoOption *
diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h
new file mode 100644
index e0f4bc7..9fa3c1c
*** a/src/interfaces/libpq/libpq-fe.h
--- b/src/interfaces/libpq/libpq-fe.h
*************** extern PQconninfoOption *PQconndefaults(
*** 267,276 ****
/* parse connection options in same way as PQconnectdb */
extern PQconninfoOption *PQconninfoParse(const char *conninfo, char **errmsg);
/* return the connection options used by a live connection */
extern PQconninfoOption *PQconninfo(PGconn *conn);
! /* free the data structure returned by PQconndefaults() or PQconninfoParse() */
extern void PQconninfoFree(PQconninfoOption *connOptions);
/*
--- 267,284 ----
/* parse connection options in same way as PQconnectdb */
extern PQconninfoOption *PQconninfoParse(const char *conninfo, char **errmsg);
+ /* parse connection options in same way as PQconnectdbParams */
+ extern PQconninfoOption *PQconninfoParseParams(const char *const * keywords,
+ const char *const * values, int expand_dbname,
+ char **errmsg);
+
+ /* Merge default connection options into an existing PQconninfoOption struct */
+ extern int PQconninfodefaultsMerge(PQconninfoOption *connOptions, char **errmsg);
+
/* return the connection options used by a live connection */
extern PQconninfoOption *PQconninfo(PGconn *conn);
! /* free the data structure returned by PQconndefaults(), PQconninfoParse(), or PQconninfoParseParams() */
extern void PQconninfoFree(PQconninfoOption *connOptions);
/*