def commit_file(self, fobj, digest, desc=""): """See FileCacherBackend.commit_file(). """ fobj.close() try: with SessionGen() as session: fso = FSObject(description=desc) fso.digest = digest fso.loid = fobj.loid session.add(fso) session.commit() logger.info("File %s (%s) stored on the database.", digest, desc) except IntegrityError: # If someone beat us to adding the same object to the database, we # should at least drop the large object. LargeObject.unlink(fobj.loid) logger.warning("File %s (%s) caused an IntegrityError, ignoring.", digest, desc) return False return True
def put_file(self, digest, desc=""): """See FileCacherBackend.put_file(). """ try: with SessionGen() as session: fso = FSObject.get_from_digest(digest, session) # Check digest uniqueness if fso is not None: logger.debug( "File %s already stored on database, not " "sending it again.", digest) session.rollback() return None # If it is not already present, copy the file into the # lobject else: fso = FSObject(description=desc) fso.digest = digest session.add(fso) logger.debug("File %s stored on the database.", digest) # FIXME There is a remote possibility that someone # will try to access this file, believing it has # already been stored (since its FSObject exists), # while we're still sending its content. lobject = fso.get_lobject(mode='wb') session.commit() return lobject except IntegrityError: logger.warning("File %s caused an IntegrityError, ignoring...", digest)