Skip to content
Snippets Groups Projects
Commit b34ac20d authored by Simon Künzel's avatar Simon Künzel
Browse files

Change sql string delimiter " to '

parent 7dda7511
Branches
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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)
......@@ -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)
......@@ -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
......
......@@ -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:
......
......@@ -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))
......
......@@ -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())
......
......@@ -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()
......
......@@ -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
......@@ -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 > ?
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment