Author: phd
Date: 2006-11-10 08:37:06 -0700 (Fri, 10 Nov 2006)
New Revision: 2075
Modified:
home/phd/SQLObject/paramstyles/sqlobject/col.py
home/phd/SQLObject/paramstyles/sqlobject/main.py
home/phd/SQLObject/paramstyles/sqlobject/sqlbuilder.py
home/phd/SQLObject/paramstyles/sqlobject/tests/test_delete.py
home/phd/SQLObject/paramstyles/sqlobject/tests/test_subqueries.py
Log:
Merged patches from the revisions 2065:2074 from the trunk
Modified: home/phd/SQLObject/paramstyles/sqlobject/col.py
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/col.py 2006-11-10 15:34:47 UTC (rev 2074)
+++ home/phd/SQLObject/paramstyles/sqlobject/col.py 2006-11-10 15:37:06 UTC (rev 2075)
@@ -59,10 +59,11 @@
MXDATETIME_IMPLEMENTATION = "mxDateTime"
if mxdatetime_available:
- DateTimeType = type(DateTime.now())
if hasattr(DateTime, "Time"):
+ DateTimeType = type(DateTime.now())
TimeType = type(DateTime.Time())
else: # Zope
+ DateTimeType = type(DateTime.DateTime())
TimeType = type(DateTime.DateTime.Time(DateTime.DateTime()))
if datetime_available:
Modified: home/phd/SQLObject/paramstyles/sqlobject/main.py
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/main.py 2006-11-10 15:34:47 UTC (rev 2074)
+++ home/phd/SQLObject/paramstyles/sqlobject/main.py 2006-11-10 15:37:06 UTC (rev 2075)
@@ -132,6 +132,11 @@
for klass in classregistry.registry(registry).allClasses():
if findDependantColumns(name, klass):
depends.append(klass)
+ else:
+ for join in klass.sqlmeta.joins:
+ if isinstance(join, joins.SORelatedJoin) and join.otherClassName == name:
+ depends.append(klass)
+ break
return depends
def findDependantColumns(name, klass):
@@ -1498,11 +1503,30 @@
def destroySelf(self):
self.sqlmeta.send(events.RowDestroySignal, self)
# Kills this object. Kills it dead!
+
+ klass = self.__class__
+
+ # Free related joins on the base class
+ for join in klass.sqlmeta.joins:
+ if isinstance(join, joins.SORelatedJoin):
+ q = "DELETE FROM %s WHERE %s=%d" % (join.intermediateTable, join.joinColumn, self.id)
+ self._connection.query(q)
+
depends = []
- klass = self.__class__
depends = self._SO_depends()
for k in depends:
+ # Free related joins
+ for join in k.sqlmeta.joins:
+ if isinstance(join, joins.SORelatedJoin) and join.otherClassName == klass.__name__:
+ q = "DELETE FROM %s WHERE %s=%d" % (join.intermediateTable, join.otherColumn, self.id)
+ self._connection.query(q)
+
cols = findDependantColumns(klass.__name__, k)
+
+ # Don't confuse the rest of the process
+ if len(cols) == 0:
+ continue
+
query = []
delete = setnull = restrict = False
for col in cols:
Modified: home/phd/SQLObject/paramstyles/sqlobject/sqlbuilder.py
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/sqlbuilder.py 2006-11-10 15:34:47 UTC (rev 2074)
+++ home/phd/SQLObject/paramstyles/sqlobject/sqlbuilder.py 2006-11-10 15:37:06 UTC (rev 2075)
@@ -493,7 +493,7 @@
class Select(SQLExpression):
def __init__(self, items, where=NoDefault, groupBy=NoDefault,
- having=NoDefault, orderBy=NoDefault, limit=NoDefault):
+ having=NoDefault, orderBy=NoDefault, limit=NoDefault, join=NoDefault):
if type(items) is not type([]) and type(items) is not type(()):
items = [items]
self.items = items
@@ -502,10 +502,17 @@
self.having = having
self.orderBy = orderBy
self.limit = limit
+ self.join = join
def __sqlrepr__(self, db):
select = "SELECT %s" % ", ".join([sqlrepr(v, db) for v in self.items])
+ join = []
+ if self.join is not NoDefault:
+ if isinstance(self.join, SQLJoin):
+ join.append(self.join)
+ else:
+ join.extend(self.join)
tables = {}
things = list(self.items)
if self.whereClause is not NoDefault:
@@ -513,9 +520,20 @@
for thing in things:
if isinstance(thing, SQLExpression):
tables.update(tablesUsedDict(thing))
+ for j in join:
+ if j.table1 in tables: del tables[j.table1]
+ if j.table2 in tables: del tables[j.table2]
tables = tables.keys()
if tables:
select += " FROM %s" % ", ".join(tables)
+ elif join:
+ select += " FROM "
+ for j in join:
+ if tables and j.table1:
+ sep = ", "
+ else:
+ sep = " "
+ select += sep + sqlrepr(j, db)
if self.whereClause is not NoDefault:
select += " WHERE %s" % sqlrepr(self.whereClause, db)
Modified: home/phd/SQLObject/paramstyles/sqlobject/tests/test_delete.py
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/tests/test_delete.py 2006-11-10 15:34:47 UTC (rev 2074)
+++ home/phd/SQLObject/paramstyles/sqlobject/tests/test_delete.py 2006-11-10 15:37:06 UTC (rev 2075)
@@ -26,3 +26,22 @@
value = NoCache(name='test')
value.destroySelf()
NoCache._connection.cache = old
+
+########################################
+## Delete from related joins
+########################################
+
+class Service(SQLObject):
+ groups = RelatedJoin("ServiceGroup")
+
+class ServiceGroup(SQLObject):
+ services = RelatedJoin("Service")
+
+def testDeleteRelatedJoins():
+ setupClass([Service, ServiceGroup])
+ service = Service()
+ service_group = ServiceGroup()
+ service.addServiceGroup(service_group)
+ service.destroySelf()
+ service_group = ServiceGroup.get(1)
+ assert len(service_group.services) == 0
Modified: home/phd/SQLObject/paramstyles/sqlobject/tests/test_subqueries.py
===================================================================
--- home/phd/SQLObject/paramstyles/sqlobject/tests/test_subqueries.py 2006-11-10 15:34:47 UTC (rev 2074)
+++ home/phd/SQLObject/paramstyles/sqlobject/tests/test_subqueries.py 2006-11-10 15:37:06 UTC (rev 2075)
@@ -62,3 +62,16 @@
insert()
select = TestIn1.select(TestIn1.q.col1 == Select(TestIn2.q.col2, where=(TestIn2.q.col2 == "test")))
assert select.count() == 1
+
+def test_6syntax_join():
+ insert()
+ j = LEFTOUTERJOINOn(TestIn2, TestIn1, TestIn1.q.col1==TestIn2.q.col2)
+ select = TestIn1.select(TestIn1.q.col1 == Select(TestIn2.q.col2, where=(TestIn2.q.col2 == "test"), join=j))
+ assert str(select) == \
+ "SELECT test_in1.id, test_in1.col1 FROM test_in1 WHERE ((test_in1.col1) = (SELECT test_in2.col2 FROM test_in2 LEFT OUTER JOIN test_in1 ON ((test_in1.col1) = (test_in2.col2)) WHERE ((test_in2.col2) = ('test'))))"
+
+def test_6perform_join():
+ insert()
+ j = LEFTOUTERJOINOn(TestIn2, TestIn1, TestIn1.q.col1==TestIn2.q.col2)
+ select = TestIn1.select(TestIn1.q.col1 == Select(TestIn2.q.col2, where=(TestIn2.q.col2 == "test"), join=j))
+ assert select.count() == 1
|