on 52182bc help sign in
43 lines 1.8 kB history raw
1module ProjectM36.Session where
2import ProjectM36.Base
3import Data.UUID
4import qualified Data.Map as M
5import ProjectM36.Error
7type SessionId = UUID
9--the persistence of a session is as long as the life of the database (not serialized to disk)
10-- sessions are not associated with connections and have separate lifetimes
11-- | Represents a pointer into the database's transaction graph which the 'DatabaseContextExpr's can then modify subsequently be committed to extend the transaction graph. The session contains staged (uncommitted) database changes as well as the means to switch between isomorphic schemas.
12data Session = Session DisconnectedTransaction SchemaName
14defaultSchemaName :: SchemaName
15defaultSchemaName = "main"
17disconnectedTransaction :: Session -> DisconnectedTransaction
18disconnectedTransaction (Session discon _) = discon
20isDirty :: Session -> DirtyFlag
21isDirty (Session (DisconnectedTransaction _ _ dirtyFlag) _) = dirtyFlag
23concreteDatabaseContext :: Session -> DatabaseContext
24concreteDatabaseContext (Session (DisconnectedTransaction _ (Schemas context _) _) _) = context
26parentId :: Session -> TransactionId
27parentId (Session (DisconnectedTransaction parentUUID _ _) _) = parentUUID
29subschemas :: Session -> Subschemas
30subschemas (Session (DisconnectedTransaction _ (Schemas _ s) _) _) = s
32schemas :: Session -> Schemas
33schemas (Session (DisconnectedTransaction _ s _) _) = s
35schemaName :: Session -> SchemaName
36schemaName (Session _ s) = s
38setSchemaName :: SchemaName -> Session -> Either RelationalError Session
39setSchemaName sname session = if sname == defaultSchemaName || M.member sname (subschemas session) then
40 pure (Session (disconnectedTransaction session) sname)
41 else
42 Left (SubschemaNameNotInUseError sname)