X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fdbconn.py;h=6317b5844467a260865d5c7c67996eda537d7822;hb=347c09103eb5aae32976f03e9a9a0e8d8b4afb86;hp=2f18343e974bd459fce862cddf9c89acdd0b2ea2;hpb=16b8364d02185d9ae5ac8a85a245ab7274d44c89;p=dak.git diff --git a/daklib/dbconn.py b/daklib/dbconn.py index 2f18343e..6317b584 100755 --- a/daklib/dbconn.py +++ b/daklib/dbconn.py @@ -204,7 +204,9 @@ class ORMObject(object): # 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) @@ -258,6 +260,8 @@ class ORMObject(object): 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 @@ -272,8 +276,11 @@ class ORMObject(object): 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 @@ -346,11 +353,11 @@ class Validator(MapperExtension): ''' def before_update(self, mapper, connection, instance): - #instance.validate() + instance.validate() return EXT_CONTINUE def before_insert(self, mapper, connection, instance): - #instance.validate() + instance.validate() return EXT_CONTINUE validator = Validator() @@ -2692,7 +2699,7 @@ class Suite(ORMObject): 'overrides_count'] def not_null_constraints(self): - return ['suite_name', 'version'] + return ['suite_name'] def __eq__(self, val): if isinstance(val, str):