You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
amarok/amarok/src/database_refactor/collectiondb.h

241 lines
9.7 KiB

// (c) 2004 Mark Kretschmann <markey@web.de>
// (c) 2004 Christian Muehlhaeuser <chris@chris.de>
// (c) 2004 Sami Nieminen <sami.nieminen@iki.fi>
// See COPYING file for licensing information.
#ifndef AMAROK_COLLECTIONDB_H
#define AMAROK_COLLECTIONDB_H
#include "engineobserver.h"
#include "dbenginebase.h"
#include <kurl.h>
#include <tqdir.h> //stack allocated
#include <tqobject.h> //baseclass
#include <tqptrqueue.h> //baseclass
#include <tqsemaphore.h> //stack allocated
#include <tqstringlist.h> //stack allocated
class CoverFetcher;
class MetaBundle;
class Scrobbler;
class DbConnectionPool : TQPtrQueue<DbConnection>
{
public:
DbConnectionPool();
~DbConnectionPool();
const DbConnection::DbConnectionType getDbConnectionType() const { return m_dbConnType; }
const DbConfig *getDbConfig() const { return m_dbConfig; }
void createDbConnections();
DbConnection *getDbConnection();
void putDbConnection( const DbConnection* /* conn */ );
private:
static const int POOL_SIZE = 5;
TQSemaphore m_semaphore;
DbConnection::DbConnectionType m_dbConnType;
DbConfig *m_dbConfig;
};
class CollectionDB : public TQObject, public EngineObserver
{
Q_OBJECT
friend class SimilarArtistsInsertionJob;
signals:
void scanStarted();
void scanDone( bool changed );
void databaseEngineChanged();
void scoreChanged( const TQString &url, int score );
void coverFetched( const TQString &artist, const TQString &album );
void coverRemoved( const TQString &artist, const TQString &album );
void coverFetcherError( const TQString &error );
void similarArtistsFetched( const TQString &artist );
public:
static CollectionDB *instance();
TQString escapeString( TQString string ) { return m_dbConnPool->escapeString(string); }
int getType() { return m_dbConnPool->getDbConnectionType(); }
/**
* This method returns a static DbConnection for components that want to use
* the same connection for the whole time. Should not be used anywhere else
* but in CollectionReader.
*
* @return static DbConnection
*/
DbConnection *getStaticDbConnection();
/**
* Returns the DbConnection back to connection pool.
*
* @param conn DbConnection to be returned
*/
void returnStaticDbConnection( DbConnection *conn );
//sql helper methods
TQStringList query( const TQString& statement, DbConnection *conn = NULL );
int insert( const TQString& statement, const TQString& table, DbConnection *conn = NULL );
//table management methods
bool isEmpty();
bool isValid();
void createTables( DbConnection *conn = NULL );
void dropTables( DbConnection *conn = NULL );
void clearTables( DbConnection *conn = NULL );
void moveTempTables( DbConnection *conn );
uint artistID( TQString value, bool autocreate = true, const bool temporary = false, const bool updateSpelling = false, DbConnection *conn = NULL );
uint albumID( TQString value, bool autocreate = true, const bool temporary = false, const bool updateSpelling = false, DbConnection *conn = NULL );
uint genreID( TQString value, bool autocreate = true, const bool temporary = false, const bool updateSpelling = false, DbConnection *conn = NULL );
uint yearID( TQString value, bool autocreate = true, const bool temporary = false, const bool updateSpelling = false, DbConnection *conn = NULL );
bool isDirInCollection( TQString path );
bool isFileInCollection( const TQString &url );
void removeDirFromCollection( TQString path );
void removeSongsInDir( TQString path );
void removeSongs( const KURL::List& urls );
void updateDirStats( TQString path, const long datetime, DbConnection *conn = NULL );
//song methods
bool addSong( MetaBundle* bundle, const bool incremental = false, DbConnection *conn = NULL );
/**
* The @p bundle parameter's url() will be looked up in the Collection
* @param bundle this will be filled in with tags for you
* @return true if in the collection
*/
bool bundleForUrl( MetaBundle* bundle );
TQValueList<MetaBundle> bundlesByUrls( const KURL::List& urls );
void addAudioproperties( const MetaBundle& bundle );
void updateTags( const TQString &url, const MetaBundle &bundle, const bool updateView = true );
void updateURL( const TQString &url, const bool updateView = true );
//statistics methods
int addSongPercentage( const TQString &url, int percentage );
int getSongPercentage( const TQString &url );
void setSongPercentage( const TQString &url , int percentage );
//artist methods
TQStringList similarArtists( const TQString &artist, uint count );
//album methods
void checkCompilations( const TQString &path, const bool temporary = false, DbConnection *conn = NULL );
void setCompilation( const TQString &album, const bool enabled, const bool updateView = true );
TQString albumSongCount( const TQString &artist_id, const TQString &album_id );
bool albumIsCompilation( const TQString &album_id );
//list methods
TQStringList artistList( bool withUnknowns = true, bool withCompilations = true );
TQStringList albumList( bool withUnknowns = true, bool withCompilations = true );
TQStringList genreList( bool withUnknowns = true, bool withCompilations = true );
TQStringList yearList( bool withUnknowns = true, bool withCompilations = true );
TQStringList albumListOfArtist( const TQString &artist, bool withUnknown = true, bool withCompilations = true );
TQStringList artistAlbumList( bool withUnknown = true, bool withCompilations = true );
TQStringList albumTracks( const TQString &artist_id, const TQString &album_id );
//cover management methods
/** Returns the image from a given URL, network-transparently.
* You must run TDEIO::NetAccess::removeTempFile( tmpFile ) when you are finished using the image;
**/
static TQImage fetchImage(const KURL& url, TQString &tmpFile);
/** Saves images located on the user's filesystem */
bool setAlbumImage( const TQString& artist, const TQString& album, const KURL& url );
/** Saves images obtained from CoverFetcher */
bool setAlbumImage( const TQString& artist, const TQString& album, TQImage img, const TQString& amazonUrl = TQString() );
TQString findImageByMetabundle( MetaBundle trackInformation, const uint = 1 );
TQString findImageByArtistAlbum( const TQString &artist, const TQString &album, const uint width = 1 );
TQString albumImage( MetaBundle trackInformation, const uint width = 1 );
TQString albumImage( const uint artist_id, const uint album_id, const uint width = 1 );
TQString albumImage( const TQString &artist, const TQString &album, const uint width = 1 );
bool removeAlbumImage( const uint artist_id, const uint album_id );
bool removeAlbumImage( const TQString &artist, const TQString &album );
//local cover methods
void addImageToAlbum( const TQString& image, TQValueList< TQPair<TQString, TQString> > info, DbConnection *conn = NULL );
TQString getImageForAlbum( const TQString& artist, const TQString& album, uint width = 0 );
TQString notAvailCover( int width = 0 );
void applySettings();
protected:
CollectionDB();
~CollectionDB();
TQCString md5sum( const TQString& artist, const TQString& album, const TQString& file = TQString() );
void engineTrackEnded( int finalPosition, int trackLength );
/** Manages regular folder monitoring scan */
void timerEvent( TQTimerEvent* e );
public slots:
void fetchCover( TQWidget* parent, const TQString& artist, const TQString& album, bool noedit );
void scanMonitor();
void startScan();
void stopScan();
private slots:
void dirDirty( const TQString& path );
void coverFetcherResult( CoverFetcher* );
void similarArtistsFetched( const TQString& artist, const TQStringList& suggestions );
private:
//bump DATABASE_VERSION whenever changes to the table structure are made. will remove old db file.
static const int DATABASE_VERSION = 18;
static const int DATABASE_STATS_VERSION = 3;
static const int MONITOR_INTERVAL = 60; //sec
static const bool DEBUG = false;
void initialize();
void destroy();
void customEvent( TQCustomEvent* );
//general management methods
void createStatsTable();
void dropStatsTable();
void scanModifiedDirs();
TQCString makeWidthKey( uint width );
TQString artistValue( uint id );
TQString albumValue( uint id );
TQString genreValue( uint id );
TQString yearValue( uint id );
uint IDFromValue( TQString name, TQString value, bool autocreate = true, const bool temporary = false,
const bool updateSpelling = false, DbConnection *conn = NULL );
TQString valueFromID( TQString table, uint id );
//member variables
TQString m_amazonLicense;
TQString m_cacheArtist;
uint m_cacheArtistID;
TQString m_cacheAlbum;
uint m_cacheAlbumID;
DBEngine* m_dbEngine;
DbConnectionPool *m_dbConnPool;
bool m_monitor;
TQDir m_cacheDir;
TQDir m_coverDir;
};
#endif /* AMAROK_COLLECTIONDB_H */