Switch to side-by-side view

--- a/src/rcldb/rclquery.cpp
+++ b/src/rcldb/rclquery.cpp
@@ -309,6 +309,7 @@
 		} catch (const Xapian::Error & error) {
 		  LOGERR(("enquire->get_mset: exception: %s\n", 
 			  error.get_msg().c_str()));
+                  m_reason = error.get_msg();
                   return false;
 		}
 
@@ -349,6 +350,7 @@
 	} catch (const Xapian::Error & error) {
 	  LOGERR(("enquire->get_mset: exception: %s\n", 
                   error.get_msg().c_str()));
+          m_reason = error.get_msg();
           return false;
 	}
 	if (m_nq->mset.empty())
@@ -361,13 +363,32 @@
             m_nq->query.get_description().c_str(), 
             first, last, m_nq->mset.get_matches_lower_bound()));
 
-    Xapian::Document xdoc = m_nq->mset[xapi-first].get_document();
-    Xapian::docid docid = *(m_nq->mset[xapi-first]);
-    int pc = m_nq->mset.convert_to_percent(m_nq->mset[xapi-first]);
+    Xapian::Document xdoc;
+    Xapian::docid docid = 0;
+    int pc = 0;
+    string data;
+    m_reason.erase();
+    for (int xaptries=0; xaptries < 2; xaptries++) {
+        try {
+            xdoc = m_nq->mset[xapi-first].get_document();
+            docid = *(m_nq->mset[xapi-first]);
+            pc = m_nq->mset.convert_to_percent(m_nq->mset[xapi-first]);
+            data = xdoc.get_data();
+            m_reason.erase();
+            break;
+        } catch (Xapian::DatabaseModifiedError &error) {
+            // retry or end of loop
+            LOGDEB(("getDoc: caught DatabaseModified\n"));
+            m_reason = error.get_msg();
+            continue;
+        }
+        XCATCHERROR(m_reason);
+        break;
+    }
 
     // Parse xapian document's data and populate doc fields
-    string data = xdoc.get_data();
-    return m_db->m_ndb->dbDataToRclDoc(docid, data, doc, pc);
+    return m_reason.empty() ? 
+        m_db->m_ndb->dbDataToRclDoc(docid, data, doc, pc) : false;
 }
 
 list<string> Query::expand(const Doc &doc)