Example #1
0
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)
    })
Example #2
0
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()
Example #3
0
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
    )
Example #4
0
def all_query_runs():
    query_runs = QueryRun.get_augmented_list()
    return render_template("query/list.html", user=g.user, query_runs=query_runs)