Add.hs: add runSQL function which run a single SQL statement
[hdata.git] / Add.hs
blobacbcfaecce4df4fcce6e2cc617a5ce3a53fbe5ce
1 module Add (
2 add,
3 usageAdd
4 ) where
6 import Data.List
7 import Database.HDBC
8 import Database.HDBC.Sqlite3
9 import Util
11 data Flag = Path String
12 | Title String
13 | Authors String
14 | Keywords String
15 | Journal String
16 | Volume String
17 | Issue String
18 | Date String
19 | Pages String
20 deriving (Show)
22 isFlag :: String -> Bool
23 isFlag f = f `elem` ["-f","-p","-t","-j","-i","-d","-v","-a","-k"]
25 add :: [String] -> IO ()
26 add [] = error $ "add: no arguments specified ('" ++ progName ++ " add help' for help)"
27 add argv = if isHelp $ head argv
28 then do putStrLn usageAdd
29 else do
30 case parseFlags argv of
31 Left msg -> error $ "add: " ++ msg
32 Right flags -> do putStrLn (flagsToString flags) >> runSQL (buildSQL flags)
34 buildSQL :: [Flag] -> String
35 buildSQL flags = buildSQL' ("INSERT INTO " ++ tableName ++ " (") "VALUES(" flags
36 where buildSQL' t1 t2 [] = ((init t1) ++ ") ") ++ (init(t2) ++ ");")
37 buildSQL' t1 t2 (f:fs) = buildSQL' (t1++key++",") (t2++"'"++value++"',") fs
38 where (key,val) = break (==' ') $ show f
39 value = filter (/= '\"') (tail val)
41 flagsToString :: [Flag] -> String
42 flagsToString xs = foldl' step [] xs
43 where step ys x = show x ++ "\n" ++ ys
45 parseFlags :: [String] -> Either String [Flag]
46 parseFlags argv = parseFlags' [] argv
47 where parseFlags' _ (x:[]) = Left "too few arguments"
48 parseFlags' fs [] = Right fs
49 parseFlags' fs xs =
50 let flag = getFlag xs
51 in case flag of
52 Left msg -> Left msg
53 Right f -> parseFlags' (f:fs) (dropWhile (not . isFlag) (tail xs))
55 getFlag :: [String] -> Either String Flag
56 getFlag x@(x0:x1:_) =
57 let flag = case x0 of
58 "-f" -> Path x1
59 "-t" -> Title x1
60 "-j" -> Journal x1
61 "-v" -> Volume x1
62 "-i" -> Issue x1
63 "-d" -> Date x1
64 "-p" -> Pages x1
65 "-k" -> Keywords $ getValues $ tail x
66 "-a" -> Authors $ getValues $ tail x
67 in if isFlag x1
68 then Left "too few argument"
69 else Right flag
71 getValues :: [String] -> String
72 getValues argv = intercalate "/" $ takeWhile (not . isFlag) argv
74 opendb :: IO Connection
75 opendb = do
76 conn <- connectSqlite3 dbName
77 run conn ("CREATE TABLE " ++ tableName ++ "(id INTEGER PRIMARY KEY,\
78 \ Path VARCHAR(1000),\
79 \ Title VARCHAR(1000),\
80 \ Authors VARCHAR(1000),\
81 \ Keywords VARCHAR(1000),\
82 \ Journal VARCHAR(1000),\
83 \ Volume VARCHAR(1000),\
84 \ Issue VARCHAR(1000),\
85 \ Date VARCHAR(1000),\
86 \ Pages VARCHAR(1000));") []
87 commit conn
88 return conn
90 runSQL :: String -> IO ()
91 runSQL sql = do
92 db <- opendb
93 run db sql []
94 commit db
95 disconnect db
96 return ()
98 usageAdd :: String
99 usageAdd = "usage: " ++ progName ++ " add <filters>\n\
100 \filters:\n\
101 \ -f <file>\n\
102 \ -t <title>\n\
103 \ -a <author1 [author2] ...>\n\
104 \ -k <keyword1 [keyword2] ...>\n\
105 \ -j <journal>\n\
106 \ -i <issue>\n\
107 \ -d <date>\n\
108 \ -p <page-from>-<page-to>"