summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>2011-11-17 21:19:01 +0000
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>2011-11-17 21:51:24 +0000
commit625cc1b402b33799757fb9b8fe421a2ea63e1236 (patch)
tree5df1ce82092b1344a7ad2770d425823eda23ebaa /lib
parent99ac79511cc69b3c16eb63044ede9f54ea852455 (diff)
downloadpsycopg2-625cc1b402b33799757fb9b8fe421a2ea63e1236.tar.gz
Escape parameters to the connection strings as required by PQconnectdb
Diffstat (limited to 'lib')
-rw-r--r--lib/__init__.py21
1 files changed, 20 insertions, 1 deletions
diff --git a/lib/__init__.py b/lib/__init__.py
index 7676f3c..f42d081 100644
--- a/lib/__init__.py
+++ b/lib/__init__.py
@@ -97,6 +97,24 @@ else:
_ext.register_adapter(Decimal, Adapter)
del Decimal, Adapter
+import re
+
+def _param_escape(s,
+ re_escape=re.compile(r"([\\'])"),
+ re_space=re.compile(r'\s')):
+ """
+ Apply the escaping rule required by PQconnectdb
+ """
+ if not s: return "''"
+
+ s = re_escape.sub(r'\\\1', s)
+ if re_space.search(s):
+ s = "'" + s + "'"
+
+ return s
+
+del re
+
def connect(dsn=None,
database=None, user=None, password=None, host=None, port=None,
@@ -147,7 +165,8 @@ def connect(dsn=None,
items.extend(
[(k, v) for (k, v) in kwargs.iteritems() if v is not None])
- dsn = " ".join(["%s=%s" % item for item in items])
+ dsn = " ".join(["%s=%s" % (k, _param_escape(str(v)))
+ for (k, v) in items])
if not dsn:
raise InterfaceError('missing dsn and no parameters')