Merge pull request #246 from hugmanrique/fix/sqlite-errors

Log SQLite errors
This commit is contained in:
Nick Krecklow 2021-04-21 14:29:48 -07:00 committed by GitHub
commit f0d4fc23ff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 14 deletions

@ -22,10 +22,10 @@ class App {
this.database = new Database(this) this.database = new Database(this)
// Setup database instance // Setup database instance
this.database.ensureIndexes() this.database.ensureIndexes(() => {
this.database.loadGraphPoints(config.graphDuration, () => {
this.database.loadGraphPoints(config.graphDuration, () => { this.database.loadRecords(callback)
this.database.loadRecords(callback) })
}) })
} }

@ -1,5 +1,7 @@
const sqlite = require('sqlite3') const sqlite = require('sqlite3')
const logger = require('./logger')
const config = require('../config') const config = require('../config')
const { TimeTracker } = require('./time') const { TimeTracker } = require('./time')
@ -28,18 +30,36 @@ class Database {
// Ensure the initial tables are created // Ensure the initial tables are created
// This does not created indexes since it is only inserted to // This does not created indexes since it is only inserted to
this._currentDatabaseCopyInstance.serialize(() => { this._currentDatabaseCopyInstance.serialize(() => {
this._currentDatabaseCopyInstance.run('CREATE TABLE IF NOT EXISTS pings (timestamp BIGINT NOT NULL, ip TINYTEXT, playerCount MEDIUMINT)') this._currentDatabaseCopyInstance.run('CREATE TABLE IF NOT EXISTS pings (timestamp BIGINT NOT NULL, ip TINYTEXT, playerCount MEDIUMINT)', err => {
if (err) {
logger.log('error', 'Cannot create initial table for daily database')
throw err
}
})
}) })
} }
return this._currentDatabaseCopyInstance return this._currentDatabaseCopyInstance
} }
ensureIndexes () { ensureIndexes (callback) {
const handleError = err => {
if (err) {
logger.log('error', 'Cannot create table or table index')
throw err
}
}
this._sql.serialize(() => { this._sql.serialize(() => {
this._sql.run('CREATE TABLE IF NOT EXISTS pings (timestamp BIGINT NOT NULL, ip TINYTEXT, playerCount MEDIUMINT)') this._sql.run('CREATE TABLE IF NOT EXISTS pings (timestamp BIGINT NOT NULL, ip TINYTEXT, playerCount MEDIUMINT)', handleError)
this._sql.run('CREATE INDEX IF NOT EXISTS ip_index ON pings (ip, playerCount)') this._sql.run('CREATE INDEX IF NOT EXISTS ip_index ON pings (ip, playerCount)', handleError)
this._sql.run('CREATE INDEX IF NOT EXISTS timestamp_index on PINGS (timestamp)') this._sql.run('CREATE INDEX IF NOT EXISTS timestamp_index on PINGS (timestamp)', [], err => {
handleError(err)
// Queries are executed one at a time; this is the last one.
// Note that queries not scheduled directly in the callback function of
// #serialize are not necessarily serialized.
callback()
})
}) })
} }
@ -125,13 +145,24 @@ class Database {
this._sql.all('SELECT * FROM pings WHERE timestamp >= ? AND timestamp <= ?', [ this._sql.all('SELECT * FROM pings WHERE timestamp >= ? AND timestamp <= ?', [
startTime, startTime,
endTime endTime
], (_, data) => callback(data)) ], (err, data) => {
if (err) {
logger.log('error', 'Cannot get recent pings')
throw err
}
callback(data)
})
} }
getRecord (ip, callback) { getRecord (ip, callback) {
this._sql.all('SELECT MAX(playerCount), timestamp FROM pings WHERE ip = ?', [ this._sql.all('SELECT MAX(playerCount), timestamp FROM pings WHERE ip = ?', [
ip ip
], (_, data) => { ], (err, data) => {
if (err) {
logger.log('error', `Cannot get ping record for ${ip}`)
throw err
}
// For empty results, data will be length 1 with [null, null] // For empty results, data will be length 1 with [null, null]
const playerCount = data[0]['MAX(playerCount)'] const playerCount = data[0]['MAX(playerCount)']
const timestamp = data[0].timestamp const timestamp = data[0].timestamp
@ -139,10 +170,10 @@ class Database {
// Allow null timestamps, the frontend will safely handle them // Allow null timestamps, the frontend will safely handle them
// This allows insertion of free standing records without a known timestamp // This allows insertion of free standing records without a known timestamp
if (playerCount !== null) { if (playerCount !== null) {
// eslint-disable-next-line standard/no-callback-literal // eslint-disable-next-line node/no-callback-literal
callback(true, playerCount, timestamp) callback(true, playerCount, timestamp)
} else { } else {
// eslint-disable-next-line standard/no-callback-literal // eslint-disable-next-line node/no-callback-literal
callback(false) callback(false)
} }
}) })
@ -161,7 +192,12 @@ class Database {
_insertPingTo (ip, timestamp, unsafePlayerCount, db) { _insertPingTo (ip, timestamp, unsafePlayerCount, db) {
const statement = db.prepare('INSERT INTO pings (timestamp, ip, playerCount) VALUES (?, ?, ?)') const statement = db.prepare('INSERT INTO pings (timestamp, ip, playerCount) VALUES (?, ?, ?)')
statement.run(timestamp, ip, unsafePlayerCount) statement.run(timestamp, ip, unsafePlayerCount, err => {
if (err) {
logger.error(`Cannot insert ping record of ${ip} at ${timestamp}`)
throw err
}
})
statement.finalize() statement.finalize()
} }
} }