mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-03-20 15:59:42 +01:00
* Use a separate database connection for each db-worker thread.
This commit is contained in:
parent
93a062c07f
commit
2425ec34e5
@ -26,12 +26,7 @@
|
||||
#include "Source.h"
|
||||
|
||||
#define DEFAULT_WORKER_THREADS 4
|
||||
|
||||
#if ( QT_VERSION >= QT_VERSION_CHECK(4, 8, 2) )
|
||||
#define MAX_WORKER_THREADS 1
|
||||
#else
|
||||
#define MAX_WORKER_THREADS 16
|
||||
#endif
|
||||
#define MAX_WORKER_THREADS 16
|
||||
|
||||
Database* Database::s_instance = 0;
|
||||
|
||||
@ -47,7 +42,7 @@ Database::Database( const QString& dbname, QObject* parent )
|
||||
: QObject( parent )
|
||||
, m_ready( false )
|
||||
, m_impl( new DatabaseImpl( dbname, this ) )
|
||||
, m_workerRW( new DatabaseWorker( m_impl, this, true ) )
|
||||
, m_workerRW( new DatabaseWorker( this, true ) )
|
||||
{
|
||||
s_instance = this;
|
||||
|
||||
@ -105,7 +100,7 @@ Database::enqueue( const QSharedPointer<DatabaseCommand>& lc )
|
||||
// create new thread if < WORKER_THREADS
|
||||
if ( m_workers.count() < m_maxConcurrentThreads )
|
||||
{
|
||||
DatabaseWorker* worker = new DatabaseWorker( m_impl, this, false );
|
||||
DatabaseWorker* worker = new DatabaseWorker( this, false );
|
||||
worker->start();
|
||||
|
||||
m_workers << worker;
|
||||
|
@ -53,12 +53,13 @@ public:
|
||||
~Database();
|
||||
|
||||
QString dbid() const;
|
||||
bool indexReady() const { return m_indexReady; }
|
||||
|
||||
void loadIndex();
|
||||
|
||||
bool indexReady() const { return m_indexReady; }
|
||||
bool isReady() const { return m_ready; }
|
||||
|
||||
DatabaseImpl* impl() const { return m_impl; }
|
||||
|
||||
signals:
|
||||
void indexReady(); // search index
|
||||
void ready();
|
||||
@ -74,8 +75,6 @@ private slots:
|
||||
void setIsReadyTrue() { m_ready = true; }
|
||||
|
||||
private:
|
||||
DatabaseImpl* impl() const { return m_impl; }
|
||||
|
||||
bool m_ready;
|
||||
DatabaseImpl* m_impl;
|
||||
DatabaseWorker* m_workerRW;
|
||||
|
@ -46,9 +46,7 @@
|
||||
|
||||
DatabaseImpl::DatabaseImpl( const QString& dbname, Database* parent )
|
||||
: QObject( (QObject*) parent )
|
||||
, m_lastartid( 0 )
|
||||
, m_lastalbid( 0 )
|
||||
, m_lasttrkid( 0 )
|
||||
, m_parent( parent )
|
||||
{
|
||||
QTime t;
|
||||
t.start();
|
||||
@ -67,13 +65,10 @@ DatabaseImpl::DatabaseImpl( const QString& dbname, Database* parent )
|
||||
m_dbid = uuid();
|
||||
query.exec( QString( "INSERT INTO settings(k,v) VALUES('dbid','%1')" ).arg( m_dbid ) );
|
||||
}
|
||||
tLog() << "Database ID:" << m_dbid;
|
||||
|
||||
// make sqlite behave how we want:
|
||||
query.exec( "PRAGMA auto_vacuum = FULL" );
|
||||
query.exec( "PRAGMA synchronous = ON" );
|
||||
query.exec( "PRAGMA foreign_keys = ON" );
|
||||
//query.exec( "PRAGMA temp_store = MEMORY" );
|
||||
tLog() << "Database ID:" << m_dbid;
|
||||
init();
|
||||
|
||||
tDebug( LOGVERBOSE ) << "Tweaked db pragmas:" << t.elapsed();
|
||||
|
||||
// in case of unclean shutdown last time:
|
||||
@ -84,7 +79,6 @@ DatabaseImpl::DatabaseImpl( const QString& dbname, Database* parent )
|
||||
QTimer::singleShot( 0, this, SLOT( updateIndex() ) );
|
||||
|
||||
tDebug( LOGVERBOSE ) << "Loaded index:" << t.elapsed();
|
||||
|
||||
if ( qApp->arguments().contains( "--dumpdb" ) )
|
||||
{
|
||||
dumpDatabase();
|
||||
@ -93,6 +87,30 @@ DatabaseImpl::DatabaseImpl( const QString& dbname, Database* parent )
|
||||
}
|
||||
|
||||
|
||||
DatabaseImpl::DatabaseImpl( Database* parent, const QString& dbname )
|
||||
: QObject( (QObject*) QThread::currentThread() )
|
||||
, m_parent( parent )
|
||||
{
|
||||
openDatabase( dbname, false );
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DatabaseImpl::init()
|
||||
{
|
||||
m_lastartid = m_lastalbid = m_lasttrkid = 0;
|
||||
|
||||
TomahawkSqlQuery query = newquery();
|
||||
|
||||
// make sqlite behave how we want:
|
||||
query.exec( "PRAGMA auto_vacuum = FULL" );
|
||||
query.exec( "PRAGMA synchronous = ON" );
|
||||
query.exec( "PRAGMA foreign_keys = ON" );
|
||||
//query.exec( "PRAGMA temp_store = MEMORY" );
|
||||
}
|
||||
|
||||
|
||||
DatabaseImpl::~DatabaseImpl()
|
||||
{
|
||||
delete m_fuzzyIndex;
|
||||
@ -115,6 +133,16 @@ DatabaseImpl::~DatabaseImpl()
|
||||
}
|
||||
|
||||
|
||||
DatabaseImpl*
|
||||
DatabaseImpl::clone() const
|
||||
{
|
||||
DatabaseImpl* impl = new DatabaseImpl( m_parent, m_db.databaseName() );
|
||||
impl->setDatabaseID( m_dbid );
|
||||
impl->setFuzzyIndex( m_fuzzyIndex );
|
||||
return impl;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DatabaseImpl::dumpDatabase()
|
||||
{
|
||||
@ -681,27 +709,35 @@ DatabaseImpl::resultFromHint( const Tomahawk::query_ptr& origquery )
|
||||
|
||||
|
||||
bool
|
||||
DatabaseImpl::openDatabase( const QString& dbname )
|
||||
DatabaseImpl::openDatabase( const QString& dbname, bool checkSchema )
|
||||
{
|
||||
const QStringList conns = QSqlDatabase::connectionNames();
|
||||
const QString connName = QString( "tomahawk%1" ).arg( conns.count() ? QString::number( conns.count() ) : "" );
|
||||
|
||||
bool schemaUpdated = false;
|
||||
int version = -1;
|
||||
{
|
||||
QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE", "tomahawk" );
|
||||
QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE", connName );
|
||||
db.setDatabaseName( dbname );
|
||||
if ( !db.open() )
|
||||
{
|
||||
tLog() << "Failed to open database" << dbname;
|
||||
throw "failed to open db"; // TODO
|
||||
}
|
||||
|
||||
QSqlQuery qry = QSqlQuery( db );
|
||||
qry.exec( "SELECT v FROM settings WHERE k='schema_version'" );
|
||||
if ( qry.next() )
|
||||
|
||||
if ( checkSchema )
|
||||
{
|
||||
version = qry.value( 0 ).toInt();
|
||||
tLog() << "Database schema of" << dbname << "is" << version;
|
||||
QSqlQuery qry = QSqlQuery( db );
|
||||
qry.exec( "SELECT v FROM settings WHERE k='schema_version'" );
|
||||
if ( qry.next() )
|
||||
{
|
||||
version = qry.value( 0 ).toInt();
|
||||
tLog() << "Database schema of" << dbname << "is" << version;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
version = CURRENT_SCHEMA_VERSION;
|
||||
|
||||
if ( version < 0 || version == CURRENT_SCHEMA_VERSION )
|
||||
m_db = db;
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ public:
|
||||
DatabaseImpl( const QString& dbname, Database* parent = 0 );
|
||||
~DatabaseImpl();
|
||||
|
||||
bool openDatabase( const QString& dbname );
|
||||
DatabaseImpl* clone() const;
|
||||
|
||||
TomahawkSqlQuery newquery() { return TomahawkSqlQuery( m_db ); }
|
||||
QSqlDatabase& database() { return m_db; }
|
||||
@ -85,10 +85,17 @@ private slots:
|
||||
void updateIndex();
|
||||
|
||||
private:
|
||||
QString cleanSql( const QString& sql );
|
||||
DatabaseImpl( Database* parent, const QString& dbname );
|
||||
void setFuzzyIndex( FuzzyIndex* fi ) { m_fuzzyIndex = fi; }
|
||||
void setDatabaseID( const QString& dbid ) { m_dbid = dbid; }
|
||||
|
||||
void init();
|
||||
bool openDatabase( const QString& dbname, bool checkSchema = true );
|
||||
bool updateSchema( int oldVersion );
|
||||
void dumpDatabase();
|
||||
QString cleanSql( const QString& sql );
|
||||
|
||||
Database* m_parent;
|
||||
bool m_ready;
|
||||
QSqlDatabase m_db;
|
||||
|
||||
|
@ -34,9 +34,9 @@
|
||||
//#define DEBUG_TIMING TRUE
|
||||
#endif
|
||||
|
||||
DatabaseWorker::DatabaseWorker( DatabaseImpl* lib, Database* db, bool mutates )
|
||||
DatabaseWorker::DatabaseWorker( Database* db, bool mutates )
|
||||
: QThread()
|
||||
, m_dbimpl( lib )
|
||||
, m_db( db )
|
||||
, m_outstanding( 0 )
|
||||
{
|
||||
Q_UNUSED( db );
|
||||
@ -68,6 +68,8 @@ DatabaseWorker::~DatabaseWorker()
|
||||
void
|
||||
DatabaseWorker::run()
|
||||
{
|
||||
m_dbimpl = m_db->impl()->clone();
|
||||
tDebug() << "New db connection with name:" << m_dbimpl->database().connectionName();
|
||||
exec();
|
||||
qDebug() << Q_FUNC_INFO << "DatabaseWorker finishing...";
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ class DatabaseWorker : public QThread
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DatabaseWorker( DatabaseImpl*, Database*, bool mutates );
|
||||
DatabaseWorker( Database*, bool mutates );
|
||||
~DatabaseWorker();
|
||||
|
||||
bool busy() const { return m_outstanding > 0; }
|
||||
@ -59,6 +59,7 @@ private:
|
||||
void logOp( DatabaseCommandLoggable* command );
|
||||
|
||||
QMutex m_mut;
|
||||
Database* m_db;
|
||||
DatabaseImpl* m_dbimpl;
|
||||
QList< QSharedPointer<DatabaseCommand> > m_commands;
|
||||
int m_outstanding;
|
||||
|
Loading…
x
Reference in New Issue
Block a user