Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/library/dao/trackdao.h

Go to the documentation of this file.
00001 #ifndef TRACKDAO_H
00002 #define TRACKDAO_H
00003 
00004 #include <QFileInfo>
00005 #include <QObject>
00006 #include <QSet>
00007 #include <QHash>
00008 #include <QList>
00009 #include <QSqlDatabase>
00010 #include <QSharedPointer>
00011 #include <QWeakPointer>
00012 #include <QCache>
00013 
00014 #include "configobject.h"
00015 #include "library/dao/cratedao.h"
00016 #include "library/dao/cuedao.h"
00017 #include "library/dao/dao.h"
00018 #include "library/dao/playlistdao.h"
00019 #include "trackinfoobject.h"
00020 #include "util.h"
00021 
00022 const QString LIBRARYTABLE_ID = "id";
00023 const QString LIBRARYTABLE_ARTIST = "artist";
00024 const QString LIBRARYTABLE_TITLE = "title";
00025 const QString LIBRARYTABLE_ALBUM = "album";
00026 const QString LIBRARYTABLE_YEAR = "year";
00027 const QString LIBRARYTABLE_GENRE = "genre";
00028 const QString LIBRARYTABLE_TRACKNUMBER = "tracknumber";
00029 const QString LIBRARYTABLE_FILETYPE = "filetype";
00030 const QString LIBRARYTABLE_LOCATION = "location";
00031 const QString LIBRARYTABLE_COMMENT = "comment";
00032 const QString LIBRARYTABLE_DURATION = "duration";
00033 const QString LIBRARYTABLE_BITRATE = "bitrate";
00034 const QString LIBRARYTABLE_BPM = "bpm";
00035 const QString LIBRARYTABLE_REPLAYGAIN = "replaygain";
00036 const QString LIBRARYTABLE_CUEPOINT = "cuepoint";
00037 const QString LIBRARYTABLE_URL = "url";
00038 const QString LIBRARYTABLE_SAMPLERATE = "samplerate";
00039 const QString LIBRARYTABLE_WAVESUMMARYHEX = "wavesummaryhex";
00040 const QString LIBRARYTABLE_CHANNELS = "channels";
00041 const QString LIBRARYTABLE_MIXXXDELETED = "mixxx_deleted";
00042 const QString LIBRARYTABLE_DATETIMEADDED = "datetime_added";
00043 const QString LIBRARYTABLE_HEADERPARSED = "header_parsed";
00044 const QString LIBRARYTABLE_TIMESPLAYED = "timesplayed";
00045 const QString LIBRARYTABLE_PLAYED = "played";
00046 const QString LIBRARYTABLE_RATING = "rating";
00047 const QString LIBRARYTABLE_KEY = "key";
00048 
00049 const QString TRACKLOCATIONSTABLE_ID = "id";
00050 const QString TRACKLOCATIONSTABLE_LOCATION = "location";
00051 const QString TRACKLOCATIONSTABLE_FILENAME = "filename";
00052 const QString TRACKLOCATIONSTABLE_DIRECTORY = "directory";
00053 const QString TRACKLOCATIONSTABLE_FILESIZE = "filesize";
00054 const QString TRACKLOCATIONSTABLE_FSDELETED = "fs_deleted";
00055 const QString TRACKLOCATIONSTABLE_NEEDSVERIFICATION = "needs_verification";
00056 
00057 class TrackDAO : public QObject, public virtual DAO {
00058     Q_OBJECT
00059   public:
00062     TrackDAO(QSqlDatabase& database, CueDAO& cueDao,
00063              PlaylistDAO& playlistDao, CrateDAO& crateDao,
00064              ConfigObject<ConfigValue>* pConfig = NULL);
00065     virtual ~TrackDAO();
00066 
00067     void finish();
00068     void setDatabase(QSqlDatabase& database) { m_database = database; };
00069 
00070     void initialize();
00071     int getTrackId(QString absoluteFilePath);
00072     bool trackExistsInDatabase(QString absoluteFilePath);
00073     QString getTrackLocation(int id);
00074     int addTrack(QString absoluteFilePath, bool unremove);
00075     int addTrack(QFileInfo& fileInfo, bool unremove);
00076     void addTracks(QList<TrackInfoObject*> tracksToAdd, bool unremove);
00077     void removeTrack(int id);
00078     void removeTracks(QList<int> ids);
00079     void unremoveTrack(int trackId);
00080     TrackPointer getTrack(int id, bool cacheOnly=false) const;
00081     bool isDirty(int trackId);
00082 
00083     // Scanning related calls. Should be elsewhere or private somehow.
00084     void markTrackLocationAsVerified(QString location);
00085     void markTracksInDirectoryAsVerified(QString directory);
00086     void invalidateTrackLocationsInLibrary(QString libraryPath);
00087     void markUnverifiedTracksAsDeleted();
00088     void markTrackLocationsAsDeleted(QString directory);
00089     void detectMovedFiles();
00090 
00091   signals:
00092     void trackDirty(int trackId);
00093     void trackClean(int trackId);
00094     void trackChanged(int trackId);
00095     void tracksAdded(QSet<int> trackIds);
00096     void tracksRemoved(QSet<int> trackIds);
00097 
00098   public slots:
00099     // The public interface to the TrackDAO requires a TrackPointer so that we
00100     // have a guarantee that the track will not be deleted while we are working
00101     // on it. However, private parts of TrackDAO can use the raw saveTrack(TIO*)
00102     // call.
00103     void saveTrack(TrackPointer pTrack);
00104 
00105     // TrackDAO provides a cache of TrackInfoObject's that have been requested
00106     // via getTrack(). saveDirtyTracks() saves all cached tracks marked dirty
00107     // to the database.
00108     void saveDirtyTracks();
00109 
00110     // Clears the cached TrackInfoObjects, which can be useful when the
00111     // underlying database tables change (eg. during a library rescan,
00112     // we might detect that a track has been moved and modify the update
00113     // the tables directly.)
00114     void clearCache();
00115 
00116   private slots:
00117     void slotTrackDirty(TrackInfoObject* pTrack);
00118     void slotTrackChanged(TrackInfoObject* pTrack);
00119     void slotTrackClean(TrackInfoObject* pTrack);
00120     void slotTrackSave(TrackInfoObject* pTrack);
00121 
00122   private:
00123     bool isTrackFormatSupported(TrackInfoObject* pTrack) const;
00124     void saveTrack(TrackInfoObject* pTrack);
00125     void updateTrack(TrackInfoObject* pTrack);
00126     void addTrack(TrackInfoObject* pTrack, bool unremove);
00127     TrackPointer getTrackFromDB(QSqlQuery &query) const;
00128     QString absoluteFilePath(QString location);
00129 
00130     void prepareTrackLocationsInsert(QSqlQuery& query);
00131     void bindTrackToTrackLocationsInsert(QSqlQuery& query, TrackInfoObject* pTrack);
00132     void prepareLibraryInsert(QSqlQuery& query);
00133     void bindTrackToLibraryInsert(QSqlQuery& query,
00134                                   TrackInfoObject* pTrack, int trackLocationId);
00135 
00136     void writeAudioMetaData(TrackInfoObject* pTrack);
00137     // Called when the TIO reference count drops to 0
00138     static void deleteTrack(TrackInfoObject* pTrack);
00139 
00140     QSqlDatabase &m_database;
00141     CueDAO &m_cueDao;
00142     PlaylistDAO &m_playlistDao;
00143     CrateDAO &m_crateDao;
00144     ConfigObject<ConfigValue> * m_pConfig;
00145     mutable QHash<int, TrackWeakPointer> m_tracks;
00146     mutable QSet<int> m_dirtyTracks;
00147     mutable QCache<int,TrackPointer> m_trackCache;
00148 
00149     DISALLOW_COPY_AND_ASSIGN(TrackDAO);
00150 };
00151 
00152 #endif //TRACKDAO_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines