blob: 5505e7eae105d2447fc60d3e901cac644e480639 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
(* Session: outermost connection object.
Each user connection mints a session registered in RNT at
/system/sessions/<id>. The session owns exactly one branch at a time;
DDL / DML / DRL sublanguages operate through that branch. *)
module Make (NT : Nt.S) = struct
module B = Branch.Make (NT)
let ( let* ) = Result.bind
class session
~(sid : string)
~(branch : B.branch) =
object
val mutable br : B.branch = branch
method id = sid
method branch = br
method snapshot = br#tip
method tip = br#tip
(* Switch to a different branch within the same session. *)
method set_branch (b : B.branch) = br <- b
method close () =
let* () = br#close () in
NT.session_close sid
end
(* Open a session on a live (mutable) branch.
Creates the branch if it does not exist yet. *)
let open_session claims ~branch_name =
let* sid = NT.session_open () in
let* branch = B.open_branch claims branch_name in
Ok (new session ~sid ~branch)
(* Open a session pinned to a specific snapshot hash (detached / read-only).
Mutations through the returned branch are refused. *)
let open_snapshot_session claims ~branch_name ~snapshot_hash =
let* sid = NT.session_open () in
let* branch = B.open_snapshot claims ~branch_name ~snapshot_hash in
(* Inform RNT of the session's snapshot override so future session-path
resolution (once NamespaceReferenceManager handles /system/sessions/...)
can route queries through the pinned snapshot. *)
let* () = NT.session_set_branch sid branch_name snapshot_hash in
Ok (new session ~sid ~branch)
end
|