Mercurial > dedupe
view SqliteDBLink.cpp @ 9:b5943e4bf676
Fix up header includes.
Introduce outer catch.
Fix coding style.
Remove spurious debug output.
| author | Tom Fredrik Blenning Klaussen <bfg@blenning.no> |
|---|---|
| date | Wed, 22 Aug 2012 18:48:07 +0200 |
| parents | d6fdca3bf24e |
| children | 06166d6c083b |
line wrap: on
line source
#include "SqliteDBLink.hpp" #include <QtCore/QStringList> #include <QtCore/QDebug> #include <QtSql/QSqlQuery> #include <QtSql/QSqlError> #include <QtSql/QSqlRecord> #include <cassert> SqliteDBLink::SqliteDBLink(const QString& dbPath) { db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(dbPath); bool ok = db.open(); assert(ok); QSqlQuery query; if (!query.exec(QString("SELECT * FROM files;"))) { query.exec("CREATE TABLE files(path VARCHAR PRIMARY KEY ASC, size INTEGER, mtime TEXT, checksum TEXT);"); } if (!query.exec(QString("SELECT * FROM files;"))) { qDebug()<<"No database"; exit(1); } } SqliteDBLink::~SqliteDBLink() { db.close(); } bool SqliteDBLink::exists(const QString& path) { QSqlQuery query; query.prepare("SELECT path FROM files WHERE path = :path;"); query.bindValue(":path", path); if (!query.exec()) { qDebug() << path << "::" << query.lastQuery() << "::" << query.lastError().text(); } return query.last(); } FileDBLink::DBStatus SqliteDBLink::existsWithMtime(const QString& path, const QDateTime& mtime) { QSqlQuery query; query.prepare("SELECT mtime FROM files WHERE path = :path;"); query.bindValue(":path", path); if (!query.exec()) { qDebug() << path << "::" << query.lastQuery() << "::" << query.lastError().text(); } if (query.next()) { int dateIndex = query.record().indexOf("mtime"); QDateTime mtimeEntry = query.value(dateIndex).toDateTime(); if (mtimeEntry == mtime) return SAME; return MTIME_DIFFERENT; } return NONE; } void SqliteDBLink::addFile(const QString& path, qint64 size, const QDateTime& dtime, const QByteArray& hash) { addFile(DBInfo(path, size, dtime, hash)); } bool SqliteDBLink::tryAddFile(const DBInfo& dbinfo) { if (exists(dbinfo.path())) return false; QSqlQuery query; query.prepare("INSERT INTO files (path, size, mtime, checksum) " "VALUES (:path, :size, :mtime, :checksum)"); query.bindValue(":path", dbinfo.path()); query.bindValue(":size", dbinfo.size()); query.bindValue(":mtime", dbinfo.mtime()); query.bindValue(":checksum", dbinfo.checksum()); if (!query.exec()) { qDebug() << dbinfo.path() << "::" << query.lastQuery() << "::" << query.lastError().text(); } return true; } void SqliteDBLink::updateFile(const QString& path, qint64 size, const QDateTime& dtime, const QByteArray& hash) { updateFile(DBInfo(path, size, dtime, hash)); } void SqliteDBLink::updateFile(const DBInfo& dbinfo) { QSqlQuery query; query.prepare("UPDATE files SET size=:size, mtime=:mtime, checksum=:checksum WHERE path=:path"); query.bindValue(":path", dbinfo.path()); query.bindValue(":size", dbinfo.size()); query.bindValue(":mtime", dbinfo.mtime()); query.bindValue(":checksum", dbinfo.checksum()); if (!query.exec()) { qDebug() << query.lastError().text(); } } void SqliteDBLink::addFile(const DBInfo& dbinfo) { if (!tryAddFile(dbinfo)) { abort(); //Should throw exception } } QStringList SqliteDBLink::toStringList() { abort(); QStringList list; /* foreach(QSharedPointer<DBInfo> info, entries) { list << info->serialize(); } */ return list; } const QList<QSharedPointer<FileDBLink::DBInfo> > SqliteDBLink::values(const QString& prefix) const { QList<QSharedPointer<FileDBLink::DBInfo> > values; QSqlQuery query; if (prefix.size() > 0) { query.prepare("SELECT * FROM files WHERE path LIKE :prefix"); query.bindValue(":prefix", QString("%1%").arg(prefix)); } else { query.prepare("SELECT * FROM files"); } if (!query.exec()) { qDebug() << prefix << "::" << query.lastQuery() << "::" << query.lastError().text(); abort(); } int pathIndex = query.record().indexOf("path"); int sizeIndex = query.record().indexOf("size"); int dateIndex = query.record().indexOf("mtime"); int checksumIndex = query.record().indexOf("checksum"); while (query.next()) { QString path = query.value(pathIndex).toString(); qint64 size = query.value(sizeIndex).toInt(); QDateTime mtime = query.value(dateIndex).toDateTime(); QByteArray checksum = query.value(checksumIndex).toByteArray(); values << QSharedPointer<FileDBLink::DBInfo>(new FileDBLink::DBInfo(path, size, mtime, checksum)); //qDebug() << path << size << mtime << checksum.toHex(); } return values; } void SqliteDBLink::deleteFileFromDB(const QString& path) { QSqlQuery query; query.prepare("DELETE FROM files WHERE path = :path"); query.bindValue(":path", path); if (!query.exec()) { qDebug() << path << "::" << query.lastQuery() << "::" << query.lastError().text(); } } void SqliteDBLink::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); } }
