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