1 -- ***********************************************
2 -- Author: Berlin Brown
7 -- Simple Queue Binary File Format Database.
10 -- (1) http://hackage.haskell.org/packages/archive/binary/0.4.1/doc/html/Data-Binary.html
11 -- (2) http://hackage.haskell.org/cgi-bin/hackage-scripts/package/utf8-string-0.2
12 -- (3) http://hackage.haskell.org/packages/archive/bytestring/0.9.0.1/doc/html/Data-ByteString.html
13 -- (4) http://www.haskell.org/ghc/docs/latest/html/libraries/haskell98/Time.html
14 -- ***********************************************
16 module Data
.SpiderQueue
.Queue
where
19 import Control
.Monad
(replicateM
, forM
, liftM)
22 import Data
.Binary
.Get
as BinaryGet
23 import Data
.Binary
.Put
as BinaryPut
27 -- Used qualified names for the different bytestring manipulation
28 -- modules; using 'Import Qualified' to ensure we are using the correct function.
29 import qualified Data
.ByteString
as Eager
(ByteString
, unpack
, pack
)
30 import qualified Data
.ByteString
.Char8
as CharBS
(pack
, unpack
)
31 import qualified Data
.ByteString
.Lazy
.Char8
as LazyC
(unpack
, pack
)
32 import qualified Data
.ByteString
.Lazy
as Lazy
(ByteString
, unpack
, pack
, hPut
, hGetContents)
34 magicNUMBER_U2A
= 0x25D4
35 magicNUMBER_U2B
= 0xB0DB
43 -- | Simple First in, First Out binary file format
44 data SpiderQueue
= SpiderQueue
{
45 magicNumberA
:: Word16
,
46 magicNumberB
:: Word16
,
50 queue
:: [QueueObject
]
52 data QueueObject
= QueueObject
{
55 dbsegment
:: Lazy
.ByteString
,
60 instance Show SpiderQueue
where
61 show db
= "<<<Database Content>>>\n" ++
62 printf
" Magic: %X %X\n" (magicNumberA db
)
65 instance Show QueueObject
where
66 show obj
= "<<<Queue Content>>>\n" ++
67 printf
" Tag: %X Len: %d\n" (segtag obj
)
70 instance Binary QueueObject
where
72 BinaryPut
.putWord8
(segtag dbq
)
73 BinaryPut
.putWord32be
(dbseglen dbq
)
74 BinaryPut
.putLazyByteString
(dbsegment dbq
)
75 BinaryPut
.putWord32be
(ptime dbq
)
79 segdata
<- BinaryGet
.getLazyByteString
(fromIntegral len
)
82 segtag
=tag
, dbseglen
=len
,
83 dbsegment
=segdata
, ptime
=t
86 instance Binary SpiderQueue
where
88 BinaryPut
.putWord16be
(magicNumberA dbq
)
89 BinaryPut
.putWord16be
(magicNumberB dbq
)
90 BinaryPut
.putWord16be
(majorVers dbq
)
91 BinaryPut
.putWord16be
(minorVers dbq
)
92 BinaryPut
.putWord32be
(queueSize dbq
)
93 -- @see mapM: Monad m => (a -> m b) -> [a] -> m [b]
94 (mapM_ put
(queue dbq
))
96 magicnumbera
<- BinaryGet
.getWord16be
97 magicnumberb
<- BinaryGet
.getWord16be
98 major
<- BinaryGet
.getWord16be
99 minor
<- BinaryGet
.getWord16be
100 len
<- BinaryGet
.getWord32be
101 -- *******************************
102 -- Get the remaining byte string data,
103 -- So that we can use lazy bytestring to load to load the
105 -- Also: queueData <- forM [1..len] (const (get :: Get QueueObject))
106 -- *******************************
107 queueData
<- replicateM
(fromIntegral len
) (get
:: Get QueueObject
)
108 return (SpiderQueue
{magicNumberA
=magicnumbera
,
109 magicNumberB
=magicnumberb
,
116 -- *********************************************************
120 -- *********************************************************
121 initSpiderQueue
:: [QueueObject
] -> SpiderQueue
122 initSpiderQueue objlist
= SpiderQueue
{
123 magicNumberA
=magicNUMBER_U2A
,
124 magicNumberB
=magicNUMBER_U2B
,
125 majorVers
=majorNUMBER
,
126 minorVers
=minorNUMBER
,
127 queueSize
=(fromIntegral (length objlist
)),
131 initQueueObject
:: String -> Integer -> QueueObject
132 initQueueObject obj t
= QueueObject
{
133 segtag
=(fromIntegral queueTAG
),
134 dbseglen
=(fromIntegral lenbs
),
139 lenbs
= length . LazyC
.unpack
$ bs
140 pt
= (fromIntegral t
)