8 import Database
.HDBC
.Sqlite3
11 data Flag
= Path
String
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
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
53 Right f
-> parseFlags
' (f
:fs
) (dropWhile (not . isFlag
) (tail xs
))
55 getFlag
:: [String] -> Either String Flag
65 "-k" -> Keywords
$ getValues
$ tail x
66 "-a" -> Authors
$ getValues
$ tail x
68 then Left
"too few argument"
71 getValues
:: [String] -> String
72 getValues argv
= intercalate
"/" $ takeWhile (not . isFlag
) argv
74 opendb
:: IO Connection
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));") []
90 runSQL
:: String -> IO ()
99 usageAdd
= "usage: " ++ progName
++ " add <filters>\n\
103 \ -a <author1 [author2] ...>\n\
104 \ -k <keyword1 [keyword2] ...>\n\
108 \ -p <page-from>-<page-to>"