def api_run_query(): if g.user is None: return "Authentication required", 401 text = request.form['text'] query = Query.get_by_id(request.form['query_id']) last_query_rev = query.latest_rev if last_query_rev: last_query_run = QueryRun.get_latest_run(last_query_rev.id) if last_query_run: result = worker.run_query.AsyncResult(last_query_run.task_id) if not result.ready(): result.revoke(terminate=True) last_query_run.status = QueryRun.STATUS_SUPERSEDED last_query_run.save() query_rev = QueryRevision(query_id=query.id, text=text) query_rev.save_new() query.latest_rev = query_rev query.save() query_run = QueryRun() query_run.query_rev = query_rev query_run.status = QueryRun.STATUS_QUEUED query_run.save_new() query_run.task_id = worker.run_query.delay(query_run.id).task_id query_run.save() return json.dumps({ 'output_url': url_for('api_query_output', user_id=g.user.id, run_id=query_run.id) })
def run_query(query_run_id): cur = False start_time = time.clock() try: celery_log.info("Starting run for qrun:%s", query_run_id) qrun = QueryRun.get_by_id(query_run_id) qrun.status = QueryRun.STATUS_RUNNING qrun.save() check_result = check_sql(qrun.augmented_sql) if check_result is not True: celery_log.info("Check result for qrun:%s failed, with message: %s", qrun.id, check_result[0]) raise pymysql.DatabaseError(0, check_result[1]) cur = g.conn.replica.cursor() cur.execute(qrun.augmented_sql) result = [] result.append(make_result(cur)) while cur.nextset(): result.append(make_result(cur)) total_time = time.clock() - start_time qresult = QuerySuccessResult(qrun, total_time, result, celery.conf.OUTPUT_PATH_TEMPLATE) qrun.status = QueryRun.STATUS_COMPLETE celery_log.info("Completed run for qrun:%s successfully", qrun.id) qresult.output() qrun.save() except pymysql.DatabaseError as e: total_time = time.clock() - start_time qresult = QueryErrorResult(qrun, total_time, celery.conf.OUTPUT_PATH_TEMPLATE, e.args[1]) qrun.status = QueryRun.STATUS_FAILED qresult.output() qrun.save() celery_log.info("Completed run for qrun:%s with failure: %s", qrun.id, e.args[1]) except SoftTimeLimitExceeded: celery_log.info( "Time limit exceeded for qrun:%s, thread:%s attempting to kill", qrun.id, g.conn.replica.thread_id() ) total_time = time.clock() - start_time kill_query.delay(g.conn.replica.thread_id()) qrun.state = QueryRun.STATUS_KILLED qrun.save() qresult = QueryKilledResult(qrun, total_time, celery.conf.OUTPUT_PATH_TEMPLATE) qresult.output() finally: if cur is not False: # It is possible the cursor was never created, # so check before we try to close it cur.close()
def query_show(query_id): query = Query.get_by_id(query_id) can_edit = g.user is not None and g.user.id == query.user_id jsvars = { 'query_id': query.id, 'can_edit': can_edit } # Check if there's a run? query_run = QueryRun.get_latest_run(query.latest_rev_id) if query_run is not None: jsvars['output_url'] = url_for('api_query_output', user_id=query.user_id, run_id=query_run.id) return render_template( "query/view.html", user=g.user, query=query, jsvars=jsvars )
def all_query_runs(): query_runs = QueryRun.get_augmented_list() return render_template("query/list.html", user=g.user, query_runs=query_runs)