diff options
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/databases/access.py | 12 | ||||
| -rw-r--r-- | lib/sqlalchemy/databases/firebird.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/databases/mssql.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/databases/mysql.py | 3 | ||||
| -rw-r--r-- | lib/sqlalchemy/databases/postgres.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/url.py | 82 |
6 files changed, 61 insertions, 42 deletions
diff --git a/lib/sqlalchemy/databases/access.py b/lib/sqlalchemy/databases/access.py index 2d36049ed..7552b897d 100644 --- a/lib/sqlalchemy/databases/access.py +++ b/lib/sqlalchemy/databases/access.py @@ -202,14 +202,14 @@ class AccessDialect(default.DefaultDialect): dbapi = classmethod(dbapi) def create_connect_args(self, url): - opts = url.translate_connect_args(['host', 'database', 'username', 'password', 'port']) + opts = url.translate_connect_args() connectors = ["Driver={Microsoft Access Driver (*.mdb)}"] connectors.append("Dbq=%s" % opts["database"]) - user = opts.get("user") + user = opts.get("username", None) if user: connectors.append("UID=%s" % user) connectors.append("PWD=%s" % opts.get("password", "")) - return [[";".join (connectors)], {}] + return [[";".join(connectors)], {}] def create_execution_context(self, *args, **kwargs): return AccessExecutionContext(self, *args, **kwargs) @@ -273,8 +273,7 @@ class AccessDialect(default.DefaultDialect): # A fresh DAO connection is opened for each reflection # This is necessary, so we get the latest updates - opts = connection.engine.url.translate_connect_args(['host', 'database', 'username', 'password', 'port']) - dtbs = daoEngine.OpenDatabase(opts['database']) + dtbs = daoEngine.OpenDatabase(connection.engine.url.database) try: for tbl in dtbs.TableDefs: @@ -340,8 +339,7 @@ class AccessDialect(default.DefaultDialect): def table_names(self, connection, schema): # A fresh DAO connection is opened for each reflection # This is necessary, so we get the latest updates - opts = connection.engine.url.translate_connect_args(['host', 'database', 'username', 'password', 'port']) - dtbs = daoEngine.OpenDatabase(opts['database']) + dtbs = daoEngine.OpenDatabase(connection.engine.url.database) names = [t.Name for t in dtbs.TableDefs if t.Name[:4] != "MSys" and t.Name[:4] <> "~TMP"] dtbs.Close() diff --git a/lib/sqlalchemy/databases/firebird.py b/lib/sqlalchemy/databases/firebird.py index 2a9bbb5bd..a4262d9ca 100644 --- a/lib/sqlalchemy/databases/firebird.py +++ b/lib/sqlalchemy/databases/firebird.py @@ -116,7 +116,7 @@ class FBDialect(default.DefaultDialect): dbapi = classmethod(dbapi) def create_connect_args(self, url): - opts = url.translate_connect_args(['host', 'database', 'user', 'password', 'port']) + opts = url.translate_connect_args(username='user') if opts.get('port'): opts['host'] = "%s/%s" % (opts['host'], opts['port']) del opts['port'] diff --git a/lib/sqlalchemy/databases/mssql.py b/lib/sqlalchemy/databases/mssql.py index 03b276d4a..8a23ce9a3 100644 --- a/lib/sqlalchemy/databases/mssql.py +++ b/lib/sqlalchemy/databases/mssql.py @@ -447,7 +447,7 @@ class MSSQLDialect(default.DefaultDialect): dbapi = classmethod(dbapi) def create_connect_args(self, url): - opts = url.translate_connect_args(['host', 'database', 'user', 'password', 'port']) + opts = url.translate_connect_args(username='user') opts.update(url.query) if 'auto_identity_insert' in opts: self.auto_identity_insert = bool(int(opts.pop('auto_identity_insert'))) diff --git a/lib/sqlalchemy/databases/mysql.py b/lib/sqlalchemy/databases/mysql.py index af01cf84e..6d5c54578 100644 --- a/lib/sqlalchemy/databases/mysql.py +++ b/lib/sqlalchemy/databases/mysql.py @@ -1353,7 +1353,8 @@ class MySQLDialect(default.DefaultDialect): dbapi = classmethod(dbapi) def create_connect_args(self, url): - opts = url.translate_connect_args(['host', 'db', 'user', 'passwd', 'port']) + opts = url.translate_connect_args(database='db', username='user', + password='passwd') opts.update(url.query) util.coerce_kw_type(opts, 'compress', bool) diff --git a/lib/sqlalchemy/databases/postgres.py b/lib/sqlalchemy/databases/postgres.py index e2876f1f8..eecdcebbd 100644 --- a/lib/sqlalchemy/databases/postgres.py +++ b/lib/sqlalchemy/databases/postgres.py @@ -240,7 +240,7 @@ class PGDialect(default.DefaultDialect): dbapi = classmethod(dbapi) def create_connect_args(self, url): - opts = url.translate_connect_args(['host', 'database', 'user', 'password', 'port']) + opts = url.translate_connect_args(username='user') if 'port' in opts: opts['port'] = int(opts['port']) opts.update(url.query) diff --git a/lib/sqlalchemy/engine/url.py b/lib/sqlalchemy/engine/url.py index 1f6f9eff4..a3487638c 100644 --- a/lib/sqlalchemy/engine/url.py +++ b/lib/sqlalchemy/engine/url.py @@ -101,24 +101,40 @@ class URL(object): return dialect raise ImportError('unknown database %r' % self.drivername) - def translate_connect_args(self, names): - """Translate attributes into a dictionary of connection arguments. - - Given a list of argument names corresponding to the URL - attributes (`host`, `database`, `username`, `password`, - `port`), will assemble the attribute values of this URL into - the dictionary using the given names. + def translate_connect_args(self, names=[], **kw): + """Translate url attributes into a dictionary of connection arguments. + + Returns attributes of this url (`host`, `database`, `username`, + `password`, `port`) as a plain dictionary. The attribute names are + used as the keys by default. Unset or false attributes are omitted + from the final dictionary. + + \**kw + Optional, alternate key names for url attributes:: + + # return 'username' as 'user' + username='user' + + # omit 'database' + database=None + + names + Deprecated. A list of key names. Equivalent to the keyword + usage, must be provided in the order above. """ - a = {} + translated = {} attribute_names = ['host', 'database', 'username', 'password', 'port'] - for n in names: - sname = attribute_names.pop(0) - if n is None: - continue - if getattr(self, sname, None): - a[n] = getattr(self, sname) - return a + for sname in attribute_names: + if names: + name = names.pop(0) + elif sname in kw: + name = kw[sname] + else: + name = sname + if name is not None and getattr(self, sname, False): + translated[name] = getattr(self, sname) + return translated def make_url(name_or_url): """Given a string or unicode instance, produce a new URL instance. @@ -134,36 +150,40 @@ def make_url(name_or_url): def _parse_rfc1738_args(name): pattern = re.compile(r''' - (\w+):// + (?P<name>\w+):// (?: - ([^:/]*) - (?::([^/]*))? + (?P<username>[^:/]*) + (?::(?P<password>[^/]*))? @)? (?: - ([^/:]*) - (?::([^/]*))? + (?P<host>[^/:]*) + (?::(?P<port>[^/]*))? )? - (?:/(.*))? + (?:/(?P<database>.*))? ''' , re.X) m = pattern.match(name) if m is not None: - (name, username, password, host, port, database) = m.group(1, 2, 3, 4, 5, 6) - if database is not None: - tokens = database.split(r"?", 2) - database = tokens[0] - query = (len(tokens) > 1 and dict( cgi.parse_qsl(tokens[1]) ) or None) + components = m.groupdict() + if components['database'] is not None: + tokens = components['database'].split('?', 2) + components['database'] = tokens[0] + query = (len(tokens) > 1 and dict(cgi.parse_qsl(tokens[1]))) or None if query is not None: query = dict([(k.encode('ascii'), query[k]) for k in query]) else: query = None - opts = {'username':username,'password':password,'host':host,'port':port,'database':database, 'query':query} - if opts['password'] is not None: - opts['password'] = urllib.unquote_plus(opts['password']) - return URL(name, **opts) + components['query'] = query + + if components['password'] is not None: + components['password'] = urllib.unquote_plus(components['password']) + + name = components.pop('name') + return URL(name, **components) else: - raise exceptions.ArgumentError("Could not parse rfc1738 URL from string '%s'" % name) + raise exceptions.ArgumentError( + "Could not parse rfc1738 URL from string '%s'" % name) def _parse_keyvalue_args(name): m = re.match( r'(\w+)://(.*)', name) |
