collectiondb.h

来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C头文件 代码 · 共 869 行 · 第 1/3 页

H
869
字号
// (c) 2004 Mark Kretschmann <markey@web.de>// (c) 2004 Christian Muehlhaeuser <chris@chris.de>// (c) 2004 Sami Nieminen <sami.nieminen@iki.fi>// (c) 2005 Ian Monroe <ian@monroe.nu>// (c) 2005 Jeff Mitchell <kde-dev@emailgoeshere.com>// (c) 2005 Isaiah Damron <xepo@trifault.net>// (c) 2005 Alexandre Pereira de Oliveira <aleprj@gmail.com>// (c) 2006 Jonas Hurrelmann <j@outpo.st>// (c) 2006 Shane King <kde@dontletsstart.com>// (c) 2006 Peter C. Ndikuwera <pndiku@gmail.com>// See COPYING file for licensing information.#ifndef AMAROK_COLLECTIONDB_H#define AMAROK_COLLECTIONDB_H#include "engineobserver.h"#include "threadmanager.h" //baseclass#include "amarok_export.h"#include <kurl.h>#include <qdir.h>            //stack allocated#include <qdatetime.h>#include <qimage.h>#include <qmutex.h>#include <qobject.h>         //baseclass#include <qptrqueue.h>       //baseclass#include <qsemaphore.h>      //stack allocated#include <qstringlist.h>     //stack allocated#include <qptrvector.h>#include <qthread.h>#include <qvaluestack.h>namespace KIO { class Job; }class DbConnection;class CoverFetcher;class MetaBundle;class OrganizeCollectionDialog;class PodcastChannelBundle;class PodcastEpisodeBundle;class QListViewItem;class Scrobbler;class DbConfig{};class SqliteConfig : public DbConfig{    public:        SqliteConfig( const QString& /* dbfile */ );        QString dbFile() const { return m_dbfile; }    private:        QString m_dbfile;};class MySqlConfig : public DbConfig{    public:        MySqlConfig(            const QString& /* host */,            const int /* port */,            const QString& /* database */,            const QString& /* username */,            const QString& /* password */);        QString host() const { return m_host; }        int port() const { return m_port; }        QString database() const { return m_database; }        QString username() const { return m_username; }        QString password() const { return m_password; }    private:        QString m_host;        int m_port;        QString m_database;        QString m_username;        QString m_password;};class PostgresqlConfig : public DbConfig{    public:        PostgresqlConfig(            const QString& /* host */,            const int /* port */,            const QString& /* database */,            const QString& /* username */,            const QString& /* password */);        QString host() const { return m_host; }        int port() const { return m_port; }        QString database() const { return m_database; }        QString username() const { return m_username; }        QString password() const { return m_password; }    private:        QString m_host;        int m_port;        QString m_database;        QString m_username;        QString m_password;};class DbConnection{    public:        enum DbConnectionType { sqlite = 0, mysql = 1, postgresql = 2 };        DbConnection();        virtual ~DbConnection() {}        virtual QStringList query( const QString& /* statement */, bool suppressDebug ) = 0;        virtual int insert( const QString& /* statement */, const QString& /* table */ ) = 0;        bool isInitialized() const { return m_initialized; }        virtual bool isConnected() const = 0;        virtual QString lastError() const { return "None"; }    protected:        bool m_initialized;};typedef struct sqlite3 sqlite3;typedef struct sqlite3_context sqlite3_context;typedef struct Mem sqlite3_value;class SqliteConnection : public DbConnection{    public:        SqliteConnection( const SqliteConfig* /* config */ );       ~SqliteConnection();        QStringList query( const QString& /* statement */, bool suppressDebug = false );        int insert( const QString& /* statement */, const QString& /* table */ );        bool isConnected()const { return true; }    private:        static void sqlite_rand( sqlite3_context *context, int /*argc*/, sqlite3_value ** /*argv*/ );        static void sqlite_power( sqlite3_context *context, int argc, sqlite3_value **argv );        static void sqlite_like_new( sqlite3_context *context, int argc, sqlite3_value **argv );        sqlite3* m_db;};#ifdef USE_MYSQLtypedef struct st_mysql MYSQL;class MySqlConnection : public DbConnection{    public:        MySqlConnection( const MySqlConfig* /* config */ );       ~MySqlConnection();        QStringList query( const QString& /* statement */, bool suppressDebug = false );        int insert( const QString& /* statement */, const QString& /* table */ );        bool isConnected()const { return m_connected; }        QString lastError() const { return m_error; }    private:        void setMysqlError();        MYSQL* m_db;        bool m_connected;        QString m_error;};#endif#ifdef USE_POSTGRESQLtypedef struct pg_conn PGconn;class PostgresqlConnection : public DbConnection{    public:        PostgresqlConnection( const PostgresqlConfig* /* config */ );       ~PostgresqlConnection();        QStringList query( const QString& /* statement */, bool suppressDebug = false );        int insert( const QString& /* statement */, const QString& /* table */ );        bool isConnected()const { return m_connected; }        QString lastError() const { return m_error; }    private:        void setPostgresqlError();        PGconn* m_db;        bool m_connected;        QString m_error;};#endifclass LIBAMAROK_EXPORT CollectionDB : public QObject, public EngineObserver{    Q_OBJECT    friend class SimilarArtistsInsertionJob;    signals:        void scanStarted();        void scanDone( bool changed );        void databaseEngineChanged();        void databaseUpdateDone();        void scoreChanged( const QString &url, float score );        void ratingChanged( const QString &url, int rating );        void labelsChanged( const QString &url );        void fileMoved( const QString &srcUrl, const QString &dstUrl );        void fileMoved( const QString &srcUrl, const QString &dstUrl, const QString &uniqueid );        void fileDeleted( const QString &absPath );        void fileDeleted( const QString &absPath, const QString &uniqueid );        void fileAdded( const QString &absPath );        void fileAdded( const QString &absPath, const QString &uniqueid );        void filesAdded( const QMap<QString,QString> &map );        void uniqueIdChanged( const QString &url, const QString &originalid, const QString &newid );        void coverChanged( const QString &artist, const QString &album ); //whenever a cover changes        void coverFetched( const QString &artist, const QString &album ); //only when fetching from amazon        void coverRemoved( const QString &artist, const QString &album );        void coverFetcherError( const QString &error );        void similarArtistsFetched( const QString &artist );        void tagsChanged( const MetaBundle &bundle );        void tagsChanged( const QString &oldArtist, const QString &oldAlbum );        void imageFetched( const QString &remoteURL ); //for fetching remote podcast images    public:        CollectionDB();        ~CollectionDB();        static CollectionDB *instance();        /**         * performs all initializations which require directory or URL data stored in the         * database.         */        void initDirOperations();        enum labelTypes { typeUser = 1 };           //add new types add the end!        QString escapeString(QString string ) const        {            return            #ifdef USE_MYSQL                // We have to escape "\" for mysql, but can't do so for sqlite                ( m_dbConnType == DbConnection::mysql )                ? string.replace("\\", "\\\\").replace( '\'', "''" ) :            #endif                  string.replace( '\'', "''" );        }        QString boolT() const { if (getDbConnectionType() == DbConnection::postgresql) return "true"; else return "1"; }        QString boolF() const { if (getDbConnectionType() == DbConnection::postgresql) return "false"; else return "0"; }        inline bool boolFromSql( const QString &b ) { return ( b == boolT() || b == "t" ); }        //textColumnType should be used for normal strings, which need to be compared        //either case-sensitively or -insensitively        QString textColumnType( int length=255 ) const { if ( getDbConnectionType() == DbConnection::postgresql ) return "TEXT"; else return QString("VARCHAR(%1)").arg(length); }        //exactTextColumnType should be used for strings that must be stored exactly, such        //as URLs (necessary for holding control chars etc. if present in URL), except for        //trailing spaces. Comparisions should always be done case-sensitively.        //As we create indices on these columns, we have to restrict them to        //<= 255 chars for mysql < 5.0.3        QString exactTextColumnType( int length=1024 ) const { if ( getDbConnectionType() == DbConnection::mysql ) return QString( "VARBINARY(%1)" ).arg( length>255 ? 255 : length ); else return textColumnType( length ); }        // We might consider using LONGTEXT type, as some lyrics could be VERY long..???        QString longTextColumnType() const { if ( getDbConnectionType() == DbConnection::postgresql ) return "TEXT"; else return "TEXT"; }        QString randomFunc() const { if ( getDbConnectionType() == DbConnection::postgresql ) return "random()"; else return "RAND()"; }        inline static QString exactCondition( const QString &right );        static QString likeCondition( const QString &right, bool anyBegin=false, bool anyEnd=false );        int getType() { return getDbConnectionType(); }        //sql helper methods        QStringList query( const QString& statement, bool suppressDebug = false );        int insert( const QString& statement, const QString& table );        /**         * TODO: write doc         * @param showAll         * @return a string which can be appended to an existing sql where statement         */        QString deviceidSelection( const bool showAll = false );        /**         * converts the result of a query which contains a deviceid and a relative path         * to a list of absolute paths. the order of entries in each result row must be         * deviceid first, relative path second.         * @param result the result of the sql query, deviceid first, relative path second         * @return a list of urls

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?