import traceback import json import tornado.gen import tornado.web from helpers import validatorHelper from web import asyncTornado from constants import argumentTypes from objects import glob class handler(asyncTornado.asyncRequestHandler): ARGS = { ("file_hash", "file_version", "timestamp"): argumentTypes.one_required } ARGS_VALIDATION = { validatorHelper.HEX: ["file_hash"], validatorHelper.INT: ["file_version", "timestamp"] } SQL_STRUCT = { "main": "SELECT * FROM updates WHERE %s LIMIT 1", "file_hash": "%s = '%s'", "file_version": "%s = %s", "timestamp": "timestamp <= '%s' ORDER BY timestamp DESC" } @tornado.web.asynchronous @tornado.gen.engine def asyncGet(self): status_code = 400 data = {} try: args_filter = asyncTornado.check_arguments(self) if not args_filter: raise Exception("Missing required arguments") method = args_filter[0] method_value = self.get_argument(method) conn = glob.new_sql() cur = conn.cursor() sql = self.SQL_STRUCT["main"] % self.SQL_STRUCT[method] if method == "timestamp": sql = sql % method_value else: sql = sql % (method, method_value) cur.execute(sql) data = cur.fetchone() cur.close() conn.close() status_code = 200 except Exception as e: status_code = 400 data["status"] = status_code data["message"] = str(e) print("Err: %s" % e) traceback.print_exc() finally: self.write( json.dumps(data) ) self.set_header("Content-Type", "application/json") self.set_status(status_code)