diff options
Diffstat (limited to 'common/fulltextindex.cpp')
-rw-r--r-- | common/fulltextindex.cpp | 71 |
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 | ||
85 | void FulltextIndex::commitTransaction() | 92 | void 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 | ||
122 | QVector<QByteArray> FulltextIndex::lookup(const QString &searchTerm) | 157 | QVector<QByteArray> FulltextIndex::lookup(const QString &searchTerm) |