]>
code.octet-stream.net Git - broadcaster/blob - server/database.go
11 type Database
struct {
18 sqldb
, err
:= sql
. Open ( "sqlite" , config
. SqliteDB
)
24 _
, err
= db
. sqldb
. Exec ( "PRAGMA journal_mode = WAL" )
29 _
, err
= db
. sqldb
. Exec ( "PRAGMA foreign_keys = ON" )
34 _
, err
= db
. sqldb
. Exec ( "PRAGMA busy_timeout = 5000" )
40 CREATE TABLE IF NOT EXISTS sessions (id INTEGER PRIMARY KEY AUTOINCREMENT, token TEXT, username TEXT, created TIMESTAMP, expiry TIMESTAMP);
41 CREATE TABLE IF NOT EXISTS playlists (id INTEGER PRIMARY KEY AUTOINCREMENT, enabled INTEGER, name TEXT, start_time TEXT);
42 CREATE TABLE IF NOT EXISTS playlist_entries (id INTEGER PRIMARY KEY AUTOINCREMENT, playlist_id INTEGER, position INTEGER, filename TEXT, delay_seconds INTEGER, is_relative INTEGER, CONSTRAINT fk_playlists FOREIGN KEY (playlist_id) REFERENCES playlists(id) ON DELETE CASCADE);
43 CREATE TABLE IF NOT EXISTS radios (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, token TEXT);
44 CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE, password_hash TEXT, is_admin INTEGER);
46 DELETE FROM sessions WHERE expiry < CURRENT_TIMESTAMP;
48 _
, err
= db
. sqldb
. Exec ( sqlStmt
)
50 log
. Printf ( " %q : %s \n " , err
, sqlStmt
)
55 func ( d
* Database
) CloseDatabase () {
59 func ( d
* Database
) InsertSession ( user
string , token
string , expiry time
. Time
) {
60 _
, err
:= d
. sqldb
. Exec ( "INSERT INTO sessions (token, username, created, expiry) values (?, ?, CURRENT_TIMESTAMP, ?)" , token
, user
, expiry
)
66 func ( d
* Database
) GetUserNameForSession ( token
string ) ( string , error
) {
68 err
:= d
. sqldb
. QueryRow ( "SELECT username FROM sessions WHERE token = ? AND expiry > CURRENT_TIMESTAMP" , token
). Scan (& username
)
70 return "" , errors
. New ( "no matching token" )
75 func ( d
* Database
) GetUser ( username
string ) ( User
, error
) {
77 err
:= d
. sqldb
. QueryRow ( "SELECT id, username, password_hash, is_admin FROM users WHERE username = ?" , username
). Scan (& user
. Id
, & user
. Username
, & user
. PasswordHash
, & user
. IsAdmin
)
79 return User
{}, errors
. New ( "no user with that username" )
84 func ( d
* Database
) GetUserById ( id
int ) ( User
, error
) {
86 err
:= d
. sqldb
. QueryRow ( "SELECT id, username, password_hash, is_admin FROM users WHERE id = ?" , id
). Scan (& user
. Id
, & user
. Username
, & user
. PasswordHash
, & user
. IsAdmin
)
88 return User
{}, errors
. New ( "no user with that id" )
93 func ( d
* Database
) GetUsers () [] User
{
94 ret
:= make ([] User
, 0 )
95 rows
, err
:= d
. sqldb
. Query ( "SELECT id, username, password_hash, is_admin FROM users ORDER BY username ASC" )
102 if err
:= rows
. Scan (& u
. Id
, & u
. Username
, & u
. PasswordHash
, & u
. IsAdmin
); err
!= nil {
110 func ( d
* Database
) SetUserPassword ( username
string , passwordHash
string ) {
111 d
. sqldb
. Exec ( "UPDATE users SET password_hash = ? WHERE username = ?" , passwordHash
, username
)
114 func ( d
* Database
) ClearOtherSessions ( username
string , token
string ) {
115 d
. sqldb
. Exec ( "DELETE FROM sessions WHERE username = ? AND token != ?" , username
, token
)
118 func ( d
* Database
) ClearSession ( username
string , token
string ) {
119 d
. sqldb
. Exec ( "DELETE FROM sessions WHERE username = ? AND token = ?" , username
, token
)
122 func ( d
* Database
) SetUserIsAdmin ( username
string , isAdmin
bool ) {
123 d
. sqldb
. Exec ( "UPDATE users SET is_admin = ? WHERE username = ?" , isAdmin
, username
)
126 func ( d
* Database
) CreateUser ( user User
) error
{
127 _
, err
:= d
. sqldb
. Exec ( "INSERT INTO users (username, password_hash, is_admin) values (?, ?, ?)" , user
. Username
, user
. PasswordHash
, user
. IsAdmin
)
131 func ( d
* Database
) DeleteUser ( username
string ) error
{
132 _
, err
:= d
. sqldb
. Exec ( "DELETE FROM users WHERE username = ?" , username
)
136 func ( d
* Database
) CreatePlaylist ( playlist Playlist
) int {
138 tx
, _
:= d
. sqldb
. Begin ()
139 _
, err
:= tx
. Exec ( "INSERT INTO playlists (enabled, name, start_time) values (?, ?, ?)" , playlist
. Enabled
, playlist
. Name
, playlist
. StartTime
)
143 err
= tx
. QueryRow ( "SELECT last_insert_rowid()" ). Scan (& id
)
154 func ( d
* Database
) DeletePlaylist ( playlistId
int ) {
155 d
. sqldb
. Exec ( "DELETE FROM playlists WHERE id = ?" , playlistId
)
158 func ( d
* Database
) GetPlaylists () [] Playlist
{
159 ret
:= make ([] Playlist
, 0 )
160 rows
, err
:= d
. sqldb
. Query ( "SELECT id, enabled, name, start_time FROM playlists ORDER BY id ASC" )
167 if err
:= rows
. Scan (& p
. Id
, & p
. Enabled
, & p
. Name
, & p
. StartTime
); err
!= nil {
175 func ( d
* Database
) GetPlaylist ( playlistId
int ) ( Playlist
, error
) {
177 err
:= d
. sqldb
. QueryRow ( "SELECT id, enabled, name, start_time FROM playlists WHERE id = ?" , playlistId
). Scan (& p
. Id
, & p
. Enabled
, & p
. Name
, & p
. StartTime
)
184 func ( d
* Database
) UpdatePlaylist ( playlist Playlist
) {
185 d
. sqldb
. Exec ( "UPDATE playlists SET enabled = ?, name = ?, start_time = ? WHERE id = ?" , playlist
. Enabled
, playlist
. Name
, playlist
. StartTime
, playlist
. Id
)
188 func ( d
* Database
) SetEntriesForPlaylist ( entries
[] PlaylistEntry
, playlistId
int ) {
189 tx
, _
:= d
. sqldb
. Begin ()
190 _
, err
:= tx
. Exec ( "DELETE FROM playlist_entries WHERE playlist_id = ?" , playlistId
)
191 for _
, e
:= range entries
{
192 _
, err
= tx
. Exec ( "INSERT INTO playlist_entries (playlist_id, position, filename, delay_seconds, is_relative) values (?, ?, ?, ?, ?)" , playlistId
, e
. Position
, e
. Filename
, e
. DelaySeconds
, e
. IsRelative
)
197 tx
. Commit () // ignore errors
200 func ( d
* Database
) GetEntriesForPlaylist ( playlistId
int ) [] PlaylistEntry
{
201 ret
:= make ([] PlaylistEntry
, 0 )
202 rows
, err
:= d
. sqldb
. Query ( "SELECT id, position, filename, delay_seconds, is_relative FROM playlist_entries WHERE playlist_id = ? ORDER by position ASC" , playlistId
)
208 var entry PlaylistEntry
209 if err
:= rows
. Scan (& entry
. Id
, & entry
. Position
, & entry
. Filename
, & entry
. DelaySeconds
, & entry
. IsRelative
); err
!= nil {
212 ret
= append ( ret
, entry
)
217 func ( d
* Database
) GetRadio ( radioId
int ) ( Radio
, error
) {
219 err
:= d
. sqldb
. QueryRow ( "SELECT id, name, token FROM radios WHERE id = ?" , radioId
). Scan (& r
. Id
, & r
. Name
, & r
. Token
)
226 func ( d
* Database
) GetRadioByToken ( token
string ) ( Radio
, error
) {
228 err
:= d
. sqldb
. QueryRow ( "SELECT id, name, token FROM radios WHERE token = ?" , token
). Scan (& r
. Id
, & r
. Name
, & r
. Token
)
235 func ( d
* Database
) GetRadios () [] Radio
{
236 ret
:= make ([] Radio
, 0 )
237 rows
, err
:= d
. sqldb
. Query ( "SELECT id, name, token FROM radios ORDER BY id ASC" )
244 if err
:= rows
. Scan (& r
. Id
, & r
. Name
, & r
. Token
); err
!= nil {
252 func ( d
* Database
) DeleteRadio ( radioId
int ) {
253 d
. sqldb
. Exec ( "DELETE FROM radios WHERE id = ?" , radioId
)
256 func ( d
* Database
) CreateRadio ( radio Radio
) {
257 d
. sqldb
. Exec ( "INSERT INTO radios (name, token) values (?, ?)" , radio
. Name
, radio
. Token
)
260 func ( d
* Database
) UpdateRadio ( radio Radio
) {
261 d
. sqldb
. Exec ( "UPDATE radios SET name = ?, token = ? WHERE id = ?" , radio
. Name
, radio
. Token
, radio
. Id
)