⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reposlog.cpp

📁 LINUX 下以 QT/KDE 写的 SVN 客户端
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "ReposLog.hpp"#include "LogCache.hpp"#include "svnqt/info_entry.hpp"#include "svnqt/svnqttypes.hpp"#include "svnqt/client.hpp"#include "svnqt/context_listener.hpp"#include "svnqt/cache/DatabaseException.hpp"#include <qsqldatabase.h>#if QT_VERSION < 0x040000#else#include <QSqlError>#include <QSqlQuery>#include <QVariant>#define Q_LLONG qlonglong#endif/*!    \fn svn::cache::ReposLog::ReposLog(svn::Client*aClient,const QString&) */svn::cache::ReposLog::ReposLog(svn::Client*aClient,const QString&aRepository)    :m_Client(aClient),#if QT_VERSION < 0x040000              m_Database(0),#else              m_Database(),#endif              m_ReposRoot(aRepository),m_latestHead(svn::Revision::UNDEFINED){    if (!aRepository.isEmpty()) {        m_Database = LogCache::self()->reposDb(aRepository);    }}/*!    \fn svn::cache::ReposLog::latestHeadRev() */svn::Revision svn::cache::ReposLog::latestHeadRev(){    if (!m_Client||m_ReposRoot.isEmpty()) {        return svn::Revision::UNDEFINED;    }#if QT_VERSION < 0x040000    if (!m_Database) {#else    if (!m_Database.isValid()) {#endif        m_Database = LogCache::self()->reposDb(m_ReposRoot);#if QT_VERSION < 0x040000        if (!m_Database) {#else        if (!m_Database.isValid()) {#endif            return svn::Revision::UNDEFINED;        }    }    /// no catch - exception has go trough...    svn::InfoEntries e = (m_Client->info(m_ReposRoot,false,svn::Revision::HEAD,svn::Revision::HEAD));;    if (e.count()<1||e[0].reposRoot().isEmpty()) {        return svn::Revision::UNDEFINED;    }    return e[0].revision();}/*!    \fn svn::cache::ReposLog::latestCachedRev() */svn::Revision svn::cache::ReposLog::latestCachedRev(){    if (m_ReposRoot.isEmpty()) {        return svn::Revision::UNDEFINED;    }#if QT_VERSION < 0x040000    if (!m_Database) {#else    if (!m_Database.isValid()) {#endif        m_Database = LogCache::self()->reposDb(m_ReposRoot);#if QT_VERSION < 0x040000        if (!m_Database) {#else        if (!m_Database.isValid()) {#endif            return svn::Revision::UNDEFINED;        }    }    QString q("select revision from 'logentries' order by revision DESC limit 1");    QSqlQuery _q(QString::null, m_Database);    if (!_q.exec(q)) {        qDebug(_q.lastError().text().TOUTF8().data());        return svn::Revision::UNDEFINED;    }    int _r;    if (_q.isActive() && _q.next()) {        qDebug("Sel result: %s",_q.value(0).toString().TOUTF8().data());        _r = _q.value(0).toInt();    } else {        qDebug(_q.lastError().text().TOUTF8().data());        return svn::Revision::UNDEFINED;    }    return _r;}bool svn::cache::ReposLog::checkFill(svn::Revision&start,svn::Revision&end){#if QT_VERSION < 0x040000    if (!m_Database) {#else    if (!m_Database.isValid()) {#endif        m_Database = LogCache::self()->reposDb(m_ReposRoot);#if QT_VERSION < 0x040000        if (!m_Database) {#else        if (!m_Database.isValid()) {#endif            return false;        }    }    ContextP cp = m_Client->getContext();    long long icount=0;    svn::Revision _latest=latestCachedRev();    qDebug("Latest cached rev: %i",_latest.revnum());    if (_latest.revnum()>=latestHeadRev().revnum()) {        return true;    }    start=date2numberRev(start);    end=date2numberRev(end);    // both should now one of START, HEAD or NUMBER    if (start==svn::Revision::HEAD || (end==svn::Revision::NUMBER && start==svn::Revision::NUMBER && start.revnum()>end.revnum())) {        svn::Revision tmp = start;        start = end;        end = tmp;    }    svn::Revision _rstart=_latest.revnum()+1;    svn::Revision _rend = end;    if (_rend==svn::Revision::UNDEFINED) {        _rend=svn::Revision::HEAD;    }    // no catch - exception should go outside.    if (_rstart==0){        _rstart = 1;    }    qDebug("Getting log %s -> %s",_rstart.toString().TOUTF8().data(),_rend.toString().TOUTF8().data());    if (_rend==svn::Revision::HEAD) {        _rend=latestHeadRev();    }    if (_rend==svn::Revision::HEAD||_rend.revnum()>_latest.revnum()) {        LogEntriesMap _internal;        qDebug("Retrieving from network.");        if (!m_Client->log(m_ReposRoot,_rstart,_rend,_internal,svn::Revision::UNDEFINED,true,false)) {            return false;        }        LogEntriesMap::ConstIterator it=_internal.begin();        for (;it!=_internal.end();++it) {            _insertLogEntry((*it));            if (cp && cp->getListener()) {                //cp->getListener()->contextProgress(++icount,_internal.size());                if (cp->getListener()->contextCancel()) {                    throw DatabaseException(QString("Could not retrieve values: User cancel."));                }            }        }    }    return true;}bool svn::cache::ReposLog::fillCache(const svn::Revision&_end){    svn::Revision end = _end;    svn::Revision start = latestCachedRev().revnum()+1;    return checkFill(start,end);}/*!    \fn svn::cache::ReposLog::simpleLog(const svn::Revision&start,const svn::Revision&end,LogEntriesMap&target) */bool svn::cache::ReposLog::simpleLog(LogEntriesMap&target,const svn::Revision&_start,const svn::Revision&_end,bool noNetwork){    if (!m_Client||m_ReposRoot.isEmpty()) {        return false;    }    target.clear();    ContextP cp = m_Client->getContext();    svn::Revision end = _end;    svn::Revision start = _start;    if (!noNetwork) {        if (!checkFill(start,end)) {            return false;        }    } else {        end=date2numberRev(end,noNetwork);        start=date2numberRev(start,noNetwork);    }    if (end==svn::Revision::HEAD) {        end = latestCachedRev();    }    if (start==svn::Revision::HEAD) {        start=latestCachedRev();    }    static QString sEntry("select revision,author,date,message from logentries where revision<=? and revision>=?");    static QString sItems("select changeditem,action,copyfrom,copyfromrev from changeditems where revision=?");    QSqlQuery bcur(QString::null,m_Database);    bcur.prepare(sEntry);    QSqlQuery cur(QString::null,m_Database);    cur.prepare(sItems);    bcur.bindValue(0,Q_LLONG(end.revnum()));    bcur.bindValue(1,Q_LLONG(start.revnum()));    if (!bcur.exec()) {        qDebug(bcur.lastError().text().TOUTF8().data());        throw svn::cache::DatabaseException(QString("Could not retrieve values: ")+bcur.lastError().text());        return false;    }    Q_LLONG revision;    while(bcur.next()) {

⌨️ 快捷键说明

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