📄 reposlog.cpp
字号:
#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 + -