diff options
author | Joey Hess <joeyh@joeyh.name> | 2019-01-01 13:49:19 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2019-01-01 14:45:33 -0400 |
commit | 9cc6d5549b84e0ca8a0375aa14ecc8d359c977cc (patch) | |
tree | 15fece3c9f8ba4cab2604a92967fcdcac782d41d /Types | |
parent | 1f52e5c5cbc2bd4845d0c332cbfabd0bdd6e19fb (diff) |
convert UUID from String to ByteString
This should make == comparison of UUIDs somewhat faster, and perhaps a
few other operations around maps of UUIDs etc.
FromUUID/ToUUID are used to convert String, which is still used for all
IO of UUIDs. Eventually the hope is those instances can be removed,
and all git-annex branch log files etc use ByteString throughout, for a
real speed improvement.
Note the use of fromRawFilePath / toRawFilePath -- while a UUID usually
contains only alphanumerics and so could be treated as ascii, it's
conceivable that some git-annex repository has been initialized using
a UUID that is not only not a canonical UUID, but contains high unicode
or invalid unicode. Using the filesystem encoding avoids any problems
with such a thing. However, a NUL in a UUID seems extremely unlikely,
so I didn't use encodeBS / decodeBS to avoid their extra overhead in
handling NULs.
The Read/Show instance for UUID luckily serializes the same way for
ByteString as it did for String.
Diffstat (limited to 'Types')
-rw-r--r-- | Types/UUID.hs | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/Types/UUID.hs b/Types/UUID.hs index f5c9cda301..5efc26dd0b 100644 --- a/Types/UUID.hs +++ b/Types/UUID.hs @@ -1,6 +1,6 @@ {- git-annex UUID type - - - Copyright 2011 Joey Hess <id@joeyh.name> + - Copyright 2011-2019 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -} @@ -9,29 +9,49 @@ module Types.UUID where +import qualified Data.ByteString as B import qualified Data.Map as M import qualified Data.UUID as U import Data.Maybe +import Utility.FileSystemEncoding import qualified Utility.SimpleProtocol as Proto -- A UUID is either an arbitrary opaque string, or UUID info may be missing. -data UUID = NoUUID | UUID String +data UUID = NoUUID | UUID B.ByteString deriving (Eq, Ord, Show, Read) -fromUUID :: UUID -> String -fromUUID (UUID u) = u -fromUUID NoUUID = "" +class FromUUID a where + fromUUID :: UUID -> a class ToUUID a where toUUID :: a -> UUID +instance FromUUID UUID where + fromUUID = id + instance ToUUID UUID where toUUID = id +instance FromUUID B.ByteString where + fromUUID (UUID u) = u + fromUUID NoUUID = B.empty + +instance ToUUID B.ByteString where + toUUID b + | B.null b = NoUUID + | otherwise = UUID b + +instance FromUUID String where + fromUUID s = fromRawFilePath (fromUUID s) + instance ToUUID String where - toUUID [] = NoUUID - toUUID s = UUID s + toUUID s = toUUID (toRawFilePath s) + +-- There is no matching FromUUID U.UUID because a git-annex UUID may +-- be NoUUID or perhaps contain something not allowed in a canonical UUID. +instance ToUUID U.UUID where + toUUID = toUUID . U.toASCIIBytes isUUID :: String -> Bool isUUID = isJust . U.fromString |