view MemoryDBLink.cpp @ 58:7b7e84356b39

Introduce API for fine tuning inserts. Reduce the amount of rebuilds.
author Tom Fredrik Blenning Klaussen <bfg@blenning.no>
date Fri, 14 Sep 2012 00:04:24 +0200
parents d6fdca3bf24e
children b9515dc35fe4
line wrap: on
line source

#include "MemoryDBLink.hpp"

#include <QtCore/QStringList>

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

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 QString& prefix) const
{
  if (prefix.size() == 0)
    return entries.values();

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


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


void MemoryDBLink::keepOnlyFromPrefix(const QString& prefix, const QStringList& files)
{
  QStringList list;
  foreach(QSharedPointer<DBInfo> 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)) {
    QSharedPointer<DBInfo> info = entries[path];
    if (info->mtime() == mtime)
      return SAME;
    return MTIME_DIFFERENT;
  }
  return NONE;
}

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

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