{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE TemplateHaskell #-}

module Database.MSSQLServer.Query.Row ( Row (..)
                                      , RowCount (..)
                                      , ReturnStatus (..)
                                      ) where

import Database.Tds.Message
import Database.MSSQLServer.Query.Only
import Database.MSSQLServer.Query.Template

import Control.Monad(forM)
import Language.Haskell.TH (runIO,pprint)


newtype RowCount = RowCount Int
newtype ReturnStatus = ReturnStatus Int

mcdTypeInfo :: MetaColumnData -> TypeInfo
mcdTypeInfo :: MetaColumnData -> TypeInfo
mcdTypeInfo (MetaColumnData MCDUserType
_ MCDUserType
_ TypeInfo
ti Maybe MCDTableName
_ MCDTableName
_) = TypeInfo
ti


class Row a where
  fromListOfRawBytes :: [MetaColumnData] -> [RawBytes] -> a

instance (Data a) => Row (Only a) where
  fromListOfRawBytes :: [MetaColumnData] -> [RawBytes] -> Only a
fromListOfRawBytes [MetaColumnData
m1] [RawBytes
b1] = forall a. a -> Only a
Only a
d1
    where
      !d1 :: a
d1 = forall a. Data a => TypeInfo -> RawBytes -> a
fromRawBytes (MetaColumnData -> TypeInfo
mcdTypeInfo MetaColumnData
m1) RawBytes
b1
  fromListOfRawBytes [MetaColumnData]
_ [RawBytes]
_ = forall a. HasCallStack => [Char] -> a
error [Char]
"fromListOfRawBytes: List length must be 1"

-- [MEMO] using Template Haskell
forM [2..30] $ \n -> do
  dec <- rowTupleQ n
--  runIO $ putStrLn $ pprint dec
  return dec
--instance (Data a1, Data a2) => Row (a1,a2) where
--  fromListOfRawBytes [m1,m2] [b1,b2] = (d1,d2)
--    where
--      !d1 = fromRawBytes (mcdTypeInfo m1) b1
--      !d2 = fromRawBytes (mcdTypeInfo m2) b2
--  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 2"
--