def find_or_create(cls, session: 'Session', _url: str, title: str = ""): domain = DomainName.find_or_create(session, _url) path = Url.get_path(_url) try: return cls.query.filter(cls.path == path).filter( cls.domain == domain).one() except sqlalchemy.orm.exc.NoResultFound or sqlalchemy.exc.InterfaceError: try: new = cls(_url, title, domain) session.add(new) session.commit() return new except sqlalchemy.exc.IntegrityError or sqlalchemy.exc.DatabaseError: for i in range(10): try: print("doing a rollback") session.rollback() domain = DomainName.find_or_create(session, _url) path = Url.get_path(_url) print( f"after rollback trying to find again: {domain.domain_name} + {path}" ) u = cls.query.filter(cls.path == path).filter( cls.domain == domain).first() print("Found url after recovering from race") return u except Exception as e: print("Exception of second degree in url..." + str(i) + str(e)) time.sleep(random.randrange(1, 10) * 0.1) continue break
def find(cls, url, title=""): try: d = DomainName.find(Url.get_domain(url)) return (cls.query.filter(cls.path == Url.get_path(url)).filter( cls.domain == d).one()) except sqlalchemy.orm.exc.NoResultFound: return cls(url, title)
def find_or_create(cls, session: 'Session', _url: str, title: str = ""): domain = DomainName.find_or_create(session, _url) path = Url.get_path(_url) try: return cls.query.filter(cls.path == path).filter( cls.domain == domain).one() # except sqlalchemy.orm.exc.NoResultFound or sqlalchemy.exc.InterfaceError: except: try: new = cls(_url, title, domain) session.add(new) session.commit() return new # except sqlalchemy.exc.IntegrityError or sqlalchemy.exc.DatabaseError: except: for i in range(10): try: session.rollback() u = cls.find(cls.path == path).filter( cls.domain == domain).first() print("found url after recovering from race") return u except: print("exception of second degree in url..." + str(i)) time.sleep(0.3) continue break
def __init__(self, url: str, title: str = "", domain: DomainName = None): self.path = Url.get_path(url) self.title = title if domain: self.domain = domain else: self.domain = DomainName.for_url_string(url)
def find(cls, url, title = ""): try: d = DomainName.find(Url.get_domain(url)) return (cls.query.filter(cls.path == Url.get_path(url)) .filter(cls.domain == d) .one()) except sqlalchemy.orm.exc.NoResultFound: return cls(url, title)
def set_default_exercise_based_prob(): zeeguu.app.test_request_context().push() zeeguu.db.session.commit() urls = Url.query.all() for url in urls: url.path = Url.get_path(url.url) d = DomainName.find(Url.get_domain(url.url)) url.domain = d zeeguu.db.session.add(url) zeeguu.db.session.add(d) zeeguu.db.session.commit()
def test_one_domain_multiple_urls(self): """ Tests that if multiple URLs are added to the database that their DomainName is not added to the database more than once """ # Create an 'original' URL, which is saved to the Database url_random_obj_origin = UrlRule().url # Create a random number of URLs, each with the same DomainName random_num = random.randint(0, 10) for _ in range(0, random_num): url_random_extended = url_random_obj_origin.as_string() + self.faker.word() _ = Url(url_random_extended, self.faker.word()) domain_for_query = url_random_obj_origin.domain_name() try: assert DomainName.find(domain_for_query) except NoResultFound: assert False, "No domains found in database" except MultipleResultsFound: assert False, "There were multiple DomainNames in the database"
def find(cls, url, title=""): d = DomainName.find(Url.get_domain(url)) return (cls.query.filter(cls.path == Url.get_path(url)).filter( cls.domain == d).one())
def __init__(self, url, title): self.path = Url.get_path(url) self.domain = DomainName.find(Url.get_domain(url)) self.title = title
def make_new(self, session, url: str, title: str): self.path = Url.get_path(url) self.domain = DomainName.for_url_string(url) self.title = title self.path = Url.get_path(url) self.domain = DomainName.find_or_create(Url.get_domain(url))