On Fri, Aug 22, 2014 at 02:16:12PM +0200, Niklas Hambuechen wrote:
Signed-off-by: Niklas Hambuechen <[email protected]> --- src/Ganeti/Query/Server.hs | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-)diff --git a/src/Ganeti/Query/Server.hs b/src/Ganeti/Query/Server.hs index d6c942d..2167ad7 100644 --- a/src/Ganeti/Query/Server.hs +++ b/src/Ganeti/Query/Server.hs @@ -76,6 +76,25 @@ import Ganeti.Utils.MVarLock import qualified Ganeti.Version as Version -- | Helper for classic queries. +handleQuery :: [Qlang.ItemType -> Qlang.FilterField] -- ^ Fields to put into + -- the query + -> ConfigData -- ^ Cluster config + -> Qlang.ItemType -- ^ Query type + -> [Either String Integer] -- ^ Requested names + -- (empty means all) + -> [String] -- ^ Requested fields + -> Bool -- ^ Whether to do sync queries or not + -> IO (GenericResult GanetiException JSValue) +handleQuery _ _ _ _ _ True = + return . Bad $ OpPrereqError "Sync queries are not allowed" ECodeInval +handleQuery filterFields cfg qkind names fields _ = do + let simpleNameFilter field = makeSimpleFilter (field qkind) names + flt = Qlang.OrFilter $ map simpleNameFilter filterFields + qr <- query cfg True (Qlang.Query qkind fields flt) + return $ showJSON <$> (qr >>= queryCompat) + +-- | Helper for classic queries. +-- Queries `name` and `uuid` fields. handleClassicQuery :: ConfigData -- ^ Cluster config -> Qlang.ItemType -- ^ Query type -> [Either String Integer] -- ^ Requested names @@ -83,13 +102,7 @@ handleClassicQuery :: ConfigData -- ^ Cluster config -> [String] -- ^ Requested fields -> Bool -- ^ Whether to do sync queries or not -> IO (GenericResult GanetiException JSValue) -handleClassicQuery _ _ _ _ True = - return . Bad $ OpPrereqError "Sync queries are not allowed" ECodeInval -handleClassicQuery cfg qkind names fields _ = do - let simpleNameFilter field = makeSimpleFilter (field qkind) names - flt = Qlang.OrFilter $ map simpleNameFilter [nameField, uuidField] - qr <- query cfg True (Qlang.Query qkind fields flt) - return $ showJSON <$> (qr >>= queryCompat) +handleClassicQuery = handleQuery [nameField, uuidField] -- | Minimal wrapper to handle the missing config case. handleCallWrapper :: Lock -> JQStatus -> Result ConfigData -- 2.1.0.rc2.206.gedb03e5
LGTM (it's fun when a function's type is larges than it's body)
