summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjasplin <qt-info@nokia.com>2011-03-18 13:55:53 +0100
committerjasplin <qt-info@nokia.com>2011-03-18 13:55:53 +0100
commit6efb3cbdc08f93685dff481635a9e4a9997f8017 (patch)
tree177beb082cfef166d18c588e05567265b467807d
parentae4f42288dbf4d1e33d04384e3d117d7f8c80641 (diff)
Make SQL queries safer and more robust.
This patch ensures proper processing of SQL queries by making use of the second argument to the Psycopg execute() method: WRONG: >>> SQL = "INSERT INTO authors (name) VALUES ('%s');" # NEVER DO THIS >>> data = ("O'Reilly", ) >>> cur.execute(SQL % data) # THIS WILL FAIL MISERABLY CORRECT: >>> SQL = "INSERT INTO authors (name) VALUES (%s);" # Notice: no quotes >>> data = ("O'Reilly", ) >>> cur.execute(SQL, data) # Notice: no % operator This has a double purpose: 1: Arguments are automatically handled properly according to their type (in particular strings containing single quotes). 2: SQL injection is prevented.
-rwxr-xr-xscripts/computerankings.py24
-rw-r--r--scripts/dbaccess.py10
-rw-r--r--scripts/getrankings.py30
-rw-r--r--scripts/getresultdetails2.py10
-rw-r--r--scripts/getstats1.py5
-rw-r--r--scripts/getstats2.py8
-rw-r--r--scripts/gettimeseriesdetails.py2
-rw-r--r--scripts/gettimeseriesstats.py2
-rw-r--r--scripts/listcontexts.py8
-rw-r--r--scripts/listtestcases1.py7
-rw-r--r--scripts/listtestcases2.py11
-rw-r--r--scripts/misc.py156
-rw-r--r--scripts/settimeseriesnote.py28
-rw-r--r--scripts/singlecontextbmstats.py11
-rwxr-xr-xscripts/uploadresults.py42
15 files changed, 177 insertions, 177 deletions
diff --git a/scripts/computerankings.py b/scripts/computerankings.py
index 6726806..e5165ce 100755
--- a/scripts/computerankings.py
+++ b/scripts/computerankings.py
@@ -115,19 +115,11 @@ def registerRanking(table, stat_index, stat_name, context1_id, context2_id):
prev_stat_value = stat_value
# Insert or update the corresponding row in the 'ranking' table:
- query = (
- "SELECT merge_ranking("
- + str(context1_id)
- + ", " + str(context2_id)
- + ", " + str(benchmark_id)
- + ", " + str(metric_id)
- + ", " + str(lc_timestamp)
- + ", " + str(stat_id)
- + ", " + str(stat_value)
- + ", " + str(ranking_pos)
- + ");"
- )
- execQuery(query, False)
+ execQuery(
+ "SELECT merge_ranking(%s, %s, %s, %s, %s, %s, %s, %s)",
+ (context1_id, context2_id, benchmark_id, metric_id,
+ lc_timestamp, stat_id, stat_value, ranking_pos),
+ False)
# ### 2 B DOCUMENTED!
@@ -255,13 +247,13 @@ def updateRankings(
try:
sha12_pos = zip(*snapshots)[0].index(sha12_id)
except ValueError:
- print "no observations found for SHA-1 ID:", sha12_id
+ sys.stderr.write("no observations found for SHA-1 ID: " + str(sha12_id))
sys.exit(1)
sha11_pos = max(0, (sha12_pos - 2 * durtolmax) + 1)
snapshots = snapshots[sha11_pos:(sha12_pos + 1)]
if len(snapshots) < 2:
- print (
- "no observations found before SHA-1 ID: " + sha12_id +
+ sys.stderr.write(
+ "no observations found before SHA-1 ID: " + str(sha12_id) +
" (computing rankings makes no sense)")
sys.exit(1)
diff --git a/scripts/dbaccess.py b/scripts/dbaccess.py
index d18346e..c12e186 100644
--- a/scripts/dbaccess.py
+++ b/scripts/dbaccess.py
@@ -47,15 +47,16 @@ def connectDatabase():
global cursor
cursor = conn.cursor()
-# Executes a query against the database. Returns any result set iff
-# fetch_results is true.
-def execQuery(query, fetch_results = True):
+
+# Executes a query against the database. args contains the arguments to be
+# passed to the query. Returns any result set iff fetch_results is true.
+def execQuery(query, args, fetch_results = True):
if not "cursor" in globals():
connectDatabase()
assert "cursor" in globals()
try:
- cursor.execute(query)
+ cursor.execute(query, args)
if fetch_results:
return cursor.fetchall()
except psycopg2.Error:
@@ -63,6 +64,7 @@ def execQuery(query, fetch_results = True):
print "reason:", str(sys.exc_info())
sys.exit(1)
+
# Commits everything that has been written to the database.
def commit():
if not "cursor" in globals():
diff --git a/scripts/getrankings.py b/scripts/getrankings.py
index 02a1f9f..45cc9a3 100644
--- a/scripts/getrankings.py
+++ b/scripts/getrankings.py
@@ -63,15 +63,15 @@ class GetRankings:
# Get all time series notes:
qres = execQuery(
"SELECT benchmarkId, metricId, note FROM timeSeriesAnnotation"
- " WHERE hostId = %d AND platformId = %d AND branchId = %d"
- % (self.host_id, self.platform_id, self.branch_id))
+ " WHERE hostId = %s AND platformId = %s AND branchId = %s",
+ (self.host_id, self.platform_id, self.branch_id))
notes = {}
for benchmark_id, metric_id, note in qres:
notes[benchmark_id, metric_id] = note
# Get rankings for each statistic:
- stat_infos = execQuery("SELECT id, value FROM rankingStat;")
+ stat_infos = execQuery("SELECT id, value FROM rankingStat", ())
for stat_id, stat_name in stat_infos:
# Get the unsorted ranking information:
@@ -79,9 +79,9 @@ class GetRankings:
"SELECT benchmarkId, metricId, context1Id, pos, value,"
" lastChangeTimestamp"
" FROM ranking"
- " WHERE context2Id = %d"
- " AND statId = %d;"
- % (self.context2_id, stat_id))
+ " WHERE context2Id = %s"
+ " AND statId = %s",
+ (self.context2_id, stat_id))
ranking = []
@@ -121,9 +121,9 @@ class GetRankings:
ranking_prev_list = execQuery(
"SELECT benchmarkId, metricId, pos"
" FROM ranking"
- " WHERE context2Id = %d"
- " AND statId = %d;"
- % (context2_prev_id, stat_id))
+ " WHERE context2Id = %s"
+ " AND statId = %s",
+ (context2_prev_id, stat_id))
ranking_prev = {}
for benchmark_id, metric_id, pos in ranking_prev_list:
ranking_prev[benchmark_id, metric_id] = pos
@@ -152,12 +152,14 @@ class GetRankings:
# Extract affected SHA-1s:
+ assert len(context_ids) > 0
sha1_infos = execQuery(
"SELECT context.id, sha1Id, sha1.value"
" FROM context, sha1"
- " WHERE context.id IN (%s)"
- " AND sha1Id = sha1.id;"
- % (", ".join(map(str, context_ids))))
+ " WHERE context.id IN"
+ " (%s" + ", %s"*(len(context_ids) - 1) + ")" +
+ " AND sha1Id = sha1.id",
+ tuple(context_ids))
return sha1_infos, rankings
@@ -191,8 +193,8 @@ class GetRankings:
self.sha1_infos, self.rankings = self.getRankings()
self.snapshots = self.getSnapshotsInMaxRange(self.sha1_infos)
- self.benchmarks = execQuery("SELECT id, value FROM benchmark;")
- self.metrics = execQuery("SELECT id, value FROM metric;")
+ self.benchmarks = execQuery("SELECT id, value FROM benchmark", ())
+ self.metrics = execQuery("SELECT id, value FROM metric", ())
self.writeOutput()
diff --git a/scripts/getresultdetails2.py b/scripts/getresultdetails2.py
index 20d128e..3b5f2b3 100644
--- a/scripts/getresultdetails2.py
+++ b/scripts/getresultdetails2.py
@@ -50,11 +50,11 @@ class GetResultDetails2:
"SELECT value, valid, EXTRACT(EPOCH FROM startTime)::INT"
" FROM result, upload"
" WHERE uploadId = upload.id"
- " AND contextId = %d"
- " AND benchmarkId = %d"
- " AND metricId = %d"
- " ORDER BY value DESC;"
- % (context, benchmark, metric)):
+ " AND contextId = %s"
+ " AND benchmarkId = %s"
+ " AND metricId = %s"
+ " ORDER BY value DESC",
+ (context, benchmark, metric)):
sample.append({
'value' : value,
'valid' : valid,
diff --git a/scripts/getstats1.py b/scripts/getstats1.py
index 89da8cf..f9e6005 100644
--- a/scripts/getstats1.py
+++ b/scripts/getstats1.py
@@ -89,8 +89,9 @@ class GetStats1:
self.host_id, self.platform_id, self.branch_id, self.sha1_id)
# Get all distinct benchmark/metric combinations matching the context:
- bmark_metrics = execQuery("SELECT DISTINCT benchmarkId, metricId"
- " FROM result WHERE contextId = %d;" % context_id)
+ bmark_metrics = execQuery(
+ "SELECT DISTINCT benchmarkId, metricId"
+ " FROM result WHERE contextId = %s", (context_id,))
bmstats_list = []
diff --git a/scripts/getstats2.py b/scripts/getstats2.py
index eac6833..f7fe6c6 100644
--- a/scripts/getstats2.py
+++ b/scripts/getstats2.py
@@ -181,14 +181,14 @@ class GetStats2:
bmark_metrics = execQuery(
"SELECT DISTINCT benchmarkId, metricId"
" FROM result"
- " WHERE contextId = %d"
+ " WHERE contextId = %s"
" INTERSECT "
"SELECT DISTINCT benchmarkId, metricId"
" FROM result"
- " WHERE contextId = %d"
+ " WHERE contextId = %s"
#" LIMIT 10"
- ";"
- % (context1_id, context2_id)
+ ";",
+ (context1_id, context2_id)
)
bmstats_list = []
diff --git a/scripts/gettimeseriesdetails.py b/scripts/gettimeseriesdetails.py
index 56e7a1a..621c98c 100644
--- a/scripts/gettimeseriesdetails.py
+++ b/scripts/gettimeseriesdetails.py
@@ -1,6 +1,6 @@
import sys
import json
-from dbaccess import execQuery, database
+from dbaccess import database
from misc import (
idToText, textToId, metricIdToLowerIsBetter, benchmarkToComponents,
getSnapshots, getTimeSeries, getChanges, getTimeSeriesMiscStats,
diff --git a/scripts/gettimeseriesstats.py b/scripts/gettimeseriesstats.py
index ea1294c..6b95080 100644
--- a/scripts/gettimeseriesstats.py
+++ b/scripts/gettimeseriesstats.py
@@ -1,6 +1,6 @@
import sys
import json
-from dbaccess import execQuery, database
+from dbaccess import database
from misc import (
idToText, textToId, metricIdToLowerIsBetter, benchmarkToComponents,
getSnapshots, getBMTimeSeriesStatsList, printJSONHeader)
diff --git a/scripts/listcontexts.py b/scripts/listcontexts.py
index 01c2403..4aae8bc 100644
--- a/scripts/listcontexts.py
+++ b/scripts/listcontexts.py
@@ -12,7 +12,8 @@ class ListContexts:
def rankingsExist(self, contextId):
rankings = execQuery(
- "SELECT id FROM ranking WHERE context2Id = %d LIMIT 1;" % contextId)
+ "SELECT id FROM ranking WHERE context2Id = %s LIMIT 1",
+ (contextId,))
return len(rankings) > 0
@@ -23,8 +24,9 @@ class ListContexts:
"SELECT id, hostId, platformId, branchId, sha1Id,"
" EXTRACT(EPOCH FROM timestamp)::INT"
" FROM context"
- " ORDER BY hostId, platformId, branchId, timestamp DESC;") \
- + [(-1, -1, -1, -1, -1, -1)] # Sentinel value
+ " ORDER BY hostId, platformId,"
+ " branchId, timestamp DESC;", ()) \
+ + [(-1, -1, -1, -1, -1, -1)] # Sentinel value
self.contexts = []
diff --git a/scripts/listtestcases1.py b/scripts/listtestcases1.py
index 9e50cab..90f1cc5 100644
--- a/scripts/listtestcases1.py
+++ b/scripts/listtestcases1.py
@@ -21,9 +21,10 @@ class ListTestCases1:
# Get all distinct benchmarks matching the context:
bmark_ids = execQuery(
"SELECT DISTINCT benchmarkId "
- "FROM result WHERE contextId = %d;"
- % getContext(
- self.host_id, self.platform_id, self.branch_id, self.sha1_id))
+ "FROM result WHERE contextId = %s",
+ (getContext(
+ self.host_id, self.platform_id, self.branch_id,
+ self.sha1_id),))
# Extract all distinct test case components:
tc_map = {}
diff --git a/scripts/listtestcases2.py b/scripts/listtestcases2.py
index 9cdcbda..020dcd2 100644
--- a/scripts/listtestcases2.py
+++ b/scripts/listtestcases2.py
@@ -31,17 +31,16 @@ class ListTestCases2:
# Get all distinct benchmarks matching both contexts:
bmark_ids = execQuery(
"SELECT DISTINCT benchmarkId"
- " FROM result WHERE contextId = %d"
+ " FROM result WHERE contextId = %s"
" INTERSECT "
"SELECT DISTINCT benchmarkId"
- " FROM result WHERE contextId = %d;"
- % (getContext(
+ " FROM result WHERE contextId = %s",
+ (getContext(
self.host1_id, self.platform1_id, self.branch1_id,
self.sha11_id),
- getContext(
+ getContext(
self.host2_id, self.platform2_id, self.branch2_id,
- self.sha12_id)
- )
+ self.sha12_id))
)
# Extract all distinct test case components:
diff --git a/scripts/misc.py b/scripts/misc.py
index 8d0be5c..e5663c3 100644
--- a/scripts/misc.py
+++ b/scripts/misc.py
@@ -15,14 +15,15 @@ def idToText(table, id_):
idToTextCache[table] = {}
if id_ in idToTextCache[table]:
- return idToTextCache[table][id_];
+ return idToTextCache[table][id_]
- text = ((execQuery(
- "SELECT value FROM " + table + " WHERE id = " + str(id_) +
- ";")[0][0]) if (id_ >= 0) else "")
- idToTextCache[table][id_] = text;
+ text = (execQuery(
+ "SELECT value FROM " + table + " WHERE id = %s", (id_,))[0][0]
+ if (id_ >= 0) else "")
+ idToTextCache[table][id_] = text
+
+ return text
- return text;
# ### 2 B DOCUMENTED!
def textToId(table, text):
@@ -33,15 +34,15 @@ def textToId(table, text):
textToIdCache[table] = {}
if text in textToIdCache[table]:
- return textToIdCache[table][text];
+ return textToIdCache[table][text]
+
+ res = execQuery("SELECT id FROM " + table + " WHERE value = %s", (text,))
+ id_ = res[0][0] if (len(res) > 0) else -1
- res = execQuery(
- "SELECT id FROM " + table + " WHERE value = '" + str(text) + "';")
- id_ = res[0][0] if (len(res) > 0) else -1;
+ textToIdCache[table][text] = id_
- textToIdCache[table][text] = id_;
+ return id_
- return id_;
# ### 2 B DOCUMENTED!
# Maybe also rename to lowerIsBetter() ? (but note that a global function with
@@ -52,28 +53,30 @@ def metricIdToLowerIsBetter(metric_id):
metricIdToLIBCache = {}
if metric_id in metricIdToLIBCache:
- return metricIdToLIBCache[metric_id];
+ return metricIdToLIBCache[metric_id]
lib = execQuery(
- "SELECT lowerIsBetter FROM metric WHERE id = " + str(metric_id) +
- ";")[0][0]
- metricIdToLIBCache[metric_id] = lib;
+ "SELECT lowerIsBetter FROM metric WHERE id = %s", (metric_id,))[0][0]
+ metricIdToLIBCache[metric_id] = lib
+
+ return lib
- return lib;
# Returns the non-negative ID of the given context, or -1 if not found.
def getContext(host_id, platform_id, branch_id, sha1_id):
- result = execQuery("SELECT id FROM context"
- " WHERE hostId = %d"
- " AND platformId = %d"
- " AND branchId = %d"
- " AND sha1Id = %d"
- "LIMIT 1;"
- % (host_id, platform_id, branch_id, sha1_id))
+ result = execQuery(
+ "SELECT id FROM context"
+ " WHERE hostId = %s"
+ " AND platformId = %s"
+ " AND branchId = %s"
+ " AND sha1Id = %s"
+ "LIMIT 1",
+ (host_id, platform_id, branch_id, sha1_id))
if len(result):
return result[0][0]
return -1
+
# Returns the test case, test function, and data tag components of
# a benchmark of the form <tc>:<tf>(<dt>). The test case and test function
# components may not contain whitespace, or a ':', '(', or ')' character.
@@ -86,12 +89,13 @@ def benchmarkToComponents(benchmark):
else:
raise BaseException("invalid benchmark syntax: >" + benchmark + "<")
+
+# Returns the timestamp associated with a particular context ID. This will
+# be the UTC timestamp of the earliest upload for this context.
def getTimestampFromContext(context_id):
return execQuery(
- "SELECT EXTRACT(EPOCH FROM timestamp)::INT"
- " FROM context"
- " WHERE id = %d;"
- % context_id)[0][0]
+ "SELECT EXTRACT(EPOCH FROM timestamp)::INT FROM context WHERE id = %s",
+ (context_id,))[0][0]
# Finds snapshots that match a host/platform/branch combination and that
@@ -102,33 +106,27 @@ def getTimestampFromContext(context_id):
# (sha1, first upload timestamp).
def getSnapshots(host_id, platform_id, branch_id, sha11_id, sha12_id):
timestamp1 = execQuery(
- "SELECT EXTRACT(EPOCH FROM timestamp)::INT FROM context " +
- "WHERE hostId = " + str(host_id) +
- " AND platformId = " + str(platform_id) +
- " AND branchId = " + str(branch_id) +
- " AND sha1Id = " + str(sha11_id) + ";")[0][0]
-
+ "SELECT EXTRACT(EPOCH FROM timestamp)::INT FROM context"
+ " WHERE hostId = %s"
+ " AND platformId = %s"
+ " AND branchId = %s"
+ " AND sha1Id = %s",
+ (host_id, platform_id, branch_id, sha11_id))[0][0]
if sha12_id >= 0:
-
timestamp2 = execQuery(
- "SELECT EXTRACT(EPOCH FROM timestamp)::INT FROM context " +
- "WHERE hostId = " + str(host_id) +
- " AND platformId = " + str(platform_id) +
- " AND branchId = " + str(branch_id) +
- " AND sha1Id = " + str(sha12_id) + ";")[0][0]
-
+ "SELECT EXTRACT(EPOCH FROM timestamp)::INT FROM context"
+ " WHERE hostId = %s"
+ " AND platformId = %s"
+ " AND branchId = %s"
+ " AND sha1Id = %s",
+ (host_id, platform_id, branch_id, sha12_id))[0][0]
# Ensure chronological order:
if timestamp1 > timestamp2:
timestamp1, timestamp2 = timestamp2, timestamp1
-
range_expr = "BETWEEN %d AND %d" % (timestamp1, timestamp2)
-
else:
-
range_expr = ">= %d" % timestamp1
-
-
# Each distinct SHA-1 that occurs for this host/platform/branch
# combination may occur multiple times with different upload times.
# Get the list of distinct SHA-1 IDs along with the earliest upload
@@ -136,14 +134,14 @@ def getSnapshots(host_id, platform_id, branch_id, sha11_id, sha12_id):
# order of the uploadId attributes is consistent with the order
# of their corresponding startTime attributes):
snapshots = execQuery(
- "SELECT sha1Id, EXTRACT(EPOCH FROM timestamp)::INT AS "
- "firstUploadTime FROM context "
- "WHERE hostId = %d"
- " AND platformId = %d"
- " AND branchId = %d"
- " AND EXTRACT(EPOCH FROM timestamp)::INT %s"
- " ORDER BY timestamp ASC;"
- % (host_id, platform_id, branch_id, range_expr))
+ "SELECT sha1Id, EXTRACT(EPOCH FROM timestamp)::INT AS firstUploadTime"
+ " FROM context"
+ " WHERE hostId = %s"
+ " AND platformId = %s"
+ " AND branchId = %s"
+ " AND EXTRACT(EPOCH FROM timestamp)::INT " + range_expr +
+ " ORDER BY timestamp ASC",
+ (host_id, platform_id, branch_id))
return tuple(snapshots)
@@ -151,7 +149,6 @@ def getSnapshots(host_id, platform_id, branch_id, sha11_id, sha12_id):
# Finds all snapshots matching a host/platform/branch combination.
# Returns a chronologically (except when reverse is True) ordered n-tuple
# of 2-tuples: (sha1, first upload timestamp).
-#
def getAllSnapshots(host_id, platform_id, branch_id, reverse = False):
# Each distinct SHA-1 that occurs for this host/platform/branch
@@ -163,11 +160,11 @@ def getAllSnapshots(host_id, platform_id, branch_id, reverse = False):
snapshots = execQuery(
"SELECT sha1Id, EXTRACT(EPOCH FROM timestamp)::INT AS firstUploadTime"
" FROM context"
- " WHERE hostId = %d"
- " AND platformId = %d"
- " AND branchId = %d"
- % (host_id, platform_id, branch_id) +
- " ORDER BY timestamp " + ("DESC;" if reverse else "ASC;"))
+ " WHERE hostId = %s"
+ " AND platformId = %s"
+ " AND branchId = %s"
+ " ORDER BY timestamp " + ("DESC" if reverse else "ASC"),
+ (host_id, platform_id, branch_id))
return tuple(snapshots)
@@ -181,12 +178,12 @@ def getLastRankingSnapshot(host_id, platform_id, branch_id):
" FROM ranking,"
" (SELECT id, sha1Id, timestamp"
" FROM context"
- " WHERE hostId = %d"
- " AND platformId = %d"
- " AND branchId = %d) AS matchingContext"
+ " WHERE hostId = %s"
+ " AND platformId = %s"
+ " AND branchId = %s) AS matchingContext"
" WHERE context2Id = matchingContext.id"
- " ORDER BY timestamp DESC LIMIT 1;"
- % (host_id, platform_id, branch_id))
+ " ORDER BY timestamp DESC LIMIT 1",
+ (host_id, platform_id, branch_id))
if len(result):
return result[0]
return -1, -1
@@ -203,12 +200,12 @@ def getRankingContexts(host_id, platform_id, branch_id):
" FROM ranking,"
" (SELECT id, sha1Id, timestamp"
" FROM context"
- " WHERE hostId = %d"
- " AND platformId = %d"
- " AND branchId = %d) AS matchingContext"
+ " WHERE hostId = %s"
+ " AND platformId = %s"
+ " AND branchId = %s) AS matchingContext"
" WHERE context2Id = matchingContext.id"
- " ORDER BY etimestamp DESC;"
- % (host_id, platform_id, branch_id))
+ " ORDER BY etimestamp DESC",
+ (host_id, platform_id, branch_id))
return result
@@ -251,13 +248,14 @@ def getTimeSeries(
contexts.append(getContext(host_id, platform_id, branch_id, sha1_id))
# Fetch raw values:
+ assert len(contexts) > 0
raw_values = (execQuery(
"SELECT value, valid, contextId FROM result"
- " WHERE contextId IN (%s)"
- " AND benchmarkId = %d"
- " AND metricId = %d"
- " ORDER BY contextId;"
- % (", ".join(map(str, contexts)), benchmark_id, metric_id)) +
+ " WHERE contextId IN (%s" + ", %s"*(len(contexts) - 1) + ")" +
+ " AND benchmarkId = %s"
+ " AND metricId = %s"
+ " ORDER BY contextId",
+ tuple(contexts) + (benchmark_id, metric_id)) +
[(-1, -1, -1)]) # Note sentinel item
# Compute per-sample stats:
@@ -587,9 +585,11 @@ def getBMTimeSeriesStatsList(
# Get all distinct benchmark/metric combinations that match the
# host/platform/branch context and are within the selected snapshot
# interval. Each such combination corresponds to a time series.
- bmark_metrics = execQuery("SELECT DISTINCT benchmarkId, metricId"
- " FROM result WHERE contextId IN (%s);"
- % ", ".join(map(str, contexts)))
+ assert len(contexts) > 0
+ bmark_metrics = execQuery(
+ "SELECT DISTINCT benchmarkId, metricId FROM result"
+ " WHERE contextId IN (%s" + ", %s"*(len(contexts) - 1) + ")",
+ contexts)
bmstats_list = []
diff --git a/scripts/settimeseriesnote.py b/scripts/settimeseriesnote.py
index 7e4aa5b..6d815e9 100644
--- a/scripts/settimeseriesnote.py
+++ b/scripts/settimeseriesnote.py
@@ -19,23 +19,23 @@ class SetTimeSeriesNote:
if len(self.note) == 0:
# Delete the row from the table:
- query = (
+ execQuery(
"DELETE FROM timeSeriesAnnotation"
- " WHERE hostId = %d"
- " AND platformId = %d"
- " AND branchId = %d"
- " AND benchmarkId = %d"
- " AND metricId = %d;"
- % (self.host_id, self.platform_id, self.branch_id,
- self.benchmark_id, self.metric_id))
- execQuery(query, False)
+ " WHERE hostId = %s"
+ " AND platformId = %s"
+ " AND branchId = %s"
+ " AND benchmarkId = %s"
+ " AND metricId = %s",
+ (self.host_id, self.platform_id, self.branch_id,
+ self.benchmark_id, self.metric_id),
+ False)
else:
# Insert or update table row:
- query = (
- "SELECT merge_timeSeriesNote(%d, %d, %d, %d, %d, '%s');"
- % (self.host_id, self.platform_id, self.branch_id,
- self.benchmark_id, self.metric_id, self.note))
- execQuery(query, False)
+ execQuery(
+ "SELECT merge_timeSeriesNote(%s, %s, %s, %s, %s, %s)",
+ (self.host_id, self.platform_id, self.branch_id,
+ self.benchmark_id, self.metric_id, self.note),
+ False)
# Write to database:
commit()
diff --git a/scripts/singlecontextbmstats.py b/scripts/singlecontextbmstats.py
index 665a44c..f8d2858 100644
--- a/scripts/singlecontextbmstats.py
+++ b/scripts/singlecontextbmstats.py
@@ -63,11 +63,12 @@ def extractSingleContextBMStats(context_id, benchmark_id, metric_id):
values = []
- query_result = execQuery("SELECT value, valid FROM result"
- " WHERE contextId = %d"
- " AND benchmarkId = %d"
- " AND metricId = %d;"
- % (context_id, benchmark_id, metric_id))
+ query_result = execQuery(
+ "SELECT value, valid FROM result"
+ " WHERE contextId = %s"
+ " AND benchmarkId = %s"
+ " AND metricId = %s;",
+ (context_id, benchmark_id, metric_id))
for value, valid in query_result:
if valid:
diff --git a/scripts/uploadresults.py b/scripts/uploadresults.py
index 460207f..f0d5bb3 100755
--- a/scripts/uploadresults.py
+++ b/scripts/uploadresults.py
@@ -171,7 +171,7 @@ def findOrInsertId(table, value, *args):
#print "value: >" + value + "<, ",
query_result = execQuery(
- "SELECT id FROM " + table + " WHERE value = '" + str(value) + "';")
+ "SELECT id FROM " + table + " WHERE value = %s", (value,))
if len(query_result) == 1:
# Found, so return ID:
#print "returning existing ID: >" + str(query_result[0][0]) + "<"
@@ -180,14 +180,16 @@ def findOrInsertId(table, value, *args):
# Not found, so insert:
query = "INSERT INTO " + table + " (value"
for i in range(0, len(args), 2):
- query += ", " + str(args[i])
- query += ") VALUES ('" + str(value) + "'"
+ query += ", " + args[i]
+ query += ") VALUES (%s"
+ values = [value]
for i in range(0, len(args), 2):
- query += ", " + str(args[i + 1])
+ query += ", %s"
+ values.append(args[i + 1])
# ... and retrieve ID:
- query += ") RETURNING id;"
- query_result = execQuery(query)
+ query += ") RETURNING id"
+ query_result = execQuery(query, values)
assert len(query_result) == 1
#print "returning new ID: >" + str(query_result[0][0]) + "<"
@@ -198,10 +200,10 @@ def findOrInsertId(table, value, *args):
def uploadToDatabase(host, platform, branch, sha1, results):
# Append a row to the 'upload' table (to record this upload event) ...
- execQuery("INSERT INTO upload DEFAULT VALUES;", False)
+ execQuery("INSERT INTO upload DEFAULT VALUES", (), False)
# Retrieve the ID of the row we just inserted ...
- uploadId = execQuery("SELECT currval('upload_id_seq');")[0][0]
+ uploadId = execQuery("SELECT currval('upload_id_seq')", ())[0][0]
hostId = findOrInsertId("host", host)
platformId = findOrInsertId("platform", platform)
@@ -213,9 +215,9 @@ def uploadToDatabase(host, platform, branch, sha1, results):
contextId = execQuery(
"INSERT INTO context"
" (hostId, platformId, branchId, sha1Id)"
- " VALUES (%d, %d, %d, %d)"
- " RETURNING id;"
- % (hostId, platformId, branchId, sha1Id))[0][0]
+ " VALUES (%s, %s, %s, %s)"
+ " RETURNING id",
+ (hostId, platformId, branchId, sha1Id))[0][0]
# Append rows to the 'result' table ...
for result in results:
@@ -228,14 +230,12 @@ def uploadToDatabase(host, platform, branch, sha1, results):
"metric", result['metric'], "lowerIsBetter",
result['lowerIsBetter'])
- query = (
+ execQuery(
"INSERT INTO result"
" (contextId, benchmarkId, value, valid, metricId, uploadId)"
- " VALUES (%d, %d, %f, %s, %d, %d);"
- % (contextId, benchmarkId, result['value'], result['valid'],
- metricId, uploadId))
-
- execQuery(query, False)
+ " VALUES (%s, %s, %s, %s, %s, %s)",
+ (contextId, benchmarkId, result['value'], result['valid'],
+ metricId, uploadId), False)
# Write to database:
commit()
@@ -250,7 +250,7 @@ def rankingsExist(options):
textToId('sha1', options["sha1"]))
matches = execQuery(
- "SELECT id FROM ranking WHERE context2Id = %d LIMIT 1;" % context_id)
+ "SELECT id FROM ranking WHERE context2Id = %s LIMIT 1", (context_id,))
return len(matches) > 0
@@ -278,8 +278,8 @@ def contextComplete(options):
context_id = getContextIdFromNames(options)
sample_size = execQuery(
"SELECT count(*) FROM"
- " (SELECT DISTINCT uploadId from result where contextId=%d) AS foo;"
- % context_id)[0][0]
+ " (SELECT DISTINCT uploadId from result where contextId = %s) AS foo",
+ (context_id,))[0][0]
return sample_size >= max_sample_size
@@ -321,7 +321,7 @@ def execComputeRankings(options, new_context):
p = Popen(cmd, stdout = PIPE, stderr = PIPE)
stdout, stderr = p.communicate()
if (p.returncode != 0):
- print "failed to execute command '" + cmd + "':"
+ print "failed to execute command '" + str(cmd) + "':"
print " return code:", p.returncode
print " stdout: >%s<" % stdout.strip()
print " stderr: >%s<" % stderr.strip()