summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES2
-rw-r--r--lib/sqlalchemy/engine/strategies.py12
-rw-r--r--lib/sqlalchemy/engine/url.py15
-rw-r--r--test/parseconnect.py2
4 files changed, 25 insertions, 6 deletions
diff --git a/CHANGES b/CHANGES
index 06917f768..6dc0aec0b 100644
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,8 @@ more unit tests
- fix to docs, removed incorrect info that close() is unsafe to use
with threadlocal strategy (its totally safe !)
- create_engine() can take URLs as string or unicode [ticket:188]
+- firebird support ! thanks to James Ralston and Brad Clements for their
+efforts.
0.2.1
- "pool" argument to create_engine() properly propigates
diff --git a/lib/sqlalchemy/engine/strategies.py b/lib/sqlalchemy/engine/strategies.py
index d8b503add..e2f5c8b7c 100644
--- a/lib/sqlalchemy/engine/strategies.py
+++ b/lib/sqlalchemy/engine/strategies.py
@@ -29,7 +29,9 @@ class PlainEngineStrategy(EngineStrategy):
u = url.make_url(name_or_url)
module = u.get_module()
- dialect = module.dialect(**kwargs)
+ args = u.query.copy()
+ args.update(kwargs)
+ dialect = module.dialect(**args)
poolargs = {}
for key in (('echo_pool', 'echo'), ('pool_size', 'pool_size'), ('max_overflow', 'max_overflow'), ('poolclass', 'poolclass'), ('pool_timeout','timeout'), ('pool', 'pool')):
@@ -41,7 +43,7 @@ class PlainEngineStrategy(EngineStrategy):
poolargs['use_threadlocal'] = False
provider = default.PoolConnectionProvider(dialect, u, **poolargs)
- return base.ComposedSQLEngine(provider, dialect, **kwargs)
+ return base.ComposedSQLEngine(provider, dialect, **args)
PlainEngineStrategy()
class ThreadLocalEngineStrategy(EngineStrategy):
@@ -51,7 +53,9 @@ class ThreadLocalEngineStrategy(EngineStrategy):
u = url.make_url(name_or_url)
module = u.get_module()
- dialect = module.dialect(**kwargs)
+ args = u.query.copy()
+ args.update(kwargs)
+ dialect = module.dialect(**args)
poolargs = {}
for key in (('echo_pool', 'echo'), ('pool_size', 'pool_size'), ('max_overflow', 'max_overflow'), ('poolclass', 'poolclass'), ('pool_timeout','timeout'), ('pool', 'pool')):
@@ -63,7 +67,7 @@ class ThreadLocalEngineStrategy(EngineStrategy):
poolargs['use_threadlocal'] = True
provider = threadlocal.TLocalConnectionProvider(dialect, u, **poolargs)
- return threadlocal.TLEngine(provider, dialect, **kwargs)
+ return threadlocal.TLEngine(provider, dialect, **args)
ThreadLocalEngineStrategy()
diff --git a/lib/sqlalchemy/engine/url.py b/lib/sqlalchemy/engine/url.py
index a4297f5db..5e04e1317 100644
--- a/lib/sqlalchemy/engine/url.py
+++ b/lib/sqlalchemy/engine/url.py
@@ -3,13 +3,14 @@ import cgi
import sqlalchemy.exceptions as exceptions
class URL(object):
- def __init__(self, drivername, username=None, password=None, host=None, port=None, database=None):
+ def __init__(self, drivername, username=None, password=None, host=None, port=None, database=None, query=None):
self.drivername = drivername
self.username = username
self.password = password
self.host = host
self.port = port
self.database= database
+ self.query = query or {}
def __str__(self):
s = self.drivername + "://"
if self.username is not None:
@@ -23,6 +24,10 @@ class URL(object):
s += ':' + self.port
if self.database is not None:
s += '/' + self.database
+ if len(self.query):
+ keys = self.query.keys()
+ keys.sort()
+ s += '?' + "&".join("%s=%s" % (k, self.query[k]) for k in keys)
return s
def get_module(self):
return getattr(__import__('sqlalchemy.databases.%s' % self.drivername).databases, self.drivername)
@@ -66,7 +71,13 @@ def _parse_rfc1738_args(name):
m = pattern.match(name)
if m is not None:
(name, username, password, host, port, database) = m.group(1, 2, 3, 4, 5, 6)
- opts = {'username':username,'password':password,'host':host,'port':port,'database':database}
+ 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)
+ else:
+ query = None
+ opts = {'username':username,'password':password,'host':host,'port':port,'database':database, 'query':query}
return URL(name, **opts)
else:
raise exceptions.ArgumentError("Could not parse rfc1738 URL from string '%s'" % name)
diff --git a/test/parseconnect.py b/test/parseconnect.py
index f53b7e3f7..43389c272 100644
--- a/test/parseconnect.py
+++ b/test/parseconnect.py
@@ -13,10 +13,12 @@ class ParseConnectTest(PersistTest):
'dbtype://username:password@127.0.0.1:1521',
'dbtype://hostspec/database',
'dbtype://hostspec',
+ 'dbtype://hostspec/?arg1=val1&arg2=val2',
'dbtype:///database',
'dbtype:///:memory:',
'dbtype:///foo/bar/im/a/file',
'dbtype:///E:/work/src/LEM/db/hello.db',
+ 'dbtype:///E:/work/src/LEM/db/hello.db?foo=bar&hoho=lala',
'dbtype://',
'dbtype://username:password@/db'
):