Changeset 27

Show
Ignore:
Timestamp:
07/09/07 23:49:08 (5 years ago)
Author:
dlefevre
Message:

Updates:
- fixed error in queries with special characters
- fixed SELECT song FROM genre
- fixed add album to playlist
- fixed add artist to playlist
- fixed add genre to playlist
- Added workaround for the missing INSERT IF NOT EXISTS (see mutex table)
- Added add genre method
- Added add artist method

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • mymrc/trunk/mymrc/src/db/audioqueries.py

    r18 r27  
    22from settings.settings import Settings 
    33from db.dbdriver import DBDriverClass 
     4 
     5 
    46class AudioQueries(object): 
    57    def __init__(self): 
     
    2426     
    2527    def albums(self): 
    26         query = """SELECT title FROM audio_album;""" 
     28        query = """SELECT title FROM audio_album ORDER BY title;""" 
    2729        return self._iDB.execute(query)   
    2830     
     
    4042WHERE audio_song.artist_id = audio_artist.id AND 
    4143      audio_song.album_id = audio_album.id AND 
    42       audio_song.album_id IN (SELECT id FROM audio_album WHERE title = '%s') AND 
     44      audio_song.album_id IN (SELECT id FROM audio_album WHERE title = ?) AND 
    4345      audio_song.genre_id = audio_genre.id 
    4446ORDER BY audio_artist.name, audio_album.title, audio_song.title;""" 
    45         return self._iDB.execute(query%(aAlbumTitle))       
    46      
    47     def artists(self): 
    48         query = """SELECT name FROM audio_artist;""" 
     47        return self._iDB.execute(query, (aAlbumTitle,))       
     48     
     49    def artists(self, raw=False): 
     50        if raw: 
     51            query = """SELECT * FROM audio_artist ORDER BY name;""" 
     52        else: 
     53            query = """SELECT name FROM audio_artist ORDER BY name;""" 
    4954        return self._iDB.execute(query)    
    5055     
     
    6166FROM audio_song, audio_artist, audio_album, audio_genre 
    6267WHERE audio_song.artist_id = audio_artist.id AND 
    63       audio_song.artist_id = (SELECT id FROM audio_artist WHERE name = '%s') AND 
     68      audio_song.artist_id = (SELECT id FROM audio_artist WHERE name = ?) AND 
    6469      audio_song.album_id = audio_album.id AND 
    6570      audio_song.genre_id = audio_genre.id 
    6671ORDER BY audio_album.title, audio_song.title;""" 
    67         return self._iDB.execute(query%(aArtistName)) 
     72        return self._iDB.execute(query, (aArtistName,)) 
    6873     
    6974     
     
    7479WHERE audio_song.album_id = audio_album.id AND 
    7580      audio_song.artist_id = audio_artist.id AND 
    76       audio_song.artist_id = (SELECT id FROM audio_artist WHERE name = '%s') 
     81      audio_song.artist_id = (SELECT id FROM audio_artist WHERE name = ?) 
    7782ORDER BY audio_album.title;""" 
    78         return self._iDB.execute(query%(aArtistName))    
     83        return self._iDB.execute(query,(aArtistName,))    
    7984     
    8085     
     
    9297    ## Get all songs from a genre 
    9398    def genreSongs(self, aGenre): 
    94         query = """SELECT audio_song.id AS id, 
    95        audio_song.path AS path, 
    96        audio_artist.name AS artist, 
    97        audio_song.title AS title, 
    98        audio_album.title AS album, 
    99        audio_song.track_no AS track, 
    100        audio_genre.name AS genre, 
    101        audio_song.time AS time 
    102 FROM audio_song, audio_artist, audio_album, audio_genre 
    103 WHERE audio_song.artist_id = audio_artist.id AND 
     99        query = """ 
     100SELECT audio_song.id AS id, 
     101       audio_song.path AS path, 
     102       audio_artist.name AS artist, 
     103       audio_song.title AS title, 
     104       audio_album.title AS album, 
     105       audio_song.track_no AS track, 
     106       audio_genre.name AS genre, 
     107       audio_song.time AS time 
     108FROM audio_song, audio_artist, audio_album, audio_genre 
     109WHERE audio_song.genre_id = (SELECT audio_genre.id FROM audio_genre WHERE audio_genre.name = ?) AND 
    104110      audio_song.album_id = audio_album.id AND 
    105111      audio_song.genre_id = audio_genre.id AND 
    106       audio_song.artist_id = (SELECT id FROM audio_genre WHERE name = '%s') 
    107 ORDER BY audio_album.title, audio_song.title;""" 
    108         return self._iDB.execute(query%(aGenre)) 
    109      
    110      
    111  
    112      
    113  
    114      
     112      audio_artist.id = audio_song.artist_id  
     113ORDER BY audio_album.title, audio_song.title; 
     114""" 
     115        return self._iDB.execute(query, (aGenre,)) 
     116     
     117     
     118    ## Add artist if not exists. 
     119    #  @param self The object pointer.  
     120    def addArtist(self, aArtist): 
     121        print "AddArtist: ", aArtist 
     122        query = """INSERT INTO audio_artist(name) 
     123SELECT ? 
     124FROM mutex 
     125    LEFT OUTER JOIN audio_artist 
     126        ON audio_artist.name = ? 
     127WHERE mutex.i = 1 AND audio_artist.name IS NULL;""" 
     128        return DBDriver().execute(query, (aArtist.title(), aArtist.title())) 
     129     
     130     
     131    ## Add album if not exists. 
     132    #  @param self The object pointer. 
     133    def addAlbum(self, aAlbum): 
     134        query = """INSERT INTO audio_album(title) 
     135SELECT ? 
     136FROM mutex 
     137    LEFT OUTER JOIN audio_album 
     138        ON audio_album.title = ? 
     139WHERE mutex.i = 1 AND audio_album.title IS NULL;""" 
     140        return DBDriver().execute(query, (aAlbum.title(), aAlbum.title())) 
     141    
    115142     
    116143    ## Get all available playlists. 
     
    139166      audio_song.genre_id = audio_genre.id AND 
    140167      audio_song.id = audio_playlist_data.song_id AND 
    141       audio_playlist_data.playlist_id = (SELECT id FROM audio_playlist WHERE name='%s') 
    142 ORDER BY audio_artist.name, audio_album.title, audio_song.title;""" 
    143         return self._iDB.execute(query%(aPlaylist)) 
     168      audio_playlist_data.playlist_id = (SELECT id FROM audio_playlist WHERE name=?) 
     169ORDER BY audio_playlist_data.id;""" 
     170        return self._iDB.execute(query, (aPlaylist,)) 
    144171     
    145172    def songById(self, aId): 
    146         query = """ SELECT path FROM audio_song WHERE id=%s""" %(aId) 
    147         return self._iDB.execute(query).fetchall() 
    148      
     173        query = """ SELECT path FROM audio_song WHERE id=?""" 
     174        return self._iDB.execute(query, (aId)) 
     175     
     176    def songByTitle(self, aTitle): 
     177        query = """ SELECT * FROM audio_song WHERE title=?""" 
     178        return self._iDB.execute(query,(aTitle,)) 
    149179     
    150180    def addSongToPlaylist(self, aPlaylistId, aSongId): 
    151181        query = """ INSERT INTO audio_playlist_data(playlist_id, song_id)  
    152 values('%s', '%s')""" 
    153         return self._iDB.execute(query%(aPlaylistId, aSongId)) 
     182values(?, ?)""" 
     183        return self._iDB.execute(query, (aPlaylistId, aSongId)) 
     184     
     185     
     186    ## Insert a whole artist into a playlist. 
     187    def addArtistToPlaylist(self, aArtist, aPlaylist): 
     188        query = """INSERT INTO audio_playlist_data(playlist_id, song_id) 
     189    SELECT audio_playlist.id, audio_song.id 
     190    FROM audio_playlist, audio_song 
     191    WHERE audio_song.artist_id IN (SELECT audio_artist.id FROM audio_artist WHERE  
     192    audio_artist.name = ?) AND audio_playlist.name = ?;""" 
     193        return self._iDB.execute(query, (aArtist, aPlaylist)) 
     194     
     195     
     196    ## Insert a whole album into a playlist. 
     197    def addAlbumToPlaylist(self, aAlbum, aPlaylist): 
     198        print "aAlbum: ", aAlbum 
     199        print "aPlaylist: ", aPlaylist 
     200        query = """INSERT INTO audio_playlist_data(playlist_id, song_id) 
     201    SELECT audio_playlist.id, audio_song.id 
     202    FROM audio_playlist, audio_song 
     203    WHERE audio_song.album_id IN (SELECT audio_album.id FROM audio_album WHERE  
     204    audio_album.title = ?) AND audio_playlist.name = ?;""" 
     205        return self._iDB.execute(query, (aAlbum, aPlaylist)) 
     206     
     207     
     208    ## Insert a whole genre into a playlist 
     209    def addGenreToPlaylist(self, aGenre, aPlaylist): 
     210        query = """INSERT INTO audio_playlist_data(playlist_id, song_id) 
     211    SELECT audio_playlist.id, audio_song.id 
     212    FROM audio_playlist, audio_song 
     213    WHERE audio_song.genre_id IN (SELECT audio_genre.id FROM audio_genre WHERE  
     214    audio_genre.name = ?) AND audio_playlist.name = ?;""" 
     215        return self._iDB.execute(query,(aGenre, aPlaylist)) 
     216     
     217     
     218    ## Delete a playlist 
     219    #  @note: since SQLite doesn't really deal with foreign keys, we can't just 
     220    #  use an ON DELETE CASCADE in the table creation, so we have to delete 
     221    #  all entries manually 
     222    def deletePlaylist(self, aPlaylist): 
     223        query = """DELETE FROM audio_playlist_data WHERE audio_playlist_id = ?; 
     224DELETE FROM audio_playlist WHERE id = ?"""  
     225        return self._iDB.execute(query, (aPlaylist, aPlaylist)) 
     226     
     227     
     228    ## Add song to database 
     229    def addSong(self, aPath, aTitle, aArtist, aAlbum, aGenre, aTrackNb=None, aTime=None): 
     230        query = """ INSERT INTO audio_artist(name) VALUES (?) WHERE NOT EXISTS((SELECT name FROM audio_artist WHERE name=?))""" 
     231        aArtist 
     232        aAlbum, 
     233         
     234        query = 'INSERT INTO audio_song(path, title, artist_id, album_id, genre_id, ' 
     235        if aTrackNb: 
     236            query += ', track_no' 
     237        if aTime: 
     238            query += ', time' 
     239        query += ')' 
     240        query += """VALUES( ?, ?, """ % (aPath, aTitle) 
     241        query += """(SELECT id FROM audio_artist WHERE name=?), """ % (aArtist) 
     242        query += """(SELECT id FROM audio_album WHERE title=?), """ % (aAlbum) 
     243        query += """(SELECT id FROM audio_genre WHERE name=?), """ % (aGenre) 
     244        if aTrackNb: 
     245            query += """'%d', """ 
     246        if aTime: 
     247            query += """'%d')""" 
     248        return self._iDB.execute(query) 
    154249 
    155250