view SqliteDBLink.hpp @ 107:d434137e296d

Sort the prepared queries and add end and begin queries.
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Tue, 18 Feb 2014 17:07:01 +0100
parents 6bc013d5788b
children
line wrap: on
line source

#ifndef SQLITEDBLINK_HPP
#define SQLITEDBLINK_HPP
#include "FileDBLink.hpp"

#include <QtSql/QSqlDatabase>
#include <QtCore/QPair>
#include <QtCore/QVariant>

class SqliteDBLink : public FileDBLink {
public:
  SqliteDBLink(const QString& dbpath);
  ~SqliteDBLink();

  virtual void addFile(const QString& path, quint64 size,
		       const QDateTime& dtime, const QByteArray& hash,
		       bool lazy = false);
  virtual void updateFile(const QString& path, quint64 size,
			  const QDateTime& dtime, const QByteArray& hash,
			  bool lazy = false);
  bool exists(const QString& path);
  DBStatus existsWithMtime(const QString& path, const QDateTime& mtime);

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


  QStringList toStringList();
  const QList<dbinf_ptr_t > values(const QString& prefix = QString() ) const;
  virtual void keepOnlyFromPrefix(const QString& prefix,
				  const QStringList& files,
				  bool lazy = false);
  virtual void deleteFileFromDB(const QString& path, bool lazy = false);
  bool commit(const QString& prefix = QString(), bool dirty = true );

private:
  typedef enum {None = 0, Add, Update, Delete } OperationType;
  static const char* typeString(OperationType);

  //typedef QPair<DBInfo, OperationType> Operation;
  class Operation {
  public:
    virtual OperationType type() const = 0;
    virtual  ~Operation() {}
  };

  class InfoOperation: public Operation {
  private:
    DBInfo _info;
  public:
    InfoOperation(const DBInfo&info) {
      this->_info=info;
    }
    const DBInfo& info() const {
      return _info;
    }
  };

  class UpdateOperation: public InfoOperation {
  public:
    UpdateOperation(const DBInfo&info) : InfoOperation(info) {}

    OperationType type() const
    {
      return Update;
    }
  };

  class AddOperation: public InfoOperation {
  public:
    AddOperation(const DBInfo&info) : InfoOperation(info) {}

    OperationType type() const
    {
      return Add;
    }
  };

  class DeleteOperation: public Operation {
  private:
    QString _path;
  public:
    DeleteOperation(const QString& path) {
      _path=path;
    }
    OperationType type() const
    {
      return Delete;
    }
    const QString& path() const {
      return _path;
    }
  };

  void addFile(const DBInfo& info, bool lazy = false);
  bool tryAddFile(const DBInfo& info);
  void updateFile(const DBInfo& dbinfo, bool lazy = false);

  QSqlDatabase db;
  static const QString connectionName;

  QSqlQuery* preparedBeginQuery;
  QSqlQuery* preparedDeleteQuery;
  QSqlQuery* preparedEndQuery;
  QSqlQuery* preparedSizePrefixQuery;
  QSqlQuery* preparedSizeQuery;
  QSqlQuery* preparedTryAddQuery;
  QSqlQuery* preparedUpdateQuery;

  QList<Operation*> operations;
  void executeOperation(QVariantList& paths, QVariantList& sizes,
			QVariantList& mtimes, QVariantList& checksums,
			OperationType operation);
};

#endif //MEMORYDBLINK_HPP