sure, sorry should have done at the first place. Basically I have several similar calls like one below. This one should be the heaviest one.
--scotty:
post "/setmoduletable" $ do
b <- body
let queryString = tableArrayInDataToJSON b
case queryString of
Nothing -> text $ "error parsing json! "
Just (ArrayDataIn tablename columnsCnt rowsCnt values) -> do
result <- liftIO $ FM.setmoduletable tablename columnsCnt rowsCnt values
let resultInt = fromIntegral $ result::Int
json $ ReturnIntData resultInt
--json conversions
tableArrayInDataToJSON :: L.ByteString -> Maybe ArrayDataIn
tableArrayInDataToJSON rawJson = retValue
where
json = decode rawJson :: Maybe ArrayDataIn
retValue = case json of
Nothing -> Nothing
Just a -> Just a
data ArrayDataIn = ArrayDataIn{
tablename :: !String
,columnscount :: Int
,rowscount :: Int
,values :: [Double]
}deriving (Show,Generic)
instance FromJSON ArrayDataIn
instance ToJSON ArrayDataIn
--ffi
foreign import stdcall safe "setmoduletable" c_setmoduletable :: CString -> CInt -> Ptr CDouble -> CInt -> CInt -> CInt -> IO CInt
setmoduletable :: String -> Int -> Int -> [Double] -> IO CInt
setmoduletable param columns rows array = do
let cParamLength = fromIntegral $ length param ::CInt
cColumns = fromIntegral $ columns ::CInt
cRows = fromIntegral $ rows ::CInt
cTable = [realToFrac x ::CDouble | x <- array]
firstTimeStepAfterRestart = 0::CInt
cParam <- newCString param
cTablePtr <- newArray cTable
result <- c_setmoduletable cParam cParamLength cTablePtr cColumns cRows firstTimeStepAfterRestart
free cTablePtr
free cParam
return result