view FileDBLink.hpp @ 56:76846cb92b5c

Clean up at exit. Add getSet function.
author Tom Fredrik Blenning Klaussen <bfg@blenning.no>
date Thu, 13 Sep 2012 23:49:18 +0200
parents 9463c0c22969
children b9515dc35fe4
line wrap: on
line source

#ifndef FILEDBLINK
#define FILEDBLINK

#include <QtCore/QCryptographicHash>
#include <QtCore/QDateTime>
#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> >&);

  static QByteArray computeHash(const QString& path, QCryptographicHash::Algorithm = QCryptographicHash::Sha1);

public:
  enum DBStatus { NONE = 0, MTIME_DIFFERENT, SAME};

  virtual ~FileDBLink() {}

  void updateIfModified(const QString& path);

  virtual void addFile(const QString& path, qint64 size, const QDateTime& dtime, const QByteArray& hash) = 0;
  virtual void keepOnlyFromPrefix(const QString& prefix, const QStringList& files) = 0;
  virtual void deleteFileFromDB(const QString& path) = 0;

  void addFile(const QString& path, qint64 size, const QDateTime& dtime);
  void addFile(const QFileInfo& fileinfo);

  virtual void updateFile(const QString& path, qint64 size, const QDateTime& dtime, const QByteArray& hash) = 0;
  void updateFile(const QString& path, qint64 size, const QDateTime& dtime);
  void updateFile(const QFileInfo& fileinfo);

  virtual bool exists(const QString& path) = 0;
  virtual DBStatus existsWithMtime(const QString& path, const QDateTime& mtime) = 0;

  virtual const QList<QSharedPointer<DBInfo> > values(const QString& prefix = QString() ) const = 0;
  virtual const QList<QSharedPointer<DBInfo> > computedValues(const QString& prefix = QString() ) const;

  enum SORTORDER { PATH, SIZE, MTIME, CHECKSUM, EDIT };

  virtual const QList<QSharedPointer<DBInfo> > sortOn(const QString& prefix, SORTORDER order, bool extended = false);
};

#endif //FILEDBLINK