Mercurial > dedupe
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 0:a3834af36579 | 1:aae83c0a771d |
|---|---|
| 1 #include "FileDBLink.hpp" | |
| 2 | |
| 3 #include <QtCore/QDebug> | |
| 4 #include <QtCore/QtConcurrentMap> | |
| 5 | |
| 6 #include "PermissionException.hpp" | |
| 7 #include "EditDistance.hpp" | |
| 8 | |
| 9 #include <cassert> | |
| 10 | |
| 11 #include <functional> | |
| 12 #include <algorithm> | |
| 13 #include <iostream> | |
| 14 | |
| 15 #include <boost/bind.hpp> | |
| 16 | |
| 17 void FileDBLink::updateIfModified(const QString& path) | |
| 18 { | |
| 19 QFileInfo fileinfo(path); | |
| 20 if (!exists(path)) { | |
| 21 addFile(fileinfo); | |
| 22 } | |
| 23 } | |
| 24 | |
| 25 void FileDBLink::addFile(const QFileInfo& fileinfo) | |
| 26 { | |
| 27 addFile(fileinfo.absoluteFilePath(), fileinfo.size(), fileinfo.lastModified()); | |
| 28 } | |
| 29 | |
| 30 void FileDBLink::addFile(const QString& path, qint64 size, const QDateTime& lastModified) | |
| 31 { | |
| 32 QCryptographicHash hash( QCryptographicHash::Sha1 ); | |
| 33 QFile file(path); | |
| 34 if ( file.open( QIODevice::ReadOnly ) ) { | |
| 35 hash.addData( file.readAll() ); | |
| 36 } | |
| 37 else { | |
| 38 QString errorMsg = path + ": " + file.errorString(); | |
| 39 qDebug()<<file.error(); | |
| 40 switch (file.error()) { | |
| 41 case QFile::PermissionsError: | |
| 42 throw PermissionException(errorMsg); | |
| 43 default: | |
| 44 throw IOException(errorMsg); | |
| 45 } | |
| 46 } | |
| 47 | |
| 48 addFile(path, size, lastModified, hash); | |
| 49 | |
| 50 } | |
| 51 | |
| 52 const QList<QSharedPointer<FileDBLink::DBInfo> > FileDBLink::sortOn(SORTORDER order, bool extended) | |
| 53 { | |
| 54 QList<QSharedPointer<DBInfo> > list = (extended) ? computedValues() : computedValues(); | |
| 55 | |
| 56 switch (order) { | |
| 57 case PATH: | |
| 58 { | |
| 59 QList<QSharedPointer<FileDBLink::DBInfo> > oList; | |
| 60 foreach(QSharedPointer<DBInfo> info, list) { | |
| 61 oList.push_back(info); | |
| 62 } | |
| 63 return oList; | |
| 64 } | |
| 65 case SIZE: | |
| 66 { | |
| 67 QMultiMap<quint64, QSharedPointer<DBInfo> > oList; | |
| 68 foreach(QSharedPointer<DBInfo> info, list) { | |
| 69 oList.insert(info->size(), info); | |
| 70 } | |
| 71 return oList.values(); | |
| 72 } | |
| 73 case MTIME: | |
| 74 { | |
| 75 QMultiMap<QDateTime, QSharedPointer<DBInfo> > oList; | |
| 76 foreach(QSharedPointer<DBInfo> info, list) { | |
| 77 oList.insert(info->mtime(), info); | |
| 78 } | |
| 79 return oList.values(); | |
| 80 } | |
| 81 case CHECKSUM: | |
| 82 { | |
| 83 QMultiMap<QByteArray, QSharedPointer<DBInfo> > oList; | |
| 84 foreach(QSharedPointer<DBInfo> info, list) { | |
| 85 oList.insert(info->checksum(), info); | |
| 86 } | |
| 87 return oList.values(); | |
| 88 } | |
| 89 case EDIT: | |
| 90 { | |
| 91 assert(extended); | |
| 92 QMultiMap<int, QSharedPointer<DBInfo> > oList; | |
| 93 foreach(QSharedPointer<DBInfo> info, list) { | |
| 94 QSharedPointer<ExtendedDBInfo> ptr; | |
| 95 ptr = info.dynamicCast<ExtendedDBInfo>(); | |
| 96 oList.insert(ptr->editDistance(), info); | |
| 97 } | |
| 98 return oList.values(); | |
| 99 | |
| 100 } | |
| 101 } | |
| 102 abort(); | |
| 103 } | |
| 104 | |
| 105 QSharedPointer<FileDBLink::DBInfo> FileDBLink::computedValue(const QSharedPointer<DBInfo>& info, | |
| 106 const QList<QSharedPointer<DBInfo> >& entries) | |
| 107 { | |
| 108 QString p1 = info->name(); | |
| 109 int minDist = 100000; | |
| 110 QString other; | |
| 111 for (QList<QSharedPointer<DBInfo> >::const_iterator it2 = entries.begin(); | |
| 112 it2 != entries.end(); ++it2) { | |
| 113 if (info == *it2) | |
| 114 continue; | |
| 115 QString p2 = (*it2)->name(); | |
| 116 int dist = EditDistance::Compute(p1, p2, false); | |
| 117 if (dist < minDist) { | |
| 118 minDist = dist; | |
| 119 other = (*it2)->path(); | |
| 120 } | |
| 121 } | |
| 122 return QSharedPointer<DBInfo>(new ExtendedDBInfo(*info, other, minDist)); | |
| 123 } | |
| 124 | |
| 125 const QList<QSharedPointer<FileDBLink::DBInfo> > FileDBLink::computedValues() const | |
| 126 { | |
| 127 QList<QSharedPointer<DBInfo> > list; | |
| 128 QList<QSharedPointer<DBInfo> > entries = values(); | |
| 129 | |
| 130 #if 1 | |
| 131 list = QtConcurrent::blockingMapped(entries, boost::bind( &FileDBLink::computedValue, _1, entries)); | |
| 132 #else | |
| 133 for (QList<QSharedPointer<DBInfo> >::const_iterator it1 = entries.begin(); | |
| 134 it1 != entries.end(); ++it1) { | |
| 135 QSharedPointer<DBInfo> ext = computedValue(*it1, entries); | |
| 136 list.push_back(ext); | |
| 137 } | |
| 138 #endif | |
| 139 return list; | |
| 140 } |
