view MemoryDBLink.cpp @ 101:6c6f3a5f96ea

Better support for batch operations.
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Thu, 13 Feb 2014 15:19:37 +0100
parents f49023c61dac
children
line wrap: on
line source

#include "MemoryDBLink.hpp"
#include "Exception/ValueExistsException.hpp"
#include <QtCore/QStringList>

void MemoryDBLink::addFile(const QString& path, quint64 size,
			   const QDateTime& dtime, const QByteArray& hash, bool)
{
  addFile(DBInfo(path, size, dtime, hash));
}

bool MemoryDBLink::tryAddFile(const DBInfo& dbinfo)
{
  QMap<QString, dbinf_ptr_t >::iterator pos;
  pos = entries.find(dbinfo.path());
  if (pos == entries.end()) {
    entries.insert(dbinfo.path(), dbinf_ptr_t(new DBInfo(dbinfo)));
    return true;
  }
  return false;
}

void MemoryDBLink::addFile(const DBInfo& dbinfo)
{
  if (!tryAddFile(dbinfo)) {
    QString msg = QString("Trying to add '%1', which already exists").arg(dbinfo.path());
    throw ValueExistsException(msg);
  }
}


QStringList MemoryDBLink::toStringList()
{
  QStringList list;
  foreach(dbinf_ptr_t info, entries) {
    list << info->serialize();
  }
  return list;
}

const QList<FileDBLink::dbinf_ptr_t>
MemoryDBLink::values(const QString& prefix) const
{
  if (prefix.size() == 0)
    return entries.values();

  QList<FileDBLink::dbinf_ptr_t > list;
  foreach (QString key, entries.keys()) {
    if (key.startsWith(prefix))
      list << entries[key];
  }
  return list;
}


void MemoryDBLink::deleteFileFromDB(const QString& path, bool lazy)
{
  entries.remove(path);
}


void MemoryDBLink::keepOnlyFromPrefix(const QString& prefix,
				      const QStringList& files,
				      bool lazy)
{
  QStringList list;
  foreach(dbinf_ptr_t info, values(prefix)) {
    if (!files.contains(info->path())) {
      list << info->path();
    }
  }
  foreach(QString path, list) {
    deleteFileFromDB(path);
  }
}

FileDBLink::DBStatus MemoryDBLink::existsWithMtime(const QString& path,
						   const QDateTime& mtime)
{
  if (entries.contains(path)) {
    dbinf_ptr_t info = entries[path];
    if (info->mtime() == mtime)
      return SAME;
    return MTIME_DIFFERENT;
  }
  return NONE;
}

void MemoryDBLink::updateFile(const QString& path, quint64 size,
			      const QDateTime& dtime, const QByteArray& hash,
			      bool)
{
  updateFile(DBInfo(path, size, dtime, hash));
}

void MemoryDBLink::updateFile(const DBInfo& dbinfo)
{
  *entries[dbinfo.path()] = dbinfo;
}