module Database.PostgreSQL.PQTypes.Internal.QueryResult (
    QueryResult(..)
  , ntuples
  , nfields
  ) where

import Control.Monad
import Foreign.ForeignPtr
import System.IO.Unsafe

import Database.PostgreSQL.PQTypes.Internal.C.Interface
import Database.PostgreSQL.PQTypes.Internal.C.Types

-- Note: c_PQntuples/c_PQnfields are pure on a C level and QueryResult
-- constructor is not exported to the end user (so it's not possible
-- to enforce premature finalization via finalizeForeignPtr), which
-- makes usage of unsafeDupablePerformIO fine here.

-- | Wrapper for hiding representation of query result.
newtype QueryResult = QueryResult (ForeignPtr PGresult)

-- | Extract number of returned tuples (rows) from query result.
ntuples :: QueryResult -> Int
ntuples (QueryResult fres) = unsafeDupablePerformIO $
  fromIntegral `liftM` withForeignPtr fres c_PQntuples

-- | Extract number of returned fields (columns) from query result.
nfields :: QueryResult -> Int
nfields (QueryResult fres) = unsafeDupablePerformIO $
  fromIntegral `liftM` withForeignPtr fres c_PQnfields