packages feed

psql-utils 0.1.0.0 → 0.2.0.0

raw patch · 2 files changed

+100/−57 lines, 2 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Database.PSQL.Types: type PSQL a = TablePrefix -> Connection -> IO a
+ Database.PSQL.Types: data Connection
+ Database.PSQL.Types: data PSQL a
+ Database.PSQL.Types: getTablePrefix :: PSQL TablePrefix
+ Database.PSQL.Types: instance Control.Monad.IO.Class.MonadIO Database.PSQL.Types.PSQL
+ Database.PSQL.Types: instance GHC.Base.Applicative Database.PSQL.Types.PSQL
+ Database.PSQL.Types: instance GHC.Base.Functor Database.PSQL.Types.PSQL
+ Database.PSQL.Types: instance GHC.Base.Monad Database.PSQL.Types.PSQL
+ Database.PSQL.Types: runPSQL :: TablePrefix -> Connection -> PSQL a -> IO a
+ Database.PSQL.Types: runPSQLEnv :: HasPSQL env => env -> PSQL a -> IO a
+ Database.PSQL.Types: runPSQLPool :: TablePrefix -> PSQLPool -> PSQL a -> IO a

Files

psql-utils.cabal view
@@ -1,5 +1,5 @@ name:                psql-utils-version:             0.1.0.0+version:             0.2.0.0 synopsis:            PostgreSQL Simple util tools. description:         An easy way to use postgresql-simple library. homepage:            https://github.com/Lupino/yuntan-common/tree/master/psql-utils#readme
src/Database/PSQL/Types.hs view
@@ -9,8 +9,13 @@ module Database.PSQL.Types   ( TablePrefix +  , Connection   , PSQLPool   , PSQL+  , runPSQL+  , runPSQLPool+  , runPSQLEnv+  , getTablePrefix   , HasPSQL   , psqlPool   , tablePrefix@@ -65,11 +70,12 @@   import           Control.Monad                      (void)+import           Control.Monad.IO.Class             (MonadIO (..)) import           Data.Hashable                      (Hashable (..)) import           Data.Int                           (Int64) import           Data.List                          (intercalate) import           Data.Maybe                         (listToMaybe)-import           Data.Pool                          (Pool)+import           Data.Pool                          (Pool, withResource) import           Data.String                        (IsString (..)) import           Database.PostgreSQL.Simple         (Connection, Only (..),                                                      SqlError (..), ToRow,@@ -88,13 +94,52 @@ instance IsString TablePrefix where   fromString = TablePrefix -type PSQL a = TablePrefix -> Connection -> IO a type PSQLPool = Pool Connection +newtype PSQL a = PSQL {unPSQL :: TablePrefix -> Connection -> IO a}++instance Functor PSQL where+  fmap f a = PSQL $ \p c -> f <$> unPSQL a p c+  {-# INLINE fmap #-}++instance Applicative PSQL where+  pure a = PSQL $ \_ _ -> pure a+  {-# INLINE pure #-}+  f <*> v = PSQL $ \p c -> unPSQL f p c <*> unPSQL v p c+  {-# INLINE (<*>) #-}+++instance Monad PSQL where+  return a = PSQL $ \_ _ -> return a+  {-# INLINE return #-}+  m >>= k = PSQL $ \p c -> do+    a <- unPSQL m p c+    unPSQL (k a) p c+  {-# INLINE (>>=) #-}+  m >> k = PSQL $ \p c -> unPSQL m p c >> unPSQL k p c+  {-# INLINE (>>) #-}++instance MonadIO PSQL where+  liftIO m = PSQL $ \_ _ -> m+  {-# INLINE liftIO #-}++runPSQL :: TablePrefix -> Connection -> PSQL a -> IO a+runPSQL prefix conn m = unPSQL m prefix conn++runPSQLPool :: TablePrefix -> PSQLPool -> PSQL a -> IO a+runPSQLPool prefix pool m = withResource pool $ unPSQL m prefix++getTablePrefix :: PSQL TablePrefix+getTablePrefix = PSQL $ \p _ -> return p+ class HasPSQL u where   psqlPool    :: u -> PSQLPool   tablePrefix :: u -> TablePrefix +runPSQLEnv :: (HasPSQL env) => env -> PSQL a -> IO a+runPSQLEnv env = runPSQLPool (tablePrefix env) (psqlPool env)++ class HasOtherEnv u a where   otherEnv :: a -> u @@ -145,8 +190,8 @@   ]  createTable :: TableName -> Columns -> PSQL Int64-createTable tn cols prefix conn = execute_ conn sql-  where sql = fromString $ concat+createTable tn cols = PSQL $ \prefix conn -> execute_ conn (sql prefix)+  where sql prefix = fromString $ concat           [ "CREATE TABLE IF NOT EXISTS ", getTableName prefix tn, " ("           , columnsToString cols           , ")"@@ -166,8 +211,8 @@   createIndex :: Bool -> TableName -> IndexName -> Columns -> PSQL Int64-createIndex uniq tn idxN cols prefix conn = execute_ conn sql-  where sql = fromString $ concat+createIndex uniq tn idxN cols = PSQL $ \prefix conn -> execute_ conn (sql prefix)+  where sql prefix = fromString $ concat           [ "CREATE ", uniqWord, "INDEX IF NOT EXISTS ", getIndexName prefix tn idxN           , " ON " , getTableName prefix tn, "(", columnsToString cols, ")"           ]@@ -181,9 +226,9 @@ getOnlyDefault a = maybe a fromOnly . listToMaybe  insert :: ToRow a => TableName -> Columns -> a -> PSQL Int64-insert tn cols a prefix conn = execute conn sql a-  where v = take (length cols) $ cycle ["?"]-        sql = fromString $ concat+insert tn cols a = PSQL $ \prefix conn -> execute conn (sql prefix) a+  where v = replicate (length cols) "?"+        sql prefix = fromString $ concat           [ "INSERT INTO ", getTableName prefix tn           , " (", columnsToString cols, ")"           , " VALUES"@@ -191,9 +236,9 @@           ]  insertRet :: (ToRow a, FromRow (Only b)) => TableName -> Columns -> Column -> a -> b -> PSQL b-insertRet tn cols col a def prefix conn = getOnlyDefault def <$> query conn sql a-  where v = take (length cols) $ cycle ["?"]-        sql = fromString $ concat+insertRet tn cols col a def = PSQL $ \prefix conn -> getOnlyDefault def <$> query conn (sql prefix) a+  where v = replicate (length cols) "?"+        sql prefix = fromString $ concat           [ "INSERT INTO ", getTableName prefix tn           , " (", columnsToString cols, ")"           , " VALUES"@@ -202,7 +247,7 @@           ]  insertOrUpdate :: ToRow a => TableName -> Columns -> Columns -> Columns -> a -> PSQL Int64-insertOrUpdate tn uniqCols valCols otherCols a prefix conn = execute conn sql a+insertOrUpdate tn uniqCols valCols otherCols a = PSQL $ \prefix conn -> execute conn (sql prefix) a   where cols = uniqCols ++ valCols ++ otherCols         v = replicate (length cols) "?" @@ -214,7 +259,7 @@          doSql = if null valCols then " DO NOTHING" else " DO UPDATE SET " ++ setSql -        sql = fromString $ concat+        sql prefix = fromString $ concat           [ "INSERT INTO ", getTableName prefix tn           , " (", columnsToString cols, ")"           , " VALUES"@@ -224,10 +269,10 @@           ]  update :: ToRow a => TableName -> Columns -> String -> a -> PSQL Int64-update tn cols partSql a prefix conn = execute conn sql a+update tn cols partSql a = PSQL $ \prefix conn -> execute conn (sql prefix) a   where setSql = intercalate ", " $ map appendSet cols         whereSql = if null partSql then "" else " WHERE " ++ partSql-        sql = fromString $ concat+        sql prefix = fromString $ concat           [ "UPDATE ", getTableName prefix tn           , " SET ", setSql           , whereSql@@ -238,37 +283,35 @@                                | otherwise = col ++ " = ?"  delete :: ToRow a => TableName -> String -> a -> PSQL Int64-delete tn partSql a prefix conn = execute conn sql a+delete tn partSql a = PSQL $ \prefix conn -> execute conn (sql prefix) a   where whereSql = " WHERE " ++ partSql-        sql = fromString $ concat+        sql prefix = fromString $ concat           [ "DELETE FROM ", getTableName prefix tn, whereSql           ]  delete_ :: TableName -> PSQL Int64-delete_ tn prefix conn = execute_ conn sql-  where sql = fromString $ concat-          [ "DELETE FROM ", getTableName prefix tn-          ]+delete_ tn = PSQL $ \prefix conn -> execute_ conn (sql prefix)+  where sql prefix = fromString $ "DELETE FROM " ++ getTableName prefix tn + count :: ToRow a => TableName -> String -> a -> PSQL Int64-count tn partSql a prefix conn =-  getOnlyDefault 0 <$> query conn sql a+count tn partSql a = PSQL $ \prefix conn ->+  getOnlyDefault 0 <$> query conn (sql prefix) a   where whereSql = " WHERE " ++ partSql-        sql = fromString $ concat+        sql prefix = fromString $ concat           [ "SELECT count(*) FROM ", getTableName prefix tn, whereSql           ]  count_ :: TableName -> PSQL Int64-count_ tn prefix conn =-  getOnlyDefault 0 <$> query_ conn sql-  where sql = fromString $ concat-          [ "SELECT count(*) FROM ", getTableName prefix tn-          ]+count_ tn = PSQL $ \prefix conn ->+  getOnlyDefault 0 <$> query_ conn (sql prefix)+  where sql prefix = fromString $ "SELECT count(*) FROM " ++ getTableName prefix tn + select :: (ToRow a, FromRow b) => TableName -> Columns -> String -> a -> From -> Size -> OrderBy -> PSQL [b]-select tn cols partSql a from size o prefix conn = query conn sql a+select tn cols partSql a from size o = PSQL $ \prefix conn ->  query conn (sql prefix) a   where whereSql = " WHERE " ++ partSql-        sql = fromString $ concat+        sql prefix = fromString $ concat           [ "SELECT ", columnsToString cols, " FROM ", getTableName prefix tn           , whereSql           , " ", show o@@ -277,12 +320,12 @@           ]  selectOnly :: (ToRow a, FromRow (Only b)) => TableName -> Column -> String -> a -> From -> Size -> OrderBy -> PSQL [b]-selectOnly tn col partSql a from size o prefix conn =-  map fromOnly <$> select tn [col] partSql a from size o prefix conn+selectOnly tn col partSql a from size o =+  map fromOnly <$> select tn [col] partSql a from size o  select_ :: FromRow b => TableName -> Columns -> From -> Size -> OrderBy -> PSQL [b]-select_ tn cols from size o prefix conn = query_ conn sql-  where sql = fromString $ concat+select_ tn cols from size o = PSQL $ \prefix conn -> query_ conn (sql prefix)+  where sql prefix = fromString $ concat           [ "SELECT ", columnsToString cols, " FROM ", getTableName prefix tn           , " ", show o           , " LIMIT ", show size@@ -290,56 +333,56 @@           ]  selectOnly_ :: FromRow (Only b) => TableName -> Column -> From -> Size -> OrderBy -> PSQL [b]-selectOnly_ tn col from size o prefix conn =-  map fromOnly <$> select_ tn [col] from size o prefix conn+selectOnly_ tn col from size o =+  map fromOnly <$> select_ tn [col] from size o  selectOne :: (ToRow a, FromRow b) => TableName -> Columns -> String -> a -> PSQL (Maybe b)-selectOne tn cols partSql a prefix conn = listToMaybe <$> query conn sql a+selectOne tn cols partSql a = PSQL $ \prefix conn -> listToMaybe <$> query conn (sql prefix) a   where whereSql = " WHERE " ++ partSql-        sql = fromString $ concat+        sql prefix = fromString $ concat           [ "SELECT ", columnsToString cols, " FROM ", getTableName prefix tn           , whereSql           ]  selectOneOnly :: (ToRow a, FromRow (Only b)) => TableName -> Column -> String -> a -> PSQL (Maybe b)-selectOneOnly tn col partSql a prefix conn =-  fmap fromOnly <$> selectOne tn [col] partSql a prefix conn+selectOneOnly tn col partSql a =+  fmap fromOnly <$> selectOne tn [col] partSql a  createVersionTable :: PSQL Int64-createVersionTable prefix conn =+createVersionTable =   createTable "version"     [ "name VARCHAR(10) NOT NULL"     , "version INT DEFAULT '0'"     , "PRIMARY KEY (name)"-    ] prefix conn+    ]  getCurrentVersion :: PSQL Int64-getCurrentVersion prefix conn = do-  void $ createVersionTable prefix conn-  ts <- selectOneOnly "version" "version" "name = ?" (Only ("version" :: String)) prefix conn+getCurrentVersion = do+  void createVersionTable+  ts <- selectOneOnly "version" "version" "name = ?" (Only ("version" :: String))   case ts of     Just v -> pure v     Nothing  ->-      insertRet "version" ["name", "version"] "version" ("version" :: String, 0 :: Int) 0 prefix conn+      insertRet "version" ["name", "version"] "version" ("version" :: String, 0 :: Int) 0   updateVersion :: Int64 -> PSQL ()-updateVersion ts prefix conn =-  void $ update "version" ["version"] "name = ?" (ts, "version" :: String) prefix conn+updateVersion ts =+  void $ update "version" ["version"] "name = ?" (ts, "version" :: String)  type Version a = (Int64, [PSQL a]) type VersionList a = [Version a]  mergeDatabase :: VersionList a -> PSQL ()-mergeDatabase versionList prefix conn = do-  version <- getCurrentVersion prefix conn-  mapM_ (\v -> processAction version v prefix conn) versionList+mergeDatabase versionList = do+  version <- getCurrentVersion+  mapM_ (processAction version) versionList  processAction :: Int64 -> Version a -> PSQL ()-processAction version (ts, actions) prefix conn =+processAction version (ts, actions) =   if ts > version then do-                  updateVersion ts prefix conn-                  mapM_ (\o -> void $ o prefix conn) actions+                  updateVersion ts+                  mapM_ void actions                   else pure ()  data OrderBy = Desc String | Asc String | None