aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/world/db/jdbc/output.lux
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--stdlib/source/library/lux/world/db/jdbc/output.lux195
1 files changed, 195 insertions, 0 deletions
diff --git a/stdlib/source/library/lux/world/db/jdbc/output.lux b/stdlib/source/library/lux/world/db/jdbc/output.lux
new file mode 100644
index 000000000..b172a1ac9
--- /dev/null
+++ b/stdlib/source/library/lux/world/db/jdbc/output.lux
@@ -0,0 +1,195 @@
+(.module:
+ [library
+ [lux (#- and int)
+ [ffi (#+ import:)]
+ [control
+ [functor (#+ Functor)]
+ [apply (#+ Apply)]
+ [monad (#+ Monad do)]
+ ["ex" exception]
+ ["." try (#+ Try)]]
+ [time
+ ["." instant (#+ Instant)]]
+ ["." io (#+ IO)]
+ [world
+ [binary (#+ Binary)]]]])
+
+(import: java/lang/String)
+
+(import: java/util/Date
+ (getTime [] long))
+
+(import: java/sql/Date)
+(import: java/sql/Time)
+(import: java/sql/Timestamp)
+
+(`` (import: java/sql/ResultSet
+ (~~ (template [<method-name> <return-class>]
+ [(<method-name> [int] #try <return-class>)]
+
+ [getBoolean boolean]
+
+ [getByte byte]
+ [getShort short]
+ [getInt int]
+ [getLong long]
+
+ [getDouble double]
+ [getFloat float]
+
+ [getString java/lang/String]
+ [getBytes [byte]]
+
+ [getDate java/sql/Date]
+ [getTime java/sql/Time]
+ [getTimestamp java/sql/Timestamp]
+ ))
+ (next [] #try boolean)
+ (close [] #io #try void)))
+
+(type: #export (Output a)
+ (-> [Nat java/sql/ResultSet] (Try [Nat a])))
+
+(implementation: #export functor
+ (Functor Output)
+
+ (def: (map f fa)
+ (function (_ idx+rs)
+ (case (fa idx+rs)
+ (#try.Failure error)
+ (#try.Failure error)
+
+ (#try.Success [idx' value])
+ (#try.Success [idx' (f value)])))))
+
+(implementation: #export apply
+ (Apply Output)
+
+ (def: &functor ..functor)
+
+ (def: (apply ff fa)
+ (function (_ [idx rs])
+ (case (ff [idx rs])
+ (#try.Success [idx' f])
+ (case (fa [idx' rs])
+ (#try.Success [idx'' a])
+ (#try.Success [idx'' (f a)])
+
+ (#try.Failure msg)
+ (#try.Failure msg))
+
+ (#try.Failure msg)
+ (#try.Failure msg)))))
+
+(implementation: #export monad
+ (Monad Output)
+
+ (def: &functor ..functor)
+
+ (def: (wrap a)
+ (function (_ [idx rs])
+ (#.Some [idx a])))
+
+ (def: (join mma)
+ (function (_ [idx rs])
+ (case (mma [idx rs])
+ (#try.Failure error)
+ (#try.Failure error)
+
+ (#try.Success [idx' ma])
+ (ma [idx' rs])))))
+
+(def: #export (fail error)
+ (All [a] (-> Text (Output a)))
+ (function (_ [idx result-set])
+ (#try.Failure error)))
+
+(def: #export (and left right)
+ (All [a b]
+ (-> (Output a) (Output b) (Output [a b])))
+ (do ..monad
+ [=left left
+ =right right]
+ (wrap [=left =right])))
+
+(template [<func-name> <method-name> <type>]
+ [(def: #export <func-name>
+ (Output <type>)
+ (function (_ [idx result-set])
+ (case (<method-name> [(.int idx)] result-set)
+ (#try.Failure error)
+ (#try.Failure error)
+
+ (#try.Success value)
+ (#try.Success [(inc idx) value]))))]
+
+ [boolean java/sql/ResultSet::getBoolean Bit]
+
+ [byte java/sql/ResultSet::getByte Int]
+ [short java/sql/ResultSet::getShort Int]
+ [int java/sql/ResultSet::getInt Int]
+ [long java/sql/ResultSet::getLong Int]
+
+ [float java/sql/ResultSet::getFloat Frac]
+ [double java/sql/ResultSet::getDouble Frac]
+
+ [string java/sql/ResultSet::getString Text]
+ [bytes java/sql/ResultSet::getBytes Binary]
+ )
+
+(template [<func-name> <method-name>]
+ [(def: #export <func-name>
+ (Output Instant)
+ (function (_ [idx result-set])
+ (case (<method-name> [(.int idx)] result-set)
+ (#try.Failure error)
+ (#try.Failure error)
+
+ (#try.Success value)
+ (#try.Success [(inc idx)
+ (instant.from-millis (java/util/Date::getTime value))]))))]
+
+ [date java/sql/ResultSet::getDate]
+ [time java/sql/ResultSet::getTime]
+ [time-stamp java/sql/ResultSet::getTimestamp]
+ )
+
+(def: #export (rows output results)
+ (All [a] (-> (Output a) java/sql/ResultSet (IO (Try (List a)))))
+ (case (java/sql/ResultSet::next results)
+ (#try.Success has-next?)
+ (if has-next?
+ (case (output [1 results])
+ (#.Some [_ head])
+ (do io.monad
+ [?tail (rows output results)]
+ (case ?tail
+ (#try.Success tail)
+ (wrap (ex.return (#.Cons head tail)))
+
+ (#try.Failure error)
+ (do io.monad
+ [temp (java/sql/ResultSet::close results)]
+ (wrap (do try.monad
+ [_ temp]
+ (try.fail error))))))
+
+ (#try.Failure error)
+ (do io.monad
+ [temp (java/sql/ResultSet::close results)]
+ (wrap (do try.monad
+ [_ temp]
+ (try.fail error)))))
+ (do io.monad
+ [temp (java/sql/ResultSet::close results)]
+ (wrap (do try.monad
+ [_ temp]
+ (wrap (list))))))
+
+ (#try.Failure error)
+ (do io.monad
+ [temp (java/sql/ResultSet::close results)]
+ (wrap (do try.monad
+ [_ temp]
+ (try.fail error))))
+ ))