mirror of
https://git.freebsd.org/ports.git
synced 2025-06-08 06:10:30 -04:00
2505 lines
107 KiB
Text
2505 lines
107 KiB
Text
--- sqlobject/col.py.orig 2014-05-04 12:48:24 UTC
|
|
+++ sqlobject/col.py
|
|
@@ -22,17 +22,17 @@ from array import array
|
|
from itertools import count
|
|
import re, time
|
|
try:
|
|
- import cPickle as pickle
|
|
+ import pickle as pickle
|
|
except ImportError:
|
|
import pickle
|
|
import weakref
|
|
from formencode import compound, validators
|
|
-from classregistry import findClass
|
|
+from .classregistry import findClass
|
|
# Sadly the name "constraints" conflicts with many of the function
|
|
# arguments in this module, so we rename it:
|
|
-import constraints as constrs
|
|
-import sqlbuilder
|
|
-from styles import capword
|
|
+from . import constraints as constrs
|
|
+from . import sqlbuilder
|
|
+from .styles import capword
|
|
|
|
NoDefault = sqlbuilder.NoDefault
|
|
|
|
@@ -218,7 +218,7 @@ class SOCol(object):
|
|
self.dbEncoding = dbEncoding
|
|
|
|
if extra_vars:
|
|
- for name, value in extra_vars.items():
|
|
+ for name, value in list(extra_vars.items()):
|
|
setattr(self, name, value)
|
|
|
|
def _set_validator(self, value):
|
|
@@ -286,7 +286,7 @@ class SOCol(object):
|
|
|
|
def _sqlType(self):
|
|
if self.customSQLType is None:
|
|
- raise ValueError, ("Col %s (%s) cannot be used for automatic "
|
|
+ raise ValueError("Col %s (%s) cannot be used for automatic "
|
|
"schema creation (too abstract)" %
|
|
(self.name, self.__class__))
|
|
else:
|
|
@@ -399,7 +399,7 @@ class Col(object):
|
|
super(Col, self).__init__()
|
|
self.__dict__['_name'] = name
|
|
self.__dict__['_kw'] = kw
|
|
- self.__dict__['creationOrder'] = creationOrder.next()
|
|
+ self.__dict__['creationOrder'] = next(creationOrder)
|
|
self.__dict__['_extra_vars'] = {}
|
|
|
|
def _set_name(self, value):
|
|
@@ -473,7 +473,7 @@ class SOStringLikeCol(SOCol):
|
|
|
|
def _check_case_sensitive(self, db):
|
|
if self.char_binary:
|
|
- raise ValueError, "%s does not support binary character columns" % db
|
|
+ raise ValueError("%s does not support binary character columns" % db)
|
|
|
|
def _mysqlType(self):
|
|
type = self._sqlType()
|
|
@@ -538,14 +538,14 @@ class StringValidator(SOValidator):
|
|
except AttributeError:
|
|
binaryType = type(None) # Just a simple workaround
|
|
dbEncoding = self.getDbEncoding(state, default='ascii')
|
|
- if isinstance(value, unicode):
|
|
+ if isinstance(value, str):
|
|
return value.encode(dbEncoding)
|
|
if self.dataType and isinstance(value, self.dataType):
|
|
return value
|
|
if isinstance(value, (str, buffer, binaryType, sqlbuilder.SQLExpression)):
|
|
return value
|
|
if hasattr(value, '__unicode__'):
|
|
- return unicode(value).encode(dbEncoding)
|
|
+ return str(value).encode(dbEncoding)
|
|
raise validators.Invalid("expected a str in the StringCol '%s', got %s %r instead" % \
|
|
(self.name, type(value), value), value, state)
|
|
|
|
@@ -563,7 +563,7 @@ class StringCol(Col):
|
|
|
|
class NQuoted(sqlbuilder.SQLExpression):
|
|
def __init__(self, value):
|
|
- assert isinstance(value, unicode)
|
|
+ assert isinstance(value, str)
|
|
self.value = value
|
|
def __hash__(self):
|
|
return hash(self.value)
|
|
@@ -576,14 +576,14 @@ class UnicodeStringValidator(SOValidator):
|
|
def to_python(self, value, state):
|
|
if value is None:
|
|
return None
|
|
- if isinstance(value, (unicode, sqlbuilder.SQLExpression)):
|
|
+ if isinstance(value, (str, sqlbuilder.SQLExpression)):
|
|
return value
|
|
if isinstance(value, str):
|
|
- return unicode(value, self.getDbEncoding(state))
|
|
+ return str(value, self.getDbEncoding(state))
|
|
if isinstance(value, array): # MySQL
|
|
- return unicode(value.tostring(), self.getDbEncoding(state))
|
|
+ return str(value.tostring(), self.getDbEncoding(state))
|
|
if hasattr(value, '__unicode__'):
|
|
- return unicode(value)
|
|
+ return str(value)
|
|
raise validators.Invalid("expected a str or a unicode in the UnicodeCol '%s', got %s %r instead" % \
|
|
(self.name, type(value), value), value, state)
|
|
|
|
@@ -592,7 +592,7 @@ class UnicodeStringValidator(SOValidator):
|
|
return None
|
|
if isinstance(value, (str, sqlbuilder.SQLExpression)):
|
|
return value
|
|
- if isinstance(value, unicode):
|
|
+ if isinstance(value, str):
|
|
try:
|
|
connection = state.connection or state.soObject._connection
|
|
except AttributeError:
|
|
@@ -602,7 +602,7 @@ class UnicodeStringValidator(SOValidator):
|
|
return NQuoted(value)
|
|
return value.encode(self.getDbEncoding(state))
|
|
if hasattr(value, '__unicode__'):
|
|
- return unicode(value).encode(self.getDbEncoding(state))
|
|
+ return str(value).encode(self.getDbEncoding(state))
|
|
raise validators.Invalid("expected a str or a unicode in the UnicodeCol '%s', got %s %r instead" % \
|
|
(self.name, type(value), value), value, state)
|
|
|
|
@@ -625,9 +625,9 @@ class IntValidator(SOValidator):
|
|
def to_python(self, value, state):
|
|
if value is None:
|
|
return None
|
|
- if isinstance(value, (int, long, sqlbuilder.SQLExpression)):
|
|
+ if isinstance(value, (int, sqlbuilder.SQLExpression)):
|
|
return value
|
|
- for converter, attr_name in (int, '__int__'), (long, '__long__'):
|
|
+ for converter, attr_name in (int, '__int__'), (int, '__long__'):
|
|
if hasattr(value, attr_name):
|
|
try:
|
|
return converter(value)
|
|
@@ -708,7 +708,7 @@ class BoolValidator(SOValidator):
|
|
return None
|
|
if isinstance(value, (bool, sqlbuilder.SQLExpression)):
|
|
return value
|
|
- if isinstance(value, (int, long)) or hasattr(value, '__nonzero__'):
|
|
+ if isinstance(value, int) or hasattr(value, '__nonzero__'):
|
|
return bool(value)
|
|
raise validators.Invalid("expected a bool or an int in the BoolCol '%s', got %s %r instead" % \
|
|
(self.name, type(value), value), value, state)
|
|
@@ -753,9 +753,9 @@ class FloatValidator(SOValidator):
|
|
def to_python(self, value, state):
|
|
if value is None:
|
|
return None
|
|
- if isinstance(value, (float, int, long, sqlbuilder.SQLExpression)):
|
|
+ if isinstance(value, (float, int, sqlbuilder.SQLExpression)):
|
|
return value
|
|
- for converter, attr_name in (float, '__float__'), (int, '__int__'), (long, '__long__'):
|
|
+ for converter, attr_name in (float, '__float__'), (int, '__int__'), (int, '__long__'):
|
|
if hasattr(value, attr_name):
|
|
try:
|
|
return converter(value)
|
|
@@ -964,7 +964,7 @@ class EnumValidator(SOValidator):
|
|
|
|
def to_python(self, value, state):
|
|
if value in self.enumValues:
|
|
- if isinstance(value, unicode):
|
|
+ if isinstance(value, str):
|
|
dbEncoding = self.getDbEncoding(state)
|
|
value = value.encode(dbEncoding)
|
|
return value
|
|
@@ -1000,7 +1000,7 @@ class SOEnumCol(SOCol):
|
|
return "ENUM(%s) NOT NULL" % ', '.join([sqlbuilder.sqlrepr(v, 'mysql') for v in self.enumValues])
|
|
|
|
def _postgresType(self):
|
|
- length = max(map(self._getlength, self.enumValues))
|
|
+ length = max(list(map(self._getlength, self.enumValues)))
|
|
enumValues = ', '.join([sqlbuilder.sqlrepr(v, 'postgres') for v in self.enumValues])
|
|
checkConstraint = "CHECK (%s in (%s))" % (self.dbName, enumValues)
|
|
return "VARCHAR(%i) %s" % (length, checkConstraint)
|
|
@@ -1014,7 +1014,7 @@ class SOEnumCol(SOCol):
|
|
return self._postgresType()
|
|
|
|
def _firebirdType(self):
|
|
- length = max(map(self._getlength, self.enumValues))
|
|
+ length = max(list(map(self._getlength, self.enumValues)))
|
|
enumValues = ', '.join([sqlbuilder.sqlrepr(v, 'firebird') for v in self.enumValues])
|
|
checkConstraint = "CHECK (%s in (%s))" % (self.dbName, enumValues)
|
|
#NB. Return a tuple, not a string here
|
|
@@ -1048,7 +1048,7 @@ class SetValidator(SOValidator):
|
|
(self.name, type(value), value), value, state)
|
|
|
|
def from_python(self, value, state):
|
|
- if isinstance(value, basestring):
|
|
+ if isinstance(value, str):
|
|
value = (value,)
|
|
try:
|
|
return ",".join(value)
|
|
@@ -1358,7 +1358,7 @@ class DecimalValidator(SOValidator):
|
|
def to_python(self, value, state):
|
|
if value is None:
|
|
return None
|
|
- if isinstance(value, (int, long, Decimal, sqlbuilder.SQLExpression)):
|
|
+ if isinstance(value, (int, Decimal, sqlbuilder.SQLExpression)):
|
|
return value
|
|
if isinstance(value, float):
|
|
value = str(value)
|
|
@@ -1380,7 +1380,7 @@ class DecimalValidator(SOValidator):
|
|
return None
|
|
if isinstance(value, float):
|
|
value = str(value)
|
|
- if isinstance(value, basestring):
|
|
+ if isinstance(value, str):
|
|
try:
|
|
connection = state.connection or state.soObject._connection
|
|
except AttributeError:
|
|
@@ -1393,7 +1393,7 @@ class DecimalValidator(SOValidator):
|
|
except:
|
|
raise validators.Invalid("can not parse Decimal value '%s' in the DecimalCol from '%s'" %
|
|
(value, getattr(state, 'soObject', '(unknown)')), value, state)
|
|
- if isinstance(value, (int, long, Decimal, sqlbuilder.SQLExpression)):
|
|
+ if isinstance(value, (int, Decimal, sqlbuilder.SQLExpression)):
|
|
return value
|
|
raise validators.Invalid("expected a Decimal in the DecimalCol '%s', got %s %r instead" % \
|
|
(self.name, type(value), value), value, state)
|
|
@@ -1447,7 +1447,7 @@ class DecimalStringValidator(DecimalValidator):
|
|
"Value must be less than %s" % int(self.max)
|
|
value = value.quantize(self.precision)
|
|
value = value.to_eng_string()
|
|
- elif isinstance(value, (int, long)):
|
|
+ elif isinstance(value, int):
|
|
value = str(value)
|
|
return value
|
|
|
|
@@ -1569,7 +1569,7 @@ class PickleValidator(BinaryValidator):
|
|
def to_python(self, value, state):
|
|
if value is None:
|
|
return None
|
|
- if isinstance(value, unicode):
|
|
+ if isinstance(value, str):
|
|
dbEncoding = self.getDbEncoding(state, default='ascii')
|
|
value = value.encode(dbEncoding)
|
|
if isinstance(value, str):
|
|
@@ -1610,7 +1610,7 @@ def pushKey(kw, name, value):
|
|
kw[name] = value
|
|
|
|
all = []
|
|
-for key, value in globals().items():
|
|
+for key, value in list(globals().items()):
|
|
if isinstance(value, type) and (issubclass(value, (Col, SOCol))):
|
|
all.append(key)
|
|
__all__.extend(all)
|
|
--- sqlobject/converters.py.orig 2014-05-04 12:48:24 UTC
|
|
+++ sqlobject/converters.py
|
|
@@ -95,7 +95,7 @@ def StringLikeConverter(value, db):
|
|
return "'%s'" % value
|
|
|
|
registerConverter(str, StringLikeConverter)
|
|
-registerConverter(unicode, StringLikeConverter)
|
|
+registerConverter(str, StringLikeConverter)
|
|
registerConverter(array, StringLikeConverter)
|
|
registerConverter(buffer, StringLikeConverter)
|
|
|
|
@@ -107,7 +107,7 @@ registerConverter(int, IntConverter)
|
|
def LongConverter(value, db):
|
|
return str(value)
|
|
|
|
-registerConverter(long, LongConverter)
|
|
+registerConverter(int, LongConverter)
|
|
|
|
if NumericType:
|
|
registerConverter(NumericType, IntConverter)
|
|
@@ -203,8 +203,8 @@ def sqlrepr(obj, db=None):
|
|
except AttributeError:
|
|
converter = lookupConverter(obj)
|
|
if converter is None:
|
|
- raise ValueError, "Unknown SQL builtin type: %s for %s" % \
|
|
- (type(obj), repr(obj))
|
|
+ raise ValueError("Unknown SQL builtin type: %s for %s" % \
|
|
+ (type(obj), repr(obj)))
|
|
return converter(obj, db)
|
|
else:
|
|
return reprFunc(db)
|
|
--- sqlobject/dbconnection.py.orig 2013-07-07 18:43:26 UTC
|
|
+++ sqlobject/dbconnection.py
|
|
@@ -6,17 +6,17 @@ import os
|
|
import sys
|
|
import threading
|
|
import types
|
|
-import urllib
|
|
+import urllib.request, urllib.parse, urllib.error
|
|
import warnings
|
|
import weakref
|
|
|
|
-from cache import CacheSet
|
|
-import classregistry
|
|
-import col
|
|
-from converters import sqlrepr
|
|
-import main
|
|
-import sqlbuilder
|
|
-from util.threadinglocal import local as threading_local
|
|
+from .cache import CacheSet
|
|
+from . import classregistry
|
|
+from . import col
|
|
+from .converters import sqlrepr
|
|
+from . import main
|
|
+from . import sqlbuilder
|
|
+from .util.threadinglocal import local as threading_local
|
|
|
|
warnings.filterwarnings("ignore", "DB-API extension cursor.lastrowid used")
|
|
|
|
@@ -34,7 +34,7 @@ class ConsoleWriter:
|
|
self.dbEncoding = getattr(connection, "dbEncoding", None) or "ascii"
|
|
def write(self, text):
|
|
logfile = getattr(sys, self.loglevel)
|
|
- if isinstance(text, unicode):
|
|
+ if isinstance(text, str):
|
|
try:
|
|
text = text.encode(self.dbEncoding)
|
|
except UnicodeEncodeError:
|
|
@@ -111,9 +111,9 @@ class DBConnection:
|
|
def uri(self):
|
|
auth = getattr(self, 'user', '') or ''
|
|
if auth:
|
|
- auth = urllib.quote(auth)
|
|
+ auth = urllib.parse.quote(auth)
|
|
if self.password:
|
|
- auth = auth + ':' + urllib.quote(self.password)
|
|
+ auth = auth + ':' + urllib.parse.quote(self.password)
|
|
auth = auth + '@'
|
|
else:
|
|
assert not getattr(self, 'password', None), (
|
|
@@ -127,7 +127,7 @@ class DBConnection:
|
|
db = self.db
|
|
if db.startswith('/'):
|
|
db = db[1:]
|
|
- return uri + urllib.quote(db)
|
|
+ return uri + urllib.parse.quote(db)
|
|
|
|
@classmethod
|
|
def connectionFromOldURI(cls, uri):
|
|
@@ -167,9 +167,9 @@ class DBConnection:
|
|
try:
|
|
port = int(port)
|
|
except ValueError:
|
|
- raise ValueError, "port must be integer, got '%s' instead" % port
|
|
+ raise ValueError("port must be integer, got '%s' instead" % port)
|
|
if not (1 <= port <= 65535):
|
|
- raise ValueError, "port must be integer in the range 1-65535, got '%d' instead" % port
|
|
+ raise ValueError("port must be integer in the range 1-65535, got '%d' instead" % port)
|
|
host = _host
|
|
else:
|
|
port = None
|
|
@@ -183,15 +183,15 @@ class DBConnection:
|
|
arglist = arglist.split('&')
|
|
for single in arglist:
|
|
argname, argvalue = single.split('=', 1)
|
|
- argvalue = urllib.unquote(argvalue)
|
|
+ argvalue = urllib.parse.unquote(argvalue)
|
|
args[argname] = argvalue
|
|
return user, password, host, port, path, args
|
|
|
|
@staticmethod
|
|
def _parseURI(uri):
|
|
- protocol, request = urllib.splittype(uri)
|
|
+ protocol, request = urllib.parse.splittype(uri)
|
|
user, password, port = None, None, None
|
|
- host, path = urllib.splithost(request)
|
|
+ host, path = urllib.parse.splithost(request)
|
|
|
|
if host:
|
|
# Python < 2.7 have a problem - splituser() calls unquote() too early
|
|
@@ -199,17 +199,17 @@ class DBConnection:
|
|
if '@' in host:
|
|
user, host = host.split('@', 1)
|
|
if user:
|
|
- user, password = [x and urllib.unquote(x) or None for x in urllib.splitpasswd(user)]
|
|
- host, port = urllib.splitport(host)
|
|
+ user, password = [x and urllib.parse.unquote(x) or None for x in urllib.parse.splitpasswd(user)]
|
|
+ host, port = urllib.parse.splitport(host)
|
|
if port: port = int(port)
|
|
elif host == '':
|
|
host = None
|
|
|
|
# hash-tag is splitted but ignored
|
|
- path, tag = urllib.splittag(path)
|
|
- path, query = urllib.splitquery(path)
|
|
+ path, tag = urllib.parse.splittag(path)
|
|
+ path, query = urllib.parse.splitquery(path)
|
|
|
|
- path = urllib.unquote(path)
|
|
+ path = urllib.parse.unquote(path)
|
|
if (os.name == 'nt') and (len(path) > 2):
|
|
# Preserve backward compatibility with URIs like /C|/path;
|
|
# replace '|' by ':'
|
|
@@ -282,7 +282,7 @@ class ConnWrapper(object):
|
|
"because it takes **kw: %r"
|
|
% meth)
|
|
takes_conn = 'connection' in args
|
|
- meth.im_func.takes_connection = takes_conn
|
|
+ meth.__func__.takes_connection = takes_conn
|
|
if not takes_conn:
|
|
return meth
|
|
return ConnMethodWrapper(meth, self._connection)
|
|
@@ -363,7 +363,7 @@ class DBAPI(DBConnection):
|
|
if self.debug:
|
|
self.printDebug(conn, 'auto/exception', 'ROLLBACK')
|
|
conn.rollback()
|
|
- raise Exception, 'Object used outside of a transaction; implicit COMMIT or ROLLBACK not allowed'
|
|
+ raise Exception('Object used outside of a transaction; implicit COMMIT or ROLLBACK not allowed')
|
|
elif self.autoCommit:
|
|
if self.debug:
|
|
self.printDebug(conn, 'auto', 'COMMIT')
|
|
@@ -593,7 +593,7 @@ class DBAPI(DBConnection):
|
|
|
|
def _SO_selectOneAlt(self, so, columnNames, condition):
|
|
if columnNames:
|
|
- columns = [isinstance(x, basestring) and sqlbuilder.SQLConstant(x) or x for x in columnNames]
|
|
+ columns = [isinstance(x, str) and sqlbuilder.SQLConstant(x) or x for x in columnNames]
|
|
else:
|
|
columns = None
|
|
return self.queryOne(self.sqlrepr(sqlbuilder.Select(columns,
|
|
@@ -643,7 +643,7 @@ class DBAPI(DBConnection):
|
|
data = {}
|
|
if 'id' in kw:
|
|
data[soClass.sqlmeta.idName] = kw.pop('id')
|
|
- for key, col in soClass.sqlmeta.columns.items():
|
|
+ for key, col in list(soClass.sqlmeta.columns.items()):
|
|
if key in kw:
|
|
value = kw.pop(key)
|
|
if col.from_python:
|
|
@@ -657,7 +657,7 @@ class DBAPI(DBConnection):
|
|
data[col.dbName] = obj
|
|
if kw:
|
|
# pick the first key from kw to use to raise the error,
|
|
- raise TypeError, "got an unexpected keyword argument(s): %r" % kw.keys()
|
|
+ raise TypeError("got an unexpected keyword argument(s): %r" % list(kw.keys()))
|
|
|
|
if not data:
|
|
return None
|
|
@@ -665,7 +665,7 @@ class DBAPI(DBConnection):
|
|
['%s %s %s' %
|
|
(dbName, ops.get(value, "="), self.sqlrepr(value))
|
|
for dbName, value
|
|
- in data.items()])
|
|
+ in list(data.items())])
|
|
|
|
def sqlrepr(self, v):
|
|
return sqlrepr(v, self.dbName)
|
|
@@ -718,7 +718,7 @@ class Iteration(object):
|
|
def __iter__(self):
|
|
return self
|
|
|
|
- def next(self):
|
|
+ def __next__(self):
|
|
result = self.cursor.fetchone()
|
|
if result is None:
|
|
self._cleanup()
|
|
@@ -791,7 +791,7 @@ class Transaction(object):
|
|
if not cls in self._deletedCache:
|
|
self._deletedCache[cls] = []
|
|
self._deletedCache[cls].append(inst.id)
|
|
- meth = new.instancemethod(self._dbConnection._SO_delete.im_func, self, self.__class__)
|
|
+ meth = new.instancemethod(self._dbConnection._SO_delete.__func__, self, self.__class__)
|
|
return meth(inst)
|
|
|
|
def commit(self, close=False):
|
|
@@ -801,8 +801,8 @@ class Transaction(object):
|
|
if self._dbConnection.debug:
|
|
self._dbConnection.printDebug(self._connection, '', 'COMMIT')
|
|
self._connection.commit()
|
|
- subCaches = [(sub[0], sub[1].allIDs()) for sub in self.cache.allSubCachesByClassNames().items()]
|
|
- subCaches.extend([(x[0], x[1]) for x in self._deletedCache.items()])
|
|
+ subCaches = [(sub[0], sub[1].allIDs()) for sub in list(self.cache.allSubCachesByClassNames().items())]
|
|
+ subCaches.extend([(x[0], x[1]) for x in list(self._deletedCache.items())])
|
|
for cls, ids in subCaches:
|
|
for id in ids:
|
|
inst = self._dbConnection.cache.tryGetByName(id, cls)
|
|
@@ -836,7 +836,7 @@ class Transaction(object):
|
|
self.assertActive()
|
|
attr = getattr(self._dbConnection, attr)
|
|
try:
|
|
- func = attr.im_func
|
|
+ func = attr.__func__
|
|
except AttributeError:
|
|
if isinstance(attr, ConnWrapper):
|
|
return ConnWrapper(attr._soClass, self)
|
|
@@ -996,9 +996,9 @@ class ConnectionURIOpener(object):
|
|
def connectionForURI(self, uri, oldUri=False, **args):
|
|
if args:
|
|
if '?' not in uri:
|
|
- uri += '?' + urllib.urlencode(args)
|
|
+ uri += '?' + urllib.parse.urlencode(args)
|
|
else:
|
|
- uri += '&' + urllib.urlencode(args)
|
|
+ uri += '&' + urllib.parse.urlencode(args)
|
|
if uri in self.cachedURIs:
|
|
return self.cachedURIs[uri]
|
|
if uri.find(':') != -1:
|
|
@@ -1020,7 +1020,7 @@ class ConnectionURIOpener(object):
|
|
def dbConnectionForScheme(self, scheme):
|
|
assert scheme in self.schemeBuilders, (
|
|
"No SQLObject driver exists for %s (only %s)"
|
|
- % (scheme, ', '.join(self.schemeBuilders.keys())))
|
|
+ % (scheme, ', '.join(list(self.schemeBuilders.keys()))))
|
|
return self.schemeBuilders[scheme]()
|
|
|
|
TheURIOpener = ConnectionURIOpener()
|
|
@@ -1031,11 +1031,11 @@ connectionForURI = TheURIOpener.connectionForURI
|
|
dbConnectionForScheme = TheURIOpener.dbConnectionForScheme
|
|
|
|
# Register DB URI schemas
|
|
-import firebird
|
|
-import maxdb
|
|
-import mssql
|
|
-import mysql
|
|
-import postgres
|
|
-import rdbhost
|
|
-import sqlite
|
|
-import sybase
|
|
+from . import firebird
|
|
+from . import maxdb
|
|
+from . import mssql
|
|
+from . import mysql
|
|
+from . import postgres
|
|
+from . import rdbhost
|
|
+from . import sqlite
|
|
+from . import sybase
|
|
--- sqlobject/events.py.orig 2010-11-13 17:42:40 UTC
|
|
+++ sqlobject/events.py
|
|
@@ -206,25 +206,25 @@ def summarize_events_by_sender(sender=None, output=Non
|
|
if sender is None:
|
|
send_list = [
|
|
(deref(dispatcher.senders.get(sid)), listeners)
|
|
- for sid, listeners in dispatcher.connections.items()
|
|
+ for sid, listeners in list(dispatcher.connections.items())
|
|
if deref(dispatcher.senders.get(sid))]
|
|
for sender, listeners in sorted_items(send_list):
|
|
real_sender = deref(sender)
|
|
if not real_sender:
|
|
continue
|
|
header = 'Sender: %r' % real_sender
|
|
- print >> output, (' '*indent) + header
|
|
- print >> output, (' '*indent) + '='*len(header)
|
|
+ print((' '*indent) + header, file=output)
|
|
+ print((' '*indent) + '='*len(header), file=output)
|
|
summarize_events_by_sender(real_sender, output=output, indent=indent+2)
|
|
else:
|
|
for signal, receivers in sorted_items(dispatcher.connections.get(id(sender), [])):
|
|
receivers = [deref(r) for r in receivers if deref(r)]
|
|
header = 'Signal: %s (%i receivers)' % (sort_name(signal),
|
|
len(receivers))
|
|
- print >> output, (' '*indent) + header
|
|
- print >> output, (' '*indent) + '-'*len(header)
|
|
+ print((' '*indent) + header, file=output)
|
|
+ print((' '*indent) + '-'*len(header), file=output)
|
|
for receiver in sorted(receivers, key=sort_name):
|
|
- print >> output, (' '*indent) + ' ' + nice_repr(receiver)
|
|
+ print((' '*indent) + ' ' + nice_repr(receiver), file=output)
|
|
|
|
def deref(value):
|
|
if isinstance(value, dispatcher.WEAKREF_TYPES):
|
|
@@ -234,14 +234,14 @@ def deref(value):
|
|
|
|
def sorted_items(a_dict):
|
|
if isinstance(a_dict, dict):
|
|
- a_dict = a_dict.items()
|
|
+ a_dict = list(a_dict.items())
|
|
return sorted(a_dict, key=lambda t: sort_name(t[0]))
|
|
|
|
def sort_name(value):
|
|
if isinstance(value, type):
|
|
return value.__name__
|
|
elif isinstance(value, types.FunctionType):
|
|
- return value.func_name
|
|
+ return value.__name__
|
|
else:
|
|
return str(value)
|
|
|
|
@@ -262,26 +262,26 @@ def debug_events():
|
|
|
|
def _debug_send(signal=dispatcher.Any, sender=dispatcher.Anonymous,
|
|
*arguments, **named):
|
|
- print "send %s from %s: %s" % (
|
|
- nice_repr(signal), nice_repr(sender), fmt_args(*arguments, **named))
|
|
+ print("send %s from %s: %s" % (
|
|
+ nice_repr(signal), nice_repr(sender), fmt_args(*arguments, **named)))
|
|
return _real_dispatcher_send(signal, sender, *arguments, **named)
|
|
|
|
def _debug_sendExact(signal=dispatcher.Any, sender=dispatcher.Anonymous,
|
|
*arguments, **named):
|
|
- print "sendExact %s from %s: %s" % (
|
|
- nice_repr(signal), nice_repr(sender), fmt_args(*arguments, **name))
|
|
+ print("sendExact %s from %s: %s" % (
|
|
+ nice_repr(signal), nice_repr(sender), fmt_args(*arguments, **name)))
|
|
return _real_dispatcher_sendExact(signal, sender, *arguments, **named)
|
|
|
|
def _debug_connect(receiver, signal=dispatcher.Any, sender=dispatcher.Any,
|
|
weak=True):
|
|
- print "connect %s to %s signal %s" % (
|
|
- nice_repr(receiver), nice_repr(signal), nice_repr(sender))
|
|
+ print("connect %s to %s signal %s" % (
|
|
+ nice_repr(receiver), nice_repr(signal), nice_repr(sender)))
|
|
return _real_dispatcher_connect(receiver, signal, sender, weak)
|
|
|
|
def _debug_disconnect(receiver, signal=dispatcher.Any, sender=dispatcher.Any,
|
|
weak=True):
|
|
- print "disconnecting %s from %s signal %s" % (
|
|
- nice_repr(receiver), nice_repr(signal), nice_repr(sender))
|
|
+ print("disconnecting %s from %s signal %s" % (
|
|
+ nice_repr(receiver), nice_repr(signal), nice_repr(sender)))
|
|
return disconnect(receiver, signal, sender, weak)
|
|
|
|
def fmt_args(*arguments, **name):
|
|
@@ -294,23 +294,23 @@ def nice_repr(v):
|
|
"""
|
|
Like repr(), but nicer for debugging here.
|
|
"""
|
|
- if isinstance(v, (types.ClassType, type)):
|
|
+ if isinstance(v, type):
|
|
return v.__module__ + '.' + v.__name__
|
|
elif isinstance(v, types.FunctionType):
|
|
- if '__name__' in v.func_globals:
|
|
- if getattr(sys.modules[v.func_globals['__name__']],
|
|
- v.func_name, None) is v:
|
|
- return '%s.%s' % (v.func_globals['__name__'], v.func_name)
|
|
+ if '__name__' in v.__globals__:
|
|
+ if getattr(sys.modules[v.__globals__['__name__']],
|
|
+ v.__name__, None) is v:
|
|
+ return '%s.%s' % (v.__globals__['__name__'], v.__name__)
|
|
return repr(v)
|
|
elif isinstance(v, types.MethodType):
|
|
return '%s.%s of %s' % (
|
|
- nice_repr(v.im_class), v.im_func.func_name,
|
|
- nice_repr(v.im_self))
|
|
+ nice_repr(v.__self__.__class__), v.__func__.__name__,
|
|
+ nice_repr(v.__self__))
|
|
else:
|
|
return repr(v)
|
|
|
|
|
|
__all__ = ['listen', 'send']
|
|
-for name, value in globals().items():
|
|
+for name, value in list(globals().items()):
|
|
if isinstance(value, type) and issubclass(value, Signal):
|
|
__all__.append(name)
|
|
--- sqlobject/include/pydispatch/dispatcher.py.orig 2011-05-15 15:48:27 UTC
|
|
+++ sqlobject/include/pydispatch/dispatcher.py
|
|
@@ -25,20 +25,14 @@ Internal attributes:
|
|
deletion, (considerably speeds up the cleanup process
|
|
vs. the original code.)
|
|
"""
|
|
-from __future__ import generators
|
|
+
|
|
import types, weakref
|
|
-import saferef, robustapply, errors
|
|
+from . import saferef, robustapply, errors
|
|
|
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
|
__cvsid__ = "$Id: dispatcher.py,v 1.9 2005/09/17 04:55:57 mcfletch Exp $"
|
|
__version__ = "$Revision: 1.9 $"[11:-2]
|
|
|
|
-try:
|
|
- True
|
|
-except NameError:
|
|
- True = 1==1
|
|
- False = 1==0
|
|
-
|
|
class _Parameter:
|
|
"""Used to represent default parameter values."""
|
|
def __repr__(self):
|
|
@@ -379,8 +373,8 @@ def _removeReceiver(receiver):
|
|
backKey = id(receiver)
|
|
for senderkey in sendersBack.get(backKey,()):
|
|
try:
|
|
- signals = connections[senderkey].keys()
|
|
- except KeyError,err:
|
|
+ signals = list(connections[senderkey].keys())
|
|
+ except KeyError as err:
|
|
pass
|
|
else:
|
|
for signal in signals:
|
|
@@ -391,7 +385,7 @@ def _removeReceiver(receiver):
|
|
else:
|
|
try:
|
|
receivers.remove( receiver )
|
|
- except Exception, err:
|
|
+ except Exception as err:
|
|
pass
|
|
_cleanupConnections(senderkey, signal)
|
|
try:
|
|
@@ -440,7 +434,7 @@ def _removeBackrefs( senderkey):
|
|
except KeyError:
|
|
signals = None
|
|
else:
|
|
- items = signals.items()
|
|
+ items = list(signals.items())
|
|
def allReceivers( ):
|
|
for signal,set in items:
|
|
for item in set:
|
|
@@ -468,7 +462,7 @@ def _removeOldBackRefs(senderkey, signal, receiver, re
|
|
found = 0
|
|
signals = connections.get(signal)
|
|
if signals is not None:
|
|
- for sig,recs in connections.get(signal,{}).iteritems():
|
|
+ for sig,recs in connections.get(signal,{}).items():
|
|
if sig != signal:
|
|
for rec in recs:
|
|
if rec is oldReceiver:
|
|
--- sqlobject/include/pydispatch/robust.py.orig 2006-02-09 16:14:04 UTC
|
|
+++ sqlobject/include/pydispatch/robust.py
|
|
@@ -1,6 +1,6 @@
|
|
"""Module implementing error-catching version of send (sendRobust)"""
|
|
-from dispatcher import Any, Anonymous, liveReceivers, getAllReceivers
|
|
-from robustapply import robustApply
|
|
+from .dispatcher import Any, Anonymous, liveReceivers, getAllReceivers
|
|
+from .robustapply import robustApply
|
|
|
|
def sendRobust(
|
|
signal=Any,
|
|
@@ -50,7 +50,7 @@ def sendRobust(
|
|
*arguments,
|
|
**named
|
|
)
|
|
- except Exception, err:
|
|
+ except Exception as err:
|
|
responses.append((receiver, err))
|
|
else:
|
|
responses.append((receiver, response))
|
|
--- sqlobject/include/pydispatch/saferef.py.orig 2006-02-09 16:14:04 UTC
|
|
+++ sqlobject/include/pydispatch/saferef.py
|
|
@@ -13,7 +13,7 @@ def safeRef(target, onDelete = None):
|
|
weakref or a BoundMethodWeakref) as argument.
|
|
"""
|
|
if hasattr(target, 'im_self'):
|
|
- if target.im_self is not None:
|
|
+ if target.__self__ is not None:
|
|
# Turn a bound method into a BoundMethodWeakref instance.
|
|
# Keep track of these instances for lookup by disconnect().
|
|
assert hasattr(target, 'im_func'), """safeRef target %r has im_self, but no im_func, don't know how to create reference"""%( target,)
|
|
@@ -109,26 +109,26 @@ class BoundMethodWeakref(object):
|
|
try:
|
|
if callable( function ):
|
|
function( self )
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
try:
|
|
traceback.print_exc()
|
|
- except AttributeError, err:
|
|
- print '''Exception during saferef %s cleanup function %s: %s'''%(
|
|
+ except AttributeError as err:
|
|
+ print('''Exception during saferef %s cleanup function %s: %s'''%(
|
|
self, function, e
|
|
- )
|
|
+ ))
|
|
self.deletionMethods = [onDelete]
|
|
self.key = self.calculateKey( target )
|
|
- self.weakSelf = weakref.ref(target.im_self, remove)
|
|
- self.weakFunc = weakref.ref(target.im_func, remove)
|
|
- self.selfName = str(target.im_self)
|
|
- self.funcName = str(target.im_func.__name__)
|
|
+ self.weakSelf = weakref.ref(target.__self__, remove)
|
|
+ self.weakFunc = weakref.ref(target.__func__, remove)
|
|
+ self.selfName = str(target.__self__)
|
|
+ self.funcName = str(target.__func__.__name__)
|
|
def calculateKey( cls, target ):
|
|
"""Calculate the reference key for this reference
|
|
|
|
Currently this is a two-tuple of the id()'s of the
|
|
target object and the target function respectively.
|
|
"""
|
|
- return (id(target.im_self),id(target.im_func))
|
|
+ return (id(target.__self__),id(target.__func__))
|
|
calculateKey = classmethod( calculateKey )
|
|
def __str__(self):
|
|
"""Give a friendly representation of the object"""
|
|
@@ -138,7 +138,7 @@ class BoundMethodWeakref(object):
|
|
self.funcName,
|
|
)
|
|
__repr__ = __str__
|
|
- def __nonzero__( self ):
|
|
+ def __bool__( self ):
|
|
"""Whether we are still a valid reference"""
|
|
return self() is not None
|
|
def __cmp__( self, other ):
|
|
--- sqlobject/index.py.orig 2011-05-15 15:48:27 UTC
|
|
+++ sqlobject/index.py
|
|
@@ -1,6 +1,6 @@
|
|
from itertools import count
|
|
from types import *
|
|
-from converters import sqlrepr
|
|
+from .converters import sqlrepr
|
|
|
|
creationOrder = count()
|
|
|
|
@@ -20,15 +20,15 @@ class SODatabaseIndex(object):
|
|
|
|
def get(self, *args, **kw):
|
|
if not self.unique:
|
|
- raise AttributeError, (
|
|
+ raise AttributeError(
|
|
"'%s' object has no attribute 'get' (index is not unique)" % self.name)
|
|
connection = kw.pop('connection', None)
|
|
if args and kw:
|
|
- raise TypeError, "You cannot mix named and unnamed arguments"
|
|
+ raise TypeError("You cannot mix named and unnamed arguments")
|
|
columns = [d['column'] for d in self.descriptions
|
|
if 'column' in d]
|
|
if kw and len(kw) != len(columns) or args and len(args) != len(columns):
|
|
- raise TypeError, ("get() takes exactly %d argument and an optional "
|
|
+ raise TypeError("get() takes exactly %d argument and an optional "
|
|
"named argument 'connection' (%d given)" % (
|
|
len(columns), len(args)+len(kw)))
|
|
if args:
|
|
@@ -65,13 +65,13 @@ class SODatabaseIndex(object):
|
|
columnName = columnName.name
|
|
colDict = self.soClass.sqlmeta.columns
|
|
if columnName not in colDict:
|
|
- for possible in colDict.values():
|
|
+ for possible in list(colDict.values()):
|
|
if possible.origName == columnName:
|
|
column = possible
|
|
break
|
|
else:
|
|
# None found
|
|
- raise ValueError, "The column by the name %r was not found in the class %r" % (columnName, self.soClass)
|
|
+ raise ValueError("The column by the name %r was not found in the class %r" % (columnName, self.soClass))
|
|
else:
|
|
column = colDict[columnName]
|
|
desc['column'] = column
|
|
@@ -153,7 +153,7 @@ class DatabaseIndex(object):
|
|
def __init__(self, *columns, **kw):
|
|
kw['columns'] = columns
|
|
self.kw = kw
|
|
- self.creationOrder = creationOrder.next()
|
|
+ self.creationOrder = next(creationOrder)
|
|
|
|
def setName(self, value):
|
|
assert self.kw.get('name') is None, "You cannot change a name after it has already been set (from %s to %s)" % (self.kw['name'], value)
|
|
--- sqlobject/inheritance/__init__.py.orig 2011-05-15 15:48:27 UTC
|
|
+++ sqlobject/inheritance/__init__.py
|
|
@@ -5,7 +5,8 @@ from sqlobject import sqlbuilder
|
|
from sqlobject.col import StringCol, ForeignKey
|
|
from sqlobject.main import sqlmeta, SQLObject, SelectResults, \
|
|
makeProperties, unmakeProperties, getterName, setterName
|
|
-import iteration
|
|
+from . import iteration
|
|
+from functools import reduce
|
|
|
|
def tablesUsedSet(obj, db):
|
|
if hasattr(obj, "tablesUsedSet"):
|
|
@@ -35,7 +36,7 @@ class InheritableSelectResults(SelectResults):
|
|
if inheritedTables:
|
|
for tableName in inheritedTables:
|
|
tablesSet.add(str(tableName))
|
|
- if orderBy and not isinstance(orderBy, basestring):
|
|
+ if orderBy and not isinstance(orderBy, str):
|
|
tablesSet.update(tablesUsedSet(orderBy, dbName))
|
|
#DSM: if this class has a parent, we need to link it
|
|
#DSM: and be sure the parent is in the table list.
|
|
@@ -69,7 +70,7 @@ class InheritableSelectResults(SelectResults):
|
|
#DSM: Table registry contains only the last children
|
|
#DSM: or standalone classes
|
|
parentClause = []
|
|
- for (currentClass, minParentClass) in tableRegistry.items():
|
|
+ for (currentClass, minParentClass) in list(tableRegistry.items()):
|
|
while (currentClass != minParentClass) \
|
|
and currentClass.sqlmeta.parentClass:
|
|
parentClass = currentClass.sqlmeta.parentClass
|
|
@@ -86,7 +87,7 @@ class InheritableSelectResults(SelectResults):
|
|
return super(InheritableSelectResults, self).accumulateMany(*attributes)
|
|
tables = []
|
|
for func_name, attribute in attributes:
|
|
- if not isinstance(attribute, basestring):
|
|
+ if not isinstance(attribute, str):
|
|
tables.append(attribute.tableName)
|
|
clone = self.__class__(self.sourceClass, self.clause,
|
|
self.clauseTables, inheritedTables=tables, **self.ops)
|
|
@@ -130,7 +131,7 @@ class InheritableSQLMeta(sqlmeta):
|
|
q = getattr(soClass.q, columnDef.name, None)
|
|
else:
|
|
q = None
|
|
- for c in sqlmeta.childClasses.values():
|
|
+ for c in list(sqlmeta.childClasses.values()):
|
|
c.sqlmeta.addColumn(columnDef, connection=connection, childUpdate=True)
|
|
if q: setattr(c.q, columnDef.name, q)
|
|
|
|
@@ -153,7 +154,7 @@ class InheritableSQLMeta(sqlmeta):
|
|
|
|
#DSM: Update each child class if needed
|
|
#DSM: and delete properties for this column
|
|
- for c in sqlmeta.childClasses.values():
|
|
+ for c in list(sqlmeta.childClasses.values()):
|
|
c.sqlmeta.delColumn(column, changeSchema=changeSchema,
|
|
connection=connection, childUpdate=True)
|
|
|
|
@@ -184,7 +185,7 @@ class InheritableSQLMeta(sqlmeta):
|
|
|
|
#DSM: Update each child class if needed and existing (only for new
|
|
#DSM: dynamic join as no child classes exists at object creation)
|
|
- for c in sqlmeta.childClasses.values():
|
|
+ for c in list(sqlmeta.childClasses.values()):
|
|
c.sqlmeta.addJoin(joinDef, childUpdate=True)
|
|
|
|
@classmethod
|
|
@@ -199,7 +200,7 @@ class InheritableSQLMeta(sqlmeta):
|
|
|
|
#DSM: Update each child class if needed
|
|
#DSM: and delete properties for this join
|
|
- for c in sqlmeta.childClasses.values():
|
|
+ for c in list(sqlmeta.childClasses.values()):
|
|
c.sqlmeta.delJoin(joinDef, childUpdate=True)
|
|
|
|
@classmethod
|
|
@@ -236,7 +237,7 @@ class InheritableSQLObject(SQLObject):
|
|
# if we are a child class, add sqlbuilder fields from parents
|
|
currentClass = cls.sqlmeta.parentClass
|
|
while currentClass:
|
|
- for column in currentClass.sqlmeta.columnDefinitions.values():
|
|
+ for column in list(currentClass.sqlmeta.columnDefinitions.values()):
|
|
if column.name == 'childName':
|
|
continue
|
|
if isinstance(column, ForeignKey):
|
|
@@ -319,7 +320,7 @@ class InheritableSQLObject(SQLObject):
|
|
# verify names of added columns
|
|
if sqlmeta.parentClass:
|
|
# FIXME: this does not check for grandparent column overrides
|
|
- parentCols = sqlmeta.parentClass.sqlmeta.columns.keys()
|
|
+ parentCols = list(sqlmeta.parentClass.sqlmeta.columns.keys())
|
|
for column in sqlmeta.columnList:
|
|
if column.name == 'childName':
|
|
raise AttributeError(
|
|
@@ -357,7 +358,7 @@ class InheritableSQLObject(SQLObject):
|
|
parentClass = self.sqlmeta.parentClass
|
|
new_kw = {}
|
|
parent_kw = {}
|
|
- for (name, value) in kw.items():
|
|
+ for (name, value) in list(kw.items()):
|
|
if (name != 'childName') and hasattr(parentClass, name):
|
|
parent_kw[name] = value
|
|
else:
|
|
@@ -370,7 +371,7 @@ class InheritableSQLObject(SQLObject):
|
|
for col in self.sqlmeta.columnList:
|
|
if (col._default == sqlbuilder.NoDefault) and \
|
|
(col.name not in kw) and (col.foreignName not in kw):
|
|
- raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, col.name)
|
|
+ raise TypeError("%s() did not get expected keyword argument %s" % (self.__class__.__name__, col.name))
|
|
|
|
parent_kw['childName'] = self.sqlmeta.childName
|
|
self._parent = parentClass(kw=parent_kw,
|
|
@@ -426,7 +427,7 @@ class InheritableSQLObject(SQLObject):
|
|
addClause = parentClass.q.childName == cls.sqlmeta.childName
|
|
# if the clause was one of TRUE varians, replace it
|
|
if (clause is None) or (clause is sqlbuilder.SQLTrueClause) \
|
|
- or (isinstance(clause, basestring) and (clause == 'all')):
|
|
+ or (isinstance(clause, str) and (clause == 'all')):
|
|
clause = addClause
|
|
else:
|
|
# patch WHERE condition:
|
|
@@ -471,11 +472,11 @@ class InheritableSQLObject(SQLObject):
|
|
currentClass = cls
|
|
while currentClass:
|
|
foreignColumns.update(dict([(column.foreignName, name)
|
|
- for (name, column) in currentClass.sqlmeta.columns.items()
|
|
+ for (name, column) in list(currentClass.sqlmeta.columns.items())
|
|
if column.foreignKey
|
|
]))
|
|
currentClass = currentClass.sqlmeta.parentClass
|
|
- for name, value in kw.items():
|
|
+ for name, value in list(kw.items()):
|
|
if name in foreignColumns:
|
|
name = foreignColumns[name] # translate "key" to "keyID"
|
|
if isinstance(value, SQLObject):
|
|
@@ -485,7 +486,7 @@ class InheritableSQLObject(SQLObject):
|
|
try:
|
|
clause.append(getattr(currentClass.q, name) == value)
|
|
break
|
|
- except AttributeError, err:
|
|
+ except AttributeError as err:
|
|
pass
|
|
currentClass = currentClass.sqlmeta.parentClass
|
|
else:
|
|
--- sqlobject/main.py.orig 2013-10-14 16:07:00 UTC
|
|
+++ sqlobject/main.py
|
|
@@ -28,23 +28,23 @@ USA.
|
|
|
|
import threading
|
|
import weakref
|
|
-import sqlbuilder
|
|
-import dbconnection
|
|
-import col
|
|
-import styles
|
|
+from . import sqlbuilder
|
|
+from . import dbconnection
|
|
+from . import col
|
|
+from . import styles
|
|
import types
|
|
import warnings
|
|
-import joins
|
|
-import index
|
|
-import classregistry
|
|
-import declarative
|
|
-import events
|
|
-from sresults import SelectResults
|
|
-from util.threadinglocal import local
|
|
+from . import joins
|
|
+from . import index
|
|
+from . import classregistry
|
|
+from . import declarative
|
|
+from . import events
|
|
+from .sresults import SelectResults
|
|
+from .util.threadinglocal import local
|
|
|
|
import sys
|
|
if sys.version_info[:3] < (2, 5, 0):
|
|
- raise ImportError, "SQLObject requires Python 2.5.0 or later"
|
|
+ raise ImportError("SQLObject requires Python 2.5.0 or later")
|
|
|
|
"""
|
|
This thread-local storage is needed for RowCreatedSignals. It gathers
|
|
@@ -81,7 +81,7 @@ def makeProperties(obj):
|
|
d = obj.__dict__
|
|
|
|
props = {}
|
|
- for var, value in d.items():
|
|
+ for var, value in list(d.items()):
|
|
if var.startswith('_set_'):
|
|
props.setdefault(var[5:], {})['set'] = value
|
|
elif var.startswith('_get_'):
|
|
@@ -90,7 +90,7 @@ def makeProperties(obj):
|
|
props.setdefault(var[5:], {})['del'] = value
|
|
elif var.startswith('_doc_'):
|
|
props.setdefault(var[5:], {})['doc'] = value
|
|
- for var, setters in props.items():
|
|
+ for var, setters in list(props.items()):
|
|
if len(setters) == 1 and 'doc' in setters:
|
|
continue
|
|
if var in d:
|
|
@@ -115,7 +115,7 @@ def unmakeProperties(obj):
|
|
delFunc = delattr
|
|
d = obj.__dict__
|
|
|
|
- for var, value in d.items():
|
|
+ for var, value in list(d.items()):
|
|
if isinstance(value, property):
|
|
for prop in [value.fget, value.fset, value.fdel]:
|
|
if prop and not prop.__name__ in d:
|
|
@@ -148,7 +148,7 @@ def _collectAttributes(cls, new_attrs, look_for_class)
|
|
|
|
"""
|
|
result = []
|
|
- for attr, value in new_attrs.items():
|
|
+ for attr, value in list(new_attrs.items()):
|
|
if isinstance(value, look_for_class):
|
|
value.name = attr
|
|
delattr(cls, attr)
|
|
@@ -162,7 +162,7 @@ class CreateNewSQLObject:
|
|
"""
|
|
pass
|
|
|
|
-class sqlmeta(object):
|
|
+class sqlmeta(object, metaclass=declarative.DeclarativeMeta):
|
|
|
|
"""
|
|
This object is the object we use to keep track of all sorts of
|
|
@@ -236,8 +236,6 @@ class sqlmeta(object):
|
|
# Default encoding for UnicodeCol's
|
|
dbEncoding = None
|
|
|
|
- __metaclass__ = declarative.DeclarativeMeta
|
|
-
|
|
def __classinit__(cls, new_attrs):
|
|
for attr in cls._unshared_attributes:
|
|
if attr not in new_attrs:
|
|
@@ -321,7 +319,7 @@ class sqlmeta(object):
|
|
parent_columns = []
|
|
for base in soClass.__bases__:
|
|
if hasattr(base, "sqlmeta"):
|
|
- parent_columns.extend(base.sqlmeta.columns.keys())
|
|
+ parent_columns.extend(list(base.sqlmeta.columns.keys()))
|
|
if hasattr(soClass, name):
|
|
assert (name in parent_columns) or (name == "childName"), (
|
|
"The class %s.%s already has a variable or method %r, you cannot "
|
|
@@ -440,7 +438,7 @@ class sqlmeta(object):
|
|
conn = connection or soClass._connection
|
|
for columnDef in conn.columnsFromSchema(sqlmeta.table, soClass):
|
|
if columnDef.name not in sqlmeta.columnDefinitions:
|
|
- if isinstance(columnDef.name, unicode):
|
|
+ if isinstance(columnDef.name, str):
|
|
columnDef.name = columnDef.name.encode('ascii')
|
|
sqlmeta.addColumn(columnDef)
|
|
|
|
@@ -456,7 +454,7 @@ class sqlmeta(object):
|
|
else:
|
|
raise ValueError('Unknown column ' + column)
|
|
if isinstance(column, col.Col):
|
|
- for c in sqlmeta.columns.values():
|
|
+ for c in list(sqlmeta.columns.values()):
|
|
if column is c.columnDef:
|
|
column = c
|
|
break
|
|
@@ -704,10 +702,8 @@ _postponed_local = local()
|
|
# here, though -- just automatic method generation (like
|
|
# methods and properties for each column) is done in
|
|
# MetaSQLObject.
|
|
-class SQLObject(object):
|
|
+class SQLObject(object, metaclass=declarative.DeclarativeMeta):
|
|
|
|
- __metaclass__ = declarative.DeclarativeMeta
|
|
-
|
|
_connection = sqlhub
|
|
|
|
sqlmeta = sqlmeta
|
|
@@ -770,12 +766,12 @@ class SQLObject(object):
|
|
# _columns where the attribute has been set to None in this
|
|
# class. If so, then we need to remove that column from
|
|
# _columns.
|
|
- for key in sqlmeta.columnDefinitions.keys():
|
|
+ for key in list(sqlmeta.columnDefinitions.keys()):
|
|
if (key in new_attrs
|
|
and new_attrs[key] is None):
|
|
del sqlmeta.columnDefinitions[key]
|
|
|
|
- for column in sqlmeta.columnDefinitions.values():
|
|
+ for column in list(sqlmeta.columnDefinitions.values()):
|
|
sqlmeta.addColumn(column)
|
|
|
|
for column in implicitColumns:
|
|
@@ -850,7 +846,7 @@ class SQLObject(object):
|
|
"(while fixing up sqlmeta %r inheritance)"
|
|
% cls.sqlmeta)
|
|
values = dict(cls.sqlmeta.__dict__)
|
|
- for key in values.keys():
|
|
+ for key in list(values.keys()):
|
|
if key.startswith('__') and key.endswith('__'):
|
|
# Magic values shouldn't be passed through:
|
|
del values[key]
|
|
@@ -931,7 +927,7 @@ class SQLObject(object):
|
|
dbNames = [col.dbName for col in self.sqlmeta.columnList]
|
|
selectResults = self._connection._SO_selectOne(self, dbNames)
|
|
if not selectResults:
|
|
- raise SQLObjectNotFound, "The object %s by the ID %s does not exist" % (self.__class__.__name__, self.id)
|
|
+ raise SQLObjectNotFound("The object %s by the ID %s does not exist" % (self.__class__.__name__, self.id))
|
|
self._SO_selectInit(selectResults)
|
|
self._SO_createValues = {}
|
|
self.sqlmeta.dirty = False
|
|
@@ -958,7 +954,7 @@ class SQLObject(object):
|
|
dbNames = [col.dbName for col in self.sqlmeta.columnList]
|
|
selectResults = self._connection._SO_selectOne(self, dbNames)
|
|
if not selectResults:
|
|
- raise SQLObjectNotFound, "The object %s by the ID %s has been deleted" % (self.__class__.__name__, self.id)
|
|
+ raise SQLObjectNotFound("The object %s by the ID %s has been deleted" % (self.__class__.__name__, self.id))
|
|
self._SO_selectInit(selectResults)
|
|
result = getattr(self, attrName)
|
|
return result
|
|
@@ -973,7 +969,7 @@ class SQLObject(object):
|
|
dbNames = [col.dbName for col in self.sqlmeta.columnList]
|
|
selectResults = self._connection._SO_selectOne(self, dbNames)
|
|
if not selectResults:
|
|
- raise SQLObjectNotFound, "The object %s by the ID %s has been deleted" % (self.__class__.__name__, self.id)
|
|
+ raise SQLObjectNotFound("The object %s by the ID %s has been deleted" % (self.__class__.__name__, self.id))
|
|
self._SO_selectInit(selectResults)
|
|
self.sqlmeta.expired = False
|
|
finally:
|
|
@@ -986,7 +982,7 @@ class SQLObject(object):
|
|
try:
|
|
if self.sqlmeta.columns:
|
|
values = [(self.sqlmeta.columns[v[0]].dbName, v[1])
|
|
- for v in self._SO_createValues.items()]
|
|
+ for v in list(self._SO_createValues.items())]
|
|
self._connection._SO_update(self, values)
|
|
self.sqlmeta.dirty = False
|
|
self._SO_createValues = {}
|
|
@@ -1067,13 +1063,13 @@ class SQLObject(object):
|
|
is_column = lambda _c: _c in self.sqlmeta._plainSetters
|
|
f_is_column = lambda item: is_column(item[0])
|
|
f_not_column = lambda item: not is_column(item[0])
|
|
- items = kw.items()
|
|
- extra = dict(filter(f_not_column, items))
|
|
- kw = dict(filter(f_is_column, items))
|
|
+ items = list(kw.items())
|
|
+ extra = dict(list(filter(f_not_column, items)))
|
|
+ kw = dict(list(filter(f_is_column, items)))
|
|
|
|
# _creating is special, see _SO_setValue
|
|
if self.sqlmeta._creating or self.sqlmeta.lazyUpdate:
|
|
- for name, value in kw.items():
|
|
+ for name, value in list(kw.items()):
|
|
from_python = getattr(self, '_SO_from_python_%s' % name, None)
|
|
if from_python:
|
|
kw[name] = dbValue = from_python(value, self._SO_validatorState)
|
|
@@ -1086,16 +1082,16 @@ class SQLObject(object):
|
|
|
|
self._SO_createValues.update(kw)
|
|
|
|
- for name, value in extra.items():
|
|
+ for name, value in list(extra.items()):
|
|
try:
|
|
getattr(self.__class__, name)
|
|
except AttributeError:
|
|
if name not in self.sqlmeta.columns:
|
|
- raise TypeError, "%s.set() got an unexpected keyword argument %s" % (self.__class__.__name__, name)
|
|
+ raise TypeError("%s.set() got an unexpected keyword argument %s" % (self.__class__.__name__, name))
|
|
try:
|
|
setattr(self, name, value)
|
|
- except AttributeError, e:
|
|
- raise AttributeError, '%s (with attribute %r)' % (e, name)
|
|
+ except AttributeError as e:
|
|
+ raise AttributeError('%s (with attribute %r)' % (e, name))
|
|
|
|
self.sqlmeta.dirty = True
|
|
return
|
|
@@ -1112,7 +1108,7 @@ class SQLObject(object):
|
|
# read the user's mind. We'll combine everything
|
|
# else into a single UPDATE, if necessary.
|
|
toUpdate = {}
|
|
- for name, value in kw.items():
|
|
+ for name, value in list(kw.items()):
|
|
from_python = getattr(self, '_SO_from_python_%s' % name, None)
|
|
if from_python:
|
|
dbValue = from_python(value, self._SO_validatorState)
|
|
@@ -1124,20 +1120,20 @@ class SQLObject(object):
|
|
if self.sqlmeta.cacheValues:
|
|
setattr(self, instanceName(name), value)
|
|
toUpdate[name] = dbValue
|
|
- for name, value in extra.items():
|
|
+ for name, value in list(extra.items()):
|
|
try:
|
|
getattr(self.__class__, name)
|
|
except AttributeError:
|
|
if name not in self.sqlmeta.columns:
|
|
- raise TypeError, "%s.set() got an unexpected keyword argument %s" % (self.__class__.__name__, name)
|
|
+ raise TypeError("%s.set() got an unexpected keyword argument %s" % (self.__class__.__name__, name))
|
|
try:
|
|
setattr(self, name, value)
|
|
- except AttributeError, e:
|
|
- raise AttributeError, '%s (with attribute %r)' % (e, name)
|
|
+ except AttributeError as e:
|
|
+ raise AttributeError('%s (with attribute %r)' % (e, name))
|
|
|
|
if toUpdate:
|
|
args = [(self.sqlmeta.columns[name].dbName, value)
|
|
- for name, value in toUpdate.items()]
|
|
+ for name, value in list(toUpdate.items())]
|
|
self._connection._SO_update(self, args)
|
|
finally:
|
|
self._SO_writeLock.release()
|
|
@@ -1257,7 +1253,7 @@ class SQLObject(object):
|
|
# If we specified an SQL DEFAULT, then we should use that
|
|
if default is NoDefault:
|
|
if column.defaultSQL is None:
|
|
- raise TypeError, "%s() did not get expected keyword argument '%s'" % (self.__class__.__name__, column.name)
|
|
+ raise TypeError("%s() did not get expected keyword argument '%s'" % (self.__class__.__name__, column.name))
|
|
else:
|
|
# There is defaultSQL for the column - do not put
|
|
# the column to kw so that the backend creates the value
|
|
@@ -1277,7 +1273,7 @@ class SQLObject(object):
|
|
# Here's where an INSERT is finalized.
|
|
# These are all the column values that were supposed
|
|
# to be set, but were delayed until now:
|
|
- setters = self._SO_createValues.items()
|
|
+ setters = list(self._SO_createValues.items())
|
|
# Here's their database names:
|
|
names = [self.sqlmeta.columns[v[0]].dbName for v in setters]
|
|
values = [v[1] for v in setters]
|
|
@@ -1316,7 +1312,7 @@ class SQLObject(object):
|
|
name = (name,)
|
|
value = (value,)
|
|
if len(name) != len(value):
|
|
- raise ValueError, "'column' and 'value' tuples must be of the same size"
|
|
+ raise ValueError("'column' and 'value' tuples must be of the same size")
|
|
new_value = []
|
|
for n, v in zip(name, value):
|
|
from_python = getattr(cls, '_SO_from_python_' + n)
|
|
@@ -1335,13 +1331,13 @@ class SQLObject(object):
|
|
result, obj = cls._findAlternateID(name, dbName, value, connection)
|
|
if not result:
|
|
if idxName is None:
|
|
- raise SQLObjectNotFound, "The %s by alternateID %s = %s does not exist" % (cls.__name__, name, repr(value))
|
|
+ raise SQLObjectNotFound("The %s by alternateID %s = %s does not exist" % (cls.__name__, name, repr(value)))
|
|
else:
|
|
names = []
|
|
- for i in xrange(len(name)):
|
|
+ for i in range(len(name)):
|
|
names.append("%s = %s" % (name[i], repr(value[i])))
|
|
names = ', '.join(names)
|
|
- raise SQLObjectNotFound, "The %s by unique index %s(%s) does not exist" % (cls.__name__, idxName, names)
|
|
+ raise SQLObjectNotFound("The %s by unique index %s(%s) does not exist" % (cls.__name__, idxName, names))
|
|
if obj:
|
|
return obj
|
|
if connection:
|
|
@@ -1564,7 +1560,7 @@ class SQLObject(object):
|
|
if results.count():
|
|
# Restrictions only apply if there are
|
|
# matching records on the related table
|
|
- raise SQLObjectIntegrityError, (
|
|
+ raise SQLObjectIntegrityError(
|
|
"Tried to delete %s::%s but "
|
|
"table %s has a restriction against it" %
|
|
(klass.__name__, self.id, k.__name__))
|
|
@@ -1638,7 +1634,7 @@ class SQLObject(object):
|
|
|
|
@classmethod
|
|
def setConnection(cls, value):
|
|
- if isinstance(value, basestring):
|
|
+ if isinstance(value, str):
|
|
value = dbconnection.connectionForURI(value)
|
|
cls._connection = value
|
|
|
|
@@ -1720,7 +1716,7 @@ def getID(obj, refColumn=None):
|
|
return getattr(obj, refColumn or 'id')
|
|
elif isinstance(obj, int):
|
|
return obj
|
|
- elif isinstance(obj, long):
|
|
+ elif isinstance(obj, int):
|
|
return int(obj)
|
|
elif isinstance(obj, str):
|
|
try:
|
|
@@ -1733,7 +1729,7 @@ def getID(obj, refColumn=None):
|
|
def getObject(obj, klass):
|
|
if isinstance(obj, int):
|
|
return klass(obj)
|
|
- elif isinstance(obj, long):
|
|
+ elif isinstance(obj, int):
|
|
return klass(int(obj))
|
|
elif isinstance(obj, str):
|
|
return klass(int(obj))
|
|
--- sqlobject/manager/command.py.orig 2011-05-15 15:48:27 UTC
|
|
+++ sqlobject/manager/command.py
|
|
@@ -69,10 +69,10 @@ def db_differences(soClass, conn):
|
|
del existing[col.dbName]
|
|
else:
|
|
missing[col.dbName] = col
|
|
- for col in existing.values():
|
|
+ for col in list(existing.values()):
|
|
diffs.append('Database has extra column: %s'
|
|
% col.dbName)
|
|
- for col in missing.values():
|
|
+ for col in list(missing.values()):
|
|
diffs.append('Database missing column: %s' % col.dbName)
|
|
return diffs
|
|
|
|
@@ -96,7 +96,7 @@ class CommandRunner(object):
|
|
self.invalid('No COMMAND given (try "%s help")'
|
|
% os.path.basename(invoked_as))
|
|
real_command = self.command_aliases.get(command, command)
|
|
- if real_command not in self.commands.keys():
|
|
+ if real_command not in list(self.commands.keys()):
|
|
self.invalid('COMMAND %s unknown' % command)
|
|
runner = self.commands[real_command](
|
|
invoked_as, command, args, self)
|
|
@@ -109,7 +109,7 @@ class CommandRunner(object):
|
|
self.command_aliases[alias] = name
|
|
|
|
def invalid(self, msg, code=2):
|
|
- print msg
|
|
+ print(msg)
|
|
sys.exit(code)
|
|
|
|
the_runner = CommandRunner()
|
|
@@ -170,10 +170,8 @@ def standard_parser(connection=True, simulate=True,
|
|
default=[])
|
|
return parser
|
|
|
|
-class Command(object):
|
|
+class Command(object, metaclass=DeclarativeMeta):
|
|
|
|
- __metaclass__ = DeclarativeMeta
|
|
-
|
|
min_args = 0
|
|
min_args_error = 'You must provide at least %(min_args)s arguments'
|
|
max_args = 0
|
|
@@ -225,7 +223,7 @@ class Command(object):
|
|
# Check for circular references
|
|
if cls in dependency_stack:
|
|
dependency_stack.append(cls)
|
|
- raise SQLObjectCircularReferenceError, (
|
|
+ raise SQLObjectCircularReferenceError(
|
|
"Found a circular reference: %s " %
|
|
(' --> '.join([x.__name__
|
|
for x in dependency_stack])))
|
|
@@ -248,14 +246,14 @@ class Command(object):
|
|
sorter.append((level, cls))
|
|
sorter.sort()
|
|
ordered_classes = [cls for level, cls in sorter]
|
|
- except SQLObjectCircularReferenceError, msg:
|
|
+ except SQLObjectCircularReferenceError as msg:
|
|
# Failsafe: return the classes as-is if a circular reference
|
|
# prevented the dependency levels to be calculated.
|
|
- print ("Warning: a circular reference was detected in the "
|
|
+ print(("Warning: a circular reference was detected in the "
|
|
"model. Unable to sort the classes by dependency: they "
|
|
"will be treated in alphabetic order. This may or may "
|
|
"not work depending on your database backend. "
|
|
- "The error was:\n%s" % msg)
|
|
+ "The error was:\n%s" % msg))
|
|
return classes
|
|
return ordered_classes
|
|
|
|
@@ -347,21 +345,21 @@ class Command(object):
|
|
% '\n * '.join([soClass.__name__
|
|
for soClass in missing]))
|
|
if require_some and not all:
|
|
- print 'No classes found!'
|
|
+ print('No classes found!')
|
|
if self.options.modules:
|
|
- print 'Looked in modules: %s' % ', '.join(self.options.modules)
|
|
+ print('Looked in modules: %s' % ', '.join(self.options.modules))
|
|
else:
|
|
- print 'No modules specified'
|
|
+ print('No modules specified')
|
|
if self.options.packages:
|
|
- print 'Looked in packages: %s' % ', '.join(self.options.packages)
|
|
+ print('Looked in packages: %s' % ', '.join(self.options.packages))
|
|
else:
|
|
- print 'No packages specified'
|
|
+ print('No packages specified')
|
|
if self.options.class_matchers:
|
|
- print 'Matching class pattern: %s' % self.options.class_matches
|
|
+ print('Matching class pattern: %s' % self.options.class_matches)
|
|
if self.options.eggs:
|
|
- print 'Looked in eggs: %s' % ', '.join(self.options.eggs)
|
|
+ print('Looked in eggs: %s' % ', '.join(self.options.eggs))
|
|
else:
|
|
- print 'No eggs specified'
|
|
+ print('No eggs specified')
|
|
sys.exit(1)
|
|
return self.orderClassesByDependencyLevel(all)
|
|
|
|
@@ -411,7 +409,7 @@ class Command(object):
|
|
if '#' in conf_fn:
|
|
conf_fn, conf_section = conf_fn.split('#', 1)
|
|
|
|
- from ConfigParser import ConfigParser
|
|
+ from configparser import ConfigParser
|
|
p = ConfigParser()
|
|
# Case-sensitive:
|
|
p.optionxform = str
|
|
@@ -454,21 +452,20 @@ class Command(object):
|
|
def find_classes_in_file(arg, dir_name, filenames):
|
|
if dir_name.startswith('.svn'):
|
|
return
|
|
- filenames = filter(lambda fname: fname.endswith('.py') and fname != '__init__.py',
|
|
- filenames)
|
|
+ filenames = [fname for fname in filenames if fname.endswith('.py') and fname != '__init__.py']
|
|
for fname in filenames:
|
|
module_name = os.path.join(dir_name, fname)
|
|
module_name = module_name[module_name.find(package_name):]
|
|
module_name = module_name.replace(os.path.sep,'.')[:-3]
|
|
try:
|
|
module = moduleloader.load_module(module_name)
|
|
- except ImportError, err:
|
|
+ except ImportError as err:
|
|
if self.options.verbose:
|
|
- print 'Could not import module "%s". Error was : "%s"' % (module_name, err)
|
|
+ print('Could not import module "%s". Error was : "%s"' % (module_name, err))
|
|
continue
|
|
- except Exception, exc:
|
|
+ except Exception as exc:
|
|
if self.options.verbose:
|
|
- print 'Unknown exception while processing module "%s" : "%s"' % (module_name, exc)
|
|
+ print('Unknown exception while processing module "%s" : "%s"' % (module_name, exc))
|
|
continue
|
|
classes = self.classes_from_module(module)
|
|
all.extend(classes)
|
|
@@ -484,7 +481,7 @@ class Command(object):
|
|
if not mod:
|
|
continue
|
|
if self.options.verbose:
|
|
- print 'Looking in module %s' % mod
|
|
+ print('Looking in module %s' % mod)
|
|
modules.extend(self.classes_from_module(
|
|
moduleloader.load_module(mod)))
|
|
return modules
|
|
@@ -503,7 +500,7 @@ class Command(object):
|
|
dist = pkg_resources.get_distribution(egg_spec)
|
|
if not dist.has_metadata('sqlobject.txt'):
|
|
if warn_no_sqlobject:
|
|
- print 'No sqlobject.txt in %s egg info' % egg_spec
|
|
+ print('No sqlobject.txt in %s egg info' % egg_spec)
|
|
return None, {}
|
|
result = {}
|
|
for line in dist.get_metadata_lines('sqlobject.txt'):
|
|
@@ -513,7 +510,7 @@ class Command(object):
|
|
name, value = line.split('=', 1)
|
|
name = name.strip().lower()
|
|
if name in result:
|
|
- print 'Warning: %s appears more than once in sqlobject.txt' % name
|
|
+ print('Warning: %s appears more than once in sqlobject.txt' % name)
|
|
result[name.strip().lower()] = value.strip()
|
|
return dist, result
|
|
|
|
@@ -532,12 +529,12 @@ class Command(object):
|
|
else:
|
|
prompt += ' [y/N]? '
|
|
while 1:
|
|
- response = raw_input(prompt).strip()
|
|
+ response = input(prompt).strip()
|
|
if not response.strip():
|
|
return default
|
|
if response and response[0].lower() in ('y', 'n'):
|
|
return response[0].lower() == 'y'
|
|
- print 'Y or N please'
|
|
+ print('Y or N please')
|
|
|
|
def shorten_filename(self, fn):
|
|
"""
|
|
@@ -558,7 +555,7 @@ class Command(object):
|
|
f = open(fn, 'w')
|
|
f.write(pretext)
|
|
f.close()
|
|
- print '$EDITOR %s' % fn
|
|
+ print('$EDITOR %s' % fn)
|
|
os.system('$EDITOR %s' % fn)
|
|
f = open(fn, 'r')
|
|
content = f.read()
|
|
@@ -582,16 +579,16 @@ class CommandSQL(Command):
|
|
allConstraints = []
|
|
for cls in classes:
|
|
if self.options.verbose >= 1:
|
|
- print '-- %s from %s' % (
|
|
- cls.__name__, cls.__module__)
|
|
+ print('-- %s from %s' % (
|
|
+ cls.__name__, cls.__module__))
|
|
createSql, constraints = cls.createTableSQL()
|
|
- print createSql.strip() + ';\n'
|
|
+ print(createSql.strip() + ';\n')
|
|
allConstraints.append(constraints)
|
|
for constraints in allConstraints:
|
|
if constraints:
|
|
for constraint in constraints:
|
|
if constraint:
|
|
- print constraint.strip() + ';\n'
|
|
+ print(constraint.strip() + ';\n')
|
|
|
|
|
|
class CommandList(Command):
|
|
@@ -603,12 +600,12 @@ class CommandList(Command):
|
|
|
|
def command(self):
|
|
if self.options.verbose >= 1:
|
|
- print 'Classes found:'
|
|
+ print('Classes found:')
|
|
classes = self.classes(require_connection=False)
|
|
for soClass in classes:
|
|
- print '%s.%s' % (soClass.__module__, soClass.__name__)
|
|
+ print('%s.%s' % (soClass.__module__, soClass.__name__))
|
|
if self.options.verbose >= 1:
|
|
- print ' Table: %s' % soClass.sqlmeta.table
|
|
+ print(' Table: %s' % soClass.sqlmeta.table)
|
|
|
|
class CommandCreate(Command):
|
|
|
|
@@ -633,26 +630,26 @@ class CommandCreate(Command):
|
|
if not self.options.simulate:
|
|
try:
|
|
soClass._connection.createEmptyDatabase()
|
|
- except soClass._connection.module.ProgrammingError, e:
|
|
+ except soClass._connection.module.ProgrammingError as e:
|
|
if str(e).find('already exists') != -1:
|
|
- print 'Database already exists'
|
|
+ print('Database already exists')
|
|
else:
|
|
raise
|
|
else:
|
|
- print '(simulating; cannot create database)'
|
|
+ print('(simulating; cannot create database)')
|
|
dbs_created.append(soClass._connection)
|
|
- if soClass._connection not in constraints.keys():
|
|
+ if soClass._connection not in list(constraints.keys()):
|
|
constraints[soClass._connection] = []
|
|
exists = soClass._connection.tableExists(soClass.sqlmeta.table)
|
|
if v >= 1:
|
|
if exists:
|
|
existing += 1
|
|
- print '%s already exists.' % soClass.__name__
|
|
+ print('%s already exists.' % soClass.__name__)
|
|
else:
|
|
- print 'Creating %s' % soClass.__name__
|
|
+ print('Creating %s' % soClass.__name__)
|
|
if v >= 2:
|
|
sql, extra = soClass.createTableSQL()
|
|
- print sql
|
|
+ print(sql)
|
|
if (not self.options.simulate
|
|
and not exists):
|
|
if self.options.interactive:
|
|
@@ -662,22 +659,22 @@ class CommandCreate(Command):
|
|
if tableConstraints:
|
|
constraints[soClass._connection].append(tableConstraints)
|
|
else:
|
|
- print 'Cancelled'
|
|
+ print('Cancelled')
|
|
else:
|
|
created += 1
|
|
tableConstraints = soClass.createTable(applyConstraints=False)
|
|
if tableConstraints:
|
|
constraints[soClass._connection].append(tableConstraints)
|
|
- for connection in constraints.keys():
|
|
+ for connection in list(constraints.keys()):
|
|
if v >= 2:
|
|
- print 'Creating constraints'
|
|
+ print('Creating constraints')
|
|
for constraintList in constraints[connection]:
|
|
for constraint in constraintList:
|
|
if constraint:
|
|
connection.query(constraint)
|
|
if v >= 1:
|
|
- print '%i tables created (%i already exist)' % (
|
|
- created, existing)
|
|
+ print('%i tables created (%i already exist)' % (
|
|
+ created, existing))
|
|
|
|
|
|
class CommandDrop(Command):
|
|
@@ -695,10 +692,10 @@ class CommandDrop(Command):
|
|
exists = soClass._connection.tableExists(soClass.sqlmeta.table)
|
|
if v >= 1:
|
|
if exists:
|
|
- print 'Dropping %s' % soClass.__name__
|
|
+ print('Dropping %s' % soClass.__name__)
|
|
else:
|
|
not_existing += 1
|
|
- print '%s does not exist.' % soClass.__name__
|
|
+ print('%s does not exist.' % soClass.__name__)
|
|
if (not self.options.simulate
|
|
and exists):
|
|
if self.options.interactive:
|
|
@@ -706,13 +703,13 @@ class CommandDrop(Command):
|
|
dropped += 1
|
|
soClass.dropTable()
|
|
else:
|
|
- print 'Cancelled'
|
|
+ print('Cancelled')
|
|
else:
|
|
dropped += 1
|
|
soClass.dropTable()
|
|
if v >= 1:
|
|
- print '%i tables dropped (%i didn\'t exist)' % (
|
|
- dropped, not_existing)
|
|
+ print('%i tables dropped (%i didn\'t exist)' % (
|
|
+ dropped, not_existing))
|
|
|
|
class CommandStatus(Command):
|
|
|
|
@@ -730,7 +727,7 @@ class CommandStatus(Command):
|
|
if self.printed:
|
|
return
|
|
self.printed = True
|
|
- print 'Checking %s...' % soClass.__name__
|
|
+ print('Checking %s...' % soClass.__name__)
|
|
|
|
def command(self):
|
|
good = 0
|
|
@@ -744,7 +741,7 @@ class CommandStatus(Command):
|
|
self.print_class(soClass)
|
|
if not conn.tableExists(soClass.sqlmeta.table):
|
|
self.print_class(soClass)
|
|
- print ' Does not exist in database'
|
|
+ print(' Does not exist in database')
|
|
missing_tables += 1
|
|
continue
|
|
try:
|
|
@@ -752,13 +749,13 @@ class CommandStatus(Command):
|
|
soClass)
|
|
except AttributeError:
|
|
if not columnsFromSchema_warning:
|
|
- print 'Database does not support reading columns'
|
|
+ print('Database does not support reading columns')
|
|
columnsFromSchema_warning = True
|
|
good += 1
|
|
continue
|
|
- except AssertionError, e:
|
|
- print 'Cannot read db table %s: %s' % (
|
|
- soClass.sqlmeta.table, e)
|
|
+ except AssertionError as e:
|
|
+ print('Cannot read db table %s: %s' % (
|
|
+ soClass.sqlmeta.table, e))
|
|
continue
|
|
existing = {}
|
|
for col in columns:
|
|
@@ -772,19 +769,19 @@ class CommandStatus(Command):
|
|
missing[col.dbName] = col
|
|
if existing:
|
|
self.print_class(soClass)
|
|
- for col in existing.values():
|
|
- print ' Database has extra column: %s' % col.dbName
|
|
+ for col in list(existing.values()):
|
|
+ print(' Database has extra column: %s' % col.dbName)
|
|
if missing:
|
|
self.print_class(soClass)
|
|
- for col in missing.values():
|
|
- print ' Database missing column: %s' % col.dbName
|
|
+ for col in list(missing.values()):
|
|
+ print(' Database missing column: %s' % col.dbName)
|
|
if existing or missing:
|
|
bad += 1
|
|
else:
|
|
good += 1
|
|
if self.options.verbose:
|
|
- print '%i in sync; %i out of sync; %i not in database' % (
|
|
- good, bad, missing_tables)
|
|
+ print('%i in sync; %i out of sync; %i not in database' % (
|
|
+ good, bad, missing_tables))
|
|
|
|
class CommandHelp(Command):
|
|
|
|
@@ -799,20 +796,20 @@ class CommandHelp(Command):
|
|
if self.args:
|
|
the_runner.run([self.invoked_as, self.args[0], '-h'])
|
|
else:
|
|
- print 'Available commands:'
|
|
- print ' (use "%s help COMMAND" or "%s COMMAND -h" ' % (
|
|
- self.prog_name, self.prog_name)
|
|
- print ' for more information)'
|
|
- items = the_runner.commands.items()
|
|
+ print('Available commands:')
|
|
+ print(' (use "%s help COMMAND" or "%s COMMAND -h" ' % (
|
|
+ self.prog_name, self.prog_name))
|
|
+ print(' for more information)')
|
|
+ items = list(the_runner.commands.items())
|
|
items.sort()
|
|
max_len = max([len(cn) for cn, c in items])
|
|
for command_name, command in items:
|
|
- print '%s:%s %s' % (command_name,
|
|
+ print('%s:%s %s' % (command_name,
|
|
' '*(max_len-len(command_name)),
|
|
- command.summary)
|
|
+ command.summary))
|
|
if command.aliases:
|
|
- print '%s (Aliases: %s)' % (
|
|
- ' '*max_len, ', '.join(command.aliases))
|
|
+ print('%s (Aliases: %s)' % (
|
|
+ ' '*max_len, ', '.join(command.aliases)))
|
|
|
|
class CommandExecute(Command):
|
|
|
|
@@ -834,7 +831,7 @@ class CommandExecute(Command):
|
|
args = self.args
|
|
if self.options.use_stdin:
|
|
if self.options.verbose:
|
|
- print "Reading additional SQL from stdin (Ctrl-D or Ctrl-Z to finish)..."
|
|
+ print("Reading additional SQL from stdin (Ctrl-D or Ctrl-Z to finish)...")
|
|
args.append(sys.stdin.read())
|
|
self.conn = self.connection().getConnection()
|
|
self.cursor = self.conn.cursor()
|
|
@@ -843,22 +840,22 @@ class CommandExecute(Command):
|
|
|
|
def execute_sql(self, sql):
|
|
if self.options.verbose:
|
|
- print sql
|
|
+ print(sql)
|
|
try:
|
|
self.cursor.execute(sql)
|
|
- except Exception, e:
|
|
+ except Exception as e:
|
|
if not self.options.verbose:
|
|
- print sql
|
|
- print "****Error:"
|
|
- print ' ', e
|
|
+ print(sql)
|
|
+ print("****Error:")
|
|
+ print(' ', e)
|
|
return
|
|
desc = self.cursor.description
|
|
rows = self.cursor.fetchall()
|
|
if self.options.verbose:
|
|
if not self.cursor.rowcount:
|
|
- print "No rows accessed"
|
|
+ print("No rows accessed")
|
|
else:
|
|
- print "%i rows accessed" % self.cursor.rowcount
|
|
+ print("%i rows accessed" % self.cursor.rowcount)
|
|
if desc:
|
|
for name, type_code, display_size, internal_size, precision, scale, null_ok in desc:
|
|
sys.stdout.write("%s\t" % name)
|
|
@@ -867,7 +864,7 @@ class CommandExecute(Command):
|
|
for col in row:
|
|
sys.stdout.write("%r\t" % col)
|
|
sys.stdout.write("\n")
|
|
- print
|
|
+ print()
|
|
|
|
class CommandRecord(Command):
|
|
|
|
@@ -928,12 +925,12 @@ class CommandRecord(Command):
|
|
sim = self.options.simulate
|
|
classes = self.classes()
|
|
if not classes:
|
|
- print "No classes found!"
|
|
+ print("No classes found!")
|
|
return
|
|
|
|
output_dir = self.find_output_dir()
|
|
version = os.path.basename(output_dir)
|
|
- print "Creating version %s" % version
|
|
+ print("Creating version %s" % version)
|
|
conns = []
|
|
files = {}
|
|
for cls in self.classes():
|
|
@@ -963,14 +960,14 @@ class CommandRecord(Command):
|
|
last_version_dir = self.find_last_version()
|
|
if last_version_dir and not self.options.force_create:
|
|
if v > 1:
|
|
- print "Checking %s to see if it is current" % last_version_dir
|
|
+ print("Checking %s to see if it is current" % last_version_dir)
|
|
files_copy = files.copy()
|
|
for fn in os.listdir(last_version_dir):
|
|
if not fn.endswith('.sql'):
|
|
continue
|
|
if not fn in files_copy:
|
|
if v > 1:
|
|
- print "Missing file %s" % fn
|
|
+ print("Missing file %s" % fn)
|
|
break
|
|
f = open(os.path.join(last_version_dir, fn), 'r')
|
|
content = f.read()
|
|
@@ -978,32 +975,32 @@ class CommandRecord(Command):
|
|
if (self.strip_comments(files_copy[fn])
|
|
!= self.strip_comments(content)):
|
|
if v > 1:
|
|
- print "Content does not match: %s" % fn
|
|
+ print("Content does not match: %s" % fn)
|
|
break
|
|
del files_copy[fn]
|
|
else:
|
|
# No differences so far
|
|
if not files_copy:
|
|
# Used up all files
|
|
- print ("Current status matches version %s"
|
|
- % os.path.basename(last_version_dir))
|
|
+ print(("Current status matches version %s"
|
|
+ % os.path.basename(last_version_dir)))
|
|
return
|
|
if v > 1:
|
|
- print "Extra files: %s" % ', '.join(files_copy.keys())
|
|
+ print("Extra files: %s" % ', '.join(list(files_copy.keys())))
|
|
if v:
|
|
- print ("Current state does not match %s"
|
|
- % os.path.basename(last_version_dir))
|
|
+ print(("Current state does not match %s"
|
|
+ % os.path.basename(last_version_dir)))
|
|
if v > 1 and not last_version_dir:
|
|
- print "No last version to check"
|
|
+ print("No last version to check")
|
|
if not sim:
|
|
os.mkdir(output_dir)
|
|
if v:
|
|
- print 'Making directory %s' % self.shorten_filename(output_dir)
|
|
- files = files.items()
|
|
+ print('Making directory %s' % self.shorten_filename(output_dir))
|
|
+ files = list(files.items())
|
|
files.sort()
|
|
for fn, content in files:
|
|
if v:
|
|
- print ' Writing %s' % self.shorten_filename(fn)
|
|
+ print(' Writing %s' % self.shorten_filename(fn))
|
|
if not sim:
|
|
f = open(os.path.join(output_dir, fn), 'w')
|
|
f.write(content)
|
|
@@ -1021,8 +1018,8 @@ class CommandRecord(Command):
|
|
diff = ' %s: %s' % (cls.sqlmeta.table, diff)
|
|
all_diffs.append(diff)
|
|
if all_diffs:
|
|
- print 'Database does not match schema:'
|
|
- print '\n'.join(all_diffs)
|
|
+ print('Database does not match schema:')
|
|
+ print('\n'.join(all_diffs))
|
|
for conn in conns:
|
|
self.update_db(version, conn)
|
|
else:
|
|
@@ -1044,17 +1041,17 @@ class CommandRecord(Command):
|
|
f = open(fn, 'w')
|
|
f.write(text)
|
|
f.close()
|
|
- print 'Wrote to %s' % fn
|
|
+ print('Wrote to %s' % fn)
|
|
|
|
def update_db(self, version, conn):
|
|
v = self.options.verbose
|
|
if not conn.tableExists(SQLObjectVersionTable.sqlmeta.table):
|
|
if v:
|
|
- print ('Creating table %s'
|
|
- % SQLObjectVersionTable.sqlmeta.table)
|
|
+ print(('Creating table %s'
|
|
+ % SQLObjectVersionTable.sqlmeta.table))
|
|
sql = SQLObjectVersionTable.createTableSQL(connection=conn)
|
|
if v > 1:
|
|
- print sql
|
|
+ print(sql)
|
|
if not self.options.simulate:
|
|
SQLObjectVersionTable.createTable(connection=conn)
|
|
if not self.options.simulate:
|
|
@@ -1073,7 +1070,7 @@ class CommandRecord(Command):
|
|
if base is None:
|
|
base = CONFIG.get('sqlobject_history_dir', '.')
|
|
if not os.path.exists(base):
|
|
- print 'Creating history directory %s' % self.shorten_filename(base)
|
|
+ print('Creating history directory %s' % self.shorten_filename(base))
|
|
if not self.options.simulate:
|
|
os.makedirs(base)
|
|
return base
|
|
@@ -1084,8 +1081,8 @@ class CommandRecord(Command):
|
|
dir = os.path.join(self.base_dir(), today + '-' +
|
|
self.options.version_name)
|
|
if os.path.exists(dir):
|
|
- print ("Error, directory already exists: %s"
|
|
- % dir)
|
|
+ print(("Error, directory already exists: %s"
|
|
+ % dir))
|
|
sys.exit(1)
|
|
return dir
|
|
extra = ''
|
|
@@ -1114,18 +1111,18 @@ class CommandRecord(Command):
|
|
sim = self.options.simulate
|
|
version = self.options.force_db_version
|
|
if not self.version_regex.search(version):
|
|
- print "Versions must be in the format YYYY-MM-DD..."
|
|
- print "You version %s does not fit this" % version
|
|
+ print("Versions must be in the format YYYY-MM-DD...")
|
|
+ print("You version %s does not fit this" % version)
|
|
return
|
|
version_dir = os.path.join(self.base_dir(), version)
|
|
if not os.path.exists(version_dir):
|
|
if v:
|
|
- print 'Creating %s' % self.shorten_filename(version_dir)
|
|
+ print('Creating %s' % self.shorten_filename(version_dir))
|
|
if not sim:
|
|
os.mkdir(version_dir)
|
|
elif v:
|
|
- print ('Directory %s exists'
|
|
- % self.shorten_filename(version_dir))
|
|
+ print(('Directory %s exists'
|
|
+ % self.shorten_filename(version_dir)))
|
|
if self.options.db_record:
|
|
self.update_db(version, self.connection())
|
|
|
|
@@ -1162,51 +1159,51 @@ class CommandUpgrade(CommandRecord):
|
|
else:
|
|
fname = self.find_last_version()
|
|
if fname is None:
|
|
- print "No version exists, use 'record' command to create one"
|
|
+ print("No version exists, use 'record' command to create one")
|
|
return
|
|
version_to = os.path.basename(fname)
|
|
current = self.current_version()
|
|
if v:
|
|
- print 'Current version: %s' % current
|
|
+ print('Current version: %s' % current)
|
|
version_list = self.make_plan(current, version_to)
|
|
if not version_list:
|
|
- print 'Database up to date'
|
|
+ print('Database up to date')
|
|
return
|
|
if v:
|
|
- print 'Plan:'
|
|
+ print('Plan:')
|
|
for next_version, upgrader in version_list:
|
|
- print ' Use %s to upgrade to %s' % (
|
|
- self.shorten_filename(upgrader), next_version)
|
|
+ print(' Use %s to upgrade to %s' % (
|
|
+ self.shorten_filename(upgrader), next_version))
|
|
conn = self.connection()
|
|
for next_version, upgrader in version_list:
|
|
f = open(upgrader)
|
|
sql = f.read()
|
|
f.close()
|
|
if v:
|
|
- print "Running:"
|
|
- print sql
|
|
- print '-'*60
|
|
+ print("Running:")
|
|
+ print(sql)
|
|
+ print('-'*60)
|
|
if not sim:
|
|
try:
|
|
conn.query(sql)
|
|
except:
|
|
- print "Error in script: %s" % upgrader
|
|
+ print("Error in script: %s" % upgrader)
|
|
raise
|
|
self.update_db(next_version, conn)
|
|
- print 'Done.'
|
|
+ print('Done.')
|
|
|
|
|
|
def current_version(self):
|
|
conn = self.connection()
|
|
if not conn.tableExists(SQLObjectVersionTable.sqlmeta.table):
|
|
- print 'No sqlobject_version table!'
|
|
+ print('No sqlobject_version table!')
|
|
sys.exit(1)
|
|
versions = list(SQLObjectVersionTable.select(connection=conn))
|
|
if not versions:
|
|
- print 'No rows in sqlobject_version!'
|
|
+ print('No rows in sqlobject_version!')
|
|
sys.exit(1)
|
|
if len(versions) > 1:
|
|
- print 'Ambiguous sqlobject_version_table'
|
|
+ print('Ambiguous sqlobject_version_table')
|
|
sys.exit(1)
|
|
return versions[0].version
|
|
|
|
@@ -1216,9 +1213,9 @@ class CommandUpgrade(CommandRecord):
|
|
dbname = self.connection().dbName
|
|
next_version, upgrader = self.best_upgrade(current, dest, dbname)
|
|
if not upgrader:
|
|
- print 'No way to upgrade from %s to %s' % (current, dest)
|
|
- print ('(you need a %s/upgrade_%s_%s.sql script)'
|
|
- % (current, dbname, dest))
|
|
+ print('No way to upgrade from %s to %s' % (current, dest))
|
|
+ print(('(you need a %s/upgrade_%s_%s.sql script)'
|
|
+ % (current, dbname, dest)))
|
|
sys.exit(1)
|
|
plan = [(next_version, upgrader)]
|
|
if next_version == dest:
|
|
@@ -1229,42 +1226,42 @@ class CommandUpgrade(CommandRecord):
|
|
def best_upgrade(self, current, dest, target_dbname):
|
|
current_dir = os.path.join(self.base_dir(), current)
|
|
if self.options.verbose > 1:
|
|
- print ('Looking in %s for upgraders'
|
|
- % self.shorten_filename(current_dir))
|
|
+ print(('Looking in %s for upgraders'
|
|
+ % self.shorten_filename(current_dir)))
|
|
upgraders = []
|
|
for fn in os.listdir(current_dir):
|
|
match = self.upgrade_regex.search(fn)
|
|
if not match:
|
|
if self.options.verbose > 1:
|
|
- print 'Not an upgrade script: %s' % fn
|
|
+ print('Not an upgrade script: %s' % fn)
|
|
continue
|
|
dbname = match.group(1)
|
|
version = match.group(2)
|
|
if dbname != target_dbname:
|
|
if self.options.verbose > 1:
|
|
- print 'Not for this database: %s (want %s)' % (
|
|
- dbname, target_dbname)
|
|
+ print('Not for this database: %s (want %s)' % (
|
|
+ dbname, target_dbname))
|
|
continue
|
|
if version > dest:
|
|
if self.options.verbose > 1:
|
|
- print 'Version too new: %s (only want %s)' % (
|
|
- version, dest)
|
|
+ print('Version too new: %s (only want %s)' % (
|
|
+ version, dest))
|
|
upgraders.append((version, os.path.join(current_dir, fn)))
|
|
if not upgraders:
|
|
if self.options.verbose > 1:
|
|
- print 'No upgraders found in %s' % current_dir
|
|
+ print('No upgraders found in %s' % current_dir)
|
|
return None, None
|
|
upgraders.sort()
|
|
return upgraders[-1]
|
|
|
|
def update_sys_path(paths, verbose):
|
|
- if isinstance(paths, basestring):
|
|
+ if isinstance(paths, str):
|
|
paths = [paths]
|
|
for path in paths:
|
|
path = os.path.abspath(path)
|
|
if path not in sys.path:
|
|
if verbose > 1:
|
|
- print 'Adding %s to path' % path
|
|
+ print('Adding %s to path' % path)
|
|
sys.path.insert(0, path)
|
|
|
|
if __name__ == '__main__':
|
|
--- sqlobject/maxdb/maxdbconnection.py.orig 2022-03-15 19:15:16 UTC
|
|
+++ sqlobject/maxdb/maxdbconnection.py
|
|
@@ -246,7 +246,7 @@ class MaxdbConnection(DBAPI):
|
|
pkmap[col_name]=True
|
|
|
|
if len(pkmap) == 0:
|
|
- raise PrimaryKeyNotFounded, tableName
|
|
+ raise PrimaryKeyNotFounded(tableName)
|
|
|
|
for (field, nullAllowed, default, data_type, data_len,
|
|
data_scale) in colData:
|
|
--- sqlobject/mysql/mysqlconnection.py.orig 2011-05-08 15:49:57 UTC
|
|
+++ sqlobject/mysql/mysqlconnection.py
|
|
@@ -69,7 +69,7 @@ class MySQLConnection(DBAPI):
|
|
db=self.db, user=self.user, passwd=self.password, **self.kw)
|
|
if self.module.version_info[:3] >= (1, 2, 2):
|
|
conn.ping(True) # Attempt to reconnect. This setting is persistent.
|
|
- except self.module.OperationalError, e:
|
|
+ except self.module.OperationalError as e:
|
|
conninfo = "; used connection string: host=%(host)s, port=%(port)s, db=%(db)s, user=%(user)s" % self.__dict__
|
|
raise OperationalError(ErrorMessage(e, conninfo))
|
|
|
|
@@ -90,9 +90,9 @@ class MySQLConnection(DBAPI):
|
|
conn.autocommit(auto)
|
|
|
|
def _executeRetry(self, conn, cursor, query):
|
|
- if self.need_unicode and not isinstance(query, unicode):
|
|
+ if self.need_unicode and not isinstance(query, str):
|
|
try:
|
|
- query = unicode(query, self.dbEncoding)
|
|
+ query = str(query, self.dbEncoding)
|
|
except UnicodeError:
|
|
pass
|
|
|
|
@@ -111,7 +111,7 @@ class MySQLConnection(DBAPI):
|
|
for count in range(3):
|
|
try:
|
|
return cursor.execute(query)
|
|
- except self.module.OperationalError, e:
|
|
+ except self.module.OperationalError as e:
|
|
if e.args[0] in (self.module.constants.CR.SERVER_GONE_ERROR, self.module.constants.CR.SERVER_LOST):
|
|
if count == 2:
|
|
raise OperationalError(ErrorMessage(e))
|
|
@@ -119,27 +119,27 @@ class MySQLConnection(DBAPI):
|
|
self.printDebug(conn, str(e), 'ERROR')
|
|
else:
|
|
raise OperationalError(ErrorMessage(e))
|
|
- except self.module.IntegrityError, e:
|
|
+ except self.module.IntegrityError as e:
|
|
msg = ErrorMessage(e)
|
|
if e.args[0] == self.module.constants.ER.DUP_ENTRY:
|
|
raise DuplicateEntryError(msg)
|
|
else:
|
|
raise IntegrityError(msg)
|
|
- except self.module.InternalError, e:
|
|
+ except self.module.InternalError as e:
|
|
raise InternalError(ErrorMessage(e))
|
|
- except self.module.ProgrammingError, e:
|
|
+ except self.module.ProgrammingError as e:
|
|
raise ProgrammingError(ErrorMessage(e))
|
|
- except self.module.DataError, e:
|
|
+ except self.module.DataError as e:
|
|
raise DataError(ErrorMessage(e))
|
|
- except self.module.NotSupportedError, e:
|
|
+ except self.module.NotSupportedError as e:
|
|
raise NotSupportedError(ErrorMessage(e))
|
|
- except self.module.DatabaseError, e:
|
|
+ except self.module.DatabaseError as e:
|
|
raise DatabaseError(ErrorMessage(e))
|
|
- except self.module.InterfaceError, e:
|
|
+ except self.module.InterfaceError as e:
|
|
raise InterfaceError(ErrorMessage(e))
|
|
- except self.module.Warning, e:
|
|
+ except self.module.Warning as e:
|
|
raise Warning(ErrorMessage(e))
|
|
- except self.module.Error, e:
|
|
+ except self.module.Error as e:
|
|
raise Error(ErrorMessage(e))
|
|
|
|
def _queryInsertID(self, conn, soInstance, id, names, values):
|
|
@@ -194,7 +194,7 @@ class MySQLConnection(DBAPI):
|
|
# which is not always True (for an embedded application, e.g.)
|
|
self.query('DESCRIBE %s' % (tableName))
|
|
return True
|
|
- except ProgrammingError, e:
|
|
+ except ProgrammingError as e:
|
|
if e[0].code == 1146: # ER_NO_SUCH_TABLE
|
|
return False
|
|
raise
|
|
--- sqlobject/postgres/pgconnection.py.orig 2013-09-30 14:25:11 UTC
|
|
+++ sqlobject/postgres/pgconnection.py
|
|
@@ -142,7 +142,7 @@ class PostgresConnection(DBAPI):
|
|
conn = self.module.connect(self.dsn)
|
|
else:
|
|
conn = self.module.connect(**self.dsn_dict)
|
|
- except self.module.OperationalError, e:
|
|
+ except self.module.OperationalError as e:
|
|
raise OperationalError(ErrorMessage(e, "used connection string %r" % self.dsn))
|
|
|
|
# For printDebug in _executeRetry
|
|
@@ -162,29 +162,29 @@ class PostgresConnection(DBAPI):
|
|
self.printDebug(conn, query, 'QueryR')
|
|
try:
|
|
return cursor.execute(query)
|
|
- except self.module.OperationalError, e:
|
|
+ except self.module.OperationalError as e:
|
|
raise OperationalError(ErrorMessage(e))
|
|
- except self.module.IntegrityError, e:
|
|
+ except self.module.IntegrityError as e:
|
|
msg = ErrorMessage(e)
|
|
if e.pgcode == '23505':
|
|
raise DuplicateEntryError(msg)
|
|
else:
|
|
raise IntegrityError(msg)
|
|
- except self.module.InternalError, e:
|
|
+ except self.module.InternalError as e:
|
|
raise InternalError(ErrorMessage(e))
|
|
- except self.module.ProgrammingError, e:
|
|
+ except self.module.ProgrammingError as e:
|
|
raise ProgrammingError(ErrorMessage(e))
|
|
- except self.module.DataError, e:
|
|
+ except self.module.DataError as e:
|
|
raise DataError(ErrorMessage(e))
|
|
- except self.module.NotSupportedError, e:
|
|
+ except self.module.NotSupportedError as e:
|
|
raise NotSupportedError(ErrorMessage(e))
|
|
- except self.module.DatabaseError, e:
|
|
+ except self.module.DatabaseError as e:
|
|
raise DatabaseError(ErrorMessage(e))
|
|
- except self.module.InterfaceError, e:
|
|
+ except self.module.InterfaceError as e:
|
|
raise InterfaceError(ErrorMessage(e))
|
|
- except self.module.Warning, e:
|
|
+ except self.module.Warning as e:
|
|
raise Warning(ErrorMessage(e))
|
|
- except self.module.Error, e:
|
|
+ except self.module.Error as e:
|
|
raise Error(ErrorMessage(e))
|
|
|
|
def _queryInsertID(self, conn, soInstance, id, names, values):
|
|
--- sqlobject/sqlbuilder.py.orig 2013-10-05 12:02:45 UTC
|
|
+++ sqlobject/sqlbuilder.py
|
|
@@ -67,8 +67,8 @@ import threading
|
|
import types
|
|
import weakref
|
|
|
|
-import classregistry
|
|
-from converters import registerConverter, sqlrepr, quote_str, unquote_str
|
|
+from . import classregistry
|
|
+from .converters import registerConverter, sqlrepr, quote_str, unquote_str
|
|
|
|
|
|
class VersionError(Exception):
|
|
@@ -86,7 +86,7 @@ class SQLObjectState(object):
|
|
safeSQLRE = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_\.]*$')
|
|
def sqlIdentifier(obj):
|
|
# some db drivers return unicode column names
|
|
- return isinstance(obj, basestring) and bool(safeSQLRE.search(obj.strip()))
|
|
+ return isinstance(obj, str) and bool(safeSQLRE.search(obj.strip()))
|
|
|
|
|
|
def execute(expr, executor):
|
|
@@ -97,7 +97,7 @@ def execute(expr, executor):
|
|
|
|
|
|
def _str_or_sqlrepr(expr, db):
|
|
- if isinstance(expr, basestring):
|
|
+ if isinstance(expr, str):
|
|
return expr
|
|
return sqlrepr(expr, db)
|
|
|
|
@@ -181,9 +181,9 @@ class SQLExpression:
|
|
return repr(self)
|
|
|
|
def __cmp__(self, other):
|
|
- raise VersionError, "Python 2.1+ required"
|
|
+ raise VersionError("Python 2.1+ required")
|
|
def __rcmp__(self, other):
|
|
- raise VersionError, "Python 2.1+ required"
|
|
+ raise VersionError("Python 2.1+ required")
|
|
|
|
def startswith(self, s):
|
|
return STARTSWITH(self, s)
|
|
@@ -287,7 +287,7 @@ class SQLCall(SQLExpression):
|
|
def components(self):
|
|
return [self.expr] + list(self.args)
|
|
def execute(self, executor):
|
|
- raise ValueError, "I don't yet know how to locally execute functions"
|
|
+ raise ValueError("I don't yet know how to locally execute functions")
|
|
|
|
registerConverter(SQLCall, SQLExprConverter)
|
|
|
|
@@ -316,7 +316,7 @@ class SQLConstant(SQLExpression):
|
|
def __sqlrepr__(self, db):
|
|
return self.const
|
|
def execute(self, executor):
|
|
- raise ValueError, "I don't yet know how to execute SQL constants"
|
|
+ raise ValueError("I don't yet know how to execute SQL constants")
|
|
|
|
registerConverter(SQLConstant, SQLExprConverter)
|
|
|
|
@@ -391,7 +391,7 @@ class Table(SQLExpression):
|
|
def __sqlrepr__(self, db):
|
|
return _str_or_sqlrepr(self.tableName, db)
|
|
def execute(self, executor):
|
|
- raise ValueError, "Tables don't have values"
|
|
+ raise ValueError("Tables don't have values")
|
|
|
|
class SQLObjectTable(Table):
|
|
FieldClass = SQLObjectField
|
|
@@ -411,7 +411,7 @@ class SQLObjectTable(Table):
|
|
elif attr in self.soClass.sqlmeta.columns:
|
|
column = self.soClass.sqlmeta.columns[attr]
|
|
return self._getattrFromColumn(column, attr)
|
|
- elif attr+'ID' in [k for (k, v) in self.soClass.sqlmeta.columns.items() if v.foreignKey]:
|
|
+ elif attr+'ID' in [k for (k, v) in list(self.soClass.sqlmeta.columns.items()) if v.foreignKey]:
|
|
attr += 'ID'
|
|
column = self.soClass.sqlmeta.columns[attr]
|
|
return self._getattrFromColumn(column, attr)
|
|
@@ -427,7 +427,7 @@ class SQLObjectTable(Table):
|
|
class SQLObjectTableWithJoins(SQLObjectTable):
|
|
|
|
def __getattr__(self, attr):
|
|
- if attr+'ID' in [k for (k, v) in self.soClass.sqlmeta.columns.items() if v.foreignKey]:
|
|
+ if attr+'ID' in [k for (k, v) in list(self.soClass.sqlmeta.columns.items()) if v.foreignKey]:
|
|
column = self.soClass.sqlmeta.columns[attr+'ID']
|
|
return self._getattrFromForeignKey(column, attr)
|
|
elif attr in [x.joinMethodName for x in self.soClass.sqlmeta.joins]:
|
|
@@ -616,7 +616,7 @@ class Select(SQLExpression):
|
|
# None doesn't filter anything, it's just a no-op:
|
|
return self
|
|
clause = self.ops['clause']
|
|
- if isinstance(clause, basestring):
|
|
+ if isinstance(clause, str):
|
|
clause = SQLConstant('(%s)' % clause)
|
|
return self.newClause(AND(clause, filter_clause))
|
|
|
|
@@ -697,7 +697,7 @@ class Select(SQLExpression):
|
|
if self.ops['limit'] is not NoDefault:
|
|
end = start + self.ops['limit']
|
|
if start or end:
|
|
- from dbconnection import dbConnectionForScheme
|
|
+ from .dbconnection import dbConnectionForScheme
|
|
select = dbConnectionForScheme(db)._queryAddLimitOffset(select, start, end)
|
|
if self.ops['forUpdate']:
|
|
select += " FOR UPDATE"
|
|
@@ -711,7 +711,7 @@ class Insert(SQLExpression):
|
|
self.table = table
|
|
if valueList:
|
|
if values:
|
|
- raise TypeError, "You may only give valueList *or* values"
|
|
+ raise TypeError("You may only give valueList *or* values")
|
|
self.valueList = valueList
|
|
else:
|
|
self.valueList = [values]
|
|
@@ -722,7 +722,7 @@ class Insert(SQLExpression):
|
|
allowNonDict = True
|
|
template = self.template
|
|
if (template is NoDefault) and isinstance(self.valueList[0], dict):
|
|
- template = self.valueList[0].keys()
|
|
+ template = list(self.valueList[0].keys())
|
|
allowNonDict = False
|
|
if template is not NoDefault:
|
|
insert += " (%s)" % ", ".join(template)
|
|
@@ -732,10 +732,10 @@ class Insert(SQLExpression):
|
|
for value in self.valueList:
|
|
if isinstance(value, dict):
|
|
if template is NoDefault:
|
|
- raise TypeError, "You can't mix non-dictionaries with dictionaries in an INSERT if you don't provide a template (%s)" % repr(value)
|
|
+ raise TypeError("You can't mix non-dictionaries with dictionaries in an INSERT if you don't provide a template (%s)" % repr(value))
|
|
value = dictToList(template, value)
|
|
elif not allowNonDict:
|
|
- raise TypeError, "You can't mix non-dictionaries with dictionaries in an INSERT if you don't provide a template (%s)" % repr(value)
|
|
+ raise TypeError("You can't mix non-dictionaries with dictionaries in an INSERT if you don't provide a template (%s)" % repr(value))
|
|
listToJoin_app("(%s)" % ", ".join([sqlrepr(v, db) for v in value]))
|
|
insert = "%s%s" % (insert, ", ".join(listToJoin))
|
|
return insert
|
|
@@ -746,8 +746,8 @@ def dictToList(template, dict):
|
|
list = []
|
|
for key in template:
|
|
list.append(dict[key])
|
|
- if len(dict.keys()) > len(template):
|
|
- raise TypeError, "Extra entries in dictionary that aren't asked for in template (template=%s, dict=%s)" % (repr(template), repr(dict))
|
|
+ if len(list(dict.keys())) > len(template):
|
|
+ raise TypeError("Extra entries in dictionary that aren't asked for in template (template=%s, dict=%s)" % (repr(template), repr(dict)))
|
|
return list
|
|
|
|
class Update(SQLExpression):
|
|
@@ -768,7 +768,7 @@ class Update(SQLExpression):
|
|
update += ","
|
|
update += " %s=%s" % (self.template[i], sqlrepr(self.values[i], db))
|
|
else:
|
|
- for key, value in self.values.items():
|
|
+ for key, value in list(self.values.items()):
|
|
if first:
|
|
first = False
|
|
else:
|
|
@@ -788,7 +788,7 @@ class Delete(SQLExpression):
|
|
def __init__(self, table, where=NoDefault):
|
|
self.table = table
|
|
if where is NoDefault:
|
|
- raise TypeError, "You must give a where clause or pass in None to indicate no where clause"
|
|
+ raise TypeError("You must give a where clause or pass in None to indicate no where clause")
|
|
self.whereClause = where
|
|
def __sqlrepr__(self, db):
|
|
whereClause = self.whereClause
|
|
@@ -846,7 +846,7 @@ def _IN(item, list):
|
|
return SQLOp("IN", item, list)
|
|
|
|
def IN(item, list):
|
|
- from sresults import SelectResults # Import here to avoid circular import
|
|
+ from .sresults import SelectResults # Import here to avoid circular import
|
|
if isinstance(list, SelectResults):
|
|
query = list.queryForSelect()
|
|
query.ops['items'] = [list.sourceClass.q.id]
|
|
@@ -880,7 +880,7 @@ def ISNOTNULL(expr):
|
|
class ColumnAS(SQLOp):
|
|
''' Just like SQLOp('AS', expr, name) except without the parentheses '''
|
|
def __init__(self, expr, name):
|
|
- if isinstance(name, basestring):
|
|
+ if isinstance(name, str):
|
|
name = SQLConstant(name)
|
|
SQLOp.__init__(self, 'AS', expr, name)
|
|
def __sqlrepr__(self, db):
|
|
@@ -919,11 +919,11 @@ class _LikeQuoted:
|
|
return "CONCAT(%s)" % ", ".join(values)
|
|
else:
|
|
return " || ".join(values)
|
|
- elif isinstance(s, basestring):
|
|
+ elif isinstance(s, str):
|
|
s = _quote_like_special(unquote_str(sqlrepr(s, db)), db)
|
|
return quote_str("%s%s%s" % (self.prefix, s, self.postfix), db)
|
|
else:
|
|
- raise TypeError, "expected str, unicode or SQLExpression, got %s" % type(s)
|
|
+ raise TypeError("expected str, unicode or SQLExpression, got %s" % type(s))
|
|
|
|
def _quote_like_special(s, db):
|
|
if db in ('postgres', 'rdbhost'):
|
|
@@ -1021,9 +1021,9 @@ class SQLJoinConditional(SQLJoin):
|
|
(Table1.q.col1, Table2.q.col2)
|
|
"""
|
|
if not on_condition and not using_columns:
|
|
- raise TypeError, "You must give ON condition or USING columns"
|
|
+ raise TypeError("You must give ON condition or USING columns")
|
|
if on_condition and using_columns:
|
|
- raise TypeError, "You must give ON condition or USING columns but not both"
|
|
+ raise TypeError("You must give ON condition or USING columns but not both")
|
|
SQLJoin.__init__(self, table1, table2, op)
|
|
self.on_condition = on_condition
|
|
self.using_columns = using_columns
|
|
@@ -1254,7 +1254,7 @@ class ImportProxy(SQLExpression):
|
|
self.soClass = None
|
|
classregistry.registry(registry).addClassCallback(clsName, lambda foreign, me: setattr(me, 'soClass', foreign), self)
|
|
|
|
- def __nonzero__(self):
|
|
+ def __bool__(self):
|
|
return True
|
|
|
|
def __getattr__(self, attr):
|
|
--- sqlobject/sqlite/sqliteconnection.py.orig 2014-04-12 20:42:31 UTC
|
|
+++ sqlobject/sqlite/sqliteconnection.py
|
|
@@ -1,7 +1,7 @@
|
|
import base64
|
|
import os
|
|
-import thread
|
|
-import urllib
|
|
+import _thread
|
|
+import urllib.request, urllib.parse, urllib.error
|
|
from sqlobject.dbconnection import DBAPI, Boolean
|
|
from sqlobject import col, sqlbuilder
|
|
from sqlobject.dberrors import *
|
|
@@ -121,7 +121,7 @@ class SQLiteConnection(DBAPI):
|
|
path = "//" + path
|
|
else:
|
|
path = "///" + path
|
|
- path = urllib.quote(path)
|
|
+ path = urllib.parse.quote(path)
|
|
return 'sqlite:%s' % path
|
|
|
|
def getConnection(self):
|
|
@@ -133,7 +133,7 @@ class SQLiteConnection(DBAPI):
|
|
self._connectionNumbers[id(conn)] = self._connectionCount
|
|
self._connectionCount += 1
|
|
return conn
|
|
- threadid = thread.get_ident()
|
|
+ threadid = _thread.get_ident()
|
|
if (self._pool is not None
|
|
and threadid in self._threadPool):
|
|
conn = self._threadPool[threadid]
|
|
@@ -206,30 +206,30 @@ class SQLiteConnection(DBAPI):
|
|
self.printDebug(conn, query, 'QueryR')
|
|
try:
|
|
return cursor.execute(query)
|
|
- except self.module.OperationalError, e:
|
|
+ except self.module.OperationalError as e:
|
|
raise OperationalError(ErrorMessage(e))
|
|
- except self.module.IntegrityError, e:
|
|
+ except self.module.IntegrityError as e:
|
|
msg = ErrorMessage(e)
|
|
if msg.startswith('column') and msg.endswith('not unique') \
|
|
or msg.startswith('UNIQUE constraint failed:'):
|
|
raise DuplicateEntryError(msg)
|
|
else:
|
|
raise IntegrityError(msg)
|
|
- except self.module.InternalError, e:
|
|
+ except self.module.InternalError as e:
|
|
raise InternalError(ErrorMessage(e))
|
|
- except self.module.ProgrammingError, e:
|
|
+ except self.module.ProgrammingError as e:
|
|
raise ProgrammingError(ErrorMessage(e))
|
|
- except self.module.DataError, e:
|
|
+ except self.module.DataError as e:
|
|
raise DataError(ErrorMessage(e))
|
|
- except self.module.NotSupportedError, e:
|
|
+ except self.module.NotSupportedError as e:
|
|
raise NotSupportedError(ErrorMessage(e))
|
|
- except self.module.DatabaseError, e:
|
|
+ except self.module.DatabaseError as e:
|
|
raise DatabaseError(ErrorMessage(e))
|
|
- except self.module.InterfaceError, e:
|
|
+ except self.module.InterfaceError as e:
|
|
raise InterfaceError(ErrorMessage(e))
|
|
- except self.module.Warning, e:
|
|
+ except self.module.Warning as e:
|
|
raise Warning(ErrorMessage(e))
|
|
- except self.module.Error, e:
|
|
+ except self.module.Error as e:
|
|
raise Error(ErrorMessage(e))
|
|
|
|
def _queryInsertID(self, conn, soInstance, id, names, values):
|
|
--- sqlobject/util/moduleloader.py.orig 2011-05-15 15:48:27 UTC
|
|
+++ sqlobject/util/moduleloader.py
|
|
@@ -15,7 +15,7 @@ def load_module_from_name(filename, module_name):
|
|
if not os.path.exists(init_filename):
|
|
try:
|
|
f = open(init_filename, 'w')
|
|
- except (OSError, IOError), e:
|
|
+ except (OSError, IOError) as e:
|
|
raise IOError(
|
|
'Cannot write __init__.py file into directory %s (%s)\n'
|
|
% (os.path.dirname(filename), e))
|