Concurrent Clean : MySQL binding
ここのところ作業していたMySQL bindingが一応使えるようになった。Blobとか、各種オプションとかはサポートしていないので、基本的なところしか使えないが。
サンプルプログラムはこんな感じ。
module Main import MySQL, StdDebug Start w # (mConn,w) = MySQLOpen host port db user pass [] w = case mConn of Fail e = trace_n e w Pass conn # (mStmt,conn) = sqlOpenStatement sql [] conn conn = case mStmt of Fail e = trace_n e conn Pass stmt # stmt = run stmt (mErr,conn) = sqlCloseStatement stmt conn = case mErr of Nothing = conn Just e = trace_n e conn (mErr,w) = sqlClose conn w = case mErr of Nothing = w Just e = trace_n e w where host = "localhost" port = 0 db = "cleanoptenv" user = "lethevert" pass = "lethevert" sql = "SELECT * FROM TBL1 WHERE STR = ? AND NUM = ?" run stmt # (mErr,stmt) = sqlBind [SQL_TEXT "Hello", SQL_INT 1] stmt = case mErr of Just e = trace_n e stmt Nothing # (mErr,stmt) = sqlQuery stmt = case mErr of Just e = trace_n e stmt Nothing # (cols,stmt) = sqlColumns stmt stmt = showCols (size cols) cols stmt = each stmt showCols :: !Int !{!String} !*MySQLStmt -> *MySQLStmt showCols 0 cols stmt = stmt showCols idx cols stmt = let nidx = dec idx in showCols nidx cols (trace_n cols.[nidx] stmt) each :: !*MySQLStmt -> *MySQLStmt each stmt # (mNext,stmt) = sqlFetch stmt = case mNext of Fail e = trace_n e stmt Pass False = stmt Pass True # (mData,stmt) = sqlResults stmt = case mData of Fail e = trace_n e stmt Pass data # stmt = showResults (size data) data stmt = each stmt showResults 0 data stmt = stmt showResults idx data stmt = let nidx = dec idx in showResults nidx data (trace_n data.[nidx] stmt)