view 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 source

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