← Back to team overview

uonedb-qt team mailing list archive

[Merge] lp:~uonedb-qt/u1db-qt/smartDefaultDocs into lp:u1db-qt

 

Christian Dywan has proposed merging lp:~uonedb-qt/u1db-qt/smartDefaultDocs into lp:u1db-qt.

Commit message:
Avoid loading contents and revision for default documents

Requested reviews:
  U1DB Qt developers (uonedb-qt)

For more details, see:
https://code.launchpad.net/~uonedb-qt/u1db-qt/smartDefaultDocs/+merge/245638
-- 
Your team U1DB Qt developers is requested to review the proposed merge of lp:~uonedb-qt/u1db-qt/smartDefaultDocs into lp:u1db-qt.
=== modified file 'src/database.cpp'
--- src/database.cpp	2014-11-07 14:30:31 +0000
+++ src/database.cpp	2015-01-06 10:46:20 +0000
@@ -377,55 +377,39 @@
 
 QString Database::getNextDocRevisionNumber(QString doc_id)
 {
-
     QString revision_number = getReplicaUid()+":1";
-
     QString current_revision_number = getCurrentDocRevisionNumber(doc_id);
 
     /*!
         Some revisions contain information from previous
 conflicts/syncs. Revisions are delimited by '|'.
-
      */
 
     QStringList current_revision_list = current_revision_number.split("|");
-
     Q_FOREACH (QString current_revision, current_revision_list) {
 
         /*!
             Each revision contains two pieces of information,
 the uid of the database that made the revsion, and a counter
 for the revsion. This information is delimited by ':'.
-
          */
 
         QStringList current_revision_number_list = current_revision.split(":");
-
         if(current_revision_number_list[0]==getReplicaUid()) {
 
             /*!
                 If the current revision uid  is the same as this Database's uid the counter portion is increased by one.
-
              */
 
             int revision_generation_number = current_revision_number_list[1].toInt()+1;
-
             revision_number = getReplicaUid()+":"+QString::number(revision_generation_number);
-
         }
         else {
 
             /*!
                 If the current revision uid  is not the same as this Database's uid then the revision represents a change that originated in another database.
-
-             */
-            //revision_number+="|"+current_revision;
-
-            /* Not sure if the above is necessary,
-             *and did not appear to be working as intended either.
-             *
-             * Commented out, but maybe OK to delete.
-             */
+             */
+            // FIXME: revision_number+="|"+current_revision;
         }
 
     }
@@ -436,9 +420,7 @@
      */
 
     revision_number = revision_number.replace("{","");
-
     revision_number = revision_number.replace("}","");
-
     return revision_number;
 
 }
@@ -618,10 +600,10 @@
     there's no error.
     If no \a docId is given or \a docId is an empty string the \a contents will be
     stored under an autogenerated name.
-    Returns the new revision of the document, or -1 on failure.
+    Returns the new \a revision of the document, or -1 on failure.
  */
 QString
-Database::putDoc(QVariant contents, const QString& docId)
+Database::putDoc(QVariant contents, const QString& docId, const QString& revision)
 {
     if (!initializeIfNeeded())
         return "";
@@ -629,16 +611,15 @@
     ScopedTransaction t(m_db);
 
     QString newOrEmptyDocId(docId);
-    QVariant oldDoc = newOrEmptyDocId.isEmpty() ? QVariant() : getDocUnchecked(newOrEmptyDocId);
-
-    QString revision_number = getNextDocRevisionNumber(newOrEmptyDocId);
+    QVariant oldDoc = newOrEmptyDocId.isEmpty() || !revision.isEmpty() ? QVariant() : getDocUnchecked(newOrEmptyDocId);
+    QString newRevisionNumber = revision.isEmpty() ? getNextDocRevisionNumber(newOrEmptyDocId) : revision;
 
     QSqlQuery query(m_db.exec());
     if (oldDoc.isValid())
     {
         query.prepare("UPDATE document SET doc_rev=:docRev, content=:docJson WHERE doc_id = :docId");
         query.bindValue(":docId", newOrEmptyDocId);
-        query.bindValue(":docRev", revision_number);
+        query.bindValue(":docRev", newRevisionNumber);
         // Parse Variant from QML as JsonDocument, fallback to string
         QString json(QJsonDocument::fromVariant(contents).toJson());
         query.bindValue(":docJson", json.isEmpty() ? contents : json);
@@ -650,7 +631,6 @@
             return setError(QString("Failed to delete document field %1: %2\n%3").arg(newOrEmptyDocId).arg(query.lastError().text()).arg(query.lastQuery())) ? "" : "";
 
         createNewTransaction(newOrEmptyDocId);
-
     }
     else
     {
@@ -661,7 +641,7 @@
 
         query.prepare("INSERT INTO document (doc_id, doc_rev, content) VALUES (:docId, :docRev, :docJson)");
         query.bindValue(":docId", newOrEmptyDocId);
-        query.bindValue(":docRev", revision_number);
+        query.bindValue(":docRev", newRevisionNumber);
         // Parse Variant from QML as JsonDocument, fallback to string
         QJsonDocument json(QJsonDocument::fromVariant(contents));
         query.bindValue(":docJson", json.isEmpty() ? contents : json.toJson());
@@ -680,7 +660,7 @@
 
     Q_EMIT docChanged(newOrEmptyDocId, contents);
 
-    return revision_number;
+    return newRevisionNumber;
 }
 
 /*!

=== modified file 'src/database.h'
--- src/database.h	2014-01-24 11:13:35 +0000
+++ src/database.h	2015-01-06 10:46:20 +0000
@@ -48,7 +48,7 @@
     Q_INVOKABLE QVariant getDoc(const QString& docId);
     QString getDocumentContents(const QString& docId);
     QVariant getDocUnchecked(const QString& docId) const;
-    Q_INVOKABLE QString putDoc(QVariant newDoc, const QString& docID=QString());
+    Q_INVOKABLE QString putDoc(QVariant newDoc, const QString& docID=QString(), const QString& rev=QString());
     Q_INVOKABLE void deleteDoc(const QString& docID);
     Q_INVOKABLE QList<QString> listDocs();
     Q_INVOKABLE QString lastError();
@@ -57,6 +57,7 @@
     Q_INVOKABLE QStringList getIndexKeys(const QString& indexName);
 
     /* Functions handy for Synchronization */
+    QString getReplicaUid();
     QString getNextDocRevisionNumber(QString doc_id);
     QString getCurrentDocRevisionNumber(QString doc_id);
     void updateDocRevisionNumber(QString doc_id,QString revision);
@@ -81,7 +82,6 @@
     QSqlDatabase m_db;
     QString m_error;
 
-    QString getReplicaUid();
     bool isInitialized();
     bool initializeIfNeeded(const QString& path=":memory:");
     bool setError(const QString& error);

=== modified file 'src/document.cpp'
--- src/document.cpp	2013-04-23 15:17:24 +0000
+++ src/document.cpp	2015-01-06 10:46:20 +0000
@@ -152,8 +152,8 @@
     m_create = create;
     Q_EMIT createChanged(create);
 
-    if (m_create && m_database && m_defaults.isValid() && !m_database->getDocUnchecked(m_docId).isValid())
-        m_database->putDoc(m_defaults, m_docId);
+    if (m_create && m_database && m_defaults.isValid() && !m_contents.isValid())
+        m_database->putDoc(m_defaults, m_docId, m_database->getReplicaUid() + ":1");
 }
 
 QVariant
@@ -178,8 +178,8 @@
     m_defaults = defaults;
     Q_EMIT defaultsChanged(defaults);
 
-    if (m_create && m_database && m_defaults.isValid() && !m_database->getDocUnchecked(m_docId).isValid())
-        m_database->putDoc(m_defaults, m_docId);
+    if (m_create && m_database && m_defaults.isValid() && !m_contents.isValid())
+        m_database->putDoc(m_defaults, m_docId, m_database->getReplicaUid() + ":1");
 }
 
 QVariant


Follow ups