From 4d005b5c9cb26313394bb417a2501ad1993034ea Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Sun, 17 Mar 2019 17:25:41 +0100 Subject: [PATCH] Improve Postgres connection string parsing. Add support for single-quoting database name as in the Postgres documentation about connection string at: https://www.postgresql.org/docs/10/libpq-connect.html#LIBPQ-CONNSTRING In passing, allow for ipv6 as well as ipv4 host ip addresses. Fixes #923. --- src/parsers/command-db-uri.lisp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/parsers/command-db-uri.lisp b/src/parsers/command-db-uri.lisp index 339d45f..8ada563 100644 --- a/src/parsers/command-db-uri.lisp +++ b/src/parsers/command-db-uri.lisp @@ -55,6 +55,10 @@ (:lambda (ipv4) (list :ipv4 (text ipv4)))) +(defrule ipv6 (and #\[ (+ (or (digit-char-p character) ":")) #\]) + (:lambda (ipv6) + (list :ipv6 (text ipv6)))) + ;;; socket directory is unix only, so we can forbid ":" on the parsing (defun socket-directory-character-p (char) (or (member char #.(quote (coerce "/.-_" 'list))) @@ -71,7 +75,7 @@ (let ((host (text name))) (list :host (unless (string= "" host) host))))) -(defrule hostname (or ipv4 socket-directory network-name) +(defrule hostname (or ipv4 ipv6 socket-directory network-name) (:identity t)) (defun process-hostname (hostname) @@ -79,6 +83,7 @@ (ecase type (:unix (if name (cons :unix name) :unix)) (:ipv4 name) + (:ipv6 name) (:host name)))) (defrule dsn-hostname (and (? hostname) (? dsn-port)) @@ -87,9 +92,10 @@ (append (list :host (when host (process-hostname host))) port)))) -(defrule dsn-dbname (and "/" (? (* (or (alpha-char-p character) - (digit-char-p character) - punct)))) +(defrule dsn-dbname (and "/" (? (or single-quoted-string + (* (or (alpha-char-p character) + (digit-char-p character) + punct))))) (:lambda (dbn) (list :dbname (text (second dbn)))))