29 zDebug() <<
"Insert mark, recordID: " << recordID
30 <<
", lastRecordID: " << lastRecordID
31 <<
", seekPosition: " << seekPosition;
33 if(lastRecordID == -1)
34 lastRecordID = recordID;
35 else if(recordID > lastRecordID)
37 zDebug() <<
"Warning: lastRecordID should be less than or equal to " 38 "recordID. Swapping values.";
40 qint64 temp = recordID;
41 recordID = lastRecordID;
47 zDebug() <<
"Creating mark at record ID: " << recordID;
49 m_map.insert(recordID,
MarkNode(recordID, lastRecordID, seekPosition));
58 QMap<qint64, MarkNode>::iterator it =
m_map.lowerBound(recordID);
60 if(it !=
m_map.end() && it.key() == recordID)
64 zDebug() <<
"A mark already exists at record ID: " << recordID;
66 if(it->m_lastID < lastRecordID)
70 zDebug() <<
"Stretching mark at record ID: " << recordID
71 <<
", lastID: " << lastRecordID;
73 it->m_lastID = lastRecordID;
93 if(it ==
m_map.begin())
98 zDebug() <<
"Creating mark at record ID: " << recordID;
100 it =
m_map.insert(recordID,
MarkNode(recordID, lastRecordID, seekPosition));
111 qint64 recID = it->m_recordID;
112 qint64 lastID = it->m_lastID;
114 if(recordID > lastID+1)
119 zDebug() <<
"Creating mark at record ID: " << recordID;
121 it =
m_map.insert(recordID,
MarkNode(recordID, lastRecordID, seekPosition));
129 else if(lastRecordID > lastID)
134 zDebug() <<
"Stretching mark at record ID: " << recID
135 <<
", lastID: " << lastRecordID;
137 it->m_lastID = lastRecordID;
147 zDebug() <<
"Existing mark subsumes new mark at record ID: " 169 zDebug() <<
"Merging nodes at record ID: " << it->m_recordID;
171 QMap<qint64, MarkNode>::iterator next = it+1;
173 while(next !=
m_map.end())
175 if(it->m_lastID < next->m_recordID)
178 if(next->m_lastID > it->m_lastID)
180 zDebug() <<
"Stretching mark at record ID: " << it->m_recordID
181 <<
", lastID: " << next->m_lastID;
183 it->m_lastID = next->m_lastID;
186 zDebug() <<
"Removing superfluous mark at record ID: " 189 next =
m_map.erase(next);
198 QMap<qint64, MarkNode>::const_iterator it =
m_map.lowerBound(recordID);
200 if(it ==
m_map.begin())
201 return (recordID >= it->m_recordID && recordID <= it->m_lastID);
203 if(it ==
m_map.end() || recordID != it->m_recordID)
206 return recordID <= it->m_lastID;
214 QMap<qint64, MarkNode>::const_iterator it;
219 if(startID == 0 && !forward)
229 it =
m_map.lowerBound(startID);
231 if(it ==
m_map.end())
241 it =
m_map.lowerBound(startID);
243 if(--it ==
m_map.begin())
255 zDebug() <<
"Remove mark, recordID: " << recordID
256 <<
", lastRecordID: " << lastRecordID;
260 zDebug() <<
"Warning: removeMark called for empty log map.";
266 if(lastRecordID == -1)
267 lastRecordID = recordID;
268 else if(recordID > lastRecordID)
270 zDebug() <<
"Warning: lastRecordID should be less than or equal to " 271 "recordID. Swapping values.";
273 qint64 temp = recordID;
274 recordID = lastRecordID;
278 QMap<qint64, MarkNode>::iterator it =
m_map.lowerBound(recordID);
280 if(it ==
m_map.end())
285 if(it->m_recordID > lastRecordID)
287 else if(lastRecordID >= it->m_lastID)
290 retval =
splitRange(it, recordID-1, lastRecordID+1);
292 else if(it.key() == recordID)
296 zDebug() <<
"A mark exists at record ID: " << recordID;
298 if(it->m_lastID == lastRecordID)
302 zDebug() <<
"Removing mark at record ID: " << recordID
303 <<
", lastID: " << lastRecordID;
305 m_map.remove(it.key());
309 else if(it->m_lastID < lastRecordID)
330 if(it->m_recordID <= lastRecordID)
338 if(it ==
m_map.begin())
346 if(it->m_lastID < recordID)
349 else if(lastRecordID >= it->m_lastID)
352 retval =
splitRange(it, recordID-1, lastRecordID+1);
367 bool markRemoved =
false;
369 while(it->m_recordID <= lastRecordID && it->m_lastID <= lastRecordID)
371 m_map.remove(it.key());
374 if(it ==
m_map.end())
380 if(it->m_recordID <= lastRecordID)
391 if(newStartID == it->m_recordID)
394 if(newStartID < it->m_recordID || newStartID > it->m_lastID)
396 zWarning() <<
"newStartID parameter exceeds range of iterator item.";
400 qint64 lastExtantID = it->m_lastID;
402 m_map.remove(it.key());
411 if(newEndID < it->m_recordID || newEndID > it->m_lastID)
413 zWarning() <<
"newEndID parameter exceeds range of iterator item.";
417 it->m_lastID = newEndID;
424 if(endHeadID < it->m_recordID || endHeadID > it->m_lastID)
426 zWarning() <<
"endHeadID parameter exceeds range of iterator item.";
430 if(startTailID < it->m_recordID || startTailID > it->m_lastID)
432 zWarning() <<
"startTailID parameter exceeds range of iterator item.";
436 qint64 lastExtantID = it->m_lastID;
451 QMap<qint64, MarkNode>::const_iterator it =
m_map.begin();
453 for(qint64 index=0; it !=
m_map.end(); it++)
455 qint64 linkID = it->getFirstID();
456 qint64 linkPos = it->getSeekPos();
457 zDebug() <<
"link key = " << it.key() <<
", ID = " << linkID
458 <<
", seek = " << linkPos;
460 links.
addLink(linkID, linkPos);
MarkType
Types of log maps: Invalid, Selection, Search, Bookmark.
void mergeMarkNodes(QMap< qint64, MarkNode >::iterator it)
bool splitRange(QMap< qint64, MarkNode >::iterator it, qint64 endHeadID, qint64 startTailID)
void addLink(qint64 index, qint64 seekPos)
bool insertMark(qint64 recordID, qint64 lastRecordID, qint64 seekPosition)
Creates a new log mark in the database.
MarkType m_markType
The type of mark map: invalid, selection, bookmark, searchmark.
bool truncateRange(QMap< qint64, MarkNode >::iterator it, qint64 newEndID)
ZblLogLinkList getLogLinkList() const
Obtain a ZblLogLinkList object containing expanded log links.
bool clear()
Removes all marks from the log map.
A mark node is a compressed set of contiguous log record links.
bool decapitateRange(QMap< qint64, MarkNode >::iterator it, qint64 newStartID)
MarkType getMapType() const
returns this log map's mark type
#define ZBL_DEFINE_LOGGED_OBJECT(class_name)
This class allows Zuble log file viewer text search operations to pass log record link parameters bet...
bool removeRange(QMap< qint64, MarkNode >::iterator it, qint64 recordID, qint64 lastRecordID)
bool removeMark(qint64 recordID, qint64 lastRecordID)
Removes the specified mark from the log map.
ZBL_DECLARE_LOGGED_OBJECT QMap< qint64, MarkNode > m_map
A lookup table for mark nodes. It maps firstRecordID to MarkNode object.
qint64 findNextMark(qint64 startID, bool forward) const
Search forward or backward for the next mark from a specified starting position.
bool hasMark(qint64 recordID) const
Determine if the log map contains a mark for the specified log record.
The implicitly shared data object encapsulated by ZblLogMap objects.