highscore-server/src/main.v

68 lines
1.5 KiB
V

module main
import vweb
import db.sqlite
import time
import os
import log
struct App {
vweb.Context
config Config [vweb_global]
mut:
logger log.Logger [vweb_global]
is_admin bool
pub mut:
db sqlite.DB
}
fn main() {
config := load_config() or { panic('Could not load config file: ${err.str()}') }
mut logger := &log.Log{
level: log.level_from_tag(config.loglevel.to_upper()) or { log.Level.info }
output_target: log.LogTarget.console
}
log.set_logger(logger)
if !os.exists(config.db_path) {
logger.info('Creating database file at ' + config.db_path)
mut file := os.create(config.db_path) or { logger.fatal(err.str()) }
file.close()
}
db := sqlite.connect(config.db_path) or { logger.fatal('Database error! ${err.str()}') }
mut app := &App{
config: config
logger: logger
db: db
}
app.create_tables() or { logger.fatal('Could not create database tables! ${err.str()}') }
mut host := '0.0.0.0'
if config.host.len != 0 {
host = config.host
}
// Handle graceful shutdown for Docker
os.signal_opt(os.Signal.int, app.shutdown) or { logger.fatal(err.str()) }
os.signal_opt(os.Signal.term, app.shutdown) or { logger.fatal(err.str()) }
vweb.run_at(app, vweb.RunParams{
host: host
port: config.port
family: .ip
}) or { logger.fatal(err.str()) }
}
fn (mut app App) shutdown(sig os.Signal) {
app.db.close() or { app.logger.fatal(err.str()) }
app.logger.info('Shut down database gracefully')
app.logger.info('Exiting...')
time.sleep(1e+9) // Sleep one second
exit(0)
}