]>
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);
45 _
, err
= db
. sqldb
. Exec ( sqlStmt
)
47 log
. Printf ( " %q : %s \n " , err
, sqlStmt
)
52 func ( d
* Database
) CloseDatabase () {
56 func ( d
* Database
) InsertSession ( user
string , token
string , expiry time
. Time
) {
57 _
, err
:= d
. sqldb
. Exec ( "INSERT INTO sessions (token, username, created, expiry) values (?, ?, CURRENT_TIMESTAMP, ?)" , token
, user
, expiry
)
63 func ( d
* Database
) GetUserForSession ( token
string ) ( string , error
) {
65 err
:= d
. sqldb
. QueryRow ( "SELECT username FROM sessions WHERE token = ? AND expiry > CURRENT_TIMESTAMP" , token
). Scan (& username
)
67 return "" , errors
. New ( "no matching token" )
72 func ( d
* Database
) CreatePlaylist ( playlist Playlist
) int {
74 tx
, _
:= d
. sqldb
. Begin ()
75 _
, err
:= tx
. Exec ( "INSERT INTO playlists (enabled, name, start_time) values (?, ?, ?)" , playlist
. Enabled
, playlist
. Name
, playlist
. StartTime
)
79 err
= tx
. QueryRow ( "SELECT last_insert_rowid()" ). Scan (& id
)
90 func ( d
* Database
) DeletePlaylist ( playlistId
int ) {
91 d
. sqldb
. Exec ( "DELETE FROM playlists WHERE id = ?" , playlistId
)
94 func ( d
* Database
) GetPlaylists () [] Playlist
{
95 ret
:= make ([] Playlist
, 0 )
96 rows
, err
:= d
. sqldb
. Query ( "SELECT id, enabled, name, start_time FROM playlists ORDER BY id ASC" )
103 if err
:= rows
. Scan (& p
. Id
, & p
. Enabled
, & p
. Name
, & p
. StartTime
); err
!= nil {
111 func ( d
* Database
) GetPlaylist ( playlistId
int ) ( Playlist
, error
) {
113 err
:= d
. sqldb
. QueryRow ( "SELECT id, enabled, name, start_time FROM playlists WHERE id = ?" , playlistId
). Scan (& p
. Id
, & p
. Enabled
, & p
. Name
, & p
. StartTime
)
120 func ( d
* Database
) UpdatePlaylist ( playlist Playlist
) {
121 d
. sqldb
. Exec ( "UPDATE playlists SET enabled = ?, name = ?, start_time = ? WHERE id = ?" , playlist
. Enabled
, playlist
. Name
, playlist
. StartTime
, playlist
. Id
)
124 func ( d
* Database
) SetEntriesForPlaylist ( entries
[] PlaylistEntry
, playlistId
int ) {
125 tx
, _
:= d
. sqldb
. Begin ()
126 _
, err
:= tx
. Exec ( "DELETE FROM playlist_entries WHERE playlist_id = ?" , playlistId
)
127 for _
, e
:= range entries
{
128 _
, 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
)
133 tx
. Commit () // ignore errors
136 func ( d
* Database
) GetEntriesForPlaylist ( playlistId
int ) [] PlaylistEntry
{
137 ret
:= make ([] PlaylistEntry
, 0 )
138 rows
, err
:= d
. sqldb
. Query ( "SELECT id, position, filename, delay_seconds, is_relative FROM playlist_entries WHERE playlist_id = ? ORDER by position ASC" , playlistId
)
144 var entry PlaylistEntry
145 if err
:= rows
. Scan (& entry
. Id
, & entry
. Position
, & entry
. Filename
, & entry
. DelaySeconds
, & entry
. IsRelative
); err
!= nil {
148 ret
= append ( ret
, entry
)
153 func ( d
* Database
) GetRadio ( radioId
int ) ( Radio
, error
) {
155 err
:= d
. sqldb
. QueryRow ( "SELECT id, name, token FROM radios WHERE id = ?" , radioId
). Scan (& r
. Id
, & r
. Name
, & r
. Token
)
162 func ( d
* Database
) GetRadioByToken ( token
string ) ( Radio
, error
) {
164 err
:= d
. sqldb
. QueryRow ( "SELECT id, name, token FROM radios WHERE token = ?" , token
). Scan (& r
. Id
, & r
. Name
, & r
. Token
)
171 func ( d
* Database
) GetRadios () [] Radio
{
172 ret
:= make ([] Radio
, 0 )
173 rows
, err
:= d
. sqldb
. Query ( "SELECT id, name, token FROM radios ORDER BY id ASC" )
180 if err
:= rows
. Scan (& r
. Id
, & r
. Name
, & r
. Token
); err
!= nil {
188 func ( d
* Database
) DeleteRadio ( radioId
int ) {
189 d
. sqldb
. Exec ( "DELETE FROM radios WHERE id = ?" , radioId
)
192 func ( d
* Database
) CreateRadio ( radio Radio
) {
193 d
. sqldb
. Exec ( "INSERT INTO radios (name, token) values (?, ?)" , radio
. Name
, radio
. Token
)
196 func ( d
* Database
) UpdateRadio ( radio Radio
) {
197 d
. sqldb
. Exec ( "UPDATE radios SET name = ?, token = ? WHERE id = ?" , radio
. Name
, radio
. Token
, radio
. Id
)