Database::Database( const QString& dbname, QObject* parent ) : QObject( parent ) , m_ready( false ) , m_impl( new DatabaseImpl( dbname ) ) , m_workerRW( new DatabaseWorkerThread( this, true ) ) , m_idWorker( new IdThreadWorker( this ) ) { s_instance = this; if ( MAX_WORKER_THREADS < DEFAULT_WORKER_THREADS ) m_maxConcurrentThreads = MAX_WORKER_THREADS; else m_maxConcurrentThreads = qBound( DEFAULT_WORKER_THREADS, QThread::idealThreadCount(), MAX_WORKER_THREADS ); tDebug() << Q_FUNC_INFO << "Using" << m_maxConcurrentThreads << "database worker threads"; connect( m_impl, SIGNAL( indexReady() ), SIGNAL( indexReady() ) ); connect( m_impl, SIGNAL( indexReady() ), SIGNAL( ready() ) ); connect( m_impl, SIGNAL( indexReady() ), SLOT( setIsReadyTrue() ) ); Q_ASSERT( m_workerRW ); m_workerRW.data()->start(); while ( m_workerThreads.count() < m_maxConcurrentThreads ) { QPointer< DatabaseWorkerThread > workerThread( new DatabaseWorkerThread( this, false ) ); Q_ASSERT( workerThread ); workerThread.data()->start(); m_workerThreads << workerThread; } m_idWorker->start(); }
void Tomahawk::DatabaseImpl::loadIndex() { connect( m_fuzzyIndex, SIGNAL( indexStarted() ), SIGNAL( indexStarted() ) ); connect( m_fuzzyIndex, SIGNAL( indexReady() ), SIGNAL( indexReady() ) ); m_fuzzyIndex->loadLuceneIndex(); }
void run() { string ns = "unittests.rollback_create_collection_and_indexes"; const ServiceContext::UniqueOperationContext opCtxPtr = cc().makeOperationContext(); OperationContext& opCtx = *opCtxPtr; NamespaceString nss(ns); dropDatabase(&opCtx, nss); Lock::DBLock dbXLock(&opCtx, nss.db(), MODE_X); OldClientContext ctx(&opCtx, nss.ns()); string idxNameA = "indexA"; string idxNameB = "indexB"; string idxNameC = "indexC"; BSONObj specA = BSON("ns" << ns << "key" << BSON("a" << 1) << "name" << idxNameA << "v" << static_cast<int>(kIndexVersion)); BSONObj specB = BSON("ns" << ns << "key" << BSON("b" << 1) << "name" << idxNameB << "v" << static_cast<int>(kIndexVersion)); BSONObj specC = BSON("ns" << ns << "key" << BSON("c" << 1) << "name" << idxNameC << "v" << static_cast<int>(kIndexVersion)); // END SETUP / START TEST { WriteUnitOfWork uow(&opCtx); ASSERT(!collectionExists(&ctx, nss.ns())); ASSERT_OK(userCreateNS( &opCtx, ctx.db(), nss.ns(), BSONObj(), CollectionOptions::parseForCommand, false)); ASSERT(collectionExists(&ctx, nss.ns())); Collection* coll = ctx.db()->getCollection(&opCtx, nss); IndexCatalog* catalog = coll->getIndexCatalog(); ASSERT_OK(catalog->createIndexOnEmptyCollection(&opCtx, specA)); ASSERT_OK(catalog->createIndexOnEmptyCollection(&opCtx, specB)); ASSERT_OK(catalog->createIndexOnEmptyCollection(&opCtx, specC)); if (!rollback) { uow.commit(); } } // uow if (rollback) { ASSERT(!collectionExists(&ctx, ns)); } else { ASSERT(collectionExists(&ctx, ns)); ASSERT(indexReady(&opCtx, nss, idxNameA)); ASSERT(indexReady(&opCtx, nss, idxNameB)); ASSERT(indexReady(&opCtx, nss, idxNameC)); } }
void run() { string ns = "unittests.rollback_drop_index"; const ServiceContext::UniqueOperationContext opCtxPtr = cc().makeOperationContext(); OperationContext& opCtx = *opCtxPtr; NamespaceString nss(ns); dropDatabase(&opCtx, nss); createCollection(&opCtx, nss); AutoGetDb autoDb(&opCtx, nss.db(), MODE_X); Collection* coll = autoDb.getDb()->getCollection(&opCtx, nss); IndexCatalog* catalog = coll->getIndexCatalog(); string idxName = "a"; BSONObj spec = BSON("ns" << ns << "key" << BSON("a" << 1) << "name" << idxName << "v" << static_cast<int>(kIndexVersion)); { WriteUnitOfWork uow(&opCtx); ASSERT_OK(catalog->createIndexOnEmptyCollection(&opCtx, spec)); insertRecord(&opCtx, nss, BSON("a" << 1)); insertRecord(&opCtx, nss, BSON("a" << 2)); insertRecord(&opCtx, nss, BSON("a" << 3)); uow.commit(); } ASSERT(indexReady(&opCtx, nss, idxName)); ASSERT_EQ(3u, getNumIndexEntries(&opCtx, nss, idxName)); // END SETUP / START TEST { WriteUnitOfWork uow(&opCtx); dropIndex(&opCtx, nss, idxName); ASSERT(!indexExists(&opCtx, nss, idxName)); if (!rollback) { uow.commit(); } } if (rollback) { ASSERT(indexExists(&opCtx, nss, idxName)); ASSERT(indexReady(&opCtx, nss, idxName)); ASSERT_EQ(3u, getNumIndexEntries(&opCtx, nss, idxName)); } else { ASSERT(!indexExists(&opCtx, nss, idxName)); } }
Database::Database( const QString& dbname, QObject* parent ) : QObject( parent ) , m_ready( false ) , m_impl( new DatabaseImpl( dbname ) ) , m_workerRW( new DatabaseWorkerThread( this, true ) ) , m_idWorker( new IdThreadWorker( this ) ) { s_instance = this; // register commands registerCommand<DatabaseCommand_AddFiles>(); registerCommand<DatabaseCommand_DeleteFiles>(); registerCommand<DatabaseCommand_CreatePlaylist>(); registerCommand<DatabaseCommand_DeletePlaylist>(); registerCommand<DatabaseCommand_LogPlayback>(); registerCommand<DatabaseCommand_RenamePlaylist>(); registerCommand<DatabaseCommand_SetPlaylistRevision>(); registerCommand<DatabaseCommand_CreateDynamicPlaylist>(); registerCommand<DatabaseCommand_DeleteDynamicPlaylist>(); registerCommand<DatabaseCommand_SetDynamicPlaylistRevision>(); registerCommand<DatabaseCommand_SocialAction>(); registerCommand<DatabaseCommand_SetCollectionAttributes>(); registerCommand<DatabaseCommand_SetTrackAttributes>(); registerCommand<DatabaseCommand_ShareTrack>(); if ( MAX_WORKER_THREADS < DEFAULT_WORKER_THREADS ) m_maxConcurrentThreads = MAX_WORKER_THREADS; else m_maxConcurrentThreads = qBound( DEFAULT_WORKER_THREADS, QThread::idealThreadCount(), MAX_WORKER_THREADS ); tDebug() << Q_FUNC_INFO << "Using" << m_maxConcurrentThreads << "database worker threads"; connect( m_impl, SIGNAL( indexReady() ), SLOT( markAsReady() ) ); connect( m_impl, SIGNAL( indexReady() ), SIGNAL( indexReady() ) ); Q_ASSERT( m_workerRW ); m_workerRW.data()->start(); while ( m_workerThreads.count() < m_maxConcurrentThreads ) { QPointer< DatabaseWorkerThread > workerThread( new DatabaseWorkerThread( this, false ) ); Q_ASSERT( workerThread ); workerThread.data()->start(); m_workerThreads << workerThread; } m_idWorker->start(); }
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 ) ) { s_instance = this; m_maxConcurrentThreads = qBound( DEFAULT_WORKER_THREADS, QThread::idealThreadCount(), MAX_WORKER_THREADS ); qDebug() << Q_FUNC_INFO << "Using" << m_maxConcurrentThreads << "threads"; connect( m_impl, SIGNAL( indexReady() ), SIGNAL( indexReady() ) ); connect( m_impl, SIGNAL( indexReady() ), SIGNAL( ready() ) ); connect( m_impl, SIGNAL( indexReady() ), SLOT( setIsReadyTrue() ) ); m_workerRW->start(); }
void DatabaseImpl::loadIndex() { connect( m_fuzzyIndex, SIGNAL( indexReady() ), SIGNAL( indexReady() ) ); m_fuzzyIndex->loadLuceneIndex(); }