![]() |
Mixxx
|
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