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;
+}