+ pub fn try_open_note(&self, note_id: i32, version: i64) -> Option<OpenNoteHandle> {
+ let mut versions = self.versions();
+ let handles = versions.get_mut(¬e_id);
+ match handles {
+ Some(hl) => {
+ // find the highest version in all open handles for this note
+ if hl.version > version {
+ // version is outdated
+ return None;
+ } else if version > hl.version {
+ hl.version = version;
+ }
+ // ok
+ let id = NHANDLE_ID.fetch_add(1, Ordering::Relaxed);
+ let handle = OpenNoteHandle {
+ versions: self.versions.clone(),
+ note_id: note_id,
+ handle_id: id
+ };
+ hl.handles.push(id);
+ Some(handle)
+ },
+ None => {
+ let mut v = Vec::new();
+ let id = NHANDLE_ID.fetch_add(1, Ordering::Relaxed);
+ let handle = OpenNoteHandle {
+ versions: self.versions.clone(),
+ note_id: note_id,
+ handle_id: id
+ };
+ v.push(id);
+ let hl = NoteHandleList {
+ version: version,
+ handles: v
+ };
+ versions.insert(note_id, hl);
+ Some(handle)
+ }
+ }
+ }
+
+ pub fn update_note_version(&self, note_id: i32, version: i64) {
+ let mut versions = self.versions();
+ let handles = versions.get_mut(¬e_id);
+ if let Some(hl) = handles {
+ hl.version = version;
+ }
+ }
+}