packages feed

pontarius-mediaserver-0.0.2.0: Media/XPMN/Server/ObjectServer.hs

{-

Copyright © Jon Kristensen, 2010-2011.

This file is part of Pontarius Media Server.

Pontarius Media Server is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your option)
any later version.

Pontarius Media Server is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
more details.

You should have received a copy of the GNU Affero General Public License along
with Pontarius Media Server. If not, see <http://www.gnu.org/licenses/>.

-}


-- | Module:      $Header$
--   Description: Event-based module for managing media database objects
--   Copyright:   Copyright © 2010-2011 Jon Kristensen
--   License:     AGPL-3
--   
--   Maintainer:  info@pontarius.org
--   Stability:   unstable
--   Portability: portable

module Media.XPMN.Server.ObjectServer (ObjectServerOutEvent (..), ObjectServerInEvent (..), start) where

import Media.XPMN.Server.Object

import Database.HDBC
import Database.HDBC.Sqlite3

import Control.Concurrent (forkIO, threadDelay)
import Control.Concurrent.Chan (Chan, newChan, readChan, writeChan)
import Data.Maybe

data State = State { stateConnection :: Connection }

data ObjectServerInEvent = OSIEPersistObject Object |
                           OSIEUpdateObject ObjectID Object |
                           OSIEGetObject ObjectID |
                           OSIEGetRoot |
                           OSIEGetChildren ObjectID deriving (Show)

data ObjectServerOutEvent = OSOEObjectPersisted PersistedObject |
                            OSOEObjectUpdated PersistedObject |
                            OSOEObject (Maybe PersistedObject) |
                            OSOEGetRoot [PersistedObject] |
                            OSOEGetChildren [PersistedObject]  deriving (Show)

start :: String -> IO ((ObjectServerInEvent -> IO ()), IO ObjectServerOutEvent)
start s = do
  c <- newChan
  c_ <- newChan
  connection <- connectToDatabase s
  -- initializeDatabase connection
  forkIO $ eventLoop c c_ (State { stateConnection = connection })
  return (writeChan c, readChan c_)

eventLoop :: Chan ObjectServerInEvent -> Chan ObjectServerOutEvent -> State -> IO ()
eventLoop c c_ s = do
  e <- readChan c
  s' <- processEvent e c_ s
  eventLoop c c_ s

processEvent :: ObjectServerInEvent -> Chan ObjectServerOutEvent -> State -> IO State
processEvent (OSIEPersistObject o) c s = do
  persistedObject <- persist (stateConnection s) o Nothing
  writeChan c $ OSOEObjectPersisted persistedObject
  putStrLn (show $ objectID persistedObject)
  return s
processEvent (OSIEUpdateObject i o) c s = do
  persistedObject <- update (stateConnection s) i Nothing o
  writeChan c $ OSOEObjectUpdated persistedObject
  putStrLn (show $ objectID persistedObject)
  return s
processEvent (OSIEGetObject i) c s = do
  persistedObject <- getObject (stateConnection s) i
  writeChan c $ OSOEObject persistedObject
  putStrLn $ "Got object: " ++ (show $ objectID $ fromJust persistedObject)
  return s
processEvent OSIEGetRoot c s = do
  persistedObjects <- getRoot (stateConnection s)
  writeChan c $ OSOEGetRoot persistedObjects
  putStrLn $ "Got " ++ (show $ length persistedObjects) ++ " objects."
  return s
processEvent (OSIEGetChildren i) c s = do
  persistedObjects <- getChildren (stateConnection s) i
  writeChan c $ OSOEGetChildren persistedObjects
  putStrLn $ "Got " ++ (show $ length persistedObjects) ++ " objects."
  return s

main = do
  (write, read) <- start "Test"
  write $ OSIEPersistObject (container Nothing Nothing)
  write $ OSIEPersistObject (item Nothing Nothing Nothing Nothing)
  write $ OSIEUpdateObject "82c2cae1-b7b4-248e-ede6-9792419a1576" (item Nothing Nothing Nothing Nothing)
  write $ OSIEGetObject "82c2cae1-b7b4-248e-ede6-9792419a1576"
  write $ OSIEGetRoot
  write $ OSIEGetChildren "82c2cae1-b7b4-248e-ede6-9792419a1576"
  return ()