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 }