groundhog-inspector 0.7.0 → 0.7.1
raw patch · 3 files changed
+118/−2 lines, 3 filesdep +cmdargsdep +groundhog-inspectordep +groundhog-mysqldep ~basedep ~groundhogdep ~groundhog-thnew-component:exe:groundhog_inspectorPVP ok
version bump matches the API change (PVP)
Dependencies added: cmdargs, groundhog-inspector, groundhog-mysql, groundhog-postgresql, groundhog-sqlite, mtl
Dependency ranges changed: base, groundhog, groundhog-th
API changes (from Hackage documentation)
Files
- changelog +3/−0
- groundhog-inspector.cabal +43/−2
- main/Main.hs +72/−0
changelog view
@@ -1,2 +1,5 @@+0.7.1+* Add executable groundhog_inspector+ 0.7.0 * The first release
groundhog-inspector.cabal view
@@ -1,5 +1,5 @@ name: groundhog-inspector-version: 0.7.0+version: 0.7.1 license: BSD3 license-file: LICENSE author: Boris Lykah <lykahb@gmail.com>@@ -8,13 +8,25 @@ description: This library analyzes database tables and creates corresponding datatypes and their mappings for Groundhog <https://www.fpcomplete.com/user/lykahb/groundhog>. See examples at <https://github.com/lykahb/groundhog/tree/master/groundhog-inspector/examples>. category: Database stability: Experimental-cabal-version: >= 1.6+cabal-version: >= 1.8 build-type: Simple homepage: http://github.com/lykahb/groundhog extra-source-files: changelog +Flag sqlite+ Description: analyze Slite+ Default: True++Flag postgresql+ Description: analyze PostgreSQL+ Default: False++Flag mysql+ Description: analyze MySQL+ Default: False+ library build-depends: base >= 4 && < 5 , bytestring >= 0.9@@ -34,3 +46,32 @@ source-repository head type: git location: git://github.com/lykahb/groundhog.git++executable groundhog_inspector+ hs-source-dirs: main+ main-is: Main.hs++ ghc-options:+ -Wall -rtsopts++ build-depends:+ base+ , mtl >= 2.0+ , cmdargs >= 0.10+ , containers >= 0.2+ , bytestring >= 0.9+ , groundhog+ , groundhog-th+ , groundhog-inspector++ if flag(sqlite)+ build-depends: groundhog-sqlite+ cpp-options: -DWITH_SQLITE++ if flag(postgresql)+ build-depends: groundhog-postgresql+ cpp-options: -DWITH_POSTGRESQL++ if flag(mysql)+ build-depends: groundhog-mysql+ cpp-options: -DWITH_MYSQL
+ main/Main.hs view
@@ -0,0 +1,72 @@+{-# LANGUAGE CPP, DeriveDataTypeable #-}++module Main where++import System.Console.CmdArgs+import Control.Monad.Trans (MonadIO(..))+import qualified Data.ByteString.Lazy.Char8 as B+import qualified Data.Map as Map++import Database.Groundhog.Generic.Migration (SchemaAnalyzer)+import Database.Groundhog.TH (suffixNamingStyle)+import Database.Groundhog.Inspector++#if WITH_SQLITE+import Database.Groundhog.Sqlite+#endif+#if WITH_POSTGRESQL+import Database.Groundhog.Postgresql+#endif+#if WITH_MYSQL+import Database.Groundhog.MySQL+#endif++data Args = Args {database :: String, connectionInfo :: String} deriving (Show, Data, Typeable)++databases :: [String]+databases =+#if WITH_SQLITE+ "sqlite":+#endif+#if WITH_POSTGRESQL+ "postgresql":+#endif+#if WITH_MYSQL+ "mysql":+#endif+ []++sample :: Mode (CmdArgs Args)+sample = cmdArgsMode $ Args { database = def &= argPos 0 &= typ (show databases) &= opt (head databases)+ , connectionInfo = def &= argPos 1 &= typ "CONNECTION_STRING" }+ &= summary "groundhog-inspector"+ &= details ["Pass a name of a database. The connection string is an argument to with*Conn. "+ , "MySQL connection string is \"ConnectInfo {...}\""]++analyze :: (PersistBackend m, SchemaAnalyzer m, MonadIO m) => m ()+analyze = do+ tables <- collectTables (const True) Nothing+ -- Analyze tables+ let decs = generateData defaultDataCodegenConfig defaultReverseNamingStyle tables+ mappings <- generateMapping defaultReverseNamingStyle tables+ -- Print datatype declarations+ liftIO $ mapM_ (putStrLn . showData) $ concat $ map (uncurry (:)) $ Map.elems $ decs+ -- Remove parts of mapping that are defaults for the chosen naming style+ let mappings' = Map.intersectionWith (minimizeMapping suffixNamingStyle . fst) decs mappings+ -- Print mappings+ liftIO $ B.putStrLn $ showMappings $ Map.elems mappings'++main :: IO ()+main = do+ arg <- cmdArgsRun sample+ case database arg of+#if WITH_SQLITE+ "sqlite" -> withSqliteConn (connectionInfo arg) $ runDbConn analyze+#endif+#if WITH_POSTGRESQL+ "postgresql" -> withPostgresqlConn (connectionInfo arg) $ runDbConn analyze+#endif+#if WITH_MYSQL+ "mysql" -> withMySQLConn (read $ connectionInfo arg) $ runDbConn analyze+#endif+ other -> fail $ "Unknown database: " ++ other