@@ -13,13 +13,13 @@ import Data.Word (Word8)
13
13
import Foreign.Concurrent (newForeignPtr )
14
14
import qualified Foreign.Concurrent as Concurrent
15
15
import Foreign.Marshal.Alloc (alloca , allocaBytes )
16
- import Foreign.Marshal.Array (peekArray , allocaArray )
16
+ import Foreign.Marshal.Array (peekArray , allocaArray , withArrayLen )
17
17
import Foreign.Storable (Storable (.. ))
18
18
import Foreign.Ptr (Ptr , FunPtr , castPtr , nullPtr )
19
19
import Foreign.ForeignPtr (FinalizerPtr , addForeignPtrFinalizer , newForeignPtr_ , withForeignPtr )
20
20
import Foreign.C.Error (Errno (.. ), getErrno )
21
21
import Foreign.C.String (CString , newCString , withCAString , peekCAString , peekCString )
22
- import Foreign.C.Types (CFile , CInt (.. ), CSize , CChar )
22
+ import Foreign.C.Types (CFile , CInt (.. ), CSize , CChar , CLong )
23
23
import System.IO (Handle , stdin , stdout , stderr )
24
24
import System.Posix.IO (handleToFd )
25
25
import System.Posix.Types (Fd (.. ))
@@ -972,6 +972,118 @@ newRdKafkaTopicT kafkaPtr topic topicConfPtr = do
972
972
_ <- traverse (addForeignPtrFinalizer rdKafkaTopicDestroy') res
973
973
return res
974
974
975
+ -------------------------------------------------------------------------------------------------
976
+ ---- Errors
977
+
978
+ data RdKafkaErrorT
979
+ {# pointer * rd_kafka_error_t as RdKafkaErrorTPtr -> RdKafkaErrorT # }
980
+
981
+ {# fun rd_kafka_error_code as ^
982
+ {`RdKafkaErrorTPtr' } -> `RdKafkaRespErrT' cIntToEnum # }
983
+
984
+ {# fun rd_kafka_error_destroy as ^
985
+ {`RdKafkaErrorTPtr' } -> `() ' # }
986
+ -------------------------------------------------------------------------------------------------
987
+ ---- Headers
988
+
989
+ data RdKafkaHeadersT
990
+ {# pointer * rd_kafka_headers_t as RdKafkaHeadersTPtr -> RdKafkaHeadersT # }
991
+
992
+ {# fun rd_kafka_header_get_all as ^
993
+ {`RdKafkaHeadersTPtr' , cIntConv `CSize' , castPtr `Ptr CString' , castPtr `Ptr Word8Ptr' , `CSizePtr' } -> `RdKafkaRespErrT' cIntToEnum # }
994
+
995
+ {# fun rd_kafka_message_headers as ^
996
+ {castPtr `Ptr RdKafkaMessageT' , alloca- `RdKafkaHeadersTPtr' peekPtr* } -> `RdKafkaRespErrT' cIntToEnum # }
997
+
998
+ --- Produceva api
999
+
1000
+ {# enum rd_kafka_vtype_t as ^ {underscoreToCase} deriving (Show , Eq ) # }
1001
+
1002
+ data RdKafkaVuT
1003
+ = Topic'RdKafkaVu CString
1004
+ | TopicHandle'RdKafkaVu (Ptr RdKafkaTopicT )
1005
+ | Partition'RdKafkaVu CInt32T
1006
+ | Value'RdKafkaVu Word8Ptr CSize
1007
+ | Key'RdKafkaVu Word8Ptr CSize
1008
+ | MsgFlags'RdKafkaVu CInt
1009
+ | Timestamp'RdKafkaVu CInt64T
1010
+ | Opaque'RdKafkaVu (Ptr () )
1011
+ | Header'RdKafkaVu CString Word8Ptr CSize
1012
+ | Headers'RdKafkaVu (Ptr RdKafkaHeadersT ) -- The message object will assume ownership of the headers (unless produceva() fails)
1013
+ | End'RdKafkaVu
1014
+
1015
+ {# pointer * rd_kafka_vu_t as RdKafkaVuTPtr foreign -> RdKafkaVuT # }
1016
+
1017
+ instance Storable RdKafkaVuT where
1018
+ alignment _ = {# alignof rd_kafka_vu_t # }
1019
+ sizeOf _ = {# sizeof rd_kafka_vu_t # }
1020
+ peek p = {# get rd_kafka_vu_t-> vtype # } p >>= \ a -> case cIntToEnum a of
1021
+ RdKafkaVtypeEnd -> return End'RdKafkaVu
1022
+ RdKafkaVtypeTopic -> Topic'RdKafkaVu <$> ({# get rd_kafka_vu_t-> u. cstr # } p)
1023
+ RdKafkaVtypeMsgflags -> MsgFlags'RdKafkaVu <$> ({# get rd_kafka_vu_t-> u. i # } p)
1024
+ RdKafkaVtypeTimestamp -> Timestamp'RdKafkaVu <$> ({# get rd_kafka_vu_t-> u. i64 # } p)
1025
+ RdKafkaVtypePartition -> Partition'RdKafkaVu <$> ({# get rd_kafka_vu_t-> u. i32 # } p)
1026
+ RdKafkaVtypeHeaders -> Headers'RdKafkaVu <$> ({# get rd_kafka_vu_t-> u. headers # } p)
1027
+ RdKafkaVtypeValue -> do
1028
+ nm <- liftM castPtr ({# get rd_kafka_vu_t-> u. mem. ptr # } p)
1029
+ sz <- ({# get rd_kafka_vu_t-> u. mem. size # } p)
1030
+ return $ Value'RdKafkaVu nm (cIntConv sz)
1031
+ RdKafkaVtypeKey -> do
1032
+ nm <- liftM castPtr ({# get rd_kafka_vu_t-> u. mem. ptr # } p)
1033
+ sz <- ({# get rd_kafka_vu_t-> u. mem. size # } p)
1034
+ return $ Key'RdKafkaVu nm (cIntConv sz)
1035
+ RdKafkaVtypeRkt -> TopicHandle'RdKafkaVu <$> ({# get rd_kafka_vu_t-> u. rkt # } p)
1036
+ RdKafkaVtypeOpaque -> Opaque'RdKafkaVu <$> ({# get rd_kafka_vu_t-> u. ptr # } p)
1037
+ RdKafkaVtypeHeader -> do
1038
+ nm <- ({# get rd_kafka_vu_t-> u. header. name # } p)
1039
+ val' <- liftM castPtr ({# get rd_kafka_vu_t-> u. header. val # } p)
1040
+ sz <- ({# get rd_kafka_vu_t-> u. header. size # } p)
1041
+ return $ Header'RdKafkaVu nm val' (cIntConv sz)
1042
+ poke p End'RdKafkaVu =
1043
+ {# set rd_kafka_vu_t. vtype # } p (enumToCInt RdKafkaVtypeEnd )
1044
+ poke p (Topic'RdKafkaVu str) = do
1045
+ {# set rd_kafka_vu_t. vtype # } p (enumToCInt RdKafkaVtypeTopic )
1046
+ {# set rd_kafka_vu_t. u. cstr # } p str
1047
+ poke p (Timestamp'RdKafkaVu tms) = do
1048
+ {# set rd_kafka_vu_t. vtype # } p (enumToCInt RdKafkaVtypeTimestamp )
1049
+ {# set rd_kafka_vu_t. u. i64 # } p tms
1050
+ poke p (Partition'RdKafkaVu prt) = do
1051
+ {# set rd_kafka_vu_t. vtype # } p (enumToCInt RdKafkaVtypePartition )
1052
+ {# set rd_kafka_vu_t. u. i32 # } p prt
1053
+ poke p (MsgFlags'RdKafkaVu flags) = do
1054
+ {# set rd_kafka_vu_t. vtype # } p (enumToCInt RdKafkaVtypeMsgflags )
1055
+ {# set rd_kafka_vu_t. u. i # } p flags
1056
+ poke p (Headers'RdKafkaVu headers) = do
1057
+ {# set rd_kafka_vu_t. vtype # } p (enumToCInt RdKafkaVtypeHeaders )
1058
+ {# set rd_kafka_vu_t. u. headers # } p headers
1059
+ poke p (TopicHandle'RdKafkaVu tphandle) = do
1060
+ {# set rd_kafka_vu_t. vtype # } p (enumToCInt RdKafkaVtypeRkt )
1061
+ {# set rd_kafka_vu_t. u. rkt # } p tphandle
1062
+ poke p (Value'RdKafkaVu pl sz) = do
1063
+ {# set rd_kafka_vu_t. vtype # } p (enumToCInt RdKafkaVtypeValue )
1064
+ {# set rd_kafka_vu_t. u. mem. size # } p (cIntConv sz)
1065
+ {# set rd_kafka_vu_t. u. mem. ptr # } p (castPtr pl)
1066
+ poke p (Key'RdKafkaVu pl sz) = do
1067
+ {# set rd_kafka_vu_t. vtype # } p (enumToCInt RdKafkaVtypeKey )
1068
+ {# set rd_kafka_vu_t. u. mem. size # } p (cIntConv sz)
1069
+ {# set rd_kafka_vu_t. u. mem. ptr # } p (castPtr pl)
1070
+ poke p (Opaque'RdKafkaVu ptr') = do
1071
+ {# set rd_kafka_vu_t. vtype # } p (enumToCInt RdKafkaVtypeOpaque )
1072
+ {# set rd_kafka_vu_t. u. ptr # } p ptr'
1073
+ poke p (Header'RdKafkaVu nm val' sz) = do
1074
+ {# set rd_kafka_vu_t. vtype # } p (enumToCInt RdKafkaVtypeHeader )
1075
+ {# set rd_kafka_vu_t. u. header. size # } p (cIntConv sz)
1076
+ {# set rd_kafka_vu_t. u. header. name # } p nm
1077
+ {# set rd_kafka_vu_t. u. header. val # } p (castPtr val')
1078
+
1079
+ {# fun rd_kafka_produceva as rdKafkaMessageProduceVa'
1080
+ {`RdKafkaTPtr' , `RdKafkaVuTPtr' , `CLong' } -> `RdKafkaErrorTPtr' # }
1081
+
1082
+ rdKafkaMessageProduceVa :: RdKafkaTPtr -> [RdKafkaVuT ] -> IO RdKafkaErrorTPtr
1083
+ rdKafkaMessageProduceVa kafkaPtr vts = withArrayLen vts $ \ i arrPtr -> do
1084
+ fptr <- newForeignPtr_ arrPtr
1085
+ rdKafkaMessageProduceVa' kafkaPtr fptr (cIntConv i)
1086
+
975
1087
-- Marshall / Unmarshall
976
1088
enumToCInt :: Enum a => a -> CInt
977
1089
enumToCInt = fromIntegral . fromEnum
@@ -1013,4 +1125,4 @@ c_stdin = handleToCFile stdin "r"
1013
1125
c_stdout :: IO CFilePtr
1014
1126
c_stdout = handleToCFile stdout " w"
1015
1127
c_stderr :: IO CFilePtr
1016
- c_stderr = handleToCFile stderr " w"
1128
+ c_stderr = handleToCFile stderr " w"
0 commit comments