📄 reposlog.cpp
字号:
revision = bcur.value(0).toLongLong(); cur.bindValue(0,revision); if (!cur.exec()) { qDebug(cur.lastError().text().TOUTF8().data()); throw svn::cache::DatabaseException(QString("Could not retrieve values: ")+cur.lastError().text() ,cur.lastError().number()); return false; } target[revision].revision=revision; target[revision].author=bcur.value(1).toString(); target[revision].date=bcur.value(2).toLongLong(); target[revision].message=bcur.value(3).toString(); while(cur.next()) { LogChangePathEntry lcp; QString ac = cur.value(1).toString();#if QT_VERSION < 0x040000 lcp.action=ac[0].latin1();#else lcp.action=ac[0].toLatin1();#endif lcp.copyFromPath=cur.value(2).toString(); lcp.path= cur.value(0).toString(); lcp.copyFromRevision=cur.value(3).toLongLong(); target[revision].changedPaths.push_back(lcp); } if (cp && cp->getListener()) { //cp->getListener()->contextProgress(++icount,bcur.size()); if (cp->getListener()->contextCancel()) { throw svn::cache::DatabaseException(QString("Could not retrieve values: User cancel.")); } } } return false;}/*! \fn svn::cache::ReposLog::date2numberRev(const svn::Revision&) */svn::Revision svn::cache::ReposLog::date2numberRev(const svn::Revision&aRev,bool noNetwork){ if (aRev!=svn::Revision::DATE) { return aRev; }#if QT_VERSION < 0x040000 if (!m_Database) {#else if (!m_Database.isValid()) {#endif return svn::Revision::UNDEFINED; } static QString _q("select revision from logentries where date<? order by revision desc"); QSqlQuery query("select revision,date from logentries order by revision desc limit 1",m_Database);#if QT_VERSION < 0x040000 if (query.lastError().type()!=QSqlError::None) {#else if (query.lastError().type()!=QSqlError::NoError) {#endif qDebug(query.lastError().text().TOUTF8().data()); } bool must_remote=!noNetwork; if (query.next()) { if (query.value(1).toLongLong()>=aRev.date()) { must_remote=false; } } if (must_remote) { svn::InfoEntries e = (m_Client->info(m_ReposRoot,false,aRev,aRev));; if (e.count()<1||e[0].reposRoot().isEmpty()) { return aRev; } return e[0].revision(); } query.prepare(_q); query.bindValue(0,Q_LLONG(aRev.date())); query.exec();#if QT_VERSION < 0x040000 if (query.lastError().type()!=QSqlError::None) {#else if (query.lastError().type()!=QSqlError::NoError) {#endif qDebug(query.lastError().text().TOUTF8().data()); } if (query.next()) { return query.value(0).toInt(); } // not found... svn::InfoEntries e = (m_Client->info(m_ReposRoot,false,svn::Revision::HEAD,svn::Revision::HEAD));; if (e.count()<1||e[0].reposRoot().isEmpty()) { return aRev; } return e[0].revision();}/*! \fn svn::cache::ReposLog::insertLogEntry(const svn::LogEntry&) */bool svn::cache::ReposLog::_insertLogEntry(const svn::LogEntry&aEntry){ QSqlRecord *buffer;#if QT_VERSION < 0x040000 m_Database->transaction(); Q_LLONG j = aEntry.revision;#else m_Database.transaction(); qlonglong j = aEntry.revision;#endif static QString qEntry("insert into logentries (revision,date,author,message) values (?,?,?,?)"); static QString qPathes("insert into changeditems (revision,changeditem,action,copyfrom,copyfromrev) values (?,?,?,?,?)"); QSqlQuery _q(QString::null,m_Database); _q.prepare(qEntry); _q.bindValue(0,j); _q.bindValue(1,aEntry.date); _q.bindValue(2,aEntry.author); _q.bindValue(3,aEntry.message); if (!_q.exec()) {#if QT_VERSION < 0x040000 m_Database->rollback();#else m_Database.rollback();#endif qDebug("Could not insert values: %s",_q.lastError().text().TOUTF8().data()); qDebug(_q.lastQuery().TOUTF8().data()); throw svn::cache::DatabaseException(QString("Could not insert values: ")+_q.lastError().text(),_q.lastError().number()); } _q.prepare(qPathes); svn::LogChangePathEntries::ConstIterator cpit = aEntry.changedPaths.begin(); for (;cpit!=aEntry.changedPaths.end();++cpit){ _q.bindValue(0,j); _q.bindValue(1,(*cpit).path); _q.bindValue(2,QString(QChar((*cpit).action))); _q.bindValue(3,(*cpit).copyFromPath); _q.bindValue(4,Q_LLONG((*cpit).copyFromRevision)); if (!_q.exec()) {#if QT_VERSION < 0x040000 m_Database->rollback();#else m_Database.rollback();#endif qDebug("Could not insert values: %s",_q.lastError().text().TOUTF8().data()); qDebug(_q.lastQuery().TOUTF8().data()); throw svn::cache::DatabaseException(QString("Could not insert values: ")+_q.lastError().text(),_q.lastError().number()); } }#if QT_VERSION < 0x040000 m_Database->commit();#else m_Database.commit();#endif return true;}bool svn::cache::ReposLog::insertLogEntry(const svn::LogEntry&aEntry){ return _insertLogEntry(aEntry);}/*! \fn svn::cache::ReposLog::log(const svn::Path&,const svn::Revision&start, const svn::Revision&end,const svn::Revision&peg,svn::LogEntriesMap&target, bool strictNodeHistory,int limit)) */bool svn::cache::ReposLog::log(const svn::Path&what,const svn::Revision&_start, const svn::Revision&_end,const svn::Revision&_peg,svn::LogEntriesMap&target, bool strictNodeHistory,int limit){ static QString s_q("select logentries.revision,logentries.author,logentries.date,logentries.message from logentries where logentries.revision in (select changeditems.revision from changeditems where (changeditems.changeditem='%1' or changeditems.changeditem GLOB '%2/*') %3 GROUP BY changeditems.revision) ORDER BY logentries.revision DESC"); svn::Revision peg = date2numberRev(_peg,true); svn::Revision end = date2numberRev(_end,true); svn::Revision start = date2numberRev(_start,true); QString query_string = QString(s_q).arg(what.native()).arg(what.native()).arg((peg==svn::Revision::UNDEFINED?"":QString(" AND revision<=%1").arg(peg.revnum()))); if (peg==svn::Revision::UNDEFINED) { peg = latestCachedRev(); } if (!itemExists(peg,what)) { throw svn::cache::DatabaseException(QString("Entry '%1' does not exists at revision %2").arg(what.native()).arg(peg.toString())); } if (limit>0) { query_string+=QString(" LIMIT %1").arg(limit); } qDebug("Query-string: %s",query_string.TOUTF8().data()); QSqlQuery _q(QString::null,m_Database); _q.prepare(query_string); if (!_q.exec()) { qDebug("Could not select values: %s",_q.lastError().text().TOUTF8().data()); qDebug(_q.lastQuery().TOUTF8().data()); throw svn::cache::DatabaseException(QString("Could not select values: ")+_q.lastError().text(),_q.lastError().number()); } while(_q.next()) { Q_LLONG revision = _q.value(0).toLongLong(); target[revision].revision=revision; target[revision].author=_q.value(1).toString(); target[revision].date=_q.value(2).toLongLong(); target[revision].message=_q.value(3).toString(); } return true;}/*! \fn svn::cache::ReposLog::itemExists(const svn::Revision&,const QString&) */bool svn::cache::ReposLog::itemExists(const svn::Revision&peg,const svn::Path&path){ /// @todo this moment I have no idea how to check real with all moves and deletes of parent folders without a hell of sql statements so we make it quite simple: it exists if we found it.#if 0 static QString _s1("select revision from changeditems where changeditem='%1' and action='A' and revision<=%2 order by revision desc limit 1"); QSqlQuery _q(QString::null,m_Database); QString query_string=QString(_s1).arg(path.native()).arg(peg.revnum()); if (!_q.exec(query_string)) { qDebug("Could not select values: %s",_q.lastError().text().TOUTF8().data()); qDebug(_q.lastQuery().TOUTF8().data()); throw svn::cache::DatabaseException(QString("Could not select values: ")+_q.lastError().text(),_q.lastError().number()); } qDebug(_q.lastQuery().TOUTF8().data()); svn::Path _p = path; static QString _s2("select revision from changeditem where changeditem in (%1) and action='D' and revision>%2 and revision<=%3 order by revision desc limit 1"); QStringList p_list; while (_p.length()>0) { p_list.append(QString("'%1'").arg(_p.native())); _p.removeLast(); } query_string=QString(_s2).arg(p_list.join(",")).arg();#endif return true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -