From 3c3e94bf5026d27d9307a825bae77dba968a1d9f Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Mon, 25 Feb 2013 09:55:35 +0100 Subject: webapp: complete cross hash support --- webapp.py | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/webapp.py b/webapp.py index 10e526f..06aa5d6 100755 --- a/webapp.py +++ b/webapp.py @@ -66,10 +66,13 @@ detail_template = jinjaenv.from_string( {% block content %}

{{ details1.package|e }} <-> {{ details2.package|e }}

{%- if shared -%} - - {%- for entry in shared|sort(attribute="size", reverse=true) -%} - +
sizefilename in {{ details1.package|e }}filename in {{ details2.package|e }}hash functions
{{ entry.size|format_size }}{{ entry.filename1 }}{{ entry.filename2 }} - {%- for function, hashvalue in entry.functions.items() %}{{ function|e }} {% endfor %}
+ + {%- for entry in shared|sort(attribute="size1", reverse=true) -%} + + {%- endfor -%}
{{ details1.package|e }}{{ details2.package|e }}
sizefilenamehash functionssizefilenamehash functions
{{ entry.size1|format_size }}{{ entry.filename1 }} + {%- for funccomb, hashvalue in entry.functions.items() %}{{ funccomb[0]|e }} {% endfor %}{{ entry.size2|format_size }}{{ entry.filename2 }} + {%- for funccomb, hashvalue in entry.functions.items() %}{{ funccomb[1]|e }} {% endfor %}
{%- endif -%} @@ -80,10 +83,11 @@ hash_template = jinjaenv.from_string( {% block title %}information on {{ function|e }} hash {{ hashvalue|e }}{% endblock %} {% block content %}

{{ function|e }} {{ hashvalue|e }}

- +
packagefilenamesize
{%- for entry in entries -%} - + + {%- endfor -%}
packagefilenamesizedifferent function
{{ entry.package|e }}{{ entry.filename|e }}{{ entry.size|format_size }}
{{ entry.filename|e }}{{ entry.size|format_size }}{% if function != entry.function %}{{ entry.function|e }}{% endif %}
{% endblock %}""") @@ -189,21 +193,27 @@ class Application(object): if package1 == package2: details1 = details2 = self.get_details(package1) - self.cur.execute("SELECT a.filename, b.filename, a.size, a.function, a.hash FROM content AS a JOIN content AS b ON a.function = b.function AND a.hash = b.hash WHERE a.package = ? AND b.package = ? AND a.filename != b.filename;", + self.cur.execute("SELECT a.filename, a.size, a.function, b.filename, b.size, b.function, a.hash FROM content AS a JOIN content AS b ON a.hash = b.hash WHERE a.package = ? AND b.package = ? AND a.filename != b.filename;", (package1, package1)) else: details1 = self.get_details(package1) details2 = self.get_details(package2) - self.cur.execute("SELECT a.filename, b.filename, a.size, a.function, a.hash FROM content AS a JOIN content AS b ON a.function = b.function AND a.hash = b.hash WHERE a.package = ? AND b.package = ?;", + self.cur.execute("SELECT a.filename, a.size, a.function, b.filename, b.size, b.function, a.hash FROM content AS a JOIN content AS b ON a.hash = b.hash WHERE a.package = ? AND b.package = ?;", (package1, package2)) shared = dict() - for filename1, filename2, size, function, hashvalue in self.cur.fetchall(): - shared.setdefault((filename1, filename2, size), dict())[function] = hashvalue - shared = [dict(filename1=filename1, filename2=filename2, size=size, - functions=functions) - for (filename1, filename2, size), functions in shared.items()] + for filename1, size1, func1, filename2, size2, func2, hashvalue in self.cur.fetchall(): + funccomb = (func1, func2) + if funccomb not in hash_functions: + continue + funcdict = shared.setdefault((filename1, filename2), + (size1, size2, dict()))[2] + funcdict[(func1, func2)] = hashvalue + shared = [dict(filename1=filename1, filename2=filename2, size1=size1, + size2=size2, functions=functions) + for (filename1, filename2), (size1, size2, functions) + in shared.items()] params = dict( details1=details1, details2=details2, @@ -212,10 +222,12 @@ class Application(object): content_type="text/html") def show_hash(self, function, hashvalue): - self.cur.execute("SELECT package, filename, size FROM content WHERE function = ? AND hash = ?;", - (function, hashvalue)) - entries = [dict(package=package, filename=filename, size=size) - for package, filename, size in self.cur.fetchall()] + 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() + if (function, otherfunc) in hash_functions] if not entries: raise NotFound() params = dict(function=function, hashvalue=hashvalue, entries=entries) -- cgit v1.2.3