Author: phd
Date: 2010-03-17 11:20:30 -0600 (Wed, 17 Mar 2010)
New Revision: 4132
Added:
SQLObject/trunk/sqlobject/rdbhost/
SQLObject/trunk/sqlobject/rdbhost/__init__.py
SQLObject/trunk/sqlobject/rdbhost/rdbhostconnection.py
Modified:
SQLObject/trunk/docs/Authors.txt
SQLObject/trunk/docs/News.txt
SQLObject/trunk/sqlobject/conftest.py
SQLObject/trunk/sqlobject/converters.py
SQLObject/trunk/sqlobject/dbconnection.py
SQLObject/trunk/sqlobject/sqlbuilder.py
SQLObject/trunk/sqlobject/tests/dbtest.py
SQLObject/trunk/sqlobject/tests/test_auto.py
Log:
Added a connection class for rdbhost.com (commercial Postgres-over-Web service).
Modified: SQLObject/trunk/docs/Authors.txt
===================================================================
--- SQLObject/trunk/docs/Authors.txt 2010-03-04 13:26:10 UTC (rev 4131)
+++ SQLObject/trunk/docs/Authors.txt 2010-03-17 17:20:30 UTC (rev 4132)
@@ -22,6 +22,7 @@
* Dan Pascu <dan at ag-projects.com>
* Diez B. Roggisch <deets at web.de>
* Christopher Singley <csingley at gmail.com>
+* David Keeney <dkeeney at rdbhost.com>
* Oleg Broytman <ph...@ph...>
.. image:: http://sflogo.sourceforge.net/sflogo.php?group_id=74338&type=10
Modified: SQLObject/trunk/docs/News.txt
===================================================================
--- SQLObject/trunk/docs/News.txt 2010-03-04 13:26:10 UTC (rev 4131)
+++ SQLObject/trunk/docs/News.txt 2010-03-17 17:20:30 UTC (rev 4132)
@@ -19,6 +19,9 @@
* Added TimedeltaCol; currently it's only implemented on PostgreSQL as an
INTERVAL type.
+* Added a connection class for rdbhost.com (commercial Postgres-over-Web
+ service).
+
Small Features
--------------
Modified: SQLObject/trunk/sqlobject/conftest.py
===================================================================
--- SQLObject/trunk/sqlobject/conftest.py 2010-03-04 13:26:10 UTC (rev 4131)
+++ SQLObject/trunk/sqlobject/conftest.py 2010-03-17 17:20:30 UTC (rev 4132)
@@ -23,6 +23,7 @@
'dbm': 'dbm:///data',
'postgres': 'postgres:///test',
'postgresql': 'postgres:///test',
+ 'rdbhost': 'rdhbost://role:aut...@ww.../',
'pygresql': 'pygresql://localhost/test',
'sqlite': 'sqlite:/:memory:',
'sybase': 'sybase://test:test123@sybase/test?autoCommit=0',
Modified: SQLObject/trunk/sqlobject/converters.py
===================================================================
--- SQLObject/trunk/sqlobject/converters.py 2010-03-04 13:26:10 UTC (rev 4131)
+++ SQLObject/trunk/sqlobject/converters.py 2010-03-17 17:20:30 UTC (rev 4132)
@@ -83,7 +83,7 @@
elif isinstance(value, buffer):
value = str(value)
- if db in ('mysql', 'postgres'):
+ if db in ('mysql', 'postgres', 'rdbhost'):
for orig, repl in sqlStringReplace:
value = value.replace(orig, repl)
elif db in ('sqlite', 'firebird', 'sybase', 'maxdb', 'mssql'):
@@ -111,7 +111,7 @@
registerConverter(NumericType, IntConverter)
def BoolConverter(value, db):
- if db in ('postgres',):
+ if db in ('postgres', 'rdbhost'):
if value:
return "'t'"
else:
Modified: SQLObject/trunk/sqlobject/dbconnection.py
===================================================================
--- SQLObject/trunk/sqlobject/dbconnection.py 2010-03-04 13:26:10 UTC (rev 4131)
+++ SQLObject/trunk/sqlobject/dbconnection.py 2010-03-17 17:20:30 UTC (rev 4132)
@@ -966,5 +966,6 @@
import mssql
import mysql
import postgres
+import rdbhost
import sqlite
import sybase
Added: SQLObject/trunk/sqlobject/rdbhost/__init__.py
===================================================================
--- SQLObject/trunk/sqlobject/rdbhost/__init__.py (rev 0)
+++ SQLObject/trunk/sqlobject/rdbhost/__init__.py 2010-03-17 17:20:30 UTC (rev 4132)
@@ -0,0 +1,7 @@
+from sqlobject.dbconnection import registerConnection
+
+def builder():
+ import rdbhostconnection
+ return rdbhostconnection.RdbhostConnection
+
+registerConnection(['rdbhost'], builder)
Added: SQLObject/trunk/sqlobject/rdbhost/rdbhostconnection.py
===================================================================
--- SQLObject/trunk/sqlobject/rdbhost/rdbhostconnection.py (rev 0)
+++ SQLObject/trunk/sqlobject/rdbhost/rdbhostconnection.py 2010-03-17 17:20:30 UTC (rev 4132)
@@ -0,0 +1,78 @@
+"""
+This module written by David Keeney, 2009, 2010
+
+Released under the LGPL for use with the SQLObject ORM library.
+"""
+
+import re
+from sqlobject import col
+from sqlobject import sqlbuilder
+from sqlobject.converters import registerConverter
+from sqlobject.dbconnection import DBAPI
+from sqlobject.postgres.pgconnection import PostgresConnection
+
+class RdbhostConnection(PostgresConnection):
+
+ supportTransactions = False
+ dbName = 'rdbhost'
+ schemes = [dbName]
+
+ def __init__(self, dsn=None, host=None, port=None, db=None,
+ user=None, password=None, backend='rdbhost', unicodeCols=False,
+ **kw):
+ backends = backend
+ for backend in backends.split(','):
+ backend = backend.strip()
+ if not backend:
+ continue
+ try:
+ if backend == 'rdbhost':
+ from rdbhdb import rdbhdb as rdb
+ # monkey patch % escaping into Cursor._execute
+ old_execute = getattr(rdb.Cursor, '_execute')
+ setattr(rdb.Cursor, '_old_execute', old_execute)
+ def _execute(self, query, *args):
+ assert not any([a for a in args])
+ query = query.replace('%', '%%')
+ self._old_execute(query, (), (), ())
+ setattr(rdb.Cursor, '_execute', _execute)
+ self.module = rdb
+ else:
+ raise ValueError('Unknown Rdbhost backend %s'%backend)
+ except ImportError:
+ pass
+ else:
+ break
+ else:
+ raise ImportError('Cannot find the Rdbhost backend')
+ self.user = user
+ self.host = host
+ self.port = port
+ self.db = db
+ self.password = password
+ self.dsn_dict = dsn_dict = {}
+ self.use_dsn = dsn is not None
+ if host:
+ dsn_dict["host"] = host
+ if user:
+ dsn_dict["role"] = user
+ if password:
+ dsn_dict["authcode"] = password
+ if dsn is None:
+ dsn = []
+ if db:
+ dsn.append('dbname=%s' % db)
+ if user:
+ dsn.append('user=%s' % user)
+ if password:
+ dsn.append('password=%s' % password)
+ if host:
+ dsn.append('host=%s' % host)
+ if port:
+ dsn.append('port=%d' % port)
+ dsn = ' '.join(dsn)
+ self.dsn = dsn
+ self.unicodeCols = unicodeCols
+ self.schema = kw.pop('schema', None)
+ self.dbEncoding = 'utf-8'
+ DBAPI.__init__(self, **kw)
Modified: SQLObject/trunk/sqlobject/sqlbuilder.py
===================================================================
--- SQLObject/trunk/sqlobject/sqlbuilder.py 2010-03-04 13:26:10 UTC (rev 4131)
+++ SQLObject/trunk/sqlobject/sqlbuilder.py 2010-03-17 17:20:30 UTC (rev 4132)
@@ -912,7 +912,7 @@
raise TypeError, "expected str, unicode or SQLExpression, got %s" % type(s)
def _quote_like_special(s, db):
- if db == 'postgres':
+ if db in ('postgres', 'rdbhost'):
escape = r'\\'
else:
escape = '\\'
@@ -1178,6 +1178,7 @@
'maxdb': 'RLIKE',
'mysql': 'RLIKE',
'postgres': '~',
+ 'rdbhost': '~',
'sqlite': 'REGEXP'
}
Modified: SQLObject/trunk/sqlobject/tests/dbtest.py
===================================================================
--- SQLObject/trunk/sqlobject/tests/dbtest.py 2010-03-04 13:26:10 UTC (rev 4131)
+++ SQLObject/trunk/sqlobject/tests/dbtest.py 2010-03-17 17:20:30 UTC (rev 4132)
@@ -39,10 +39,10 @@
"""
supportsMatrix = {
'+exceptions': 'mysql sqlite',
- '-transactions': 'mysql',
+ '-transactions': 'mysql rdbhost',
'-dropTableCascade': 'sybase mssql',
'-expressionIndex': 'mysql sqlite firebird mssql',
- '-blobData': 'mssql',
+ '-blobData': 'mssql rdbhost',
'-decimalColumn': 'mssql',
'-emptyTable': 'mssql',
'-limitSelect' : 'mssql',
@@ -276,6 +276,7 @@
"The supportMatrix does not list this feature: %r"
% feature)
+
# To avoid name clashes:
_inserts = inserts
Modified: SQLObject/trunk/sqlobject/tests/test_auto.py
===================================================================
--- SQLObject/trunk/sqlobject/tests/test_auto.py 2010-03-04 13:26:10 UTC (rev 4131)
+++ SQLObject/trunk/sqlobject/tests/test_auto.py 2010-03-17 17:20:30 UTC (rev 4132)
@@ -104,6 +104,19 @@
)
"""
+ rdbhostCreate = """
+ CREATE TABLE auto_test (
+ auto_id SERIAL PRIMARY KEY,
+ first_name VARCHAR(100),
+ last_name VARCHAR(200) NOT NULL,
+ age INT DEFAULT 0,
+ created VARCHAR(40) NOT NULL,
+ happy char(1) DEFAULT 'Y' NOT NULL,
+ long_field TEXT,
+ wannahavefun BOOL DEFAULT FALSE NOT NULL
+ )
+ """
+
sqliteCreate = """
CREATE TABLE auto_test (
auto_id INTEGER PRIMARY KEY AUTOINCREMENT ,
@@ -151,7 +164,7 @@
DROP TABLE auto_test
"""
- sqliteDrop = sybaseDrop = mssqlDrop = postgresDrop
+ sqliteDrop = sybaseDrop = mssqlDrop = postgresDrop = rdbhostDrop
def setup_method(self, meth):
conn = getConnection()
|