From b2ddcdd470e16134d978d9afb5d00231b2caa079 Mon Sep 17 00:00:00 2001 From: Martin Kleusberg Date: Sat, 30 Sep 2017 13:35:40 +0200 Subject: [PATCH] dbhub: Only keep one record per checked out file Instead of just adding and adding records to the local checkout database, search for a previous checkout and update its record. This avoids all sorts of problems in the rest of the code which always assumed that there is only one record per file. --- src/RemoteDatabase.cpp | 121 +++++++++++++++++++++++++++-------------- 1 file changed, 79 insertions(+), 42 deletions(-) diff --git a/src/RemoteDatabase.cpp b/src/RemoteDatabase.cpp index ed5c4ff0..2acd9d81 100644 --- a/src/RemoteDatabase.cpp +++ b/src/RemoteDatabase.cpp @@ -543,55 +543,92 @@ void RemoteDatabase::localAdd(QString filename, QString identity, const QUrl& ur localAssureOpened(); - // Insert database into local database list - QString sql = QString("INSERT INTO local(identity, name, url, commit_id, file) VALUES(?, ?, ?, ?, ?)"); - sqlite3_stmt* stmt; - if(sqlite3_prepare_v2(m_dbLocal, sql.toUtf8(), -1, &stmt, 0) != SQLITE_OK) - return; - - QFileInfo f(identity); // Remove the path - identity = f.fileName(); - if(sqlite3_bind_text(stmt, 1, identity.toUtf8(), identity.toUtf8().length(), SQLITE_TRANSIENT)) + // Check if this file has already been checked in + QString last_commit_id = localLastCommitId(filename); + QString new_commit_id = QUrlQuery(url).queryItemValue("commit"); + if(last_commit_id.isNull()) { - sqlite3_finalize(stmt); - return; - } + // The file hasn't been checked in yet. So add a new record for it. - if(sqlite3_bind_text(stmt, 2, url.fileName().toUtf8(), url.fileName().toUtf8().length(), SQLITE_TRANSIENT)) - { - sqlite3_finalize(stmt); - return; - } + // Insert database into local database list + QString sql = QString("INSERT INTO local(identity, name, url, commit_id, file) VALUES(?, ?, ?, ?, ?)"); + sqlite3_stmt* stmt; + if(sqlite3_prepare_v2(m_dbLocal, sql.toUtf8(), -1, &stmt, 0) != SQLITE_OK) + return; - QUrl url_without_query = url; // Remove the '?commit=x' bit from the URL - url_without_query.setQuery(QString()); - if(sqlite3_bind_text(stmt, 3, url_without_query.toString().toUtf8(), url_without_query.toString().toUtf8().length(), SQLITE_TRANSIENT)) - { - sqlite3_finalize(stmt); - return; - } + QFileInfo f(identity); // Remove the path + identity = f.fileName(); + if(sqlite3_bind_text(stmt, 1, identity.toUtf8(), identity.toUtf8().length(), SQLITE_TRANSIENT)) + { + sqlite3_finalize(stmt); + return; + } - if(sqlite3_bind_text(stmt, 4, QUrlQuery(url).queryItemValue("commit").toUtf8(), QUrlQuery(url).queryItemValue("commit").toUtf8().length(), SQLITE_TRANSIENT)) - { - sqlite3_finalize(stmt); - return; - } + if(sqlite3_bind_text(stmt, 2, url.fileName().toUtf8(), url.fileName().toUtf8().length(), SQLITE_TRANSIENT)) + { + sqlite3_finalize(stmt); + return; + } - f = QFileInfo(filename); // Remove the path - filename = f.fileName(); - if(sqlite3_bind_text(stmt, 5, filename.toUtf8(), filename.toUtf8().length(), SQLITE_TRANSIENT)) - { - sqlite3_finalize(stmt); - return; - } + QUrl url_without_query = url; // Remove the '?commit=x' bit from the URL + url_without_query.setQuery(QString()); + if(sqlite3_bind_text(stmt, 3, url_without_query.toString().toUtf8(), url_without_query.toString().toUtf8().length(), SQLITE_TRANSIENT)) + { + sqlite3_finalize(stmt); + return; + } - if(sqlite3_step(stmt) != SQLITE_DONE) - { - sqlite3_finalize(stmt); - return; - } + if(sqlite3_bind_text(stmt, 4, new_commit_id.toUtf8(), new_commit_id.toUtf8().length(), SQLITE_TRANSIENT)) + { + sqlite3_finalize(stmt); + return; + } - sqlite3_finalize(stmt); + f = QFileInfo(filename); // Remove the path + filename = f.fileName(); + if(sqlite3_bind_text(stmt, 5, filename.toUtf8(), filename.toUtf8().length(), SQLITE_TRANSIENT)) + { + sqlite3_finalize(stmt); + return; + } + + if(sqlite3_step(stmt) != SQLITE_DONE) + { + sqlite3_finalize(stmt); + return; + } + + sqlite3_finalize(stmt); + } else if(last_commit_id != new_commit_id) { + // The file has already been checked in and the commit ids are different (if they weren't we wouldn't need to update anything) + + QString sql = QString("UPDATE local SET commit_id=? WHERE file=?"); + sqlite3_stmt* stmt; + if(sqlite3_prepare_v2(m_dbLocal, sql.toUtf8(), -1, &stmt, 0) != SQLITE_OK) + return; + + if(sqlite3_bind_text(stmt, 1, new_commit_id.toUtf8(), new_commit_id.toUtf8().length(), SQLITE_TRANSIENT)) + { + sqlite3_finalize(stmt); + return; + } + + QFileInfo f(filename); // Remove the path + filename = f.fileName(); + if(sqlite3_bind_text(stmt, 2, filename.toUtf8(), filename.toUtf8().length(), SQLITE_TRANSIENT)) + { + sqlite3_finalize(stmt); + return; + } + + if(sqlite3_step(stmt) != SQLITE_DONE) + { + sqlite3_finalize(stmt); + return; + } + + sqlite3_finalize(stmt); + } } QString RemoteDatabase::localExists(const QUrl& url, QString identity)