]> ruin.nu Git - yawbih.git/blob - Wiki.hs
ab89fff9de0e8c6a9a6e6bd834b67fd589d26c81
[yawbih.git] / Wiki.hs
1 module Wiki (
2         Backend (getCurrent,getList,get,setCurrent,update)
3         ,PGB
4         ,createPGB
5         ,Markup (Text, Paragraph, Link)
6         ,Document
7         ,wikiParser
8
9 ) where
10
11 import Dbconnect
12 import Data.Char
13 import Text.ParserCombinators.Parsec
14
15 class Backend a where
16         --Keyword -> (Full text,date)
17         getCurrent :: a -> String -> IO (Maybe (String,String))
18
19         --Keyword -> [(id,date,author,comment)]
20         getList :: a -> String -> IO [(String, String, String, String)]
21
22         --Keyword -> id -> Full text
23         get :: a -> String -> String -> IO String
24
25         --Keyword -> id -> ()
26         setCurrent :: a -> String -> String -> IO Bool
27
28         --Keyword -> Full text -> id
29         update :: a -> String -> String -> String -> String -> IO String
30
31 data Markup = Text String
32         | Paragraph 
33         | Link String String
34
35 type Document = [Markup]
36
37 wikiParser :: GenParser Char st Document        
38 wikiParser = do 
39         s <- (try (pPara) 
40                 <|> pOneEol 
41                 <|> pLinkLong
42                 <|> pText)
43         ss <- (wikiParser <|> return [])
44         return (s:ss)
45
46 pPara = do
47         pEol
48         pEol
49         return (Paragraph)
50
51 pOneEol = do
52         pEol
53         return (Text " ")
54
55 pEol = char '\n' <|> do
56         char '\r'
57         char '\n'
58
59 pLinkLong = do
60         string "[["
61         l <- many1 $ noneOf ['|','[',']']
62         char '|'
63         d <- many1 $ noneOf ['|','[',']'] 
64         string "]]"
65         return (Link l d)
66 pText = do
67         t <- many1 (noneOf ['\n','\r','[',']'])
68         return (Text t)
69
70 newtype PGB = PGB DBService
71
72 createPGB :: String -> String -> String -> String -> IO PGB
73 createPGB host database user password = let db = createDBService host database "" user password Nothing in return (PGB db)
74
75
76 testDB = createPGB "wave" "wiki" "wiki" "12wiki34db"
77
78 instance Backend PGB where
79
80         getCurrent (PGB db) key = do 
81                 result <- selectReturnTuples db $ "SELECT fulltext,timestamp FROM curtexts WHERE keyword="++tov key
82                 case result of
83                         [text,date]:_ -> return (Just (text,date))
84                         _ -> return Nothing
85
86         getList (PGB db) key = do
87                 list <- selectReturnTuples db $ "SELECT id, timestamp, author, comment from fulltexts WHERE keyword = "++tov key
88                 return $ map (\[id,date,author,comment] -> (id,date,author,comment)) list
89
90         get (PGB db) key id = return ""
91
92         setCurrent (PGB db) key id = do
93                 full <- selectReturnTuples db $ "SELECT keyword FROM fulltexts WHERE keyword="++tov key++" AND id='"++id++"'"
94                 cur <- selectReturnTuples db $ "SELECT keyword FROM curtexts WHERE keyword="++tov key
95                 case full of
96                         [[]] -> do
97                                 return False
98                         _  -> do
99                                 rows <- case cur of
100                                         [[]] -> do
101                                                 execute db $ "INSERT INTO current (keyword, id) VALUES ("++tov key++","++tov id++")"
102                                         _  -> do
103                                                 execute db $ "UPDATE current SET id = "++tov id++" WHERE keyword = "++tov key
104                                 if rows == 1 then return True
105                                         else return False 
106
107         update (PGB db) key text author comment = do
108                 rows <- execute db $ "INSERT INTO fulltexts (keyword,fulltext, author, comment) VALUES ("++tov key++","++tov text++","++tov author++","++tov comment++")"
109                 if rows == 0 then return ""
110                         else do
111                                 [[id]] <- selectReturnTuples db $ "SELECT currval('fulltexts_id_seq')" 
112                                 setCurrent (PGB db) key id
113                                 return id
114                         
115
116 tov :: String -> String
117 tov s = '\'':escapeQuery s++"'"
118                 
119