0 | module Oracle.Internal.Decode
2 | import Control.Monad.Elin
3 | import Control.Monad.MCancel
4 | import Data.ByteString
5 | import Data.Linear.Ref1
7 | import Oracle.FFI.Data
8 | import Oracle.FFI.DateTime
9 | import Oracle.FFI.Lob
10 | import Oracle.FFI.QueryInfo
11 | import Oracle.FFI.Raw
12 | import Oracle.FFI.Statement
13 | import Oracle.Internal.Hex
14 | import Oracle.Internal.QueryInfo
15 | import Oracle.Types.ColumnInfo
16 | import Oracle.Types.DateTime
17 | import Oracle.Types.OracleType
18 | import Oracle.Types.Value
19 | import Oracle.Types.Error
30 | getColumnInfo : AnyPtr -> Int32 -> IO (Either OracleError ColumnInfo)
31 | getColumnInfo stmt column =
32 | withQueryInfo stmt column $
\info => do
33 | name <- primIO (prim__queryInfoName info)
34 | tynum <- primIO (prim__queryInfoType info)
35 | size <- primIO (prim__queryInfoSize info)
36 | nullable <- primIO (prim__queryInfoNullable info)
40 | (fromOracleTypeNum tynum)
54 | decodeColumn : AnyPtr -> Int32 -> IO (Either OracleError OracleValue)
55 | decodeColumn stmt column = do
56 | inforesult <- getColumnInfo stmt column
61 | dataptr <- primIO (prim__columnValue stmt column)
62 | case prim__nullAnyPtr dataptr == 1 of
64 | lasterr <- getLastError
67 | isnull <- primIO (prim__dataIsNull dataptr)
70 | pure (Right OracleNull)
72 | case info.oracletype of
73 | OracleTypeVarchar =>
74 | Right . OracleString <$>
75 | primIO (prim__dataString dataptr)
77 | Right . OracleString <$>
78 | primIO (prim__dataString dataptr)
79 | OracleTypeNVarchar =>
80 | Right . OracleString <$>
81 | primIO (prim__dataString dataptr)
83 | Right . OracleString <$>
84 | primIO (prim__dataString dataptr)
86 | Right . OracleNumber <$>
87 | primIO (prim__dataDouble dataptr)
88 | OracleTypeBinaryFloat =>
89 | Right . OracleBinaryFloat <$>
90 | primIO (prim__dataBinaryFloat dataptr)
91 | OracleTypeBinaryDouble =>
92 | Right . OracleBinaryDouble <$>
93 | primIO (prim__dataBinaryDouble dataptr)
94 | OracleTypeDate => do
95 | dt <- primIO (prim__dataTimestamp dataptr)
100 | !(primIO (prim__timestampYear dt))
101 | !(primIO (prim__timestampMonth dt))
102 | !(primIO (prim__timestampDay dt))
103 | !(primIO (prim__timestampHour dt))
104 | !(primIO (prim__timestampMinute dt))
105 | !(primIO (prim__timestampSecond dt))
106 | OracleTypeTimestamp => do
107 | ts <- primIO (prim__dataTimestamp dataptr)
112 | !(primIO (prim__timestampYear ts))
113 | !(primIO (prim__timestampMonth ts))
114 | !(primIO (prim__timestampDay ts))
115 | !(primIO (prim__timestampHour ts))
116 | !(primIO (prim__timestampMinute ts))
117 | !(primIO (prim__timestampSecond ts))
118 | !(primIO (prim__timestampNanosecond ts))
119 | OracleTypeTimestampTZ => do
120 | ts <- primIO (prim__dataTimestamp dataptr)
123 | OracleTimestampTZ $
124 | MkOracleTimestampTZ
125 | !(primIO (prim__timestampYear ts))
126 | !(primIO (prim__timestampMonth ts))
127 | !(primIO (prim__timestampDay ts))
128 | !(primIO (prim__timestampHour ts))
129 | !(primIO (prim__timestampMinute ts))
130 | !(primIO (prim__timestampSecond ts))
131 | !(primIO (prim__timestampNanosecond ts))
132 | !(primIO (prim__timestampTZHour ts))
133 | !(primIO (prim__timestampTZMinute ts))
134 | OracleTypeIntervalYM => do
135 | iv <- primIO (prim__dataIntervalYM dataptr)
140 | !(primIO (prim__intervalYMYears iv))
141 | !(primIO (prim__intervalYMMonths iv))
142 | OracleTypeIntervalDS => do
143 | iv <- primIO (prim__dataIntervalDS dataptr)
148 | !(primIO (prim__intervalDSDays iv))
149 | !(primIO (prim__intervalDSHours iv))
150 | !(primIO (prim__intervalDSMinutes iv))
151 | !(primIO (prim__intervalDSSeconds iv))
152 | !(primIO (prim__intervalDSNanoseconds iv))
153 | OracleTypeRaw => do
154 | result <- runElinIO (withDataPtrAndOracleType dataptr OracleTypeRaw)
161 | pure (Right value')
163 | assert_total $
idris_crash "Oracle.Internal.Decode.decodeColumn: \{show err}"
164 | OracleTypeBlob => do
165 | result <- runElinIO (withDataPtrAndOracleType dataptr OracleTypeBlob)
172 | pure (Right value')
174 | assert_total $
idris_crash "Oracle.Internal.Decode.decodeColumn: \{show err}"
175 | OracleTypeClob => do
176 | result <- runElinIO (withDataPtrAndOracleType dataptr OracleTypeClob)
183 | pure (Right value')
185 | assert_total $
idris_crash "Oracle.Internal.Decode.decodeColumn: \{show err}"
186 | OracleTypeBoolean => do
187 | b <- primIO (prim__dataBool dataptr)
190 | pure (Right $
OracleBool False)
192 | pure (Right $
OracleBool True)
198 | "Unsupported BOOLEAN: \{show n}"
199 | "Oracle.Internal.Decode.decodeColumn"
201 | OracleTypeUnknown n =>
206 | ("Unsupported Oracle type: " ++ show n)
207 | "Oracle.Internal.Decode.decodeColumn"
210 | acquire : AnyPtr -> OracleType -> F1 World AnyPtr
211 | acquire dataptr oracletype =
214 | ioToF1 (pure dataptr)
216 | ioToF1 (primIO (prim__dataLob dataptr))
217 | use : AnyPtr -> OracleType -> F1 World (Either OracleError OracleValue)
218 | use ptr oracletype =
221 | ioToF1 ( do case prim__nullAnyPtr ptr == 1 of
223 | lasterr <- getLastError
224 | pure (Left lasterr)
226 | size <- primIO (prim__lobSize ptr)
229 | lasterr <- getLastError
230 | pure (Left lasterr)
232 | bytes <- primIO (prim__lobRead ptr 1 size)
233 | pure (Right $
OracleBlob $
fromString bytes)
236 | ioToF1 ( do case prim__nullAnyPtr ptr == 1 of
238 | lasterr <- getLastError
239 | pure (Left lasterr)
241 | text <- primIO (prim__clobRead ptr)
242 | pure (Right $
OracleClob text)
245 | ioToF1 (do case prim__nullAnyPtr ptr == 1 of
247 | lasterr <- getLastError
248 | pure (Left lasterr)
250 | hex <- primIO (prim__dataBytesHex ptr)
251 | case hexDecode hex of
257 | ("Invalid RAW hexadecimal value: " ++ hex)
258 | "Oracle.Internal.Decode.decodeColumn.use"
261 | pure (Right $
OracleRaw $
pack bytes)
268 | "Unsupported type: \{show ty}"
269 | "Oracle.Internal.Decode.decodeColumn.use"
272 | release : AnyPtr -> OracleType -> F1' World
273 | release ptr oracletype =
278 | ioToF1 (primIO (prim__lobRelease ptr))
279 | withDataPtrAndOracleType : AnyPtr -> OracleType -> Elin World [] (Either OracleError OracleValue)
280 | withDataPtrAndOracleType dataptr oracletype =
281 | bracket (runIO (acquire dataptr oracletype))
282 | (\ptr => runIO (use ptr oracletype))
283 | (\ptr => runIO (release ptr oracletype))