2 | import Data.ByteString
3 | import Derive.Prelude
6 | %language ElabReflection
17 | data SqlResult : Type where
18 | SQLITE_OK : SqlResult
19 | SQLITE_ERROR : SqlResult
20 | SQLITE_INTERNAL : SqlResult
21 | SQLITE_PERM : SqlResult
22 | SQLITE_ABORT : SqlResult
23 | SQLITE_BUSY : SqlResult
24 | SQLITE_LOCKED : SqlResult
25 | SQLITE_NOMEM : SqlResult
26 | SQLITE_READONLY : SqlResult
27 | SQLITE_INTERRUPT : SqlResult
28 | SQLITE_IOERR : SqlResult
29 | SQLITE_CORRUPT : SqlResult
30 | SQLITE_NOTFOUND : SqlResult
31 | SQLITE_FULL : SqlResult
32 | SQLITE_CANTOPEN : SqlResult
33 | SQLITE_PROTOCOL : SqlResult
34 | SQLITE_EMPTY : SqlResult
35 | SQLITE_SCHEMA : SqlResult
36 | SQLITE_TOOBIG : SqlResult
37 | SQLITE_CONSTRAINT : SqlResult
38 | SQLITE_MISMATCH : SqlResult
39 | SQLITE_MISUSE : SqlResult
40 | SQLITE_NOLFS : SqlResult
41 | SQLITE_AUTH : SqlResult
42 | SQLITE_FORMAT : SqlResult
43 | SQLITE_RANGE : SqlResult
44 | SQLITE_NOTADB : SqlResult
45 | SQLITE_NOTICE : SqlResult
46 | SQLITE_WARNING : SqlResult
47 | SQLITE_ROW : SqlResult
48 | SQLITE_DONE : SqlResult
51 | %runElab derive "SqlResult" [Show,Eq,Ord]
54 | fromInt : Int -> SqlResult
55 | fromInt 0 = SQLITE_OK
56 | fromInt 1 = SQLITE_ERROR
57 | fromInt 2 = SQLITE_INTERNAL
58 | fromInt 3 = SQLITE_PERM
59 | fromInt 4 = SQLITE_ABORT
60 | fromInt 5 = SQLITE_BUSY
61 | fromInt 6 = SQLITE_LOCKED
62 | fromInt 7 = SQLITE_NOMEM
63 | fromInt 8 = SQLITE_READONLY
64 | fromInt 9 = SQLITE_INTERRUPT
65 | fromInt 10 = SQLITE_IOERR
66 | fromInt 11 = SQLITE_CORRUPT
67 | fromInt 12 = SQLITE_NOTFOUND
68 | fromInt 13 = SQLITE_FULL
69 | fromInt 14 = SQLITE_CANTOPEN
70 | fromInt 15 = SQLITE_PROTOCOL
71 | fromInt 16 = SQLITE_EMPTY
72 | fromInt 17 = SQLITE_SCHEMA
73 | fromInt 18 = SQLITE_TOOBIG
74 | fromInt 19 = SQLITE_CONSTRAINT
75 | fromInt 20 = SQLITE_MISMATCH
76 | fromInt 21 = SQLITE_MISUSE
77 | fromInt 22 = SQLITE_NOLFS
78 | fromInt 23 = SQLITE_AUTH
79 | fromInt 24 = SQLITE_FORMAT
80 | fromInt 25 = SQLITE_RANGE
81 | fromInt 26 = SQLITE_NOTADB
82 | fromInt 27 = SQLITE_NOTICE
83 | fromInt 28 = SQLITE_WARNING
84 | fromInt 100 = SQLITE_ROW
85 | fromInt 101 = SQLITE_DONE
100 | data SqliteType : Type where
103 | INTEGER : SqliteType
106 | %runElab derive "SqliteType" [Show,Eq,Ord]
114 | public export %inline
120 | 0 IdrisType : SqliteType -> Type
121 | IdrisType BLOB = ByteString
122 | IdrisType TEXT = String
123 | IdrisType INTEGER = Int64
124 | IdrisType REAL = Double
133 | data SqlError : Type where
134 | ResultError : SqlResult -> (msg : String) -> SqlError
135 | DecodingError : SqliteType -> String -> SqlError
136 | TypeMismatch : (expected, found : SqliteType) -> SqlError
137 | NullPointer : String -> SqlError
138 | NoMoreData : SqlError
140 | %runElab derive "SqlError" [Show,Eq]
143 | Interpolation SqlError where
144 | interpolate (ResultError x m) = "SQL error \{show x}: \{m}"
145 | interpolate (DecodingError x s) = "Error when decoding \{show x}: \{s}"
146 | interpolate (TypeMismatch x f) = "Type mismatch: Expected \{show x} but found \{show f}"
147 | interpolate (NullPointer s) = "Exception when decoding \{s}: Value is NULL"
148 | interpolate NoMoreData = "Exception when decoding row: No more data"