@@ -22,11 +22,13 @@ import Data.ListLike (CharString(..))
22
22
import Data.Map (Map )
23
23
import qualified Data.Map as DM
24
24
import Data.Maybe
25
+ import Data.Pool
25
26
import Data.String
26
27
import Data.Text (Text )
27
28
import qualified Data.Text as DT
28
29
import qualified Data.Text.Encoding as DT
29
- import Database.HDBC.PostgreSQL
30
+ import qualified Database.HDBC as HDBC
31
+ import Database.HDBC.MySQL
30
32
import JCU.Prolog
31
33
import JCU.Templates
32
34
import JCU.Types
@@ -37,7 +39,7 @@ import Snap.Core
37
39
import Snap.Snaplet
38
40
import Snap.Snaplet.Auth
39
41
import Snap.Snaplet.Auth.Backends.Hdbc
40
- import Snap.Snaplet.Hdbc
42
+ {- import Snap.Snaplet.Hdbc-}
41
43
import Snap.Snaplet.Session
42
44
import Snap.Snaplet.Session.Backends.CookieSession
43
45
import Snap.Util.FileServe
@@ -54,18 +56,15 @@ import qualified Database.HDBC as HDBC
54
56
data App = App
55
57
{ _authLens :: Snaplet (AuthManager App )
56
58
, _sessLens :: Snaplet SessionManager
57
- , _dbLens :: Snaplet ( HdbcSnaplet Connection IO )
59
+ , pgconn :: Connection
58
60
}
59
61
60
62
makeLens ''App
61
63
62
64
type AppHandler = Handler App App
63
65
64
- instance HasHdbc (Handler b App ) Connection IO where
65
- getHdbcState = with dbLens get
66
-
67
- -- instance Control.Monad.Trans.Control.MonadBaseControl IO (Handler b App) where
68
-
66
+ {- instance HasHdbc (Handler b App) Connection IO where-}
67
+ {- getHdbcState = with dbLens get-}
69
68
70
69
jcu :: SnapletInit App App
71
70
jcu = makeSnaplet " jcu" " Prolog proof tree practice application" Nothing $ do
@@ -86,13 +85,17 @@ jcu = makeSnaplet "jcu" "Prolog proof tree practice application" Nothing $ do
86
85
]
87
86
_sesslens' <- nestSnaplet " session" sessLens $ initCookieSessionManager
88
87
" config/site_key.txt" " _session" Nothing
89
- let sqli = do connString <- readFile " config/connection_string.conf"
90
- c <- connectPostgreSQL connString
91
- return c
92
- _dblens' <- nestSnaplet " hdbc" dbLens $ hdbcInit sqli
88
+ pass <- readFile " config/connection_string.conf"
89
+ let pgsql = connectMySql defaultMySQLConnectInfo {
90
+ mysqlPassword = pass,
91
+ mysqlDatabase = " jcu"
92
+ } -- connectPostgreSQL' =<< readFile "config/connection_string.conf"
93
+ pg <- liftIO $ pgsql
94
+ -- pool <- liftIO $ createPool pgsql HDBC.disconnect 1 500 1
95
+ {- _dblens' <- nestSnaplet "hdbc" dbLens $ hdbcInit pgsql-}
93
96
_authlens' <- nestSnaplet " auth" authLens $ initHdbcAuthManager
94
- defAuthSettings sessLens sqli defAuthTable defQueries
95
- return $ App _authlens' _sesslens' _dblens'
97
+ defAuthSettings sessLens pgsql defAuthTable defQueries
98
+ return $ App _authlens' _sesslens' pg
96
99
97
100
98
101
------------------------------------------------------------------------------
@@ -182,7 +185,9 @@ deleteStoredRuleH = restrict forbiddenH $ do
182
185
mrid <- getParam " id"
183
186
case mrid of
184
187
Nothing -> return ()
185
- Just x -> deleteRule x -- TODO: Take user ID into account. we don't want people deleting other users's rules
188
+ Just x -> do
189
+ uid <- getUserId
190
+ deleteRule uid x
186
191
187
192
addStoredRuleH :: AppHandler ()
188
193
addStoredRuleH = restrict forbiddenH $ do
@@ -198,8 +203,7 @@ loadExampleH = restrict forbiddenH $ do
198
203
uid <- getUserId
199
204
deleteUserRules uid
200
205
mapM_ (insertRule uid) exampleData
201
- -- commitSession
202
- -- redirect "/"
206
+ redirect " /"
203
207
204
208
205
209
getUserId :: AppHandler UserId
@@ -347,36 +351,53 @@ voidM m = do
347
351
return ()
348
352
349
353
-- TODO: This is just a workaround....
350
- q :: HasHdbc m c s => String -> [SqlValue ] -> m ()
351
- q qry vals = withTransaction $ \ conn' -> do
352
- stmt <- HDBC. prepare conn' qry
353
- _ <- HDBC. execute stmt vals
354
- return ()
355
-
356
- insertRule :: HasHdbc m c s => UserId -> Rule -> m (Maybe Int )
357
- insertRule uid rl = let sqlVals = [toSql $ unUid uid, toSql $ show rl] in do
358
- q " INSERT INTO rules (uid, rule_order, rule) VALUES (?, 1, ?)" sqlVals
359
- rws <- query " SELECT rid FROM rules WHERE uid = ? AND rule = ? ORDER BY rid DESC"
360
- sqlVals
361
- return $ case rws of
362
- [] -> Nothing
363
- (x: _) -> Just $ fromSql $ x DM. ! " rid"
364
-
365
- deleteRule :: HasHdbc m c s => ByteString -> m ()
366
- deleteRule rid = q " DELETE FROM rules WHERE rid = ?" [toSql rid]
367
-
368
- getStoredRules :: HasHdbc m c s => UserId -> m [DBRule ]
354
+ q :: String -> [HDBC. SqlValue ] -> AppHandler ()
355
+ q qry vals = do
356
+ c <- gets pgconn
357
+ c' <- liftIO $ HDBC. clone c
358
+ liftIO $ HDBC. withTransaction c' $ \ conn' -> do
359
+ stmt <- HDBC. prepare conn' qry
360
+ voidM $ HDBC. execute stmt vals
361
+ HDBC. commit c'
362
+ return ()
363
+
364
+ insertRule :: UserId -> Rule -> AppHandler (Maybe Int )
365
+ insertRule uid rl =
366
+ let sqlVals = [HDBC. toSql $ unUid uid, HDBC. toSql $ show rl]
367
+ in do
368
+ q " INSERT INTO rules (uid, rule_order, rule) VALUES (?, 1, ?)" sqlVals
369
+ c <- gets pgconn
370
+ c' <- liftIO $ HDBC. clone c
371
+ rws <- liftIO $ do
372
+ stmt <- HDBC. prepare c' " SELECT rid FROM rules WHERE uid = ? AND rule = ? ORDER BY rid DESC"
373
+ voidM $ HDBC. execute stmt sqlVals
374
+ HDBC. fetchAllRowsMap' stmt
375
+ return $ case rws of
376
+ [] -> Nothing
377
+ (x: _) -> Just $ HDBC. fromSql $ x DM. ! " rid"
378
+
379
+ deleteRule :: UserId -> ByteString -> AppHandler ()
380
+ deleteRule uid rid = q " DELETE FROM rules WHERE rid = ? AND uid = ?"
381
+ [HDBC. toSql rid, HDBC. toSql uid]
382
+
383
+ getStoredRules :: UserId -> AppHandler [DBRule ]
369
384
getStoredRules uid = do
370
- rs <- query " SELECT rid, rule_order, rule FROM rules WHERE uid = ?"
371
- [toSql uid]
372
- return $ map convRow rs
373
- where convRow :: Map String SqlValue -> DBRule
385
+ c <- gets pgconn
386
+ c' <- liftIO $ HDBC. clone c
387
+ rws <- liftIO $ do
388
+ stmt <- HDBC. prepare c' " SELECT rid, rule_order, rule FROM rules WHERE uid = ?"
389
+ voidM $ HDBC. execute stmt [HDBC. toSql uid]
390
+ HDBC. fetchAllRowsMap' stmt
391
+ {- rs <- query "SELECT rid, rule_order, rule FROM rules WHERE uid = ?"-}
392
+ {- [toSql uid]-}
393
+ return $ map convRow rws
394
+ where convRow :: Map String HDBC. SqlValue -> DBRule
374
395
convRow mp =
375
- let rdSql k = fromSql $ mp DM. ! k
396
+ let rdSql k = HDBC. fromSql $ mp DM. ! k
376
397
in DBRule (rdSql " rid" )
377
398
(rdSql " rule_order" )
378
399
(fst . startParse pRule $ CS (rdSql " rule" ))
379
400
380
- deleteUserRules :: HasHdbc m c s => UserId -> m ()
381
- deleteUserRules uid = q " DELETE FROM rules WHERE uid = ?" [toSql uid]
401
+ deleteUserRules :: UserId -> AppHandler ()
402
+ deleteUserRules uid = q " DELETE FROM rules WHERE uid = ?" [HDBC. toSql uid]
382
403
0 commit comments