File indexing completed on 2024-05-19 04:50:23

0001 /****************************************************************************************
0002  * Copyright (c) 2008 Nikolaj Hald Nielsen <nhn@kde.org>                                *
0003  *                                                                                      *
0004  * This program is free software; you can redistribute it and/or modify it under        *
0005  * the terms of the GNU General Public License as published by the Free Software        *
0006  * Foundation; either version 2 of the License, or (at your option) any later           *
0007  * version.                                                                             *
0008  *                                                                                      *
0009  * This program is distributed in the hope that it will be useful, but WITHOUT ANY      *
0010  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A      *
0011  * PARTICULAR PURPOSE. See the GNU General Public License for more details.             *
0012  *                                                                                      *
0013  * You should have received a copy of the GNU General Public License along with         *
0014  * this program.  If not, see <http://www.gnu.org/licenses/>.                           *
0015  ****************************************************************************************/
0016 
0017 #include "OpmlDirectoryDatabaseHandler.h"
0018 
0019 #include "core-impl/collections/support/CollectionManager.h"
0020 #include "core/support/Debug.h"
0021 #include <core/storage/SqlStorage.h>
0022 
0023 using namespace Meta;
0024 
0025 OpmlDirectoryDatabaseHandler::OpmlDirectoryDatabaseHandler()
0026 {}
0027 
0028 OpmlDirectoryDatabaseHandler::~OpmlDirectoryDatabaseHandler()
0029 {}
0030 
0031 void
0032 OpmlDirectoryDatabaseHandler::createDatabase()
0033 {
0034     //Get database instance
0035     SqlStorage *db = CollectionManager::instance()->sqlStorage();
0036 
0037     QString genreAutoIncrement = "";
0038 
0039     // create table containing feeds
0040     QString queryString = "CREATE TABLE opmldirectory_tracks ("
0041                           "id INTEGER PRIMARY KEY AUTO_INCREMENT, "
0042                           "name " + db->textColumnType() + ',' +
0043                           "track_number INTEGER,"
0044                           "length INTEGER,"
0045                           "preview_url " + db->exactTextColumnType() + ',' +
0046                           "album_id INTEGER,"
0047                           "artist_id INTEGER ) ENGINE = MyISAM;";
0048 
0049     debug() << "Creating opmldirectory_tracks: " << queryString;
0050 
0051     QStringList result = db->query( queryString );
0052 
0053     db->query( "CREATE INDEX opmldirectory_tracks_id ON opmldirectory_tracks(id);" );
0054     db->query( "CREATE INDEX opmldirectory_tracks_album_id ON opmldirectory_tracks(album_id);" );
0055 
0056     // create table containing categories
0057     queryString = "CREATE TABLE opmldirectory_albums ("
0058                   "id INTEGER PRIMARY KEY AUTO_INCREMENT, "
0059                   "name " + db->textColumnType() + ',' +
0060                   "description " + db->exactTextColumnType() + ',' +
0061                   "artist_id INTEGER ) ENGINE = MyISAM;";
0062 
0063     result = db->query( queryString );
0064     db->query( "CREATE INDEX opmldirectory_albums_name ON opmldirectory_albums(name);" );
0065 
0066 
0067     //HACK!! monster hack actually! We really need a default dummy artist or the service query maker screws up big time-
0068     // we also need a dummy genre it would seem....
0069 
0070     queryString = "CREATE TABLE opmldirectory_artists ("
0071             "id INTEGER PRIMARY KEY AUTO_INCREMENT, "
0072             "name " + db->textColumnType() + ',' +
0073             "description " + db->exactTextColumnType() + ") ENGINE = MyISAM;";
0074 
0075     result = db->query( queryString );
0076 
0077     //now, insert a default artist
0078     SqlStorage *sqlDb = CollectionManager::instance()->sqlStorage();
0079     queryString = "INSERT INTO opmldirectory_artists ( id, name, description "
0080             ") VALUES ( 1, 'dummy', 'dummy' );";
0081 
0082     sqlDb->insert( queryString, QString() );
0083 
0084     //create genre table
0085     queryString = "CREATE TABLE opmldirectory_genre ("
0086             "id INTEGER PRIMARY KEY AUTO_INCREMENT, "
0087             "name " + db->textColumnType() + ',' +
0088             "album_id INTEGER ) ENGINE = MyISAM;";
0089 
0090     result = db->query( queryString );
0091 }
0092 
0093 void
0094 OpmlDirectoryDatabaseHandler::destroyDatabase()
0095 {
0096     SqlStorage *db = CollectionManager::instance()->sqlStorage();
0097     QStringList result = db->query( "DROP TABLE IF EXISTS opmldirectory_tracks;" );
0098     result = db->query( "DROP TABLE IF EXISTS opmldirectory_albums;" );
0099     result = db->query( "DROP TABLE IF EXISTS opmldirectory_artists;" );
0100     result = db->query( "DROP TABLE IF EXISTS opmldirectory_genre;");
0101 
0102     result = db->query( "DROP INDEX IF EXISTS opmldirectory_tracks_id;");
0103     result = db->query( "DROP INDEX IF EXISTS opmldirectory_tracks_artist_id;");
0104     result = db->query( "DROP INDEX IF EXISTS opmldirectory_album_name;");
0105 }
0106 
0107 int
0108 OpmlDirectoryDatabaseHandler::insertTrack( ServiceTrackPtr track )
0109 {
0110     SqlStorage *sqlDb = CollectionManager::instance()->sqlStorage();
0111     QString queryString = "INSERT INTO opmldirectory_tracks ( name, track_number, length, "
0112                           "album_id, artist_id, preview_url ) VALUES ( '"
0113                           + sqlDb->escape( track->name() ) + "', "
0114                           + QString::number( 0 ) + ", "
0115                           + QString::number( 0 ) + ", "
0116                           + QString::number( track->albumId() ) + ", "
0117                           + QString::number( 1 ) + ", '"
0118                           + sqlDb->escape( track->uidUrl() ) + "' );";
0119 
0120     int trackId = sqlDb->insert( queryString, NULL );
0121 
0122     return trackId;
0123 }
0124 
0125 int
0126 OpmlDirectoryDatabaseHandler::insertAlbum( ServiceAlbumPtr album )
0127 {
0128     QString queryString;
0129     SqlStorage *sqlDb = CollectionManager::instance()->sqlStorage();
0130     queryString = "INSERT INTO opmldirectory_albums ( name, description, "
0131                   "artist_id ) VALUES ( '"
0132                   + sqlDb->escape( album->name() ) + "', '"
0133                   + sqlDb->escape( album->description() ) + "', "
0134                   + QString::number( 1 ) + ");";
0135 
0136     int newAlbumId = sqlDb->insert( queryString, QString() );
0137 
0138     //create a dummy genre for this album
0139     queryString = "INSERT INTO opmldirectory_genre ( album_id, name "
0140                   ") VALUES ( " + QString::number ( newAlbumId ) + ", 'dummy');";
0141 
0142     return sqlDb->insert( queryString, 0 );
0143 }
0144 
0145 void
0146 OpmlDirectoryDatabaseHandler::begin()
0147 {
0148     CollectionManager *mgr = CollectionManager::instance();
0149     QString queryString = "BEGIN;";
0150     mgr->sqlStorage()->query( queryString );
0151 }
0152 
0153 void
0154 OpmlDirectoryDatabaseHandler::commit()
0155 {
0156     CollectionManager *mgr = CollectionManager::instance();
0157     QString queryString = "COMMIT;";
0158     mgr->sqlStorage()->query( queryString );
0159 }
0160