]>
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 foreign_keys = ON" )
26 log
. Printf ( " %q \n " , err
)
31 CREATE TABLE IF NOT EXISTS sessions (id INTEGER PRIMARY KEY AUTOINCREMENT, token TEXT, username TEXT, created TIMESTAMP, expiry TIMESTAMP);
32 CREATE TABLE IF NOT EXISTS playlists (id INTEGER PRIMARY KEY AUTOINCREMENT, enabled INTEGER, name TEXT, start_time TEXT);
33 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);
34 CREATE TABLE IF NOT EXISTS radios (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, token TEXT);
36 _
, err
= db
. sqldb
. Exec ( sqlStmt
)
38 log
. Printf ( " %q : %s \n " , err
, sqlStmt
)
43 func ( d
* Database
) CloseDatabase () {
47 func ( d
* Database
) InsertSession ( user
string , token
string , expiry time
. Time
) {
48 _
, err
:= d
. sqldb
. Exec ( "INSERT INTO sessions (token, username, created, expiry) values (?, ?, CURRENT_TIMESTAMP, ?)" , token
, user
, expiry
)
54 func ( d
* Database
) GetUserForSession ( token
string ) ( string , error
) {
56 err
:= d
. sqldb
. QueryRow ( "SELECT username FROM sessions WHERE token = ? AND expiry > CURRENT_TIMESTAMP" , token
). Scan (& username
)
58 return "" , errors
. New ( "no matching token" )
63 func ( d
* Database
) CreatePlaylist ( playlist Playlist
) int {
65 tx
, _
:= d
. sqldb
. Begin ()
66 _
, err
:= tx
. Exec ( "INSERT INTO playlists (enabled, name, start_time) values (?, ?, ?)" , playlist
. Enabled
, playlist
. Name
, playlist
. StartTime
)
70 err
= tx
. QueryRow ( "SELECT last_insert_rowid()" ). Scan (& id
)
81 func ( d
* Database
) DeletePlaylist ( playlistId
int ) {
82 d
. sqldb
. Exec ( "DELETE FROM playlists WHERE id = ?" , playlistId
)
85 func ( d
* Database
) GetPlaylists () [] Playlist
{
86 ret
:= make ([] Playlist
, 0 )
87 rows
, err
:= d
. sqldb
. Query ( "SELECT id, enabled, name, start_time FROM playlists ORDER BY id ASC" )
94 if err
:= rows
. Scan (& p
. Id
, & p
. Enabled
, & p
. Name
, & p
. StartTime
); err
!= nil {
102 func ( d
* Database
) GetPlaylist ( playlistId
int ) ( Playlist
, error
) {
104 err
:= d
. sqldb
. QueryRow ( "SELECT id, enabled, name, start_time FROM playlists WHERE id = ?" , playlistId
). Scan (& p
. Id
, & p
. Enabled
, & p
. Name
, & p
. StartTime
)
111 func ( d
* Database
) UpdatePlaylist ( playlist Playlist
) {
112 d
. sqldb
. Exec ( "UPDATE playlists SET enabled = ?, name = ?, start_time = ? WHERE id = ?" , playlist
. Enabled
, playlist
. Name
, playlist
. StartTime
, playlist
. Id
)
115 func ( d
* Database
) SetEntriesForPlaylist ( entries
[] PlaylistEntry
, playlistId
int ) {
116 tx
, _
:= d
. sqldb
. Begin ()
117 _
, err
:= tx
. Exec ( "DELETE FROM playlist_entries WHERE playlist_id = ?" , playlistId
)
118 for _
, e
:= range entries
{
119 _
, 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
)
124 tx
. Commit () // ignore errors
127 func ( d
* Database
) GetEntriesForPlaylist ( playlistId
int ) [] PlaylistEntry
{
128 ret
:= make ([] PlaylistEntry
, 0 )
129 rows
, err
:= d
. sqldb
. Query ( "SELECT id, position, filename, delay_seconds, is_relative FROM playlist_entries WHERE playlist_id = ? ORDER by position ASC" , playlistId
)
135 var entry PlaylistEntry
136 if err
:= rows
. Scan (& entry
. Id
, & entry
. Position
, & entry
. Filename
, & entry
. DelaySeconds
, & entry
. IsRelative
); err
!= nil {
139 ret
= append ( ret
, entry
)
144 func ( d
* Database
) GetRadio ( radioId
int ) ( Radio
, error
) {
146 err
:= d
. sqldb
. QueryRow ( "SELECT id, name, token FROM radios WHERE id = ?" , radioId
). Scan (& r
. Id
, & r
. Name
, & r
. Token
)
153 func ( d
* Database
) GetRadioByToken ( token
string ) ( Radio
, error
) {
155 err
:= d
. sqldb
. QueryRow ( "SELECT id, name, token FROM radios WHERE token = ?" , token
). Scan (& r
. Id
, & r
. Name
, & r
. Token
)
162 func ( d
* Database
) GetRadios () [] Radio
{
163 ret
:= make ([] Radio
, 0 )
164 rows
, err
:= d
. sqldb
. Query ( "SELECT id, name, token FROM radios ORDER BY id ASC" )
171 if err
:= rows
. Scan (& r
. Id
, & r
. Name
, & r
. Token
); err
!= nil {
179 func ( d
* Database
) DeleteRadio ( radioId
int ) {
180 d
. sqldb
. Exec ( "DELETE FROM radios WHERE id = ?" , radioId
)
183 func ( d
* Database
) CreateRadio ( radio Radio
) {
184 d
. sqldb
. Exec ( "INSERT INTO radios (name, token) values (?, ?)" , radio
. Name
, radio
. Token
)
187 func ( d
* Database
) UpdateRadio ( radio Radio
) {
188 d
. sqldb
. Exec ( "UPDATE radios SET name = ?, token = ? WHERE id = ?" , radio
. Name
, radio
. Token
, radio
. Id
)