# list
value = len(value)
elif hasattr(value, 'count'):
- # query
+ # query (but not during validation)
+ if self.in_validation:
+ continue
value = value.count()
else:
raise KeyError('Do not understand property %s.' % property)
validation_message = \
"Validation failed because property '%s' must not be empty in object\n%s"
+ in_validation = False
+
def validate(self):
'''
This function validates the not NULL constraints as returned by
getattr(self, property + '_id') is not None:
continue
if not hasattr(self, property) or getattr(self, property) is None:
- raise DBUpdateError(self.validation_message % \
- (property, str(self)))
+ # str() might lead to races due to a 2nd flush
+ self.in_validation = True
+ message = self.validation_message % (property, str(self))
+ self.in_validation = False
+ raise DBUpdateError(message)
@classmethod
@session_wrapper
from db_test import DBDakTestCase
from daklib.dbconn import Architecture, Suite
+from daklib.dak_exceptions import DBUpdateError
try:
# python >= 2.6
architecture.suites = [sid, squeeze]
self.assertTrue(re.search('"suites_count": 2', str(architecture)))
+ def test_validation(self):
+ suite = Suite()
+ self.session.add(suite)
+ self.assertRaises(DBUpdateError, self.session.flush)
+
if __name__ == '__main__':
unittest.main()