Mercurial > dedupe
view FileDBLink.cpp @ 1:aae83c0a771d
Refactor:
-Rename all Db to DB.
Add setup script
Add support for Sqlite3 in configuration.
| author | Tom Fredrik Blenning Klaussen <bfg@blenning.no> |
|---|---|
| date | Mon, 20 Aug 2012 17:32:58 +0200 |
| parents | FileDbLink.cpp@a3834af36579 |
| children | 2833b7f8884a |
line wrap: on
line source
#include "FileDBLink.hpp" #include <QtCore/QDebug> #include <QtCore/QtConcurrentMap> #include "PermissionException.hpp" #include "EditDistance.hpp" #include <cassert> #include <functional> #include <algorithm> #include <iostream> #include <boost/bind.hpp> void FileDBLink::updateIfModified(const QString& path) { QFileInfo fileinfo(path); if (!exists(path)) { addFile(fileinfo); } } void FileDBLink::addFile(const QFileInfo& fileinfo) { addFile(fileinfo.absoluteFilePath(), fileinfo.size(), fileinfo.lastModified()); } void FileDBLink::addFile(const QString& path, qint64 size, const QDateTime& lastModified) { QCryptographicHash hash( QCryptographicHash::Sha1 ); QFile file(path); if ( file.open( QIODevice::ReadOnly ) ) { hash.addData( file.readAll() ); } else { QString errorMsg = path + ": " + file.errorString(); qDebug()<<file.error(); switch (file.error()) { case QFile::PermissionsError: throw PermissionException(errorMsg); default: throw IOException(errorMsg); } } addFile(path, size, lastModified, hash); } const QList<QSharedPointer<FileDBLink::DBInfo> > FileDBLink::sortOn(SORTORDER order, bool extended) { QList<QSharedPointer<DBInfo> > list = (extended) ? computedValues() : computedValues(); switch (order) { case PATH: { QList<QSharedPointer<FileDBLink::DBInfo> > oList; foreach(QSharedPointer<DBInfo> info, list) { oList.push_back(info); } return oList; } case SIZE: { QMultiMap<quint64, QSharedPointer<DBInfo> > oList; foreach(QSharedPointer<DBInfo> info, list) { oList.insert(info->size(), info); } return oList.values(); } case MTIME: { QMultiMap<QDateTime, QSharedPointer<DBInfo> > oList; foreach(QSharedPointer<DBInfo> info, list) { oList.insert(info->mtime(), info); } return oList.values(); } case CHECKSUM: { QMultiMap<QByteArray, QSharedPointer<DBInfo> > oList; foreach(QSharedPointer<DBInfo> info, list) { oList.insert(info->checksum(), info); } return oList.values(); } case EDIT: { assert(extended); QMultiMap<int, QSharedPointer<DBInfo> > oList; foreach(QSharedPointer<DBInfo> info, list) { QSharedPointer<ExtendedDBInfo> ptr; ptr = info.dynamicCast<ExtendedDBInfo>(); oList.insert(ptr->editDistance(), info); } return oList.values(); } } abort(); } QSharedPointer<FileDBLink::DBInfo> FileDBLink::computedValue(const QSharedPointer<DBInfo>& info, const QList<QSharedPointer<DBInfo> >& entries) { QString p1 = info->name(); int minDist = 100000; QString other; for (QList<QSharedPointer<DBInfo> >::const_iterator it2 = entries.begin(); it2 != entries.end(); ++it2) { if (info == *it2) continue; QString p2 = (*it2)->name(); int dist = EditDistance::Compute(p1, p2, false); if (dist < minDist) { minDist = dist; other = (*it2)->path(); } } return QSharedPointer<DBInfo>(new ExtendedDBInfo(*info, other, minDist)); } const QList<QSharedPointer<FileDBLink::DBInfo> > FileDBLink::computedValues() const { QList<QSharedPointer<DBInfo> > list; QList<QSharedPointer<DBInfo> > entries = values(); #if 1 list = QtConcurrent::blockingMapped(entries, boost::bind( &FileDBLink::computedValue, _1, entries)); #else for (QList<QSharedPointer<DBInfo> >::const_iterator it1 = entries.begin(); it1 != entries.end(); ++it1) { QSharedPointer<DBInfo> ext = computedValue(*it1, entries); list.push_back(ext); } #endif return list; }
