From b34ac20d9880ac287b33c12152f241a7ec203f4d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Simon=20K=C3=BCnzel?= <simonk@fsmpi.rwth-aachen.de>
Date: Sun, 5 May 2024 23:12:15 +0200
Subject: [PATCH] Change sql string delimiter " to '

---
 feeds.py           |  4 ++--
 icalexport.py      |  8 ++++----
 jobmanagement.py   | 10 +++++-----
 jobs.py            | 18 +++++++++---------
 livestreams.py     |  2 +-
 server.py          | 32 ++++++++++++++++----------------
 sorter.py          |  2 +-
 stats.py           | 22 +++++++++++-----------
 template_helper.py |  2 +-
 timetable.py       |  2 +-
 10 files changed, 51 insertions(+), 51 deletions(-)

diff --git a/feeds.py b/feeds.py
index ba8c2df..cf4a548 100644
--- a/feeds.py
+++ b/feeds.py
@@ -21,7 +21,7 @@ def feed(handle=None):
 		course = query('SELECT * FROM courses WHERE handle = ? AND visible', handle)[0]
 		course['atomid'] = gen_atomid('Video AG, courses['+str(course['id'])+']: '+course['handle'])
 	entries = query('''
-			SELECT lectures.*, "video" AS sep, videos.*, formats.description AS format_description, formats.prio, "course" AS sep, courses.*
+			SELECT lectures.*, 'video' AS sep, videos.*, formats.description AS format_description, formats.prio, \'course\' AS sep, courses.*
 				FROM lectures
 				JOIN courses ON (courses.id = lectures.course_id)
 				JOIN videos ON (lectures.id = videos.lecture_id)
@@ -56,7 +56,7 @@ def rss_feed(handle):
 	if 'format_id' not in request.values:
 		return redirect(url_for('rss_feed', handle=handle, format_id=formats[0]['id']))
 	fmt = query('SELECT * FROM formats WHERE id = ?', request.values.get('format_id', request.values['format_id']))[0]
-	items = query('''SELECT lectures.*, "video" AS sep, videos.*
+	items = query('''SELECT lectures.*, 'video' AS sep, videos.*
 			FROM lectures
 			JOIN courses ON courses.id = lectures.course_id
 			JOIN videos ON lectures.id = videos.lecture_id
diff --git a/icalexport.py b/icalexport.py
index cf50ff7..edb3ad6 100644
--- a/icalexport.py
+++ b/icalexport.py
@@ -57,7 +57,7 @@ def get_responsible():
 @app.route('/internal/ical/all')
 @calperm
 def ical_all():
-	return export_lectures(query('''SELECT lectures.*, "course" AS sep, courses.*
+	return export_lectures(query('''SELECT lectures.*, 'course' AS sep, courses.*
 				FROM lectures JOIN courses ON courses.id = lectures.course_id
 				WHERE NOT norecording AND NOT external
 				ORDER BY time DESC LIMIT ?''', request.values.get('limit', 1000)),
@@ -67,7 +67,7 @@ def ical_all():
 @calperm
 def ical_user(user):
 	username = query('SELECT name FROM users WHERE users.id = ?', user)[0]['name']
-	return export_lectures(query('''SELECT lectures.*, "course" AS sep, courses.*
+	return export_lectures(query('''SELECT lectures.*, 'course' AS sep, courses.*
 				FROM lectures
 				JOIN courses ON courses.id = lectures.course_id
 				JOIN responsible ON responsible.course_id = courses.id
@@ -79,7 +79,7 @@ def ical_user(user):
 @calperm
 def ical_notuser(user):
 	username = query('SELECT name FROM users WHERE users.id = ?', user)[0]['name']
-	return export_lectures(query('''SELECT lectures.*, "course" AS sep, courses.*
+	return export_lectures(query('''SELECT lectures.*, 'course' AS sep, courses.*
 				FROM lectures
 				JOIN courses ON courses.id = lectures.course_id
 				LEFT JOIN responsible ON (responsible.course_id = courses.id AND responsible.user_id = ?)
@@ -90,7 +90,7 @@ def ical_notuser(user):
 @app.route('/internal/ical/course/<course>')
 @calperm
 def ical_course(course):
-	return export_lectures(query('''SELECT lectures.*, "course" AS sep, courses.*
+	return export_lectures(query('''SELECT lectures.*, 'course' AS sep, courses.*
 				FROM lectures JOIN courses ON courses.id = lectures.course_id
 				WHERE courses.handle = ? AND NOT norecording AND NOT external ORDER BY time DESC''', course),
 			get_responsible(), 'videoag_%s.ics'%course)
diff --git a/jobmanagement.py b/jobmanagement.py
index 818fb09..f600b43 100644
--- a/jobmanagement.py
+++ b/jobmanagement.py
@@ -30,14 +30,14 @@ def job_handler_handle(id, state):
 def job_catch_broken():
 	# scheduled but never pinged
 	modify("BEGIN")
-	query('UPDATE jobs SET state="ready" WHERE state="scheduled" and time_scheduled < ?', datetime.now() - timedelta(seconds=10))
+	query('UPDATE jobs SET state=\'ready\' WHERE state=\'scheduled\' and time_scheduled < ?', datetime.now() - timedelta(seconds=10))
 	try:
 		modify("COMMIT")
 	except: #pylint: disable=bare-except
 		pass
 	# no pings since 60s
 	modify("BEGIN")
-	query('UPDATE jobs SET state="failed" WHERE state="running" and last_ping < ?', datetime.now() - timedelta(seconds=60))
+	query('UPDATE jobs SET state=\'failed\' WHERE state=\'running\' and last_ping < ?', datetime.now() - timedelta(seconds=60))
 	try:
 		modify("COMMIT")
 	except: #pylint: disable=bare-except
@@ -53,11 +53,11 @@ def schedule_job(jobtype, data=None, priority=0, queue="default"):
 			jobtype, priority, queue, json.dumps(data, default=date_json_handler), datetime.now())
 
 def cancel_job(job_id):
-	query('UPDATE jobs SET state = "deleted" WHERE id = ? AND state = "ready"', job_id)
+	query('UPDATE jobs SET state = \'deleted\' WHERE id = ? AND state = \'ready\'', job_id)
 	query('UPDATE jobs SET canceled = 1 WHERE id = ?', job_id)
 
 def restart_job(job_id, canceled=False):
 	if canceled:
-		query('UPDATE jobs SET state = "ready", canceled = 0 WHERE id = ? AND state = "failed"', job_id)
+		query('UPDATE jobs SET state = \'ready\', canceled = 0 WHERE id = ? AND state = \'failed\'', job_id)
 	else:
-		query('UPDATE jobs SET state = "ready" WHERE id = ? AND state = "failed" AND NOT canceled', job_id)
+		query('UPDATE jobs SET state = \'ready\' WHERE id = ? AND state = \'failed\' AND NOT canceled', job_id)
diff --git a/jobs.py b/jobs.py
index 8751196..52fe14f 100644
--- a/jobs.py
+++ b/jobs.py
@@ -25,13 +25,13 @@ def jobs_overview():
 			'state': request.args.get('state', 'failed'),
 			'worker': request.args.get('worker', '%')}
 
-	pagecount = math.ceil(query('SELECT count(id) as count FROM jobs WHERE (type like ?) AND (worker like ? OR (worker IS NULL AND ? = "%")) AND (state like ?)',
+	pagecount = math.ceil(query('SELECT count(id) as count FROM jobs WHERE (type like ?) AND (worker like ? OR (worker IS NULL AND ? = \'%\')) AND (state like ?)',
 		filter['type'], filter['worker'], filter['worker'], filter['state'])[0]['count']/pagesize)
 	jobs = query('SELECT * FROM jobs \
-			WHERE (type like ?) AND (worker like ? OR (worker IS NULL AND ? = "%")) AND (state like ?) \
+			WHERE (type like ?) AND (worker like ? OR (worker IS NULL AND ? = \'%\')) AND (state like ?) \
 			ORDER BY "time_created" DESC LIMIT ? OFFSET ?',
 			filter['type'], filter['worker'], filter['worker'], filter['state'], pagesize, page*pagesize)
-	active_streams = query('SELECT lectures.*, "course" AS sep, courses.*, "job" AS sep, jobs.* FROM lectures \
+	active_streams = query('SELECT lectures.*, \'course\' AS sep, courses.*, \'job\' AS sep, jobs.* FROM lectures \
 			JOIN courses ON (courses.id = lectures.course_id) \
 			JOIN jobs ON (jobs.id = lectures.stream_job) WHERE lectures.stream_job')
 	for stream in active_streams:
@@ -55,15 +55,15 @@ def jobs_overview():
 @csrf_protect
 def jobs_action(action, jobid=None):
 	if action == 'clear_failed':
-		query('UPDATE jobs SET state = "deleted" WHERE state = "failed" AND (id = ? OR ? IS NULL)', jobid, jobid)
+		query('UPDATE jobs SET state = \'deleted\' WHERE state = \'failed\' AND (id = ? OR ? IS NULL)', jobid, jobid)
 	elif action == 'retry_failed':
-		query('UPDATE jobs SET state = "ready", canceled = 0 WHERE state = "failed" AND (id = ? OR ? IS NULL)', jobid, jobid)
+		query('UPDATE jobs SET state = \'ready\', canceled = 0 WHERE state = \'failed\' AND (id = ? OR ? IS NULL)', jobid, jobid)
 	elif action == 'copy' and jobid:
 		query("INSERT INTO jobs (type, priority, queue, state, data, time_created) \
 				SELECT type, priority, queue, 'ready', data, ? FROM jobs where id = ?",
 				datetime.now(), jobid)
 	elif action == 'delete' and jobid:
-		query('UPDATE jobs SET state = "deleted" WHERE id = ?', jobid)
+		query('UPDATE jobs SET state = \'deleted\' WHERE id = ?', jobid)
 	elif action == 'cancel' and jobid:
 		cancel_job(jobid)
 	return redirect(request.values.get('ref', url_for('jobs_overview')))
@@ -75,7 +75,7 @@ def jobs_ping(id):
 	status = json.dumps(json.loads(request.values['status']), default=date_json_handler)
 	state = request.values['state']
 	if state == 'finished':
-		query('UPDATE jobs SET time_finished = ?, status = ?, state = "finished" where id = ?', datetime.now(), status, id)
+		query('UPDATE jobs SET time_finished = ?, status = ?, state = \'finished\' where id = ?', datetime.now(), status, id)
 	else:
 		query('UPDATE jobs SET worker = ?, last_ping = ?, status = ?, state = ? where id = ?', hostname, datetime.now(), status, state, id)
 	job_handler_handle(id, state)
@@ -96,13 +96,13 @@ def jobs_schedule(hostname):
 	while not job:
 		try:
 			modify("BEGIN")
-			for i in query('SELECT * FROM jobs WHERE state = "ready" ORDER BY priority DESC'):
+			for i in query('SELECT * FROM jobs WHERE state = \'ready\' ORDER BY priority DESC'):
 				if i['type'] in hostdata['jobtypes'] and i['queue'] in hostdata['queues']:
 					job = i
 					break
 			if not job:
 				return 'no jobs', 503
-			modify('UPDATE jobs SET state="scheduled", worker = ?, time_scheduled = ? WHERE id = ?', hostname, datetime.now(), job['id'])
+			modify('UPDATE jobs SET state=\'scheduled\', worker = ?, time_scheduled = ? WHERE id = ?', hostname, datetime.now(), job['id'])
 			modify("COMMIT")
 		except: #pylint: disable=bare-except
 			tries += 1
diff --git a/livestreams.py b/livestreams.py
index cb8dca5..9c92b19 100644
--- a/livestreams.py
+++ b/livestreams.py
@@ -45,7 +45,7 @@ def streamauth_legacy(server=None):
 		if 'lecture' in request.values:
 			match = {'id': request.values['lecture']}
 		try:
-			modify("INSERT INTO streams (handle, active, visible, lecture_id, description, poster) VALUES (?, 0, 1, -1, "", "")", request.values['name'])
+			modify("INSERT INTO streams (handle, active, visible, lecture_id, description, poster) VALUES (?, 0, 1, -1, '', '')", request.values['name'])
 		except:
 			pass
 		if server:
diff --git a/server.py b/server.py
index ad98b1f..4f24ddf 100644
--- a/server.py
+++ b/server.py
@@ -138,7 +138,7 @@ def genlive(streams):
 	return streams
 
 def genlive_new(lectures):
-	hls_format = (query('SELECT * FROM formats WHERE keywords = "hls"') or [{}])[0]
+	hls_format = (query('SELECT * FROM formats WHERE keywords = \'hls\'') or [{}])[0]
 	res = []
 	for lecture in lectures:
 		if not lecture['stream_job']:
@@ -161,7 +161,7 @@ def index():
 	start = date.today()
 	end = start + timedelta(days=7)
 	upcomming = query('''
-		SELECT lectures.*, streams.active AS nowlive, "course" AS sep, courses.*
+		SELECT lectures.*, streams.active AS nowlive, \'course\' AS sep, courses.*
 		FROM lectures
 		JOIN courses ON (lectures.course_id = courses.id)
 		LEFT JOIN streams ON lectures.id = streams.lecture_id
@@ -170,7 +170,7 @@ def index():
 	for i in upcomming:
 		i['date'] = i['time'].date()
 	latestvideos = query('''
-		SELECT lectures.*, "course" AS sep, courses.*
+		SELECT lectures.*, \'course\' AS sep, courses.*
 		FROM lectures
 		LEFT JOIN videos ON (videos.lecture_id = lectures.id)
 		LEFT JOIN courses on (courses.id = lectures.course_id)
@@ -178,13 +178,13 @@ def index():
 		GROUP BY videos.lecture_id
 		ORDER BY MAX(videos.time_created) DESC
 		LIMIT 6	''', ismod())
-	livestreams = query('''SELECT streams.handle AS livehandle, lectures.*, "course" AS sep, courses.*
+	livestreams = query('''SELECT streams.handle AS livehandle, lectures.*, \'course\' AS sep, courses.*
 		FROM streams
 		JOIN lectures ON lectures.id = streams.lecture_id
 		JOIN courses ON courses.id = lectures.course_id
 		WHERE streams.active AND (? OR (streams.visible AND courses.visible AND courses.listed AND lectures.visible))
 		''', ismod())
-	livestreams_new = query('''SELECT lectures.*, "course" AS sep, courses.*
+	livestreams_new = query('''SELECT lectures.*, \'course\' AS sep, courses.*
 		FROM lectures
 		JOIN courses ON courses.id = lectures.course_id
 		WHERE lectures.stream_job IS NOT NULL AND (? OR (courses.visible AND courses.listed AND lectures.visible))
@@ -200,14 +200,14 @@ def index():
 			item['courses'] = query('SELECT * FROM courses WHERE (visible AND listed) AND "%s" = ? ORDER BY "%s"'%(item['param'], item['param']), item['param2'])
 		elif item['type'] == 'video':
 			item['lecture'] = {'id': item['param']}
-			streams = query('''SELECT streams.handle AS livehandle, streams.lecture_id, "formats" AS sep, formats.*
+			streams = query('''SELECT streams.handle AS livehandle, streams.lecture_id, \'formats\' AS sep, formats.*
 					FROM streams
 					JOIN lectures ON lectures.id = streams.lecture_id
-					JOIN formats ON formats.keywords = "hls"
+					JOIN formats ON formats.keywords = 'hls'
 					WHERE streams.active AND streams.visible AND lectures.id = ?
 					''', item['param'])
 			item['videos'] = query('''
-					SELECT videos.*, "formats" AS sep, formats.*
+					SELECT videos.*, 'formats' AS sep, formats.*
 					FROM videos
 					JOIN formats ON (videos.video_format = formats.id)
 					WHERE videos.lecture_id = ? AND videos.visible
@@ -259,7 +259,7 @@ def course(id=None, handle=None):
 			if perm['lecture_id'] == lecture['id']:
 				lecture['perm'].append(perm)
 	videos = query('''
-			SELECT videos.*, (videos.downloadable AND courses.downloadable) as downloadable, "formats" AS sep, formats.*
+			SELECT videos.*, (videos.downloadable AND courses.downloadable) as downloadable, 'formats' AS sep, formats.*
 			FROM videos
 			JOIN lectures ON (videos.lecture_id = lectures.id)
 			JOIN formats ON (videos.video_format = formats.id)
@@ -267,10 +267,10 @@ def course(id=None, handle=None):
 			WHERE lectures.course_id= ? AND (? OR videos.visible)
 			ORDER BY lectures.time, formats.prio DESC
 			''', course['id'], ismod())
-	livestreams = query('''SELECT streams.handle AS livehandle, streams.lecture_id, "formats" AS sep, formats.*
+	livestreams = query('''SELECT streams.handle AS livehandle, streams.lecture_id, 'formats' AS sep, formats.*
 			FROM streams
 			JOIN lectures ON lectures.id = streams.lecture_id
-			JOIN formats ON formats.keywords = "hls"
+			JOIN formats ON formats.keywords = 'hls'
 			WHERE streams.active AND (? OR streams.visible) AND lectures.course_id = ?
 			''', ismod(), course['id'])
 	videos += genlive(livestreams)
@@ -283,7 +283,7 @@ def course(id=None, handle=None):
 	responsible = query('''SELECT users.*, responsible.course_id AS responsible
 			FROM users
 			LEFT JOIN responsible ON (responsible.user_id = users.id AND responsible.course_id = ?)
-			WHERE users.fsacc != "" AND users.level > 0
+			WHERE users.fsacc != '' AND users.level > 0
 			ORDER BY responsible DESC, users.realname ASC''', course['id'])
 	live_sources = query('SELECT * FROM live_sources WHERE NOT deleted')
 	return render_template('course.html', course=course, lectures=lectures, videos=videos, chapters=chapters, responsible=responsible, live_sources=live_sources)
@@ -305,17 +305,17 @@ def impress():
 def lecture(id, course=None, courseid=None): #pylint: disable=unused-argument,too-many-branches
 	lecture = query('SELECT * FROM lectures WHERE id = ? AND (? OR visible)', id, ismod())[0]
 	videos = query('''
-			SELECT videos.*, (videos.downloadable AND courses.downloadable) as downloadable, "formats" AS sep, formats.*
+			SELECT videos.*, (videos.downloadable AND courses.downloadable) as downloadable, 'formats' AS sep, formats.*
 			FROM videos
 			JOIN formats ON (videos.video_format = formats.id)
 			JOIN courses ON (courses.id = ?)
 			WHERE videos.lecture_id = ? AND (? OR videos.visible)
 			ORDER BY formats.prio DESC
 			''', lecture['course_id'], lecture['id'], ismod())
-	livestreams = query('''SELECT streams.handle AS livehandle, streams.lecture_id, "formats" AS sep, formats.*
+	livestreams = query('''SELECT streams.handle AS livehandle, streams.lecture_id, 'formats' AS sep, formats.*
 			FROM streams
 			JOIN lectures ON lectures.id = streams.lecture_id
-			JOIN formats ON formats.keywords = "hls"
+			JOIN formats ON formats.keywords = 'hls'
 			WHERE streams.active AND (? OR streams.visible) AND lectures.id = ?
 			''', ismod(), id)
 	videos += genlive(livestreams)
@@ -447,7 +447,7 @@ def login():
 	session['user'] = userinfo
 	dbuser = query('SELECT * FROM users WHERE name = ?', user)
 	if not dbuser:
-		modify('INSERT INTO users (name, realname, fsacc, level, calendar_key, rfc6238) VALUES (?, ?, ?, 1, "", "")', user, session['user']['givenName'], user)
+		modify('INSERT INTO users (name, realname, fsacc, level, calendar_key, rfc6238) VALUES (?, ?, ?, 1, \'\', \'\')', user, session['user']['givenName'], user)
 		dbuser = query('SELECT * FROM users WHERE name = ?', user)
 	session['user']['dbid'] = dbuser[0]['id']
 	session['_csrf_token'] = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(64))
diff --git a/sorter.py b/sorter.py
index f4b8e9b..a0d24c1 100644
--- a/sorter.py
+++ b/sorter.py
@@ -60,7 +60,7 @@ def insert_video(lectureid, dbfilepath, fileformatid, hash="", filesize=-1, dura
 	video_id = modify('''INSERT INTO videos_data
 		(lecture_id, visible, path, video_format, title, comment, internal, file_modified, time_created, time_updated, created_by, hash, file_size, duration, source)
 		VALUES 
-		(?, ?, ?, ?, "", "", "", ?, ?, ?, ?, ?, ?, ?, ?)''',
+		(?, ?, ?, ?, '', '', '', ?, ?, ?, ?, ?, ?, ?, ?)''',
 		lectureid, visible, dbfilepath, fileformatid, datetime.now(), datetime.now(), datetime.now(), -1, hash, filesize, duration, sourceid)
 	if not sourceid:
 		query('INSERT INTO sortlog (lecture_id,video_id,path,"when") VALUES (?,?,?,?)', lectureid, video_id, dbfilepath, datetime.now())
diff --git a/stats.py b/stats.py
index ad27e48..6ca9565 100644
--- a/stats.py
+++ b/stats.py
@@ -8,7 +8,7 @@ from server import *
 @register_navbar('Statistiken', icon='stats')
 @mod_required
 def stats():
-	semester = query('SELECT DISTINCT semester from courses WHERE semester != ""')
+	semester = query('SELECT DISTINCT semester from courses WHERE semester != \'\'')
 	for i in semester:
 		year = int(i['semester'][0:4])
 		if i['semester'].endswith('ss'):
@@ -22,9 +22,9 @@ def stats():
 STATS_QUERIES = {}
 STATS_QUERIES['formats_views'] = "SELECT formats.description AS labels, count(DISTINCT log.id) AS \"values\" FROM log \
 		JOIN videos ON (videos.id = log.video) JOIN formats ON (formats.id = videos.video_format) GROUP BY formats.id"
-STATS_QUERIES['course_count'] = 'SELECT semester AS x, count(id) AS y FROM courses WHERE semester != "" GROUP BY semester'
+STATS_QUERIES['course_count'] = 'SELECT semester AS x, count(id) AS y FROM courses WHERE semester != \'\' GROUP BY semester'
 STATS_QUERIES['lectures_count'] = 'SELECT semester AS x, count(lectures.id) AS y FROM lectures \
-		JOIN courses ON (courses.id = lectures.course_id) WHERE semester != "" GROUP BY semester'
+		JOIN courses ON (courses.id = lectures.course_id) WHERE semester != \'\' GROUP BY semester'
 STATS_QUERIES['categories_courses'] = "SELECT courses.subject AS labels, count(courses.id) AS \"values\" FROM courses \
 		GROUP BY courses.subject ORDER BY labels DESC LIMIT 100"
 STATS_QUERIES['organizer_courses'] = "SELECT courses.organizer AS labels, count(courses.id) AS \"values\" FROM courses \
@@ -71,9 +71,9 @@ def stats_generic(req, param=None):
 @app.route('/internal/stats/viewsperday/<req>/<param>')
 @mod_required
 def stats_viewsperday(req, param=""): #pylint: disable=too-many-locals
-	update_expr = 'INSERT INTO logcache (req, param, trace, date, value) SELECT "%s", ?, trace, date, y FROM (%s) AS cachetmp WHERE date < ?'
-	query_expr = 'SELECT date, trace, value AS y FROM logcache WHERE req = "%s" AND param = ? UNION SELECT * FROM (%s) AS cachetmp'
-	date_subexpr = 'SELECT CASE WHEN MAX(date) IS NULL THEN "2000-00-00" ELSE MAX(date) END AS t FROM "logcache" WHERE req = "%s" AND param = ?'
+	update_expr = 'INSERT INTO logcache (req, param, trace, date, value) SELECT \'%s\', ?, trace, date, y FROM (%s) AS cachetmp WHERE date < ?'
+	query_expr = 'SELECT date, trace, value AS y FROM logcache WHERE req = \'%s\' AND param = ? UNION SELECT * FROM (%s) AS cachetmp'
+	date_subexpr = 'SELECT CASE WHEN MAX(date) IS NULL THEN \'2000-00-00\' ELSE MAX(date) END AS t FROM "logcache" WHERE req = \'%s\' AND param = ?'
 	queries = {
 		'lecture': # views per day per lecture (split per format)
 			'''SELECT log.date AS date, formats.description AS trace, COUNT(DISTINCT log.id) AS y
@@ -83,7 +83,7 @@ def stats_viewsperday(req, param=""): #pylint: disable=too-many-locals
 			WHERE log.date > %T AND videos.lecture_id = ?
 			GROUP BY log.date, videos.video_format
 			UNION
-				SELECT log.date AS date, "total" AS trace, COUNT(DISTINCT log.id) AS y
+				SELECT log.date AS date, \'total\' AS trace, COUNT(DISTINCT log.id) AS y
 				FROM log JOIN videos ON videos.id = log.video
 				WHERE log.date > %T AND videos.lecture_id = ? GROUP BY log.date''',
 
@@ -95,7 +95,7 @@ def stats_viewsperday(req, param=""): #pylint: disable=too-many-locals
 			WHERE log.date > %T AND lectures.course_id = ?
 			GROUP BY log.date, videos.video_format
 			UNION
-				SELECT log.date AS date, "total" AS trace, COUNT(DISTINCT log.id) AS y
+				SELECT log.date AS date, \'total\' AS trace, COUNT(DISTINCT log.id) AS y
 				FROM log
 				JOIN videos ON videos.id = log.video
 				JOIN lectures ON lectures.id = videos.lecture_id
@@ -109,7 +109,7 @@ def stats_viewsperday(req, param=""): #pylint: disable=too-many-locals
 			JOIN formats ON formats.id = videos.video_format
 			WHERE log.date > %T GROUP BY log.date, videos.video_format
 			UNION
-				SELECT log.date AS date, "total" AS trace, COUNT(DISTINCT log.id) AS y
+				SELECT log.date AS date, \'total\' AS trace, COUNT(DISTINCT log.id) AS y
 				FROM log
 				WHERE log.date > %T
 				GROUP BY log.date''',
@@ -122,7 +122,7 @@ def stats_viewsperday(req, param=""): #pylint: disable=too-many-locals
 			WHERE log.date > %T
 			GROUP BY log.date, courses.id'''
 	}
-	expr = queries[req].replace('%T', '"'+query(date_subexpr%('viewsperday.'+req), param)[0]['t']+'"')
+	expr = queries[req].replace('%T', '\''+query(date_subexpr%('viewsperday.'+req), param)[0]['t']+'\'')
 	params = [param]*expr.count('?')
 	try:
 		modify("BEGIN")
@@ -130,7 +130,7 @@ def stats_viewsperday(req, param=""): #pylint: disable=too-many-locals
 		modify('COMMIT')
 	except Exception: #pylint: disable=broad-except
 		traceback.print_exc()
-	expr = queries[req].replace('%T', '"'+str(date.today())+'"')
+	expr = queries[req].replace('%T', '\''+str(date.today())+'\'')
 	rows = query(query_expr%('viewsperday.'+req, expr), param, *params)
 	start = None
 	traces = set()
diff --git a/template_helper.py b/template_helper.py
index e7fb5f4..6dea949 100644
--- a/template_helper.py
+++ b/template_helper.py
@@ -252,6 +252,6 @@ def tagid(value):
 @app.template_global()
 def is_readonly():
 	try:
-		return show('SHOW GLOBAL STATUS LIKE "wsrep_ready"')['wsrep_ready'] != 'ON'
+		return show('SHOW GLOBAL STATUS LIKE \'wsrep_ready\'')['wsrep_ready'] != 'ON'
 	except: #pylint: disable=bare-except
 		return True
diff --git a/timetable.py b/timetable.py
index 6efbbb3..bcb1a07 100644
--- a/timetable.py
+++ b/timetable.py
@@ -23,7 +23,7 @@ def query_lectures_on_day(start, end):
 	#  lecture.time <= end AND lecture.time+lecture.duration >= start
 	# But there is no SQL statement that does this and is compatible with both sqlite
 	# and mysql, so we approximate the "lecture.time+lecture.duration" part
-	rows = query('''SELECT lectures.*, courses.short, "course" AS sep, courses.*
+	rows = query('''SELECT lectures.*, courses.short, \'course\' AS sep, courses.*
 		FROM lectures 
 		JOIN courses ON (lectures.course_id = courses.id) 
 		WHERE time <= ? AND time > ?
-- 
GitLab