summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2018-02-21 13:40:36 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2018-02-21 13:40:36 +0100
commitacf28d6f734402202be4404086e20d2739466aa8 (patch)
treea75dcc2b62934937a06f2aed9a00145cc2998eea
parenta05c66462d73aaab5b7973e79bc481301fdb9e81 (diff)
downloadsink-acf28d6f734402202be4404086e20d2739466aa8.tar.gz
sink-acf28d6f734402202be4404086e20d2739466aa8.zip
Catch xapian exceptions
-rw-r--r--common/fulltextindex.cpp71
1 files changed, 53 insertions, 18 deletions
diff --git a/common/fulltextindex.cpp b/common/fulltextindex.cpp
index 839079d..355f1ca 100644
--- a/common/fulltextindex.cpp
+++ b/common/fulltextindex.cpp
@@ -65,29 +65,43 @@ void FulltextIndex::add(const QByteArray &key, const QList<QPair<QString, QStrin
65 if (!mDb) { 65 if (!mDb) {
66 return; 66 return;
67 } 67 }
68 Xapian::TermGenerator generator; 68 try {
69 Xapian::Document document; 69 Xapian::TermGenerator generator;
70 generator.set_document(document); 70 Xapian::Document document;
71 generator.set_document(document);
71 72
72 for (const auto &entry : values) { 73 for (const auto &entry : values) {
73 if (!entry.second.isEmpty()) { 74 if (!entry.second.isEmpty()) {
74 generator.index_text(entry.second.toStdString()); 75 generator.index_text(entry.second.toStdString());
76 }
75 } 77 }
76 } 78 document.add_value(0, key.toStdString());
77 document.add_value(0, key.toStdString());
78 79
79 const auto idterm = idTerm(key); 80 const auto idterm = idTerm(key);
80 document.add_boolean_term(idterm); 81 document.add_boolean_term(idterm);
81 82
82 writableDatabase()->replace_document(idterm, document); 83 writableDatabase()->replace_document(idterm, document);
84 }
85 catch (const Xapian::Error &error) {
86 SinkError() << "Exception during Xapian commit_transaction:" << error.get_msg().c_str();
87 //FIXME we should somehow retry the transaction...
88 Q_ASSERT(false);
89 }
83} 90}
84 91
85void FulltextIndex::commitTransaction() 92void FulltextIndex::commitTransaction()
86{ 93{
87 if (mHasTransactionOpen) { 94 if (mHasTransactionOpen) {
88 Q_ASSERT(mDb); 95 Q_ASSERT(mDb);
89 writableDatabase()->commit_transaction(); 96 try {
90 mHasTransactionOpen = false; 97 writableDatabase()->commit_transaction();
98 mHasTransactionOpen = false;
99 }
100 catch (const Xapian::Error &error) {
101 SinkError() << "Exception during Xapian commit_transaction:" << error.get_msg().c_str();
102 //FIXME we should somehow retry the transaction...
103 Q_ASSERT(false);
104 }
91 } 105 }
92} 106}
93 107
@@ -95,8 +109,15 @@ void FulltextIndex::abortTransaction()
95{ 109{
96 if (mHasTransactionOpen) { 110 if (mHasTransactionOpen) {
97 Q_ASSERT(mDb); 111 Q_ASSERT(mDb);
98 writableDatabase()->cancel_transaction(); 112 try {
99 mHasTransactionOpen = false; 113 writableDatabase()->cancel_transaction();
114 mHasTransactionOpen = false;
115 }
116 catch (const Xapian::Error &error) {
117 SinkError() << "Exception during Xapian cancel_transaction:" << error.get_msg().c_str();
118 //FIXME we should somehow retry the transaction...
119 Q_ASSERT(false);
120 }
100 } 121 }
101} 122}
102 123
@@ -105,8 +126,15 @@ Xapian::WritableDatabase* FulltextIndex::writableDatabase()
105 Q_ASSERT(dynamic_cast<Xapian::WritableDatabase*>(mDb)); 126 Q_ASSERT(dynamic_cast<Xapian::WritableDatabase*>(mDb));
106 auto db = static_cast<Xapian::WritableDatabase*>(mDb); 127 auto db = static_cast<Xapian::WritableDatabase*>(mDb);
107 if (!mHasTransactionOpen) { 128 if (!mHasTransactionOpen) {
108 db->begin_transaction(); 129 try {
109 mHasTransactionOpen = true; 130 db->begin_transaction();
131 mHasTransactionOpen = true;
132 }
133 catch (const Xapian::Error &error) {
134 SinkError() << "Exception during Xapian begin_transaction:" << error.get_msg().c_str();
135 //FIXME we should somehow retry the transaction...
136 Q_ASSERT(false);
137 }
110 } 138 }
111 return db; 139 return db;
112} 140}
@@ -116,7 +144,14 @@ void FulltextIndex::remove(const QByteArray &key)
116 if (!mDb) { 144 if (!mDb) {
117 return; 145 return;
118 } 146 }
119 writableDatabase()->delete_document(idTerm(key)); 147 try {
148 writableDatabase()->delete_document(idTerm(key));
149 }
150 catch (const Xapian::Error &error) {
151 SinkError() << "Exception during Xapian delete_document:" << error.get_msg().c_str();
152 //FIXME we should somehow retry the transaction...
153 Q_ASSERT(false);
154 }
120} 155}
121 156
122QVector<QByteArray> FulltextIndex::lookup(const QString &searchTerm) 157QVector<QByteArray> FulltextIndex::lookup(const QString &searchTerm)