summaryrefslogtreecommitdiff
path: root/webapp.py
diff options
context:
space:
mode:
Diffstat (limited to 'webapp.py')
-rwxr-xr-xwebapp.py45
1 files changed, 33 insertions, 12 deletions
diff --git a/webapp.py b/webapp.py
index 06aa5d6..a215dd5 100755
--- a/webapp.py
+++ b/webapp.py
@@ -1,5 +1,6 @@
#!/usr/bin/python
+import datetime
import sqlite3
from wsgiref.simple_server import make_server
@@ -10,6 +11,7 @@ from werkzeug.wrappers import Request, Response
hash_functions = [
("sha512", "sha512"),
+ ("image_sha512", "image_sha512"),
("gzip_sha512", "gzip_sha512"),
("sha512", "gzip_sha512"),
("gzip_sha512", "sha512")]
@@ -104,6 +106,29 @@ index_template = jinjaenv.from_string(
</ul>
{% endblock %}""")
+def fetchiter(cursor):
+ rows = cursor.fetchmany()
+ while rows:
+ for row in rows:
+ yield row
+ rows = cursor.fetchmany()
+
+def encode_and_buffer(iterator):
+ buff = b""
+ for elem in iterator:
+ buff += elem.encode("utf8")
+ if len(buff) >= 2048:
+ yield buff
+ buff = b""
+ if buff:
+ yield buff
+
+def html_response(unicode_iterator, max_age=24 * 60 * 60):
+ resp = Response(encode_and_buffer(unicode_iterator), mimetype="text/html")
+ resp.cache_control.max_age = max_age
+ resp.expires = datetime.datetime.now() + datetime.timedelta(seconds=max_age)
+ return resp
+
class Application(object):
def __init__(self):
self.db = sqlite3.connect("test.sqlite3")
@@ -129,8 +154,7 @@ class Application(object):
elif endpoint == "index":
if not request.environ["PATH_INFO"]:
raise RequestRedirect(request.environ["SCRIPT_NAME"] + "/")
- return Response(index_template.render().encode("utf8"),
- content_type="text/html")
+ return html_response(index_template.stream())
raise NotFound()
except HTTPException as e:
return e
@@ -154,7 +178,7 @@ class Application(object):
def get_dependencies(self, package):
self.cur.execute("SELECT required FROM dependency WHERE package = ?;",
(package,))
- return set(row[0] for row in self.cur.fetchall())
+ return set(row[0] for row in fetchiter(self.cur))
def show_package(self, package):
params = self.get_details(package)
@@ -165,7 +189,7 @@ class Application(object):
self.cur.execute("SELECT a.filename, a.hash, a.size, b.package FROM content AS a JOIN content AS b ON a.hash = b.hash WHERE a.package = ? AND a.function = ? AND b.function = ? AND (a.filename != b.filename OR b.package != ?);",
(package, func1, func2, package))
sharing = dict()
- for afile, hashval, size, bpkg in self.cur.fetchall():
+ for afile, hashval, size, bpkg in fetchiter(self.cur):
hashdict = sharing.setdefault(bpkg, dict())
fileset = hashdict.setdefault(hashval, (size, set()))[1]
fileset.add(afile)
@@ -186,8 +210,7 @@ class Application(object):
curstats.append(dict(package=pkg, duplicate=duplicate, savable=savable))
params["shared"] = sharedstats
- return Response(package_template.render(**params).encode("utf8"),
- content_type="text/html")
+ return html_response(package_template.render(params))
def show_detail(self, package1, package2):
if package1 == package2:
@@ -203,7 +226,7 @@ class Application(object):
(package1, package2))
shared = dict()
- for filename1, size1, func1, filename2, size2, func2, hashvalue in self.cur.fetchall():
+ for filename1, size1, func1, filename2, size2, func2, hashvalue in fetchiter(self.cur):
funccomb = (func1, func2)
if funccomb not in hash_functions:
continue
@@ -218,21 +241,19 @@ class Application(object):
details1=details1,
details2=details2,
shared=shared)
- return Response(detail_template.render(**params).encode("utf8"),
- content_type="text/html")
+ return html_response(detail_template.render(params))
def show_hash(self, function, hashvalue):
self.cur.execute("SELECT package, filename, size, function FROM content WHERE hash = ?;",
(hashvalue,))
entries = [dict(package=package, filename=filename, size=size,
function=otherfunc)
- for package, filename, size, otherfunc in self.cur.fetchall()
+ for package, filename, size, otherfunc in fetchiter(self.cur)
if (function, otherfunc) in hash_functions]
if not entries:
raise NotFound()
params = dict(function=function, hashvalue=hashvalue, entries=entries)
- return Response(hash_template.render(**params).encode("utf8"),
- content_type="text/html")
+ return html_response(hash_template.render(params))
def main():
app = Application()