view FileDBLink.hpp @ 96:c7da835ea912

Support for prefix in commit.
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Tue, 22 Oct 2013 14:40:08 +0200
parents 308a718812ba
children 6c6f3a5f96ea
line wrap: on
line source

#ifndef FILEDBLINK
#define FILEDBLINK

#include <QtCore/QCryptographicHash>
#include <QtCore/QDateTime>
#include <QtCore/QFileInfo>

class FileDBLink : public QObject {
  Q_OBJECT
public:
  class DBInfo {
  public:
    DBInfo(const QString& path, quint64 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_;
    quint64 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_;
  };
  typedef QSharedPointer<DBInfo> dbinf_ptr_t;

  static dbinf_ptr_t
  computedValue(const dbinf_ptr_t& info,
		const QList<dbinf_ptr_t >&);

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

signals:
  void progressUpdate(int, int);

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

  virtual ~FileDBLink();

  void updateIfModified(const QString& path, bool lazy = false);

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

  virtual const QList<dbinf_ptr_t> filesWithSize(quint64 size, const QString& prefix = QString()) const;

  bool updateAllWithSize(quint64 size);

  virtual dbinf_ptr_t value(const QString& path) const;

  void addFile(const QString& path, quint64 size, const QDateTime& dtime, bool lazy = false);
  void addFile(const QFileInfo& fileinfo, bool lazy = false);

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

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

  virtual bool commit(const QString& prefix = QString());
  virtual const QList<dbinf_ptr_t>
  values(const QString& prefix = QString() ) const = 0;

  virtual const QList<dbinf_ptr_t>
  computedValues(const QString& prefix = QString() ) const;

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

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

#endif //FILEDBLINK