drop support for Python 2.x
[~helmut/debian-dedup.git] / dedup / utils.py
1 import errno
2 import urllib.error
3 import urllib.request
4
5 from debian.debian_support import version_compare
6
7 from dedup.compression import decompress
8
9 def fetchiter(cursor):
10     rows = cursor.fetchmany()
11     while rows:
12         yield from rows
13         rows = cursor.fetchmany()
14
15 def sql_add_version_compare(db):
16     db.create_collation("debian_version", version_compare)
17     db.create_function("debian_version_compare", 2, version_compare)
18
19 def open_compressed_mirror_url(url, extensions=(".xz", ".gz", "")):
20     """Fetch the given url. Try appending each of the given compression
21     schemes and move on in case it doesn't exist. Decompress the resulting
22     stream on the fly.
23     @returns: a file-like with the decompressed contents
24     """
25     for ext in extensions:
26         try:
27             handle = urllib.request.urlopen(url + ext)
28         except urllib.error.HTTPError as error:
29             if error.code != 404:
30                 raise
31         except urllib.error.URLError as error:
32             if not hasattr(error.reason, "errno"):
33                 raise
34             if error.reason.errno != errno.ENOENT:
35                 raise
36         else:
37             return decompress(handle, ext)
38     raise OSError(errno.ENOENT, "No such file or directory")