diff --git a/src/db/logs.v b/src/db/logs.v index 806f3d8..4ec48c7 100644 --- a/src/db/logs.v +++ b/src/db/logs.v @@ -16,44 +16,23 @@ pub fn (db &VieterDb) get_build_logs(filter BuildLogFilter) []BuildLog { } if filter.after != time.Time{} { - where_parts << 'start_time > $filter.after.unix_time()' - } - - // NOTE: possible SQL injection - if filter.arch != '' { - where_parts << "arch == '$filter.arch'" - } - - println(filter.exit_codes) - - mut parts := []string{} - - for exp in filter.exit_codes { - if exp[0] == `!` { - code := exp[1..].int() - - parts << 'exit_code != $code' - }else { - code := exp.int() - - parts << 'exit_code == $code' - } - } - - if parts.len > 0 { - where_parts << parts.map('($it)').join(' or ') + where_parts << 'start_time < $filter.after.unix_time()' } mut where_str := '' if where_parts.len > 0 { - where_str = 'where ' + where_parts.map('($it)').join(' and ') + where_str = ' where ' + where_parts.map('($it)').join(' and ') } - query := 'select * from BuildLog $where_str limit $filter.limit offset $filter.offset' + query := 'select from BuildLog' + where_str rows, _ := db.conn.exec(query) res := rows.map(row_into(it)) + // res := sql db.conn { + // select from BuildLog where filter.repo == 0 || repo_id == filter.repo order by id + // } + return res } diff --git a/src/models/logs.v b/src/models/logs.v index 5ea9dd5..82fc52f 100644 --- a/src/models/logs.v +++ b/src/models/logs.v @@ -35,6 +35,7 @@ pub mut: repo int before time.Time after time.Time + exit_codes_whitelist []u8 + exit_codes_blacklist []u8 arch string - exit_codes []string } diff --git a/src/models/models.v b/src/models/models.v index 0d0395a..924f45f 100644 --- a/src/models/models.v +++ b/src/models/models.v @@ -1,7 +1,5 @@ module models -import time - // from_params creates a new instance of T from the given map by parsing all // of its fields from the map. pub fn from_params(params map[string]string) ?T { @@ -25,12 +23,7 @@ pub fn patch_from_params(mut o T, params map[string]string) ? { o.$(field.name) = params[field.name].u64() } $else $if field.typ is []GitRepoArch { o.$(field.name) = params[field.name].split(',').map(GitRepoArch{ value: it }) - } $else $if field.typ is time.Time { - o.$(field.name) = time.unix(params[field.name].int()) - } $else $if field.typ is []string { - o.$(field.name) = params[field.name].split(',') } - } else if field.attrs.contains('nonull') { return error('Missing parameter: ${field.name}.') } diff --git a/src/server/logs.v b/src/server/logs.v index 51b364f..af0b081 100644 --- a/src/server/logs.v +++ b/src/server/logs.v @@ -8,7 +8,7 @@ import db import time import os import util -import models { BuildLog, BuildLogFilter } +import models { BuildLog } // get_logs returns all build logs in the database. A 'repo' query param can // optionally be added to limit the list of build logs to that repository. @@ -18,10 +18,11 @@ fn (mut app App) get_logs() web.Result { return app.json(http.Status.unauthorized, new_response('Unauthorized.')) } - filter := models.from_params(app.query) or { - return app.json(http.Status.bad_request, new_response('Invalid query parameters.')) + logs := if 'repo' in app.query { + app.db.get_build_logs_for_repo(app.query['repo'].int()) + } else { + app.db.get_build_logs() } - logs := app.db.get_build_logs(filter) return app.json(http.Status.ok, new_data_response(logs)) }