From 19e86b8c044ca43dbe5c2c712358c52c214f7aff Mon Sep 17 00:00:00 2001 From: Gabe Kangas Date: Mon, 26 Oct 2020 08:55:31 -0700 Subject: [PATCH] First pass at centralized database reference. Closes #282 (#289) * First pass at centralized database reference. Closes #282 * Add verbose logging option to launch.json * Clear current broadcaster on stream end. Closes #285 * Fix typo in verbose launch args * Add support for purging tailwind styles. For #224 * Don't need to pass db as param since it is stored * Commit updated Javascript packages Co-authored-by: Owncast --- .gitignore | 1 + config/config.go | 28 ++++++++++++++++++---------- config/defaults.go | 1 + core/chat/persistence.go | 22 ++++------------------ core/data/data.go | 37 +++++++++++++++++++++++++++++++++++++ main.go | 13 ++++++++----- 6 files changed, 69 insertions(+), 33 deletions(-) create mode 100644 core/data/data.go diff --git a/.gitignore b/.gitignore index 7fd92c6b5..99a23c32d 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ chat.db .yp.key !webroot/js/web_modules/**/dist +!core/data diff --git a/config/config.go b/config/config.go index a5b815d73..ad8f43771 100644 --- a/config/config.go +++ b/config/config.go @@ -14,16 +14,16 @@ var Config *config var _default config type config struct { - ChatDatabaseFilePath string `yaml:"chatDatabaseFile"` - EnableDebugFeatures bool `yaml:"-"` - FFMpegPath string `yaml:"ffmpegPath"` - Files files `yaml:"files"` - InstanceDetails InstanceDetails `yaml:"instanceDetails"` - S3 S3 `yaml:"s3"` - VersionInfo string `yaml:"-"` // For storing the version/build number - VideoSettings videoSettings `yaml:"videoSettings"` - WebServerPort int `yaml:"webServerPort"` - YP YP `yaml:"yp"` + DatabaseFilePath string `yaml:"databaseFile"` + EnableDebugFeatures bool `yaml:"-"` + FFMpegPath string `yaml:"ffmpegPath"` + Files files `yaml:"files"` + InstanceDetails InstanceDetails `yaml:"instanceDetails"` + S3 S3 `yaml:"s3"` + VersionInfo string `yaml:"-"` // For storing the version/build number + VideoSettings videoSettings `yaml:"videoSettings"` + WebServerPort int `yaml:"webServerPort"` + YP YP `yaml:"yp"` } // InstanceDetails defines the user-visible information about this particular instance. @@ -193,6 +193,14 @@ func (c *config) GetYPServiceHost() string { return _default.YP.YPServiceURL } +func (c *config) GetDataFilePath() string { + if c.DatabaseFilePath != "" { + return c.DatabaseFilePath + } + + return _default.DatabaseFilePath +} + func (c *config) GetVideoStreamQualities() []StreamQuality { if len(c.VideoSettings.StreamQualities) > 0 { return c.VideoSettings.StreamQualities diff --git a/config/defaults.go b/config/defaults.go index 32b451d06..92093ef71 100644 --- a/config/defaults.go +++ b/config/defaults.go @@ -15,6 +15,7 @@ func getDefaults() config { defaults.Files.MaxNumberInPlaylist = 5 defaults.YP.Enabled = false defaults.YP.YPServiceURL = "https://yp.owncast.online" + defaults.DatabaseFilePath = "data/owncast.db" defaultQuality := StreamQuality{ IsAudioPassthrough: true, diff --git a/core/chat/persistence.go b/core/chat/persistence.go index dcf4c8d0e..24a011b7f 100644 --- a/core/chat/persistence.go +++ b/core/chat/persistence.go @@ -2,36 +2,22 @@ package chat import ( "database/sql" - "os" "time" _ "github.com/mattn/go-sqlite3" - "github.com/owncast/owncast/config" + "github.com/owncast/owncast/core/data" "github.com/owncast/owncast/models" - "github.com/owncast/owncast/utils" log "github.com/sirupsen/logrus" ) var _db *sql.DB func setupPersistence() { - file := config.Config.ChatDatabaseFilePath - // Create empty DB file if it doesn't exist. - if !utils.DoesFileExists(file) { - log.Traceln("Creating new chat history database at", file) - - _, err := os.Create(file) - if err != nil { - log.Fatal(err.Error()) - } - } - - sqliteDatabase, _ := sql.Open("sqlite3", file) - _db = sqliteDatabase - createTable(sqliteDatabase) + _db = data.GetDatabase() + createTable() } -func createTable(db *sql.DB) { +func createTable() { createTableSQL := `CREATE TABLE IF NOT EXISTS messages ( "id" string NOT NULL PRIMARY KEY, "author" TEXT, diff --git a/core/data/data.go b/core/data/data.go new file mode 100644 index 000000000..1f0f214e9 --- /dev/null +++ b/core/data/data.go @@ -0,0 +1,37 @@ +// This is a centralized place to connect to the database, and hold a reference to it. +// Other packages can share this reference. This package would also be a place to add any kind of +// persistence-related convenience methods or migrations. + +package data + +import ( + "database/sql" + "os" + + "github.com/owncast/owncast/config" + "github.com/owncast/owncast/utils" + log "github.com/sirupsen/logrus" +) + +var _db *sql.DB + +func GetDatabase() *sql.DB { + return _db +} + +func SetupPersistence() { + file := config.Config.DatabaseFilePath + + // Create empty DB file if it doesn't exist. + if !utils.DoesFileExists(file) { + log.Traceln("Creating new database at", file) + + _, err := os.Create(file) + if err != nil { + log.Fatal(err.Error()) + } + } + + sqliteDatabase, _ := sql.Open("sqlite3", file) + _db = sqliteDatabase +} diff --git a/main.go b/main.go index 2053e036a..a4e7bdfbc 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "github.com/owncast/owncast/config" "github.com/owncast/owncast/core" + "github.com/owncast/owncast/core/data" "github.com/owncast/owncast/metrics" "github.com/owncast/owncast/router" ) @@ -29,7 +30,7 @@ func main() { log.Infoln(getVersion()) configFile := flag.String("configFile", "config.yaml", "Config File full path. Defaults to current folder") - chatDbFile := flag.String("chatDatabase", "", "Path to the chat database file.") + dbFile := flag.String("database", "", "Path to the database file.") enableDebugOptions := flag.Bool("enableDebugFeatures", false, "Enable additional debugging options.") enableVerboseLogging := flag.Bool("enableVerboseLogging", false, "Enable additional logging.") @@ -50,14 +51,16 @@ func main() { } config.Config.EnableDebugFeatures = *enableDebugOptions - if *chatDbFile != "" { - config.Config.ChatDatabaseFilePath = *chatDbFile - } else if config.Config.ChatDatabaseFilePath == "" { - config.Config.ChatDatabaseFilePath = "chat.db" + if *dbFile != "" { + config.Config.DatabaseFilePath = *dbFile + } else if config.Config.DatabaseFilePath == "" { + config.Config.DatabaseFilePath = config.Config.GetDataFilePath() } go metrics.Start() + data.SetupPersistence() + // starts the core if err := core.Start(); err != nil { log.Error("failed to start the core package")