mirror of
				https://github.com/psycopg/psycopg2.git
				synced 2025-10-31 07:47:30 +03:00 
			
		
		
		
	Escape parameters to the connection strings as required by PQconnectdb
This commit is contained in:
		
							parent
							
								
									99ac79511c
								
							
						
					
					
						commit
						625cc1b402
					
				|  | @ -97,6 +97,24 @@ else: | ||||||
|     _ext.register_adapter(Decimal, Adapter) |     _ext.register_adapter(Decimal, Adapter) | ||||||
|     del 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, | def connect(dsn=None, | ||||||
|         database=None, user=None, password=None, host=None, port=None, |         database=None, user=None, password=None, host=None, port=None, | ||||||
|  | @ -147,7 +165,8 @@ def connect(dsn=None, | ||||||
| 
 | 
 | ||||||
|         items.extend( |         items.extend( | ||||||
|             [(k, v) for (k, v) in kwargs.iteritems() if v is not None]) |             [(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: |         if not dsn: | ||||||
|             raise InterfaceError('missing dsn and no parameters') |             raise InterfaceError('missing dsn and no parameters') | ||||||
|  |  | ||||||
|  | @ -99,6 +99,26 @@ class ConnectTestCase(unittest.TestCase): | ||||||
|         self.assertEqual(self.args[1], None) |         self.assertEqual(self.args[1], None) | ||||||
|         self.assert_(self.args[2]) |         self.assert_(self.args[2]) | ||||||
| 
 | 
 | ||||||
|  |     def test_empty_param(self): | ||||||
|  |         psycopg2.connect(database='sony', password='') | ||||||
|  |         self.assertEqual(self.args[0], "dbname=sony password=''") | ||||||
|  | 
 | ||||||
|  |     def test_escape(self): | ||||||
|  |         psycopg2.connect(database='hello world') | ||||||
|  |         self.assertEqual(self.args[0], "dbname='hello world'") | ||||||
|  | 
 | ||||||
|  |         psycopg2.connect(database=r'back\slash') | ||||||
|  |         self.assertEqual(self.args[0], r"dbname=back\\slash") | ||||||
|  | 
 | ||||||
|  |         psycopg2.connect(database="quo'te") | ||||||
|  |         self.assertEqual(self.args[0], r"dbname=quo\'te") | ||||||
|  | 
 | ||||||
|  |         psycopg2.connect(database="with\ttab") | ||||||
|  |         self.assertEqual(self.args[0], "dbname='with\ttab'") | ||||||
|  | 
 | ||||||
|  |         psycopg2.connect(database=r"\every thing'") | ||||||
|  |         self.assertEqual(self.args[0], r"dbname='\\every thing\''") | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def test_suite(): | def test_suite(): | ||||||
|     return unittest.TestLoader().loadTestsFromName(__name__) |     return unittest.TestLoader().loadTestsFromName(__name__) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user