Author: phd
Date: Tue Mar 1 10:31:01 2011
New Revision: 4339
Log:
Quote components of DB URI.
Modified:
SQLObject/trunk/sqlobject/dbconnection.py
SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py
SQLObject/trunk/sqlobject/tests/test_parse_uri.py
Modified: SQLObject/trunk/sqlobject/dbconnection.py
==============================================================================
--- SQLObject/trunk/sqlobject/dbconnection.py Thu Feb 24 06:02:17 2011 (r4338)
+++ SQLObject/trunk/sqlobject/dbconnection.py Tue Mar 1 10:31:01 2011 (r4339)
@@ -88,7 +88,7 @@
registerConnectionInstance(self)
atexit.register(_closeConnection, weakref.ref(self))
- def uri(self):
+ def oldUri(self):
auth = getattr(self, 'user', '') or ''
if auth:
if self.password:
@@ -105,9 +105,30 @@
uri += '/'
db = self.db
if db.startswith('/'):
- db = path[1:]
+ db = db[1:]
return uri + db
+ def uri(self):
+ auth = getattr(self, 'user', '') or ''
+ if auth:
+ auth = urllib.quote(auth)
+ if self.password:
+ auth = auth + ':' + urllib.quote(self.password)
+ auth = auth + '@'
+ else:
+ assert not getattr(self, 'password', None), (
+ 'URIs cannot express passwords without usernames')
+ uri = '%s://%s' % (self.dbName, auth)
+ if self.host:
+ uri += self.host
+ if self.port:
+ uri += ':%d' % self.port
+ uri += '/'
+ db = self.db
+ if db.startswith('/'):
+ db = db[1:]
+ return uri + urllib.quote(db)
+
def connectionFromOldURI(cls, uri):
return cls._connectionFromParams(*cls._parseOldURI(uri))
connectionFromOldURI = classmethod(connectionFromOldURI)
Modified: SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py
==============================================================================
--- SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py Thu Feb 24 06:02:17 2011 (r4338)
+++ SQLObject/trunk/sqlobject/sqlite/sqliteconnection.py Tue Mar 1 10:31:01 2011 (r4339)
@@ -1,6 +1,7 @@
import base64
import os
import thread
+import urllib
from sqlobject.dbconnection import DBAPI, Boolean
from sqlobject import col, sqlbuilder
from sqlobject.dberrors import *
@@ -112,10 +113,12 @@
path = self.filename
if path == ":memory:":
path = "/:memory:"
- elif path.startswith('/'):
- path = "//" + path
else:
- path = "///" + path
+ if path.startswith('/'):
+ path = "//" + path
+ else:
+ path = "///" + path
+ path = urllib.quote(path)
return 'sqlite:%s' % path
def getConnection(self):
Modified: SQLObject/trunk/sqlobject/tests/test_parse_uri.py
==============================================================================
--- SQLObject/trunk/sqlobject/tests/test_parse_uri.py Thu Feb 24 06:02:17 2011 (r4338)
+++ SQLObject/trunk/sqlobject/tests/test_parse_uri.py Tue Mar 1 10:31:01 2011 (r4339)
@@ -1,5 +1,6 @@
import os
from sqlobject.dbconnection import DBConnection
+from sqlobject.sqlite.sqliteconnection import SQLiteConnection
########################################
## Test _parseURI
@@ -88,3 +89,36 @@
assert port is None
assert path == "/C:/full/path/to/database"
assert args == {}
+
+def test_uri():
+ connection = DBConnection()
+ connection.close = lambda: None
+
+ connection.dbName, connection.host, connection.port, connection.user, connection.password, connection.db = 'mysql', 'host', None, None, None, 'database'
+ assert connection.uri() == "mysql://host/database"
+
+ connection.dbName, connection.host, connection.port, connection.user, connection.password, connection.db = 'mysql', 'host', None, 'user', 'pass word', 'database'
+ assert connection.uri() == "mysql://user:pass%20word@host/database"
+
+ connection.dbName, connection.host, connection.port, connection.user, connection.password, connection.db = 'postgres', 'host', None, 'user', None, 'database'
+ assert connection.uri() == "postgres://user@host/database"
+
+ connection.dbName, connection.host, connection.port, connection.user, connection.password, connection.db = 'postgres', 'host', 5432, None, None, 'database'
+ assert connection.uri() == "postgres://host:5432/database"
+
+ connection.dbName, connection.host, connection.port, connection.user, connection.password, connection.db = 'postgres', None, None, None, None, '/full/path/to/socket/database'
+ assert connection.uri() == "postgres:///full/path/to/socket/database"
+
+ connection.dbName, connection.host, connection.port, connection.user, connection.password, connection.db = 'postgres', 'host', None, 'us:er', 'p@ssword', 'database'
+ assert connection.uri() == "postgres://us%3Aer:p%40ssword@host/database"
+
+ connection = SQLiteConnection(None)
+ connection.filename = '/full/path/to/database'
+ assert connection.uri() == "sqlite:///full/path/to/database"
+
+ connection.filename = ':memory:'
+ assert connection.uri() == "sqlite:/:memory:"
+
+ if os.name == 'nt':
+ connection.filename = 'C:/full/path/to/database'
+ assert connection.uri() == "sqlite:///C:/full/path/to/database"
|