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 + -
显示快捷键?