bool CWizDatabaseManager::close(const QString& strKbGUID, bool bNotify)
{
    // should close all groups db before close user db.
    if (strKbGUID.isEmpty()) {
        Q_ASSERT(m_mapGroups.isEmpty());

        m_dbPrivate->Close();
        m_dbPrivate->deleteLater();
        return true;
    }

    qDebug() << "[CWizDatabaseManager] closed database, "
             << "kb_guid: " << m_mapGroups.value(strKbGUID)->kbGUID()
             << " name: " << m_mapGroups.value(strKbGUID)->name();

    QMap<QString, CWizDatabase*>::const_iterator it = m_mapGroups.find(strKbGUID);
    if (it != m_mapGroups.end()) {
        it.value()->Close();
        it.value()->deleteLater();
        m_mapGroups.remove(strKbGUID);
    } else {
        return false;
    }

    if (bNotify) {
        Q_EMIT databaseClosed(strKbGUID);
    }

    return true;
}
예제 #2
0
bool CWizDatabaseManager::close(const QString& strKbGUID)
{
    // should close all groups db before close user db.
    if (!m_dbGroups.isEmpty()) {
        Q_ASSERT(!strKbGUID.isEmpty());
    }

    bool closed = false;
    QList<CWizDatabase*>::iterator it;
    for (it = m_dbGroups.begin(); it != m_dbGroups.end(); it++) {
        CWizDatabase* db = *it;

        if (db->kbGUID() == strKbGUID) {
            db->Close();
            m_dbGroups.erase(it);
            closed = true;
            break;
        }
    }

    if (!closed && !strKbGUID.isEmpty()) {
        TOLOG("WARNING: nothing closed, guid not found");
        return false;
    }

    Q_EMIT databaseClosed(strKbGUID);
    return true;
}
예제 #3
0
void DatabaseTracker::removeOpenDatabase(Database* database)
{
    {
        MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
        String originString = database->getSecurityOrigin()->toRawString();
        ASSERT(m_openDatabaseMap);
        DatabaseNameMap* nameMap = m_openDatabaseMap->get(originString);
        if (!nameMap)
            return;

        String name(database->stringIdentifier());
        DatabaseSet* databaseSet = nameMap->get(name);
        if (!databaseSet)
            return;

        DatabaseSet::iterator found = databaseSet->find(database);
        if (found == databaseSet->end())
            return;

        databaseSet->remove(found);
        if (databaseSet->isEmpty()) {
            nameMap->remove(name);
            delete databaseSet;
            if (nameMap->isEmpty()) {
                m_openDatabaseMap->remove(originString);
                delete nameMap;
            }
        }
    }
    databaseClosed(database);
}
예제 #4
0
void LS3DatastoreXML::dbClose(bool saveOnClose) {    
    LS3ElapsedAutoTimer timer("LS3DatastoreXML::dbClose");
    QElapsedTimer time;
    time.restart();
    if (data!=NULL) {
        data->setDoEmitSignals(false);
        mapper->submit();
    }
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: mapper->submit()"; time.restart();
    emit disconnectWidgets();
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: emit disconnectWidgets()"; time.restart();
    emit databaseLoaded(false);
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: emit databaseLoaded(false)"; time.restart();
    emit databaseClosed(true);
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: emit databaseClosed(true)"; time.restart();
    if (!m_currentFile.isEmpty() && saveOnClose) dbSave(m_currentFile);
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: dbSave(m_currentFile)"; time.restart();

    resetFieldDefinitions();
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: resetFieldDefinitions()"; time.restart();
    clearSelection();
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: clearSelection()"; time.restart();
    getReferencTreeModel()->clear();
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: getReferencTreeModel()->clear()"; time.restart();
    keywordsdata->setStringList(QStringList());
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: keywordsdata->setStringList()"; time.restart();
    authorsdata->setStringList(QStringList());
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: authorsdata->setStringList(QStringList())"; time.restart();
    topicsdata->setStringList(QStringList());
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: topicsdata->setStringList(QStringList())"; time.restart();
    if (data!=NULL) {
        data->setDoEmitSignals(true);
    }
    data->newFile();
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: data->newFile()"; time.restart();

    m_currentFile="";
    m_databaseLoaded=true;
    emit filenameChanged(m_currentFile);
    //qDebug()<<"dbClose(saveOnClose="<<saveOnClose<<"): "<<time.elapsed()<<"ms: emit filenameChanged(m_currentFile)"; time.restart();
}
예제 #5
0
bool LS3DatastoreXML::dbLoad(const QString &fileName, QProgressBar* progress) {
    LS3ElapsedAutoTimer timer("LS3DatastoreXML::dbLoad");
    // if a database is opened: close it!
    dbClose();

    QDomDocument doc("mydocument");
    QFile file(fileName);
    QString errorMessage;
    int errorLine;
    int errorColumn;

    if (!file.open(QIODevice::ReadOnly)) {
        emit dbError(tr("Error opening databse '%1': File could not be opened.").arg(fileName));
        return m_databaseLoaded=false;
    }
    if (!doc.setContent(&file, &errorMessage, &errorLine, &errorColumn)) {
        file.close();
        //file.close();
        emit dbError(tr("Error parsing databse '%1': %2 (line %3, column %4).").arg(fileName).arg(errorMessage).arg(errorLine).arg(errorColumn));
        return m_databaseLoaded=false;
    }
    file.close();

    QDomElement docElem = doc.documentElement();
    if (docElem.tagName()!="litsoz3database") {
        emit dbError(tr("Error in databse '%1': This is not a LitSoz 3 databse file (root element is <%2>, but should be <litsoz3database>.").arg(fileName).arg(docElem.tagName()));
        return m_databaseLoaded=false;
    }

    QDomElement n = docElem.firstChildElement("records");
    data->loadFromXML(n, progress);

    timer.showMessage("XML loaded");

    //if (keywordsdata) delete keywordsdata
    //keywordsdata = new QStringListModel(this);


    // create a stringlist model for the keywords and read its contents from the keywords field in the metadata table
    // the (possibly changed) model will be written back in the closeDB() method
    QDomElement metadata = docElem.firstChildElement("metadata");
    if (!metadata.isNull()) {
        n = metadata.firstChildElement("item");
        while(!n.isNull()) {
            QString type=n.attribute("type").toLower();
            if (type=="keywords") {
                QString sdata=n.text().replace("\r\n", "\n");
                sdata=sdata.replace("\n\r", "\n");
                sdata=sdata.replace("\n\n", "\n");
                sdata=sdata.replace("\n\n", "\n");
                sdata=sdata.replace("\r\r", "");
                QStringList sl=sdata.split("\n", QString::SkipEmptyParts);
                sl.removeDuplicates();
                sl.sort();
                keywordsdata->setStringList(sl);
            }
            if (type=="topics") {
                QString sdata=n.text().replace("\r\n", "\n");
                sdata=sdata.replace("\n\r", "\n");
                sdata=sdata.replace("\n\n", "\n");
                sdata=sdata.replace("\n\n", "\n");
                sdata=sdata.replace("\r\r", "");
                QStringList sl=sdata.split("\n", QString::SkipEmptyParts);
                sl.removeDuplicates();
                sl.sort();
                topicsdata->setStringList(sl);
            }
            n=n.nextSiblingElement("item");
        }
    }

    timer.showMessage("METADATA read");


    // read the list of selected records
    QDomElement selectedNode = docElem.firstChildElement("selection_list");
    clearSelection();
    if (!selectedNode.isNull()) {
        n = selectedNode.firstChildElement("item");
        while(!n.isNull()) {
            QString uuid=n.attribute("uuid");
            select(uuid);
            n=n.nextSiblingElement("item");
        }
    }
    timer.showMessage("SELECTION read");


    // read the reference tree

    QDomElement reftreeNode = docElem.firstChildElement("litsoz3_reference_tree");
    getReferencTreeModel()->readFromXML(reftreeNode);
    timer.showMessage("REFTREE read");

    // read the authorsdata completer list from a file in config dir
    //if (authorsdata) delete authorsdata;
    //authorsdata = new QStringListModel(this);
    QFile f(settings->GetConfigDirectory()+"/completers/authors.lst");
    if (f.open(QIODevice::ReadOnly|QIODevice::Text)) {
        //std::cout<<"OK\n";
        QString s=QString::fromUtf8(f.readAll());
        authorsdata->setStringList(s.split('\n', QString::SkipEmptyParts));
    }

    updateCompleters(0, recordCount()-1, false);
    timer.showMessage("AUTHORS_COMPLETER read");

    m_currentFile=fileName;
    emit filenameChanged(m_currentFile);
    emit connectWidgets();
    timer.showMessage("CONNECTED_WIDGETS");
    dbFirst();
    timer.showMessage("MOVED FIRST");

    emit databaseLoaded(true);
    emit databaseClosed(false);
    emit massiveSelectionChange();
    timer.showMessage("EMITED SIGNALS");
    return m_databaseLoaded=true;
}
예제 #6
0
void DatabaseTracker::failedToOpenDatabase(Database* database)
{
    databaseClosed(database);
}