Author: phd
Date: 2008-05-21 08:52:25 -0600 (Wed, 21 May 2008)
New Revision: 3454
Modified:
SQLObject/branches/0.9/docs/News.txt
SQLObject/branches/0.9/sqlobject/col.py
SQLObject/branches/0.9/sqlobject/mssql/mssqlconnection.py
Log:
Use VARCHAR(MAX) and VARBINARY(MAX) for MSSQL >= 9.0.
Modified: SQLObject/branches/0.9/docs/News.txt
===================================================================
--- SQLObject/branches/0.9/docs/News.txt 2008-05-20 21:20:24 UTC (rev 3453)
+++ SQLObject/branches/0.9/docs/News.txt 2008-05-21 14:52:25 UTC (rev 3454)
@@ -10,6 +10,8 @@
SQLObject 0.9.7
===============
+* Use VARCHAR(MAX) and VARBINARY(MAX) for MSSQL >= 9.0.
+
* Fixed a minor bug in Set column.
* A bug fixed for RowCreatedSignal together with InheritableSQLObject:
Modified: SQLObject/branches/0.9/sqlobject/col.py
===================================================================
--- SQLObject/branches/0.9/sqlobject/col.py 2008-05-20 21:20:24 UTC (rev 3453)
+++ SQLObject/branches/0.9/sqlobject/col.py 2008-05-21 14:52:25 UTC (rev 3454)
@@ -345,7 +345,8 @@
def sybaseCreateSQL(self):
return ' '.join([self.dbName, self._sybaseType()] + self._extraSQL())
- def mssqlCreateSQL(self):
+ def mssqlCreateSQL(self, connection=None):
+ self.connection = connection
return ' '.join([self.dbName, self._mssqlType()] + self._extraSQL())
def firebirdCreateSQL(self):
@@ -490,7 +491,10 @@
if self.customSQLType is not None:
return self.customSQLType
if not self.length:
- type = 'varchar(4000)'
+ if self.connection and self.connection.can_use_max_types:
+ type = 'VARCHAR(MAX)'
+ else:
+ type = 'varchar(4000)'
elif self.varchar:
type = 'VARCHAR(%i)' % self.length
else:
@@ -883,8 +887,8 @@
# @@: Code from above should be moved here
return None
- def mssqlCreateSQL(self):
- sql = SOKeyCol.mssqlCreateSQL(self)
+ def mssqlCreateSQL(self, connection=None):
+ sql = SOKeyCol.mssqlCreateSQL(self, connection)
other = findClass(self.foreignKey, self.soClass.sqlmeta.registry)
tName = other.sqlmeta.table
idName = other.sqlmeta.idName
@@ -1423,7 +1427,10 @@
return 'BYTEA'
def _mssqlType(self):
- return "IMAGE"
+ if self.connection and self.connection.can_use_max_types:
+ return 'VARBINARY(MAX)'
+ else:
+ return "IMAGE"
class BLOBCol(StringCol):
baseClass = SOBLOBCol
Modified: SQLObject/branches/0.9/sqlobject/mssql/mssqlconnection.py
===================================================================
--- SQLObject/branches/0.9/sqlobject/mssql/mssqlconnection.py 2008-05-20 21:20:24 UTC (rev 3453)
+++ SQLObject/branches/0.9/sqlobject/mssql/mssqlconnection.py 2008-05-21 14:52:25 UTC (rev 3454)
@@ -157,7 +157,7 @@
return col.mssqlCreateReferenceConstraint()
def createColumn(self, soClass, col):
- return col.mssqlCreateSQL()
+ return col.mssqlCreateSQL(self)
def createIDColumn(self, soClass):
key_type = {int: "INT", str: "TEXT"}[soClass.sqlmeta.idType]
@@ -179,7 +179,7 @@
def addColumn(self, tableName, column):
self.query('ALTER TABLE %s ADD %s' %
(tableName,
- column.mssqlCreateSQL()))
+ column.mssqlCreateSQL(self)))
def delColumn(self, sqlmeta, column):
self.query('ALTER TABLE %s DROP COLUMN %s' % (tableName.table, column.dbName))
@@ -275,3 +275,21 @@
'precision': scale}
else:
return col.Col, {}
+
+ @property
+ def server_version(self):
+ try:
+ server_version = self.queryAll("SELECT SERVERPROPERTY('productversion')")[0][0]
+ server_version = server_version.split('.')[0]
+ server_version = int(server_version)
+ except:
+ server_version = None # unknown
+ self.server_version = server_version # cache it forever
+ return server_version
+
+ @property
+ def can_use_max_types(self):
+ server_version = self.server_version
+ self.can_use_max_types = can_use_max_types = \
+ (server_version is not None) and (server_version >= 9)
+ return can_use_max_types
|