Mercurial > dedupe
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/FileDBLink.cpp Mon Aug 20 17:32:58 2012 +0200 @@ -0,0 +1,140 @@ +#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; +}
