]> gitweb.michael.orlitzky.com - mailbox-count.git/blobdiff - src/Report.hs
mailbox-count.cabal: bump to version 0.0.8
[mailbox-count.git] / src / Report.hs
index db9c4ad584f0a67b379611685cfffc3d84138693..96c3150bcc10e0fe8060fbcf43c8a1d5c15fe739 100644 (file)
@@ -15,9 +15,11 @@ import Database.HDBC (
   safeFromSql,
   quickQuery )
 import Database.HDBC.Sqlite3 ( connectSqlite3 )
+import System.Console.CmdArgs.Default ( Default( def ) )
 import Test.Tasty ( TestTree, testGroup )
 import Test.Tasty.HUnit ( (@?=), testCase )
 
+import Configuration ( Configuration( detail, detail_query, summary_query ) )
 
 -- Type synonyms to make the signatures below a little more clear.
 type Domain = String
@@ -107,12 +109,18 @@ format_domain_count longest_length (DomainCount d c) =
   where
     num_spaces = longest_length - length d
 
+
+-- | The header that gets output before the summary report.
+--
 summary_header :: String
 summary_header = "Summary (number of mailboxes per domain)\n" ++
                  "----------------------------------------"
 
-report_summary :: IConnection a => a -> IO String
-report_summary conn = do
+
+-- | Given a connection, produces the summary report as a 'String'.
+--
+report_summary :: IConnection a => a -> String -> IO String
+report_summary conn query = do
   list_rows <- quickQuery conn query []
   let maybe_domain_counts = map list_to_domain_count list_rows
   let domain_counts = catMaybes maybe_domain_counts
@@ -136,10 +144,6 @@ report_summary conn = do
       where
         longest = maximumBy compare_dcs_by_length dcs
 
-    query = "SELECT domain,COUNT(username) " ++
-            "FROM mailbox " ++
-            "GROUP BY domain "++
-            "ORDER BY domain;"
 
 
 -- | Construct a Domain -> [Username] (a DomainUserMap) map from a
@@ -162,8 +166,8 @@ report_summary conn = do
 --   fromList [("example.com",["user2","user1"]),("example.net",["user3"])]
 --
 construct_domain_user_map :: [DomainUser] -> DomainUserMap
-construct_domain_user_map dus =
-  foldl' append_this_du Map.empty dus
+construct_domain_user_map =
+  foldl' append_this_du Map.empty
   where
     append_func :: Username -> (Maybe [Username]) -> (Maybe [Username])
     append_func user maybe_userlist =
@@ -176,12 +180,17 @@ construct_domain_user_map dus =
       Map.alter (append_func user) domain du_map
 
 
+-- | The header that gets output before the detail report.
+--
 detail_header :: String
 detail_header = "Detail (list of all mailboxes by domain)\n" ++
                 "----------------------------------------"
 
-report_detail :: IConnection a => a -> IO String
-report_detail conn = do
+
+-- | Given a connection, produces the detail report as a 'String'.
+--
+report_detail :: IConnection a => a -> String -> IO String
+report_detail conn query = do
   list_rows <- quickQuery conn query []
   let maybe_domain_users = map list_to_domain_user list_rows
   let domain_users = catMaybes maybe_domain_users
@@ -192,10 +201,6 @@ report_detail conn = do
   let report_body = Map.foldl (++) "" domain_report_map
   return $ detail_header ++ report_body
   where
-    query = "SELECT domain,username " ++
-            "FROM mailbox " ++
-            "ORDER BY domain;"
-
     format_domain :: Domain -> [Username] -> String
     format_domain domain users =
       (join "\n" (domain_header : indented_users)) ++ "\n"
@@ -205,11 +210,14 @@ report_detail conn = do
         indented_users = map ("  " ++) users
 
 
-report :: IConnection a => a -> Bool -> IO String
-report conn do_detail =
-  if do_detail
-  then report_detail conn
-  else report_summary conn
+-- | Given a connection and a 'Configuration', produces the report as
+--   a 'String'.
+--
+report :: IConnection a => Configuration -> a -> IO String
+report cfg conn =
+  if (detail cfg)
+  then report_detail conn (detail_query cfg)
+  else report_summary conn (summary_query cfg)
 
 
 
@@ -224,7 +232,8 @@ test_summary_report :: TestTree
 test_summary_report =
   testCase desc $ do
     conn <- connectSqlite3 "test/fixtures/postfixadmin.sqlite3"
-    actual <- report_summary conn
+    let cfg = def :: Configuration
+    actual <- report_summary conn (summary_query cfg)
     actual @?= expected
   where
     desc = "Summary report looks like it should"
@@ -240,7 +249,8 @@ test_detail_report :: TestTree
 test_detail_report =
   testCase desc $ do
     conn <- connectSqlite3 "test/fixtures/postfixadmin.sqlite3"
-    actual <- report_detail conn
+    let cfg = def :: Configuration
+    actual <- report_detail conn (detail_query cfg)
     actual @?= expected
   where
     desc = "Detail report looks like it should"