(in-package :araneida-repl) (defun print-basic-info-for-session (session stream) (declare (type araneida::session session)) (let ((expired (not (araneida::valid-session-p session)))) (format stream "Session <~A>: ~:[~;EXPIRED~]~%" (session-id session) expired) (format stream " named: ~A~%" (araneida::session-name session)) (format stream " created by URL: ~A~%" (request-url (creation-request session))) (if expired (format stream " lifetime: expired ~:D seconds ago~%" (- (get-universal-time) (+ (lifetime session) (last-access-time session)))) (format stream " lifetime: ~:D seconds~%" (lifetime session))) (format stream " last accessed: ~:D seconds ago~%" (- (get-universal-time) (last-access-time session))) (format stream " with slots: ~S~%" (session-slots session)))) (defun show-sessions (&optional (stream *standard-output*)) "Prints to stream a description of all current sessions" (flet ((print-session (elt) (print-basic-info-for-session elt stream) (format stream "~%"))) (loop for elt across araneida::*session-table* with valid-sessions = 0 with expired-sessions = 0 do (when elt (if (araneida::valid-session-p elt) (incf valid-sessions) (incf expired-sessions)) (print-session elt)) finally (format stream "Valid sessions: ~A Expired sessions: ~A Total sessions: ~A~%" valid-sessions expired-sessions (+ valid-sessions expired-sessions))))) (defun describe-session (session-id &optional (stream *standard-output*)) "Prints to stream a detailed description of session SESSION-ID" (let ((session (if (and (< session-id (length araneida::*session-table*)) (araneida::session-p (elt araneida::*session-table* session-id))) (elt araneida::*session-table* session-id) nil))) (if session (progn (print-basic-info-for-session session stream) (dolist (s (araneida::session-slots session)) (format stream " ~S: ~S~%" s (araneida::session-slot-value session s))) (format stream "~%")) (format stream "Session ID ~A does not exist.~%" session-id))))