-- © 2001- 2006 Peter Thiemann
-- |Definition of the type of the redo log entries
module WASH.CGI.LogEntry where

import WASH.CGI.RawCGITypes

data PARAMETER 
  = PAR_RESULT String		-- ^ result of an IO operation shown as a string
  | PAR_VALUES CGIParameters	-- ^ record of a form input
  | PAR_MARK   String		-- ^ recorded stateID before the mark
  | PAR_IGNORED
  | PAR_TRANS  String		-- ^ recorded stateID at start of transaction
  | PAR_CRE_TV String String    -- ^ record of a @create@ or @init@ operation
  | PAR_REM_TV String	        -- ^ record of a @remove@ operation
  | PAR_GET_TV String String    -- ^ record of a @get@ operation
  | PAR_SET_TV String String	-- ^ record of a @set@ operation
  | PAR_DB     String		-- ^ record entry for all DB operations.
                                -- the string is already the result of a 
                                -- show operation for DB tuples, so it is
			        -- doubly encoded :-(

instance Show PARAMETER where
  showsPrec i par = case par of
    PAR_RESULT str -> showString ":R" . shows str
    PAR_VALUES cps -> showString ":V" . shows cps
    PAR_MARK   str -> showString ":M" . shows str
    PAR_IGNORED    -> showString ":I"
    PAR_TRANS  str -> showString ":T" . shows str
    PAR_CRE_TV n v -> showString ":C" . shows n . shows v
    PAR_REM_TV n   -> showString ":E" . shows n
    PAR_GET_TV n v -> showString ":G" . shows n . shows v
    PAR_SET_TV n v -> showString ":S" . shows n . shows v
    PAR_DB     str -> showString ":D" . shows str

instance Read PARAMETER where
  readsPrec i str = case str of
    ':' : rest -> g rest
    _  -> []
    where g ('R' : str) = [(PAR_RESULT v, rest) | (v, rest) <- reads str]
	  g ('V' : str) = [(PAR_VALUES v, rest) | (v, rest) <- reads str]
	  g ('M' : str) = [(PAR_MARK   v, rest) | (v, rest) <- reads str]
	  g ('I' : str) = [(PAR_IGNORED, str)]
	  g ('T' : str) = [(PAR_TRANS  v, rest) | (v, rest) <- reads str]
	  g ('C' : str) = [(PAR_CRE_TV n v, rest)
			  |(n, str1) <- reads str, (v, rest) <- reads str1]
	  g ('E' : str) = [(PAR_REM_TV n, rest)
			  |(n, rest) <- reads str]
	  g ('G' : str) = [(PAR_GET_TV n v, rest)
			  |(n, str1) <- reads str, (v, rest) <- reads str1]
	  g ('S' : str) = [(PAR_SET_TV n v, rest)
			  |(n, str1) <- reads str, (v, rest) <- reads str1]
	  g ('D' : str) = [(PAR_DB v, rest)     | (v, rest) <- reads str]
	  g _           = []