changeset 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 a3834af36579
children 2833b7f8884a
files CMakeLists.txt CMake_Modules/FindSqlite3.cmake DataController.cpp DataController.hpp FileDBLink.cpp FileDBLink.hpp FileDbLink.cpp FileDbLink.hpp MemoryDBLink.cpp MemoryDBLink.hpp MemoryDbLink.cpp MemoryDbLink.hpp setup.sh
diffstat 13 files changed, 416 insertions(+), 334 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Mon Aug 20 15:49:48 2012 +0200
+++ b/CMakeLists.txt	Mon Aug 20 17:32:58 2012 +0200
@@ -3,6 +3,8 @@
 
 INCLUDE(PrecompiledHeader.cmake)
 
+SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMake_Modules/")
+
 FIND_PACKAGE(Boost)
 IF (Boost_FOUND)
     INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
@@ -12,6 +14,8 @@
 
 FIND_PACKAGE(Qt4 COMPONENTS QtOpenGL QtXml REQUIRED)
 
+FIND_PACKAGE(Sqlite3 REQUIRED)
+
 INCLUDE(${QT_USE_FILE})
 ADD_DEFINITIONS(${QT_DEFINITIONS})
 
@@ -32,11 +36,9 @@
 # Returns the moc_xxx.cpp files in the foo_MOC_SRCS variable
 QT4_WRAP_CPP(MOC_SOURCES ${MOC_HEADERS})
 
-MESSAGE(WARNING ${MOC_SOURCES})
-
 SET(CMAKE_CXX_FLAGS "-g2 -Wall -Werror -fno-inline")
 ADD_EXECUTABLE(DeDupe ${SOURCES} ${MOC_SOURCES})
-TARGET_LINK_LIBRARIES(DeDupe ${QT_LIBRARIES})
+TARGET_LINK_LIBRARIES(DeDupe ${QT_LIBRARIES} ${SQLITE3_LIBRARIES})
 
 ENABLE_TESTING()
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CMake_Modules/FindSqlite3.cmake	Mon Aug 20 17:32:58 2012 +0200
@@ -0,0 +1,56 @@
+# - find Sqlite 3
+# SQLITE3_INCLUDE_DIR - Where to find Sqlite 3 header files (directory)
+# SQLITE3_LIBRARIES - Sqlite 3 libraries
+# SQLITE3_LIBRARY_RELEASE - Where the release library is
+# SQLITE3_LIBRARY_DEBUG - Where the debug library is
+# SQLITE3_FOUND - Set to TRUE if we found everything (library, includes and executable)
+
+# Copyright (c) 2010 Pau Garcia i Quiles, <pgquiles@elpauer.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+# Generated by CModuler, a CMake Module Generator - http://gitorious.org/cmoduler
+
+IF( SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARY_RELEASE AND SQLITE3_LIBRARY_DEBUG )
+    SET(SQLITE3_FIND_QUIETLY TRUE)
+ENDIF( SQLITE3_INCLUDE_DIR AND SQLITE3_LIBRARY_RELEASE AND SQLITE3_LIBRARY_DEBUG )
+
+FIND_PATH( SQLITE3_INCLUDE_DIR sqlite3.h  )
+
+FIND_LIBRARY(SQLITE3_LIBRARY_RELEASE NAMES sqlite3 )
+
+FIND_LIBRARY(SQLITE3_LIBRARY_DEBUG NAMES sqlite3 sqlite3d  HINTS /usr/lib/debug/usr/lib/ )
+
+IF( SQLITE3_LIBRARY_RELEASE OR SQLITE3_LIBRARY_DEBUG AND SQLITE3_INCLUDE_DIR )
+	SET( SQLITE3_FOUND TRUE )
+ENDIF( SQLITE3_LIBRARY_RELEASE OR SQLITE3_LIBRARY_DEBUG AND SQLITE3_INCLUDE_DIR )
+
+IF( SQLITE3_LIBRARY_DEBUG AND SQLITE3_LIBRARY_RELEASE )
+	# if the generator supports configuration types then set
+	# optimized and debug libraries, or if the CMAKE_BUILD_TYPE has a value
+	IF( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )
+		SET( SQLITE3_LIBRARIES optimized ${SQLITE3_LIBRARY_RELEASE} debug ${SQLITE3_LIBRARY_DEBUG} )
+	ELSE( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )
+    # if there are no configuration types and CMAKE_BUILD_TYPE has no value
+    # then just use the release libraries
+		SET( SQLITE3_LIBRARIES ${SQLITE3_LIBRARY_RELEASE} )
+	ENDIF( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )
+ELSEIF( SQLITE3_LIBRARY_RELEASE )
+	SET( SQLITE3_LIBRARIES ${SQLITE3_LIBRARY_RELEASE} )
+ELSE( SQLITE3_LIBRARY_DEBUG AND SQLITE3_LIBRARY_RELEASE )
+	SET( SQLITE3_LIBRARIES ${SQLITE3_LIBRARY_DEBUG} )
+ENDIF( SQLITE3_LIBRARY_DEBUG AND SQLITE3_LIBRARY_RELEASE )
+
+IF( SQLITE3_FOUND )
+	IF( NOT SQLITE3_FIND_QUIETLY )
+		MESSAGE( STATUS "Found Sqlite3 header file in ${SQLITE3_INCLUDE_DIR}")
+		MESSAGE( STATUS "Found Sqlite3 libraries: ${SQLITE3_LIBRARIES}")
+	ENDIF( NOT SQLITE3_FIND_QUIETLY )
+ELSE(SQLITE3_FOUND)
+	IF( SQLITE3_FIND_REQUIRED)
+		MESSAGE( FATAL_ERROR "Could not find Sqlite3" )
+	ELSE( SQLITE3_FIND_REQUIRED)
+		MESSAGE( STATUS "Optional package Sqlite3 was not found" )
+	ENDIF( SQLITE3_FIND_REQUIRED)
+ENDIF(SQLITE3_FOUND)
--- a/DataController.cpp	Mon Aug 20 15:49:48 2012 +0200
+++ b/DataController.cpp	Mon Aug 20 17:32:58 2012 +0200
@@ -1,6 +1,6 @@
 #include "DataController.hpp"
 
-#include "MemoryDbLink.hpp"
+#include "MemoryDBLink.hpp"
 
 #include "PermissionException.hpp"
 #include "DataController.hpp"
@@ -26,7 +26,7 @@
 #include "EditDistance.hpp"
 
 #include <cassert>
-void findFiles(const QDir& dir, FileDbLink& dblink)
+void findFiles(const QDir& dir, FileDBLink& dblink)
 {
   /*
   QProgressDialog progressDialog(this);
@@ -55,7 +55,7 @@
   }
 }
 
-QTreeWidgetItem* DataController::createItem(const FileDbLink::DBInfo& info)
+QTreeWidgetItem* DataController::createItem(const FileDBLink::DBInfo& info)
 {
   QTreeWidgetItem* item = new QTreeWidgetItem();
   item->setData(0, Qt::DisplayRole, info.name());
@@ -86,7 +86,7 @@
 {
   tw->clear();
 
-  const QList<QSharedPointer<FileDbLink::DBInfo> > elems = dblink->sortOn(FileDbLink::EDIT, true);
+  const QList<QSharedPointer<FileDBLink::DBInfo> > elems = dblink->sortOn(FileDBLink::EDIT, true);
 
   QProgressBar bar;
 
@@ -102,13 +102,13 @@
 
   tw->setUpdatesEnabled(false);
 
-  foreach(QSharedPointer<FileDbLink::DBInfo> line, elems) {
+  foreach(QSharedPointer<FileDBLink::DBInfo> line, elems) {
     QTreeWidgetItem* item = 0;
     bool anyAdded = false;
 
     if (showNameDups) {
       QTreeWidgetItem* topLevelItem = 0;
-      foreach(QSharedPointer<FileDbLink::DBInfo> dup, elems) {
+      foreach(QSharedPointer<FileDBLink::DBInfo> dup, elems) {
 	if(dup != line && line->name() == dup->name() ) {
 	  if (!topLevelItem) {
 	    topLevelItem =  new QTreeWidgetItem();
@@ -125,7 +125,7 @@
 
     if (showSizeDups) {
       QTreeWidgetItem* topLevelItem = 0;
-      foreach(QSharedPointer<FileDbLink::DBInfo> dup, elems) {
+      foreach(QSharedPointer<FileDBLink::DBInfo> dup, elems) {
 	if(dup != line && line->size() == dup->size() ) {
 	  if (!topLevelItem) {
 	    topLevelItem =  new QTreeWidgetItem();
@@ -142,7 +142,7 @@
 
     if (showMTimeDups) {
       QTreeWidgetItem* topLevelItem = 0;
-      foreach(QSharedPointer<FileDbLink::DBInfo> dup, elems) {
+      foreach(QSharedPointer<FileDBLink::DBInfo> dup, elems) {
 	if(dup != line && line->mtime() == dup->mtime() ) {
 	  if (!topLevelItem) {
 	    topLevelItem =  new QTreeWidgetItem();
@@ -159,7 +159,7 @@
 
     if (showCheckSumDups) {
       QTreeWidgetItem* topLevelItem = 0;
-      foreach(QSharedPointer<FileDbLink::DBInfo> dup, elems) {
+      foreach(QSharedPointer<FileDBLink::DBInfo> dup, elems) {
 	if(dup != line && line->checksum() == dup->checksum() ) {
 	  if (!topLevelItem) {
 	    topLevelItem =  new QTreeWidgetItem();
@@ -176,10 +176,10 @@
 
     if (editDistanceCutoff < 1.0) {
       QTreeWidgetItem* topLevelItem = 0;
-      QMultiMap<int, QSharedPointer<FileDbLink::DBInfo> > oList;
+      QMultiMap<int, QSharedPointer<FileDBLink::DBInfo> > oList;
 
       int absoluteCutoff = line->name().length() * editDistanceCutoff;
-      foreach(QSharedPointer<FileDbLink::DBInfo> dup, elems) {
+      foreach(QSharedPointer<FileDBLink::DBInfo> dup, elems) {
 	if(dup != line) {
 	  int distance = EditDistance::Compute(line->name(), dup->name());
 
@@ -198,7 +198,7 @@
 	anyAdded = true;
       }
       
-      foreach(QSharedPointer<FileDbLink::DBInfo> dup, oList.values()) {
+      foreach(QSharedPointer<FileDBLink::DBInfo> dup, oList.values()) {
 	topLevelItem->addChild(createItem(*dup));
       }
     }
@@ -224,7 +224,7 @@
   populateDelay->setInterval(500);
   connect(populateDelay, SIGNAL(timeout()), this, SLOT(populate()));
 
-  dblink = new MemoryDbLink();
+  dblink = new MemoryDBLink();
 
   findFiles(QDir("."), *dblink);
 
--- a/DataController.hpp	Mon Aug 20 15:49:48 2012 +0200
+++ b/DataController.hpp	Mon Aug 20 17:32:58 2012 +0200
@@ -3,7 +3,7 @@
 
 #include <QtCore/QObject>
 
-#include "FileDbLink.hpp"
+#include "FileDBLink.hpp"
 
 class QMainWindow;
 class QTreeWidget;
@@ -37,13 +37,13 @@
 		bool showMTimeDups, bool showCheckSumDups,
 		float editDistanceCutoff);
 
-  QTreeWidgetItem* createItem(const FileDbLink::DBInfo& info);
+  QTreeWidgetItem* createItem(const FileDBLink::DBInfo& info);
 
   bool showFullPath;
   QMainWindow* mw;
   QTreeWidget* tw;
 
-  FileDbLink* dblink;
+  FileDBLink* dblink;
 
   QAction* nameFilter;
   QAction* sizeFilter;
--- /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;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FileDBLink.hpp	Mon Aug 20 17:32:58 2012 +0200
@@ -0,0 +1,109 @@
+#ifndef FILEDBLINK
+#define FILEDBLINK
+
+#include <QtCore/QDateTime>
+#include <QtCore/QCryptographicHash>
+#include <QtCore/QFileInfo>
+
+class FileDBLink {
+public:
+  class DBInfo {
+  public:
+    DBInfo(const QString& path, qint64 size, const QDateTime& mtime, const QByteArray& hash) : path_(path),
+												       size_(size),
+												       mtime_(mtime),
+												       hash_(hash)
+    {}
+    DBInfo() {}
+
+    virtual ~DBInfo() {}
+
+    const QString& path() const
+    {
+      return path_;
+    }
+
+    QString name() const
+    {
+      QFileInfo finf(path());
+      return finf.fileName();
+    }
+
+    quint64 size() const
+    {
+      return size_;
+    }
+
+    const QDateTime& mtime() const
+    {
+      return mtime_;
+    }
+
+    const QByteArray checksum() const
+    {
+      return hash_;
+    }
+
+    virtual QString serialize() const
+    {
+      QString size = QString::number(size_);
+      QString str = path_;
+      str += ", " + size;
+      str += ", " + mtime_.toString();
+      str += ", " + hash_.toHex();
+      return str;
+    }
+
+  private:
+    QString path_;
+    qint64 size_;
+    QDateTime mtime_;
+    QByteArray hash_;
+  };
+
+  class ExtendedDBInfo : public DBInfo {
+  public:
+    ExtendedDBInfo(const DBInfo& dbinfo, const QString& closestEditPath, int editDistance) : DBInfo(dbinfo), closestEditPath_(closestEditPath), editDistance_(editDistance) {}
+    ExtendedDBInfo() {}
+
+    virtual ~ExtendedDBInfo() {}
+
+    virtual QString serialize() const
+    {
+      QString dist = QString::number(editDistance_);
+      QString str = DBInfo::serialize();
+      str += ", " + closestEditPath_;
+      str += ", " + dist;
+      return str;
+    }
+
+    int editDistance() const
+    {
+      return editDistance_;
+    }
+
+  private:
+    QString closestEditPath_;
+    int editDistance_;
+  };
+
+  static QSharedPointer<DBInfo> computedValue(const QSharedPointer<DBInfo>& info, const QList<QSharedPointer<DBInfo> >&);
+
+
+public:
+  virtual ~FileDBLink() {}
+
+  void updateIfModified(const QString& path);
+  virtual void addFile(const QString& path, qint64 size, const QDateTime& dtime, const QCryptographicHash& hash) = 0;
+  void addFile(const QString& path, qint64 size, const QDateTime& dtime);
+  void addFile(const QFileInfo& fileinfo);
+  virtual bool exists(const QString& path) = 0;
+  virtual const QList<QSharedPointer<DBInfo> > values() const = 0;
+  virtual const QList<QSharedPointer<DBInfo> > computedValues() const;
+
+  enum SORTORDER { PATH, SIZE, MTIME, CHECKSUM, EDIT };
+
+  virtual const QList<QSharedPointer<DBInfo> > sortOn(SORTORDER order, bool extended = false);
+};
+
+#endif //FILEDBLINK
--- a/FileDbLink.cpp	Mon Aug 20 15:49:48 2012 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,140 +0,0 @@
-#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;
-}
--- a/FileDbLink.hpp	Mon Aug 20 15:49:48 2012 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-#ifndef FILEDBLINK
-#define FILEDBLINK
-
-#include <QtCore/QDateTime>
-#include <QtCore/QCryptographicHash>
-#include <QtCore/QFileInfo>
-
-class FileDbLink {
-public:
-  class DBInfo {
-  public:
-    DBInfo(const QString& path, qint64 size, const QDateTime& mtime, const QByteArray& hash) : path_(path),
-												       size_(size),
-												       mtime_(mtime),
-												       hash_(hash)
-    {}
-    DBInfo() {}
-
-    virtual ~DBInfo() {}
-
-    const QString& path() const
-    {
-      return path_;
-    }
-
-    QString name() const
-    {
-      QFileInfo finf(path());
-      return finf.fileName();
-    }
-
-    quint64 size() const
-    {
-      return size_;
-    }
-
-    const QDateTime& mtime() const
-    {
-      return mtime_;
-    }
-
-    const QByteArray checksum() const
-    {
-      return hash_;
-    }
-
-    virtual QString serialize() const
-    {
-      QString size = QString::number(size_);
-      QString str = path_;
-      str += ", " + size;
-      str += ", " + mtime_.toString();
-      str += ", " + hash_.toHex();
-      return str;
-    }
-
-  private:
-    QString path_;
-    qint64 size_;
-    QDateTime mtime_;
-    QByteArray hash_;
-  };
-
-  class ExtendedDBInfo : public DBInfo {
-  public:
-    ExtendedDBInfo(const DBInfo& dbinfo, const QString& closestEditPath, int editDistance) : DBInfo(dbinfo), closestEditPath_(closestEditPath), editDistance_(editDistance) {}
-    ExtendedDBInfo() {}
-
-    virtual ~ExtendedDBInfo() {}
-
-    virtual QString serialize() const
-    {
-      QString dist = QString::number(editDistance_);
-      QString str = DBInfo::serialize();
-      str += ", " + closestEditPath_;
-      str += ", " + dist;
-      return str;
-    }
-
-    int editDistance() const
-    {
-      return editDistance_;
-    }
-
-  private:
-    QString closestEditPath_;
-    int editDistance_;
-  };
-
-  static QSharedPointer<DBInfo> computedValue(const QSharedPointer<DBInfo>& info, const QList<QSharedPointer<DBInfo> >&);
-
-
-public:
-  virtual ~FileDbLink() {}
-
-  void updateIfModified(const QString& path);
-  virtual void addFile(const QString& path, qint64 size, const QDateTime& dtime, const QCryptographicHash& hash) = 0;
-  void addFile(const QString& path, qint64 size, const QDateTime& dtime);
-  void addFile(const QFileInfo& fileinfo);
-  virtual bool exists(const QString& path) = 0;
-  virtual const QList<QSharedPointer<DBInfo> > values() const = 0;
-  virtual const QList<QSharedPointer<DBInfo> > computedValues() const;
-
-  enum SORTORDER { PATH, SIZE, MTIME, CHECKSUM, EDIT };
-
-  virtual const QList<QSharedPointer<DBInfo> > sortOn(SORTORDER order, bool extended = false);
-};
-
-#endif //FILEDBLINK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MemoryDBLink.cpp	Mon Aug 20 17:32:58 2012 +0200
@@ -0,0 +1,41 @@
+#include "MemoryDBLink.hpp"
+
+#include <QtCore/QStringList>
+
+void MemoryDBLink::addFile(const QString& path, qint64 size, const QDateTime& dtime, const QCryptographicHash& hash)
+{
+  addFile(DBInfo(path, size, dtime, hash.result()));
+}
+
+bool MemoryDBLink::tryAddFile(const DBInfo& dbinfo)
+{
+  QMap<QString, QSharedPointer<DBInfo> >::iterator pos;
+  pos = entries.find(dbinfo.path());
+  if (pos == entries.end()) {
+    entries.insert(dbinfo.path(), QSharedPointer<DBInfo>(new DBInfo(dbinfo)));
+    return true;
+  }
+  return false;
+}
+
+void MemoryDBLink::addFile(const DBInfo& dbinfo)
+{
+  if (!tryAddFile(dbinfo)) {
+    abort(); //Should throw exception
+  }
+}
+
+
+QStringList MemoryDBLink::toStringList()
+{
+  QStringList list;
+  foreach(QSharedPointer<DBInfo> info, entries) {
+    list << info->serialize();
+  }
+  return list;
+}
+
+const QList<QSharedPointer<FileDBLink::DBInfo> > MemoryDBLink::values() const
+{
+  return entries.values();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MemoryDBLink.hpp	Mon Aug 20 17:32:58 2012 +0200
@@ -0,0 +1,25 @@
+#ifndef MEMORYDBLINK_HPP
+#define MEMORYDBLINK_HPP
+#include "FileDBLink.hpp"
+
+#include <QtCore/QMap>
+#include <QtCore/QSharedPointer>
+
+class MemoryDBLink : public FileDBLink {
+public:
+  virtual void addFile(const QString& path, qint64 size, const QDateTime& dtime, const QCryptographicHash& hash);
+  bool exists(const QString& path)
+  {
+    return (entries.contains(path));
+  }
+
+  QStringList toStringList();
+  const QList<QSharedPointer<DBInfo> > values() const;
+
+private:
+  void addFile(const DBInfo& info);
+  bool tryAddFile(const DBInfo& info);
+  QMap<QString, QSharedPointer<DBInfo> > entries;
+};
+
+#endif //MEMORYDBLINK_HPP
--- a/MemoryDbLink.cpp	Mon Aug 20 15:49:48 2012 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-#include "MemoryDbLink.hpp"
-
-#include <QtCore/QStringList>
-
-void MemoryDbLink::addFile(const QString& path, qint64 size, const QDateTime& dtime, const QCryptographicHash& hash)
-{
-  addFile(DBInfo(path, size, dtime, hash.result()));
-}
-
-bool MemoryDbLink::tryAddFile(const DBInfo& dbinfo)
-{
-  QMap<QString, QSharedPointer<DBInfo> >::iterator pos;
-  pos = entries.find(dbinfo.path());
-  if (pos == entries.end()) {
-    entries.insert(dbinfo.path(), QSharedPointer<DBInfo>(new DBInfo(dbinfo)));
-    return true;
-  }
-  return false;
-}
-
-void MemoryDbLink::addFile(const DBInfo& dbinfo)
-{
-  if (!tryAddFile(dbinfo)) {
-    abort(); //Should throw exception
-  }
-}
-
-
-QStringList MemoryDbLink::toStringList()
-{
-  QStringList list;
-  foreach(QSharedPointer<DBInfo> info, entries) {
-    list << info->serialize();
-  }
-  return list;
-}
-
-const QList<QSharedPointer<FileDbLink::DBInfo> > MemoryDbLink::values() const
-{
-  return entries.values();
-}
--- a/MemoryDbLink.hpp	Mon Aug 20 15:49:48 2012 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-#ifndef MEMORYDBLINK_HPP
-#define MEMORYDBLINK_HPP
-#include "FileDbLink.hpp"
-
-#include <QtCore/QMap>
-#include <QtCore/QSharedPointer>
-
-class MemoryDbLink : public FileDbLink {
-public:
-  virtual void addFile(const QString& path, qint64 size, const QDateTime& dtime, const QCryptographicHash& hash);
-  bool exists(const QString& path)
-  {
-    return (entries.contains(path));
-  }
-
-  QStringList toStringList();
-  const QList<QSharedPointer<DBInfo> > values() const;
-
-private:
-  void addFile(const DBInfo& info);
-  bool tryAddFile(const DBInfo& info);
-  QMap<QString, QSharedPointer<DBInfo> > entries;
-};
-
-#endif //MEMORYDBLINK_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/setup.sh	Mon Aug 20 17:32:58 2012 +0200
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+ADD_DEFINITION() {
+    KEY=$1
+    VALUE=$(eval "echo \${${KEY}}")
+    if [ -n "${VALUE}" ]
+    then
+	DEFINITIONS="${DEFINITIONS} -D${KEY}=${VALUE}"
+    fi
+}
+
+LOCATION=$(dirname $0)
+
+if [ -f ~/.auto_cmake ]
+then
+  . ~/.auto_cmake
+fi
+
+DEFINITIONS=""
+
+ADD_DEFINITION BOOST_ROOT
+ADD_DEFINITION QT_QMAKE_EXECUTABLE
+
+eval "cmake ${DEFINITIONS} ${LOCATION}"