diff options
Diffstat (limited to 'module/vcomponent/util/instance/methods.scm')
-rw-r--r-- | module/vcomponent/util/instance/methods.scm | 89 |
1 files changed, 47 insertions, 42 deletions
diff --git a/module/vcomponent/util/instance/methods.scm b/module/vcomponent/util/instance/methods.scm index 028e01c0..a127ef8d 100644 --- a/module/vcomponent/util/instance/methods.scm +++ b/module/vcomponent/util/instance/methods.scm @@ -160,61 +160,66 @@ (prop event 'UID))) (slot-ref this 'event-set))) - (hash-set! (slot-ref this 'uid-map) (prop event 'UID) - #f)) + (remove-child! (parent event) event) + (hash-remove! (slot-ref this 'uid-map) (prop event 'UID))) -(define-method (add-and-save-event (this <events>) calendar event) - (cond - [(get-event-by-uid this (prop event 'UID)) - => (lambda (old-event) +(define-method (update-and-save-event (this <events>) calendar old-event) + ;; remove old instance of event from runtime + (remove-event this old-event) - ;; remove old instance of event from runtime - (remove-event this old-event) - (remove-child! (parent old-event) old-event) + ;; Add new event to runtime, + ;; MUST be done after since the two events SHOULD share UID. + ;; NOTE that this can emit warnings + (add-event this calendar old-event) + (remove-child! (parent old-event) old-event) - ;; Add new event to runtime, - ;; MUST be done after since the two events SHOULD share UID. - ;; NOTE that this can emit warnings - (add-event this calendar event) + (set! (prop old-event 'LAST-MODIFIED) + (current-datetime)) - (set! (prop event 'LAST-MODIFIED) - (current-datetime)) + ;; NOTE Posibly defer save to a later point. + ;; That would allow better asyncronous preformance. - ;; NOTE Posibly defer save to a later point. - ;; That would allow better asyncronous preformance. + ;; save-event sets -X-HNH-FILENAME from the UID. This is fine + ;; since the two events are guaranteed to have the same UID. + (unless ((@ (vcomponent formats vdir save-delete) save-event) old-event) + (throw 'misc-error "Saving event to disk failed.")) - ;; save-event sets -X-HNH-FILENAME from the UID. This is fine - ;; since the two events are guaranteed to have the same UID. - (unless ((@ (vcomponent formats vdir save-delete) save-event) event) - (throw 'misc-error (_ "Saving event to disk failed."))) + (unless (eq? calendar (parent old-event)) + ;; change to a new calendar + (format (current-error-port) + "Unlinking old event from ~a~%" + (prop old-event '-X-HNH-FILENAME)) + ;; NOTE that this may fail, leading to a duplicate event being + ;; created (since we save beforehand). This is just a minor problem + ;; which either a better atomic model, or a propper error + ;; recovery log would solve. + ((@ (vcomponent formats vdir save-delete) remove-event) old-event)) - (unless (eq? calendar (parent old-event)) - ;; change to a new calendar - (format (current-error-port) - (_ "Unlinking old event from ~a~%") - (prop old-event '-X-HNH-FILENAME)) - ;; NOTE that this may fail, leading to a duplicate event being - ;; created (since we save beforehand). This is just a minor problem - ;; which either a better atomic model, or a propper error - ;; recovery log would solve. - ((@ (vcomponent formats vdir save-delete) remove-event) old-event)) + (format (current-error-port) + "Event updated ~a~%" (prop old-event 'UID))) - (format (current-error-port) - (_ "Event updated ~a~%") (prop event 'UID)))] - [else - (add-event this calendar event) +;; Add a new event, which isn't already in the event object +(define-method (add-new-event (this <events>) calendar event) + (add-event this calendar event) - (set! (prop event 'LAST-MODIFIED) (current-datetime)) + (set! (prop event 'LAST-MODIFIED) (current-datetime)) - ;; NOTE Posibly defer save to a later point. - ;; That would allow better asyncronous preformance. - (unless ((@ (vcomponent formats vdir save-delete) save-event) event) - (throw 'misc-error (_ "Saving event to disk failed."))) + ;; NOTE Posibly defer save to a later point. + ;; That would allow better asyncronous preformance. + (unless ((@ (vcomponent formats vdir save-delete) save-event) event) + (throw 'misc-error "Saving event to disk failed.")) - (format (current-error-port) - (_ "Event inserted ~a~%") (prop event 'UID))])) + (format (current-error-port) + "Event inserted ~a~%" (prop event 'UID)) + ) + +(define-method (add-and-save-event (this <events>) calendar event) + (cond + [(get-event-by-uid this (prop event 'UID)) + => (lambda (old-event) (update-and-save-event this calendar old-event))] + [else (add-new-event this calendar event)])) |