module database import time @[table: 'login_attempts'] pub struct Logins { mut: ip string @[primary] attempts int @[nonnull] attempt_time time.Time @[nonnull] } pub fn Logins.by_ip(ip string, mut database_ Database) ?Logins { query := database_.get_query_builder[Logins]().where('ip = ?', ip) or { return none } result := database_.query[Logins](query) or { return none } return result.first() } pub fn Logins.create_or_update(ip string, mut database_ Database) ?Logins { mut login := Logins{ ip: ip attempts: 1 attempt_time: time.now() } if existing := Logins.by_ip(ip, mut database_) { login.attempts = existing.attempts + 1 login.attempt_time = time.now() db := database_.get_connection() or { panic(err) } sql db { update Logins set attempts = login.attempts, attempt_time = login.attempt_time where ip == ip } or { return none } } else { db := database_.get_connection() or { panic(err) } sql db { insert login into Logins } or { return none } } return login }