Author: phd
Date: 2005-10-10 15:01:10 +0000 (Mon, 10 Oct 2005)
New Revision: 1098
Added:
home/phd/SQLObject/paramstyles/sqlobject/include/
home/phd/SQLObject/paramstyles/sqlobject/include/DBSingleStyle.py
home/phd/SQLObject/paramstyles/sqlobject/include/__init__.py
home/phd/SQLObject/paramstyles/sqlobject/include/update-paramstyles
Modified:
home/phd/SQLObject/paramstyles/sqlobject/dbconnection.py
home/phd/SQLObject/paramstyles/sqlobject/mysql/mysqlconnection.py
home/phd/SQLObject/paramstyles/sqlobject/sqlbuilder.py
Log:
Started "DBAPI prepared queries" branch. Added include/DBSingleStyle.py.
Modified: home/phd/SQLObject/paramstyles/sqlobject/dbconnection.py
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/dbconnection.py 2005-10-10 14:49:29 UTC (rev 1097)
+++ home/phd/SQLObject/paramstyles/sqlobject/dbconnection.py 2005-10-10 15:01:10 UTC (rev 1098)
@@ -19,6 +19,7 @@
from joins import sorter
from converters import sqlrepr
import classregistry
+from sqlobject.include import DBSingleStyle
warnings.filterwarnings("ignore", "DB-API extension cursor.lastrowid used")
@@ -289,10 +290,27 @@
threadName = ''
print '%(n)2i%(threadName)s/%(name)s%(spaces)s%(sep)s %(s)s' % locals()
+ def _convertQuery(self, query):
+ paramstyle = self.module.paramstyle
+ converter = getattr(DBSingleStyle, "to_" % paramstyle)
+ query_string, params = converter(query.query_list)
+ if paramstyle in ("named", "pyformat"):
+ keywords = params
+ params = []
+ else:
+ keywords = {}
+ return query_string, params, keywords
+
def _executeRetry(self, conn, cursor, query):
if self.debug:
self.printDebug(conn, query, 'QueryR')
- return cursor.execute(query)
+ if isinstance(query, str):
+ return cursor.execute(query)
+ elif isinstance(query, sqlbuilder.SQLQuery):
+ query_string, params, keywords = self._convertQuery(query)
+ return cursor.execute(query_string, *params, **keywords)
+ else:
+ raise TypeError, "_executeRetry expects query string, not %s" % type(query)
def _query(self, conn, s):
if self.debug:
Added: home/phd/SQLObject/paramstyles/sqlobject/include/DBSingleStyle.py
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/include/DBSingleStyle.py 2005-10-10 14:49:29 UTC (rev 1097)
+++ home/phd/SQLObject/paramstyles/sqlobject/include/DBSingleStyle.py 2005-10-10 15:01:10 UTC (rev 1098)
@@ -0,0 +1,117 @@
+#! /usr/bin/env python
+
+# This is DBSingleStyle.py (http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ppa/misc/DBSingleStyle.py?rev=HEAD&content-type=text/vnd.viewcvs-markup)
+# written by Denis Otkidach (http://sourceforge.net/users/ods/).
+# License: Python (PSF).
+#
+# See also Python Publishing Accessories (http://ppa.sourceforge.net/).
+
+class Raw:
+ def __init__(self, value):
+ self.value = value
+ def __repr__(self):
+ return 'Raw(%r)' % (self.value,)
+
+class Param(object):
+ def __new__(cls, value):
+ if isinstance(value, Raw):
+ return value.value
+ else:
+ self = object.__new__(cls)
+ self.value = value
+ return self
+ def __repr__(self):
+ return 'Param(%r)' % (self.value,)
+
+def to_qmark(chunks):
+ query_parts = []
+ params = []
+ for chunk in chunks:
+ if isinstance(chunk, Param):
+ params.append(chunk.value)
+ query_parts.append('?')
+ elif isinstance(chunk, basestring):
+ query_parts.append(chunk)
+ else:
+ raise TypeError, "expected a string, got '%s' at the chunk '%s'" % (type(chunk), chunk)
+ return ''.join(query_parts), params
+
+def to_numeric(chunks):
+ query_parts = []
+ params = []
+ for chunk in chunks:
+ if isinstance(chunk, Param):
+ params.append(chunk.value)
+ query_parts.append(':%d' % len(params))
+ elif isinstance(chunk, basestring):
+ query_parts.append(chunk)
+ else:
+ raise TypeError, "expected a string, got '%s' at the chunk '%s'" % (type(chunk), chunk)
+ return ''.join(query_parts), tuple(params) # DCOracle2 has broken support
+ # for sequences of other types
+
+def to_named(chunks):
+ query_parts = []
+ params = {}
+ for chunk in chunks:
+ if isinstance(chunk, Param):
+ name = 'p%d' % len(params) # Are numbers in name allowed?
+ params[name] = chunk.value
+ query_parts.append(':%s' % name)
+ elif isinstance(chunk, basestring):
+ query_parts.append(chunk)
+ else:
+ raise TypeError, "expected a string, got '%s' at the chunk '%s'" % (type(chunk), chunk)
+ return ''.join(query_parts), params
+
+def to_format(chunks):
+ query_parts = []
+ params = []
+ for chunk in chunks:
+ if isinstance(chunk, Param):
+ params.append(chunk.value)
+ query_parts.append('%s')
+ elif isinstance(chunk, basestring):
+ query_parts.append(chunk.replace('%', '%%'))
+ else:
+ raise TypeError, "expected a string, got '%s' at the chunk '%s'" % (type(chunk), chunk)
+ return ''.join(query_parts), params
+
+def to_pyformat(chunks):
+ query_parts = []
+ params = {}
+ for chunk in chunks:
+ if isinstance(chunk, Param):
+ name = '%d' % len(params)
+ params[name] = chunk.value
+ query_parts.append('%%(%s)s' % name)
+ elif isinstance(chunk, basestring):
+ query_parts.append(chunk.replace('%', '%%'))
+ else:
+ raise TypeError, "expected a string, got '%s' at the chunk '%s'" % (type(chunk), chunk)
+ return ''.join(query_parts), params
+
+
+def insert(table, fields):
+ field_names = []
+ field_values = []
+ for field_name, field_value in fields.iteritems():
+ if field_names:
+ field_names.append(',')
+ field_values.append(',')
+ field_names.append(field_name)
+ field_values.append(Param(field_value))
+ return ['INSERT INTO ', table, ' ('] + field_names + \
+ [') VALUES ('] + field_values + [')']
+
+
+if __name__=='__main__':
+ query = ('SELECT * FROM test WHERE field1>', Param(10),
+ ' AND field2 LIKE ', Param('%value%'))
+ print 'Query:', query
+ for param_style in ('qmark', 'numeric', 'named', 'format', 'pyformat'):
+ print '%s: %r' % (param_style, vars()['to_'+param_style](query))
+ query = insert('documents', {'title': 'Doc title',
+ 'creation_dt': Raw('NOW()')})
+ for param_style in ('qmark', 'numeric', 'named', 'format', 'pyformat'):
+ print '%s: %r' % (param_style, vars()['to_'+param_style](query))
Property changes on: home/phd/SQLObject/paramstyles/sqlobject/include/DBSingleStyle.py
___________________________________________________________________
Name: svn:executable
+ *
Added: home/phd/SQLObject/paramstyles/sqlobject/include/__init__.py
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/include/__init__.py 2005-10-10 14:49:29 UTC (rev 1097)
+++ home/phd/SQLObject/paramstyles/sqlobject/include/__init__.py 2005-10-10 15:01:10 UTC (rev 1098)
@@ -0,0 +1 @@
+#
Added: home/phd/SQLObject/paramstyles/sqlobject/include/update-paramstyles
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/include/update-paramstyles 2005-10-10 14:49:29 UTC (rev 1097)
+++ home/phd/SQLObject/paramstyles/sqlobject/include/update-paramstyles 2005-10-10 15:01:10 UTC (rev 1098)
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+echo cd `dirname $0`
+cd `dirname $0`
+echo wget http://ppa.sourceforge.net/DBSingleStyle.py
+wget -O DBSingleStyle.py.tmp1 'http://cvs.sourceforge.net/viewcvs.py/*checkout*/ppa/misc/DBSingleStyle.py'
+
+echo DBSingleStyle.py
+echo '#! /usr/bin/env python
+
+# This is DBSingleStyle.py (http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ppa/misc/DBSingleStyle.py?rev=HEAD&content-type=text/vnd.viewcvs-markup)
+# written by Denis Otkidach (http://sourceforge.net/users/ods/).
+# License: Python (PSF).
+#
+# See also Python Publishing Accessories (http://ppa.sourceforge.net/).' >DBSingleStyle.py.tmp2
+
+awk 'NR==1 {} NR!=1 {print}' DBSingleStyle.py.tmp1 >>DBSingleStyle.py.tmp2
+cmp -s DBSingleStyle.py.tmp2 DBSingleStyle.py && \
+ rm DBSingleStyle.py.tmp2 || \
+ mv DBSingleStyle.py.tmp2 DBSingleStyle.py
+rm DBSingleStyle.py.tmp1
+chmod +x DBSingleStyle.py
Property changes on: home/phd/SQLObject/paramstyles/sqlobject/include/update-paramstyles
___________________________________________________________________
Name: svn:executable
+ *
Modified: home/phd/SQLObject/paramstyles/sqlobject/mysql/mysqlconnection.py
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/mysql/mysqlconnection.py 2005-10-10 14:49:29 UTC (rev 1097)
+++ home/phd/SQLObject/paramstyles/sqlobject/mysql/mysqlconnection.py 2005-10-10 15:01:10 UTC (rev 1098)
@@ -57,7 +57,7 @@
def _executeRetry(self, conn, cursor, query):
while 1:
try:
- return cursor.execute(query)
+ return DBAPI._executeRetry(self, conn, cursor, query)
except MySQLdb.OperationalError, e:
if e.args[0] == 2013: # SERVER_LOST error
if self.debug:
Modified: home/phd/SQLObject/paramstyles/sqlobject/sqlbuilder.py
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/sqlbuilder.py 2005-10-10 14:49:29 UTC (rev 1097)
+++ home/phd/SQLObject/paramstyles/sqlobject/sqlbuilder.py 2005-10-10 15:01:10 UTC (rev 1098)
@@ -428,6 +428,14 @@
########################################
+## SQL Queries
+########################################
+
+class SQLQuery(object):
+ def __init__(self, query_list):
+ self.query_list = query_list
+
+########################################
## SQL Statements
########################################
|