/* Copyright (c) 2006 Nikolaj Hald Nielsen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "magnatunedatabasehandler.h" #include "debug.h" MagnatuneDatabaseHandler *MagnatuneDatabaseHandler::m_pInstance = 0; MagnatuneDatabaseHandler* MagnatuneDatabaseHandler::instance() { if ( m_pInstance == 0 ) { m_pInstance = new MagnatuneDatabaseHandler(); } return m_pInstance; } MagnatuneDatabaseHandler::MagnatuneDatabaseHandler() {} MagnatuneDatabaseHandler::~MagnatuneDatabaseHandler() {} void MagnatuneDatabaseHandler::createDatabase( ) { //Get database instance CollectionDB *db = CollectionDB::instance(); TQString tracksAutoIncrement = ""; TQString albumsAutoIncrement = ""; TQString artistAutoIncrement = ""; if ( db->getDbConnectionType() == DbConnection::postgresql ) { db->query( TQString( "CREATE SEQUENCE magnatune_track_seq;" ) ); db->query( TQString( "CREATE SEQUENCE magnatune_album_seq;" ) ); db->query( TQString( "CREATE SEQUENCE magnatune_artist_seq;" ) ); tracksAutoIncrement = TQString( "DEFAULT nextval('magnatune_track_seq')" ); albumsAutoIncrement = TQString( "DEFAULT nextval('magnatune_album_seq')" ); artistAutoIncrement = TQString( "DEFAULT nextval('magnatune_artist_seq')" ); } else if ( db->getDbConnectionType() == DbConnection::mysql ) { tracksAutoIncrement = "AUTO_INCREMENT"; albumsAutoIncrement = "AUTO_INCREMENT"; artistAutoIncrement = "AUTO_INCREMENT"; } // create table containing tracks TQString queryString = "CREATE TABLE magnatune_tracks (" "id INTEGER PRIMARY KEY " + tracksAutoIncrement + ',' + "name " + db->textColumnType() + ',' + "track_number INTEGER," "length INTEGER," "album_id INTEGER," "artist_id INTEGER," "preview_lofi " + db->exactTextColumnType() + ',' + "preview_hifi " + db->exactTextColumnType() + ");"; debug() << "Creating mangnatune_tracks: " << queryString << endl; TQStringList result = db->query( queryString ); //Create album table queryString = "CREATE TABLE magnatune_albums (" "id INTEGER PRIMARY KEY " + albumsAutoIncrement + ',' + "name " + db->textColumnType() + ',' + "year INTEGER," "artist_id INTEGER," "genre " + db->textColumnType() + ',' + "album_code " + db->textColumnType() + ',' + "cover_url " + db->exactTextColumnType() + ");"; debug() << "Creating mangnatune_albums: " << queryString << endl; result = db->query( queryString ); //Create artist table queryString = "CREATE TABLE magnatune_artists (" "id INTEGER PRIMARY KEY " + artistAutoIncrement + ',' + "name " + db->textColumnType() + ',' + "artist_page " + db->exactTextColumnType() + ',' + "description " + db->textColumnType() + ',' + "photo_url " + db->exactTextColumnType() + ");"; debug() << "Creating mangnatune_artist: " << queryString << endl; result = db->query( queryString ); } void MagnatuneDatabaseHandler::destroyDatabase( ) { CollectionDB *db = CollectionDB::instance(); TQStringList result = db->query( "DROP TABLE magnatune_tracks;" ); result = db->query( "DROP TABLE magnatune_albums;" ); result = db->query( "DROP TABLE magnatune_artists;" ); if ( db->getDbConnectionType() == DbConnection::postgresql ) { db->query( TQString( "DROP SEQUENCE magnatune_track_seq;" ) ); db->query( TQString( "DROP SEQUENCE magnatune_album_seq;" ) ); db->query( TQString( "DROP SEQUENCE magnatune_artist_seq;" ) ); } } int MagnatuneDatabaseHandler::insertTrack( MagnatuneTrack *track, int albumId, int artistId ) { TQString numberString; CollectionDB *db = CollectionDB::instance(); TQString queryString = "INSERT INTO magnatune_tracks ( name, track_number, length, " "album_id, artist_id, preview_lofi, preview_hifi ) VALUES ( '" + db->escapeString( track->getName() ) + "', " + TQString::number( track->getTrackNumber() ) + ", " + TQString::number( track->getDuration() ) + ", " + TQString::number( albumId ) + ", " + TQString::number( artistId ) + ", '" + db->escapeString( track->getLofiURL() ) + "', '" + db->escapeString( track->getHifiURL() ) + "' );"; // debug() << "Adding Magnatune track " << queryString << endl; return db->insert( queryString, NULL ); } int MagnatuneDatabaseHandler::insertAlbum( MagnatuneAlbum *album, int artistId ) { TQString queryString; CollectionDB *db = CollectionDB::instance(); queryString = "INSERT INTO magnatune_albums ( name, year, artist_id, " "genre, album_code, cover_url ) VALUES ( '" + db->escapeString( db->escapeString( album->getName() ) ) + "', " + TQString::number( album->getLaunchDate().year() ) + ", " + TQString::number( artistId ) + ", '" + db->escapeString( album->getMp3Genre() ) + "', '" + album->getAlbumCode() + "', '" + db->escapeString( album->getCoverURL() ) + "' );"; //debug() << "Adding Magnatune album " << queryString << endl; return db->insert( queryString, 0 ); } int MagnatuneDatabaseHandler::insertArtist( MagnatuneArtist *artist ) { TQString queryString; CollectionDB *db = CollectionDB::instance(); queryString = "INSERT INTO magnatune_artists ( name, artist_page, description, " "photo_url ) VALUES ( '" + db->escapeString( db->escapeString( artist->getName() ) ) + "', '" + db->escapeString( artist->getHomeURL() ) + "', '" + db->escapeString( artist->getDescription() ) + "', '" + db->escapeString( artist->getPhotoURL() ) + "' );"; //debug() << "Adding Magnatune artist " << queryString << endl; return db->insert( queryString, 0 ); } int MagnatuneDatabaseHandler::getArtistIdByExactName( TQString name ) { CollectionDB *db = CollectionDB::instance(); TQString queryString = "SELECT id from magnatune_artists WHERE name='" + db->escapeString( name ) + "';"; TQStringList result = db->query( queryString ); //debug() << "Looking for id of artist " << name << ":" << endl; if ( result.size() < 1 ) return -1; int artistId = result.first().toInt(); //debug() << " Found: " << TQString::number( artistId ) << ":" << endl; return artistId; } int MagnatuneDatabaseHandler::getAlbumIdByAlbumCode( TQString albumcode ) { CollectionDB *db = CollectionDB::instance(); TQString queryString = "SELECT id from magnatune_albums WHERE album_code='" + db->escapeString( albumcode ) + "';"; TQStringList result = db->query( queryString ); //debug() << "Looking for id of album " << albumcode << ":" << endl; if ( result.size() < 1 ) return -1; int albumId = result.first().toInt(); //debug() << " Found: " << TQString::number( albumId ) << ":" << endl; return albumId; } MagnatuneArtistList MagnatuneDatabaseHandler::getArtistsByGenre( TQString genre ) { TQString genreSql = ""; if ( genre != "All" ) { genreSql = "magnatune_albums.genre='" + genre + "' AND "; } CollectionDB *db = CollectionDB::instance(); TQString queryString; queryString = "SELECT DISTINCT magnatune_artists.id, " "magnatune_artists.name, magnatune_artists.artist_page, " "magnatune_artists.description, magnatune_artists.photo_url " "FROM magnatune_albums, magnatune_artists " "WHERE " + genreSql + "magnatune_albums.artist_id " "= magnatune_artists.id;"; TQStringList result = db->query( queryString ); debug() << "Looking for artist in genre: " << genre << endl; MagnatuneArtistList list; while ( result.size() > 0 ) { MagnatuneArtist artist; artist.setId( result.front().toInt() ); result.pop_front(); artist.setName( result.front() ); result.pop_front(); artist.setHomeURL( result.front() ); result.pop_front(); artist.setDescription( result.front() ); result.pop_front(); artist.setPhotoURL( result.front() ); result.pop_front(); list.append( artist ); } return list; } MagnatuneAlbumList MagnatuneDatabaseHandler::getAlbumsByArtistId( int id, TQString genre ) { TQString genreSqlString; if ( genre.isEmpty() ) { genreSqlString = ""; } else { genreSqlString = " AND magnatune_albums.genre='" + genre + '\''; } CollectionDB *db = CollectionDB::instance(); TQString queryString; queryString = "SELECT DISTINCT id, " "name, year, " "artist_id, genre, " "album_code, cover_url " "FROM magnatune_albums " "WHERE artist_id = '" + TQString::number( id ) + '\''; queryString += genreSqlString; queryString += ';'; TQStringList result = db->query( queryString ); MagnatuneAlbumList list; debug() << "Looking for Albums..." << endl; debug() << "Query string:" << queryString << endl; while ( result.size() > 0 ) { MagnatuneAlbum album; album.setId( result.front().toInt() ); result.pop_front(); album.setName( result.front() ); result.pop_front(); album.setLaunchDate( TQDate( result.front().toInt(), 1, 1 ) ); result.pop_front(); album.setArtistId( result.front().toInt() ); result.pop_front(); album.setMp3Genre( result.front() ); result.pop_front(); album.setAlbumCode( result.front() ); result.pop_front(); album.setCoverURL( result.front() ); result.pop_front(); list.append( album ); } return list; } MagnatuneTrackList MagnatuneDatabaseHandler::getTracksByAlbumId( int id ) { CollectionDB *db = CollectionDB::instance(); TQString queryString; queryString = "SELECT DISTINCT id, " "name, track_number, " "length, album_id, " "artist_id, preview_lofi, " "preview_hifi " "FROM magnatune_tracks " "WHERE album_id = '" + TQString::number( id ) + "';"; TQStringList result = db->query( queryString ); MagnatuneTrackList list; debug() << "Looking for tracks..." << endl; debug() << "Query string:" << queryString << endl; while ( result.size() > 0 ) { debug() << "track start" << endl; MagnatuneTrack track; track.setId( result.front().toInt() ); result.pop_front(); track.setName( result.front() ); result.pop_front(); track.setTrackNumber( result.front().toInt() ); result.pop_front(); track.setDuration( result.front().toInt() ); result.pop_front(); track.setAlbumId( result.front().toInt() ); result.pop_front(); track.setArtistId( result.front().toInt() ); result.pop_front(); track.setLofiURL( result.front() ); result.pop_front(); track.setHifiURL( result.front() ); result.pop_front(); list.append( track ); debug() << "track end" << endl; } return list; } TQStringList MagnatuneDatabaseHandler::getAlbumGenres( ) { CollectionDB *db = CollectionDB::instance(); TQString queryString; queryString = "SELECT DISTINCT genre " "FROM magnatune_albums " "ORDER BY genre;"; return db->query( queryString ); } void MagnatuneDatabaseHandler::begin( ) { CollectionDB *db = CollectionDB::instance(); TQString queryString = "BEGIN;"; db->query( queryString ); } void MagnatuneDatabaseHandler::commit( ) { CollectionDB *db = CollectionDB::instance(); TQString queryString = "COMMIT;"; db->query( queryString ); } MagnatuneArtist MagnatuneDatabaseHandler::getArtistById( int id ) { CollectionDB *db = CollectionDB::instance(); TQString queryString; queryString = "SELECT id, " "name, artist_page, " "description, photo_url " "FROM magnatune_artists " "WHERE id = '" + TQString::number( id ) + "';"; TQStringList result = db->query( queryString ); MagnatuneArtist artist; if ( result.size() == 5 ) { artist.setId( result.front().toInt() ); result.pop_front(); artist.setName( result.front() ); result.pop_front(); artist.setHomeURL( result.front() ); result.pop_front(); artist.setDescription( result.front() ); result.pop_front(); artist.setPhotoURL( result.front() ); result.pop_front(); } return artist; } MagnatuneAlbum MagnatuneDatabaseHandler::getAlbumById( int id ) { CollectionDB *db = CollectionDB::instance(); TQString queryString; queryString = "SELECT id, " "name, year, " "artist_id, genre, " "album_code, cover_url " "FROM magnatune_albums " "WHERE id = '" + TQString::number( id ) + "';"; TQStringList result = db->query( queryString ); MagnatuneAlbum album; if ( result.size() == 7 ) { album.setId( result.front().toInt() ); result.pop_front(); album.setName( result.front() ); result.pop_front(); album.setLaunchDate( TQDate( result.front().toInt(), 1, 1 ) ); result.pop_front(); album.setArtistId( result.front().toInt() ); result.pop_front(); album.setMp3Genre( result.front() ); result.pop_front(); album.setAlbumCode( result.front() ); result.pop_front(); album.setCoverURL( result.front() ); result.pop_front(); } return album; } MagnatuneTrackList MagnatuneDatabaseHandler::getTracksByArtistId( int id ) { MagnatuneAlbumList albums = getAlbumsByArtistId( id, "" ); MagnatuneAlbumList::iterator it; MagnatuneTrackList tracks; for ( it = albums.begin(); it != albums.end(); ++it ) { tracks += getTracksByAlbumId( ( *it ).getId() ); } return tracks; }