@@ -22,7 +22,7 @@ data DBVal = DBInt Int
2222 | DBText String
2323 | DBFloat Float
2424 | DBNull
25−
25+
2626-- Database pointer
2727data DBPointer = MkDBPointer Ptr
2828-- Table pointer
@@ -30,16 +30,29 @@ data TBPointer = MkTBPointer Ptr
3030-- Statement pointer
3131data StmtPtr = MkStmtPtr Ptr
3232
33−Table : Set
33+Table : Type
3434Table = List (List DBVal)
3535
3636-- ForMap used in to_list_v1
37−forM : Monad m => List a -> (a -> m b) -> m (List b)
38−forM f xs = mapM xs f
37+forM : Applicative f => List a -> (a -> f b) -> f (List b)
38+forM xs f = (sequence (map f xs))
3939
4040-- Neater error handling done using DB
4141data DB a = MkDB (IO (Either String a))
4242
43+instance Functor DB where
44+ fmap f (MkDB action) = MkDB (do res <- action
45+ return (fmap f res))
46+
47+
48+instance Applicative DB where
49+ pure = MkDB . return . Right
50+ (MkDB f) <$> (MkDB x) = MkDB (do f' <- f
51+ case f' of
52+ Left err => return (Left err)
53+ Right op => x >>= (return . fmap op))
54+
55+
4356instance Monad DB where
4457 (MkDB l) >>= k = MkDB (do c <- l
4558 case c of
@@ -63,14 +76,14 @@ runDB : DB a -> IO a
6376runDB (MkDB f) = do f' <- f
6477 case f' of
6578 Right v => return v
66− Left str => ioError str
67−
79+ Left str => ioError str
80+
6881-----------------------------------------------------------------------------
6982-- | Opens an SQLite database file as specified by the String name argument.
7083-----------------------------------------------------------------------------
71−
84+
7285open_db : String -> DB DBPointer
73−open_db name = do x <- liftIO(mkForeign (FFun "sqlite3_open_idr" [FString] FPtr) name)
86+open_db name = do x <- liftIO (mkForeign (FFun "sqlite3_open_idr" [FString] FPtr) name)
7487 return (MkDBPointer x)
7588
7689-----------------------------------------------------------------------------
@@ -78,38 +91,38 @@ open_db name = do x <- liftIO(mkForeign (FFun "sqlite3_open_idr" [FString] FPtr)
7891-----------------------------------------------------------------------------
7992
8093close_db : DBPointer -> DB Int
81−close_db (MkDBPointer pointer) = liftIO (mkForeign (FFun "sqlite3_close_idr" [FPtr] FInt)pointer)
94+close_db (MkDBPointer pointer) = liftIO (mkForeign (FFun "sqlite3_close_idr" [FPtr] FInt) pointer)
8295
8396-----------------------------------------------------------------------------
8497-- | Wrapper around prepare, step and finalize.
8598-----------------------------------------------------------------------------
86−
99+
87100exec_db : DBPointer -> String -> DB Int
88−exec_db (MkDBPointer pointer) stmt = do
89− x <- liftIO(mkForeign (FFun "sqlite3_exec_idr" [FPtr, FString] FInt)pointer stmt)
101+exec_db (MkDBPointer pointer) stmt = do
102+ x <- liftIO (mkForeign (FFun "sqlite3_exec_idr" [FPtr, FString] FInt) pointer stmt)
90103 if (x == 1)
91− then fail "Could not execute."
92− else return x
104+ then fail "Could not execute."
105+ else return x
93106
94107-----------------------------------------------------------------------------
95108-- | Executes a prepared query. Use of this version is recommended.
96109-----------------------------------------------------------------------------
97110
98111exec_db_v2 : StmtPtr -> DB Int
99−exec_db_v2 (MkStmtPtr pointer) = do
112+exec_db_v2 (MkStmtPtr pointer) = do
100113 x <- liftIO (mkForeign (FFun "exec_db" [FPtr] FInt) pointer)
101114 if (x == 21)
102− then fail "No data returned."
103− else return x
104−
115+ then fail "No data returned."
116+ else return x
117+
105118-----------------------------------------------------------------------------
106119-- | Returns the error stored in the buffer by exec_db function.
107120-- This function can only be used with exec_db and get_table.
108121-- Only these functions store any occured error in the buffer array.
109122-----------------------------------------------------------------------------
110−
123+
111124get_error : DBPointer -> IO String
112−get_error (MkDBPointer pointer) =mkForeign (FFun "sqlite3_get_error" [FPtr] FString)pointer
125+get_error (MkDBPointer pointer) = mkForeign (FFun "sqlite3_get_error" [FPtr] FString) pointer
113126
114127
115128-----------------------------------------------------------------------------
@@ -117,14 +130,14 @@ get_error (MkDBPointer pointer) =mkForeign (FFun "sqlite3_get_error" [FPtr] FStr
117130-- Returns a pointer to a Statement pointer on a successful call.
118131-- Returns a null pointer on a failure.
119132-----------------------------------------------------------------------------
120−
133+
121134prepare_db : DBPointer -> String -> DB StmtPtr
122135prepare_db (MkDBPointer pointer) cmd = do
123− result <- liftIO(mkForeign (FFun "sqlite3_prepare_idr" [FPtr, FString] FPtr)pointer cmd)
124− flag <- liftIO(nullPtr result)
136+ result <- liftIO (mkForeign (FFun "sqlite3_prepare_idr" [FPtr, FString] FPtr) pointer cmd)
137+ flag <- liftIO (nullPtr result)
125138 if flag
126− then fail "Error occured while preparing"
127− else return (MkStmtPtr result)
139+ then fail "Error occured while preparing"
140+ else return (MkStmtPtr result)
128141
129142-----------------------------------------------------------------------------
130143-- | Returns the error stored in the buffer by exec_db function.
@@ -136,81 +149,92 @@ step_db : StmtPtr -> DB Int
136149step_db (MkStmtPtr pointer)= do
137150 x <- liftIO (mkForeign (FFun "sqlite3_step_idr" [FPtr] FInt)pointer)
138151 if ( x == 101)
139− then fail "SQLITE_DONE"
140− else return x
152+ then fail "SQLITE_DONE"
153+ else return x
141154
142155-----------------------------------------------------------------------------
143−-- | Deletes a prepared statement. This function must be called after
156+-- | Deletes a prepared statement. This function must be called after
144157-- prepare function.
145158-----------------------------------------------------------------------------
146159
147160finalize_db : StmtPtr -> DB Int
148−finalize_db (MkStmtPtr pointer) = do
149− x <- liftIO (mkForeign (FFun "sqlite3_finalize_idr" [FPtr] FInt)pointer)
161+finalize_db (MkStmtPtr pointer) = do
162+ x <- liftIO (mkForeign (FFun "sqlite3_finalize_idr" [FPtr] FInt) pointer)
150163 if (x /= 0)
151− then fail "Could not finalize"
152− else return x
164+ then fail "Could not finalize"
165+ else return x
153166
154167-----------------------------------------------------------------------------
155168-- | Resets a prepared statement pointer back to its initial state.
156169-----------------------------------------------------------------------------
157170
158171reset_db : StmtPtr -> DB Int
159−reset_db (MkStmtPtr pointer) = do
160− x <- liftIO(mkForeign (FFun "sqlite3_reset_idr" [FPtr] FInt)pointer)
161− if (x /=0)
162− then fail "Could not reset"
163− else return x
172+reset_db (MkStmtPtr pointer) = do
173+ x <- liftIO (mkForeign (FFun "sqlite3_reset_idr" [FPtr] FInt) pointer)
174+ if (x /= 0)
175+ then fail "Could not reset"
176+ else return x
164177
165178-----------------------------------------------------------------------------
166179-- | These routines obtain column information.
167180-----------------------------------------------------------------------------
168181
169182column_count : DBPointer -> IO (Either String Int)
170−column_count (MkDBPointer pointer) = do
171− x <- mkForeign (FFun "sqlite3_column_count_idr" [FPtr] FInt)pointer
172− if (x == 0 )
173− then return (Left "No Data")
174− else return (Right x)
183+column_count (MkDBPointer pointer) = do
184+ x <- mkForeign (FFun "sqlite3_column_count_idr" [FPtr] FInt) pointer
185+ return $ if (x == 0 )
186+ then Left "No Data"
187+ else (Right x)
175188
176189column_name : DBPointer -> Int -> IO String
177−column_name (MkDBPointer pointer) iCol =mkForeign (FFun "sqlite3_column_name_idr" [FPtr, FInt] FString)pointer iCol
178−
190+column_name (MkDBPointer pointer) iCol =
191+ mkForeign (FFun "sqlite3_column_name_idr" [FPtr, FInt] FString) pointer iCol
192+
179193column_decltype : DBPointer -> Int -> IO String
180−column_decltype (MkDBPointer pointer) iCol =mkForeign (FFun "sqlite3_column_decltype_idr" [FPtr, FInt] FString)pointer iCol
194+column_decltype (MkDBPointer pointer) iCol =
195+ mkForeign (FFun "sqlite3_column_decltype_idr" [FPtr, FInt] FString) pointer iCol
181196
182197
183198column_bytes : DBPointer -> Int -> IO Int
184−column_bytes (MkDBPointer pointer) iCol =mkForeign (FFun "sqlite3_column_bytes_idr" [FPtr, FInt] FInt)pointer iCol
199+column_bytes (MkDBPointer pointer) iCol =
200+ mkForeign (FFun "sqlite3_column_bytes_idr" [FPtr, FInt] FInt) pointer iCol
185201
186202
187203column_blob : DBPointer -> Int -> IO String
188−column_blob (MkDBPointer pointer) iCol =mkForeign (FFun "sqlite3_column_bytes_idr" [FPtr, FInt] FString)pointer iCol
204+column_blob (MkDBPointer pointer) iCol =
205+ mkForeign (FFun "sqlite3_column_bytes_idr" [FPtr, FInt] FString) pointer iCol
189206
190207
191208column_text : DBPointer -> Int -> IO String
192−column_text (MkDBPointer pointer) iCol =mkForeign (FFun "sqlite3_column_text_idr" [FPtr, FInt] FString)pointer iCol
209+column_text (MkDBPointer pointer) iCol =
210+ mkForeign (FFun "sqlite3_column_text_idr" [FPtr, FInt] FString) pointer iCol
193211
194212
195213column_Int : DBPointer -> Int -> IO Int
196−column_Int (MkDBPointer pointer) iCol =mkForeign (FFun "sqlite3_column_int_idr" [FPtr, FInt] FInt)pointer iCol
214+column_Int (MkDBPointer pointer) iCol =
215+ mkForeign (FFun "sqlite3_column_int_idr" [FPtr, FInt] FInt) pointer iCol
197216
198217-----------------------------------------------------------------------------
199218-- | These routines support some of SQLite backup functions.
200219-----------------------------------------------------------------------------
201220
202−backup_init : DBPointer -> String -> DBPointer -> String -> IO DBPointer
203−backup_init (MkDBPointer des_pointer) destName (MkDBPointer src_pointer) srcName = do x <- mkForeign (FFun "sqlite3_backup_init_idr" [FPtr,FString, FPtr, FString] FPtr)des_pointer destName src_pointer srcName
204− return (MkDBPointer x)
221+backup_init : DBPointer -> String -> DBPointer -> String -> IO DBPointer
222+backup_init (MkDBPointer des_pointer) destName (MkDBPointer src_pointer) srcName =
223+ do x <- mkForeign (FFun "sqlite3_backup_init_idr" [FPtr,FString, FPtr, FString] FPtr)
224+ des_pointer destName src_pointer srcName
225+ return (MkDBPointer x)
205226
206227backup_step : DBPointer -> Int -> IO Int
207−backup_step (MkDBPointer pointer) nPage =mkForeign (FFun "sqlite3_backup_step_idr" [FPtr, FInt] FInt)pointer nPage
228+backup_step (MkDBPointer pointer) nPage =
229+ mkForeign (FFun "sqlite3_backup_step_idr" [FPtr, FInt] FInt) pointer nPage
208230
209231backup_finish : DBPointer -> IO Int
210−backup_finish (MkDBPointer pointer) =mkForeign (FFun "sqlite3_backup_finish_idr" [FPtr] FInt)pointer
232+backup_finish (MkDBPointer pointer) =
233+ mkForeign (FFun "sqlite3_backup_finish_idr" [FPtr] FInt) pointer
211234
212235backup_remaining : DBPointer -> IO Int
213−backup_remaining (MkDBPointer pointer) =mkForeign (FFun "sqlite3_backup_remaining_idr" [FPtr] FInt)pointer
236+backup_remaining (MkDBPointer pointer) =
237+ mkForeign (FFun "sqlite3_backup_remaining_idr" [FPtr] FInt) pointer
214238
215239
216240-----------------------------------------------------------------------------
@@ -221,104 +245,98 @@ backup_remaining (MkDBPointer pointer) =mkForeign (FFun "sqlite3_backup_remainin
221245-----------------------------------------------------------------------------
222246
223247get_table : DBPointer -> String -> DB TBPointer
224−get_table (MkDBPointer pointer) name = do
225− x <- liftIO(mkForeign (FFun "sqlite3_get_table_idr" [FPtr, FString] FPtr)pointer name)
226− flag <- liftIO(nullPtr x)
248+get_table (MkDBPointer pointer) name = do
249+ x <- liftIO(mkForeign (FFun "sqlite3_get_table_idr" [FPtr, FString] FPtr) pointer name)
250+ flag <- liftIO (nullPtr x)
227251 if flag
228− then do x <- liftIO(get_error_table pointer) ; fail x
229− else return (MkTBPointer x)
252+ then do x <- liftIO(get_error_table pointer) ; fail x
253+ else return (MkTBPointer x)
230254 where
231255 get_error_table : Ptr-> IO String
232− get_error_table pointer = do x <- mkForeign (FFun "sqlite3_get_error" [FPtr] FString)pointer
256+ get_error_table pointer = do x <- mkForeign (FFun "sqlite3_get_error" [FPtr] FString) pointer
233257 return x
234258
235259
236260free_table : TBPointer -> IO ()
237−free_table (MkTBPointer pointer) = do x <- mkForeign (FFun "sqlite3_free_table_idr" [FPtr] FUnit)pointer
261+free_table (MkTBPointer pointer) = do x <- mkForeign (FFun "sqlite3_free_table_idr" [FPtr] FUnit) pointer
238262 return ()
239−
263+
240264-----------------------------------------------------------------------------
241265-- | This version of these function obtain the row and column number
242266-- from the Table struct. These functions are only used with get_table.
243267-----------------------------------------------------------------------------
244268
245269num_row : TBPointer -> IO Int
246−num_row (MkTBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_row" [FPtr] FInt)pointer
247− return (x)
270+num_row (MkTBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_row" [FPtr] FInt) pointer
271+ return x
248272
249273num_col : TBPointer -> IO Int
250−num_col (MkTBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_col" [FPtr] FInt)pointer
251− return (x)
252−
274+num_col (MkTBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_col" [FPtr] FInt) pointer
275+ return x
276+
253277-----------------------------------------------------------------------------
254278-- | This version of these function obtain the row and column number
255279-- from the Database struct.
256280-----------------------------------------------------------------------------
257281
258282num_row_v2 : DBPointer -> IO Int
259−num_row_v2 (MkDBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_row_v2" [FPtr] FInt)pointer
260− return (x)
283+num_row_v2 (MkDBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_row_v2" [FPtr] FInt) pointer
284+ return x
261285
262286num_col_v2 : DBPointer -> IO Int
263−num_col_v2 (MkDBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_col_v2" [FPtr] FInt)pointer
264− return (x)
265−
287+num_col_v2 (MkDBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_col_v2" [FPtr] FInt) pointer
288+ return x
289+
266290-----------------------------------------------------------------------------
267291-- | This function prints the result of a query by checking the type
268292-- of each value returned, it then calls the appropriate function.
269293-- Ther result is one of the DBVal variants.
270294-----------------------------------------------------------------------------
271−
295+
272296get_data : DBPointer -> Int -> Int -> IO DBVal
273297get_data (MkDBPointer pointer) row col = do
274298 ty <- get_data_type pointer row col
275299 helper ty
276− where
277− get_data_type : Ptr ->Int -> Int -> IO Int
278− get_data_type pointer row col =mkForeign (FFun "sqlite3_get_data_type" [FPtr, FInt, FInt] FInt)pointer row col
279−
280− get_data_val_int : Ptr -> Int -> IO Int
281− get_data_val_int pointer col =mkForeign (FFun "sqlite3_get_val_int" [FPtr,FInt] FInt)pointer col
282−
283− get_data_val_text : Ptr -> Int -> IO String
284− get_data_val_text pointer col =mkForeign (FFun "sqlite3_get_val_text" [FPtr, FInt] FString)pointer col
285−
286−
287−
288− get_data_val_float : Ptr -> Int -> IO Float
289− get_data_val_float pointer col =mkForeign (FFun "sqlite3_get_float" [FPtr, FInt] FFloat)pointer col
290−
291− helper : Int -> IO DBVal
292− helper 1 = do i <- get_data_val_int pointer col ; return (DBInt i)
293− helper 2 = do i <- get_data_val_float pointer col ; return (DBFloat i)
294− helper 3 = do i <- get_data_val_text pointer col; return (DBText i)
295− helper _ =return (DBNull)
296−
300+ where get_data_type : Ptr ->Int -> Int -> IO Int
301+ get_data_type pointer row col =
302+ mkForeign (FFun "sqlite3_get_data_type" [FPtr, FInt, FInt] FInt) pointer row col
303+ get_data_val_int : Ptr -> Int -> IO Int
304+ get_data_val_int pointer col =
305+ mkForeign (FFun "sqlite3_get_val_int" [FPtr,FInt] FInt) pointer col
306+
307+ get_data_val_text : Ptr -> Int -> IO String
308+ get_data_val_text pointer col =
309+ mkForeign (FFun "sqlite3_get_val_text" [FPtr, FInt] FString) pointer col
310+
311+ get_data_val_float : Ptr -> Int -> IO Float
312+ get_data_val_float pointer col =
313+ mkForeign (FFun "sqlite3_get_float" [FPtr, FInt] FFloat) pointer col
314+
315+ helper : Int -> IO DBVal
316+ helper 1 = do i <- get_data_val_int pointer col ; return (DBInt i)
317+ helper 2 = do i <- get_data_val_float pointer col ; return (DBFloat i)
318+ helper 3 = do i <- get_data_val_text pointer col; return (DBText i)
319+ helper _ = return DBNull
320+
297321-----------------------------------------------------------------------------
298322-- | This function makes use of get_data to get all the result.
299323-----------------------------------------------------------------------------
300324
301−toList_v1 : DBPointer -> DB Table
302−toList_v1 db = do
303− nbR <- liftIO (num_row_v2 db)
304− nmC <- liftIO (num_col_v2 db)
305− res <- forM [0..(nbR-1)] (\ i =>
306− forM [0..(nmC-1)] (\ j =>
307− liftIO(get_data db i j)
308−
309− )
310− )
311− return res
312−
313−
325+toList_v1 : DBPointer -> DB Table
326+toList_v1 db = do nbR <- liftIO (num_row_v2 db)
327+ nmC <- liftIO (num_col_v2 db)
328+ res <- liftIO $ forM [0..(nbR-1)] $ \ i =>
329+ forM [0..(nmC-1)] $ \ j => get_data db i j
330+ return (the (List (List DBVal)) res)
331+
314332strcat : String -> String-> String
315−strcat str1 str2 = (str1 ++ str2)
333+strcat str1 str2 = str1 ++ str2
316334
317335-----------------------------------------------------------------------------
318336-- | This version of toList retunrs result from get_table
319337-- This could be removed if not needed in the future.
320338-----------------------------------------------------------------------------
321−
339+
322340--toList_v2 : String -> String -> DBPointer -> DB Table
323341--toList_v2 name stmt x = do
324342-- ptr <- (get_table x (stmt))
@@ -327,12 +345,12 @@ strcat str1 str2 = (str1 ++ str2)
327345-- res <- forM [0..(nbR-1)] (\ i =>
328346-- forM [0..(nmC-1)] (\ j =>
329347-- liftIO(get_data x name i j)
330−--
348+--
331349-- )
332350-- )
333351-- liftIO (free_table ptr)
334−-- return res
335−
352+-- return res
353+
336354
337355-----------------------------------------------------------------------------
338356-- | These routines support binding the types supported by Idris.
@@ -341,68 +359,67 @@ strcat str1 str2 = (str1 ++ str2)
341359-----------------------------------------------------------------------------
342360
343361bind_int : StmtPtr -> Int -> Int -> DB StmtPtr
344−bind_int (MkStmtPtr pointer) indexval val = do
345− x <- liftIO(mkForeign (FFun "sqlite3_bind_int_idr" [FPtr, FInt, FInt] FPtr)pointer indexval val)
346− flag <- liftIO(nullPtr x)
362+bind_int (MkStmtPtr pointer) indexval val = do
363+ x <- liftIO (mkForeign (FFun "sqlite3_bind_int_idr" [FPtr, FInt, FInt] FPtr) pointer indexval val)
364+ flag <- liftIO (nullPtr x)
347365 if flag
348− then fail "Could not bind int."
349− else return (MkStmtPtr x)
350−
351−
366+ then fail "Could not bind int."
367+ else return (MkStmtPtr x)
368+
369+
352370bind_float : StmtPtr -> Int -> Float -> DB StmtPtr
353−bind_float (MkStmtPtr pointer) indexval val = do
354− x <- liftIO(mkForeign (FFun "sqlite3_bind_float_idr" [FPtr, FInt, FFloat] FPtr)pointer indexval val)
355− flag <- liftIO(nullPtr x)
371+bind_float (MkStmtPtr pointer) indexval val = do
372+ x <- liftIO (mkForeign (FFun "sqlite3_bind_float_idr" [FPtr, FInt, FFloat] FPtr) pointer indexval val)
373+ flag <- liftIO (nullPtr x)
356374 if flag
357− then fail "Could not bind float."
358− else return (MkStmtPtr x)
375+ then fail "Could not bind float."
376+ else return (MkStmtPtr x)
359377
360378bind_text : StmtPtr -> String -> Int -> Int -> DB StmtPtr
361379bind_text (MkStmtPtr pointer) text indexval lengthval = do
362− x <- liftIO(mkForeign (FFun "sqlite3_bind_text_idr" [FPtr, FString, FInt, FInt] FPtr)pointer text indexval lengthval)
363− flag <- liftIO(nullPtr x)
380+ x <- liftIO (mkForeign (FFun "sqlite3_bind_text_idr" [FPtr, FString, FInt, FInt] FPtr)
381+ pointer text indexval lengthval)
382+ flag <- liftIO(nullPtr x)
364383 if flag
365− then fail "Could not bind text."
366− else return (MkStmtPtr x)
384+ then fail "Could not bind text."
385+ else return (MkStmtPtr x)
367386
368387bind_null : StmtPtr -> Int -> DB StmtPtr
369−bind_null (MkStmtPtr pointer) indexval = do
370− x <- liftIO(mkForeign (FFun "sqlite3_bind_null_idr" [FPtr, FInt] FPtr)pointer indexval)
371− flag <- liftIO(nullPtr x)
388+bind_null (MkStmtPtr pointer) indexval = do
389+ x <- liftIO (mkForeign (FFun "sqlite3_bind_null_idr" [FPtr, FInt] FPtr) pointer indexval)
390+ flag <- liftIO (nullPtr x)
372391 if flag
373− then fail "Could not bind null."
374− else return (MkStmtPtr x)
392+ then fail "Could not bind null."
393+ else return (MkStmtPtr x)
375394
376395-----------------------------------------------------------------------------
377396-- | String Length
378397-----------------------------------------------------------------------------
379−
398+
380399strlen : String -> DB Int
381−strlen str = liftIO(mkForeign (FFun "strLength" [FString] FInt) str)
382−
400+strlen str = liftIO (mkForeign (FFun "strLength" [FString] FInt) str)
401+
383402instance Show DBVal where
384− show (DBInt i) = "Int val: " ++ show i ++ "\n"
385− show (DBText i) = "Text val: " ++ show i ++ "\n"
386− show (DBFloat i) = "Float val: " ++ show i ++ "\n"
387− show (DBNull ) = "NULL"
403+ show (DBInt i) = "Int val: " ++ show i ++ "\n"
404+ show (DBText i) = "Text val: " ++ show i ++ "\n"
405+ show (DBFloat i) = "Float val: " ++ show i ++ "\n"
406+ show (DBNull ) = "NULL"
388407
389408-----------------------------------------------------------------------------
390409-- | Multi bind a list of values.
391410-----------------------------------------------------------------------------
392411
393412bindMulti : StmtPtr-> List (Maybe (Int, Value)) -> DB StmtPtr
394−bindMulti pointer [] = return pointer
395−bindMulti pointer (Nothing :: vs) = bindMulti pointer vs
396−bindMulti pointer ((Just (indexs, val))::vs) = case val of
397− (VInt intval) => do x <- bind_int pointer indexs intval
398− bindMulti(x) vs
399−
400− (VStr strval) => do len <- strlen strval
401− x <- bind_text pointer strval indexs len
402− bindMulti(x) vs
403−
404−
405− (VFloat floatval) => do x <- bind_float pointer indexs floatval
406−
407− bindMulti(x) vs
413+bindMulti pointer [] = return pointer
414+bindMulti pointer (Nothing :: vs) = bindMulti pointer vs
415+bindMulti pointer ((Just (indexs, (VInt i)))::vs) =
416+ do x <- bind_int pointer indexs i
417+ bindMulti x vs
418+bindMulti pointer ((Just (indexs, (VStr s)))::vs) =
419+ do len <- strlen s
420+ x <- bind_text pointer s indexs len
421+ bindMulti x vs
422+bindMulti pointer ((Just (indexs, (VFloat f)))::vs) =
423+ do x <- bind_float pointer indexs f
424+ bindMulti x vs
408425