packages feed

HDBC-sqlite3 1.1.4.0 → 1.1.6.0

raw patch · 4 files changed

+3/−544 lines, 4 filesdep ~basePVP ok

version bump matches the API change (PVP)

Dependency ranges changed: base

API changes (from Hackage documentation)

Files

− Database/HDBC/Sqlite3/Consts.hs
@@ -1,188 +0,0 @@-{-# OPTIONS_GHC -optc-D__GLASGOW_HASKELL__=606 #-}-{-# INCLUDE <sqlite3.h> #-}-{-# LINE 1 "Database/HDBC/Sqlite3/Consts.hsc" #-}-{- -*- mode: haskell; -*- -{-# LINE 2 "Database/HDBC/Sqlite3/Consts.hsc" #-}-   vim: set filetype=haskell:-Copyright (C) 2005-2007 John Goerzen <jgoerzen@complete.org>--    This library is free software; you can redistribute it and/or-    modify it under the terms of the GNU Lesser General Public-    License as published by the Free Software Foundation; either-    version 2.1 of the License, or (at your option) any later version.--    This library is distributed in the hope that it will be useful,-    but WITHOUT ANY WARRANTY; without even the implied warranty of-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU-    Lesser General Public License for more details.--    You should have received a copy of the GNU Lesser General Public-    License along with this library; if not, write to the Free Software-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA---}--module Database.HDBC.Sqlite3.Consts- (sqlite_OK,-  sqlite_ERROR,-  sqlite_INTERNAL,-  sqlite_PERM,-  sqlite_ABORT,-  sqlite_BUSY,-  sqlite_LOCKED,-  sqlite_NOMEM,-  sqlite_READONLY,-  sqlite_INTERRUPT,-  sqlite_IOERR,-  sqlite_CORRUPT,-  sqlite_NOTFOUND,-  sqlite_FULL,-  sqlite_CANTOPEN,-  sqlite_PROTOCOL,-  sqlite_EMPTY,-  sqlite_SCHEMA,-  sqlite_TOOBIG,-  sqlite_CONSTRAINT,-  sqlite_MISMATCH,-  sqlite_MISUSE,-  sqlite_NOLFS,-  sqlite_AUTH,-  sqlite_ROW,-  sqlite_DONE)-where--import Foreign.C.Types---{-# LINE 53 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Successful result-sqlite_OK :: Int-sqlite_OK = 0-{-# LINE 57 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | SQL error or missing database-sqlite_ERROR :: Int-sqlite_ERROR = 1-{-# LINE 61 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | An internal logic error in SQLite-sqlite_INTERNAL :: Int-sqlite_INTERNAL = 2-{-# LINE 65 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Access permission denied-sqlite_PERM :: Int-sqlite_PERM = 3-{-# LINE 69 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Callback routine requested an abort-sqlite_ABORT :: Int-sqlite_ABORT = 4-{-# LINE 73 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | The database file is locked-sqlite_BUSY :: Int-sqlite_BUSY = 5-{-# LINE 77 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | A table in the database is locked-sqlite_LOCKED :: Int-sqlite_LOCKED = 6-{-# LINE 81 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | A malloc() failed-sqlite_NOMEM :: Int-sqlite_NOMEM = 7-{-# LINE 85 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Attempt to write a readonly database-sqlite_READONLY :: Int-sqlite_READONLY = 8-{-# LINE 89 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Operation terminated by sqlite_interrupt()-sqlite_INTERRUPT :: Int-sqlite_INTERRUPT = 9-{-# LINE 93 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Some kind of disk I\/O error occurred-sqlite_IOERR :: Int-sqlite_IOERR = 10-{-# LINE 97 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | The database disk image is malformed-sqlite_CORRUPT :: Int-sqlite_CORRUPT = 11-{-# LINE 101 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | (Internal Only) Table or record not found-sqlite_NOTFOUND :: Int-sqlite_NOTFOUND = 12-{-# LINE 105 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Insertion failed because database is full-sqlite_FULL :: Int-sqlite_FULL = 13-{-# LINE 109 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Unable to open the database file-sqlite_CANTOPEN :: Int-sqlite_CANTOPEN = 14-{-# LINE 113 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Database lock protocol error-sqlite_PROTOCOL :: Int-sqlite_PROTOCOL = 15-{-# LINE 117 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | (Internal Only) Database table is empty-sqlite_EMPTY :: Int-sqlite_EMPTY = 16-{-# LINE 121 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | The database schema changed-sqlite_SCHEMA :: Int-sqlite_SCHEMA = 17-{-# LINE 125 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Too much data for one row of a table-sqlite_TOOBIG :: Int-sqlite_TOOBIG = 18-{-# LINE 129 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Abort due to constraint violation-sqlite_CONSTRAINT :: Int-sqlite_CONSTRAINT = 19-{-# LINE 133 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Data type mismatch-sqlite_MISMATCH :: Int-sqlite_MISMATCH = 20-{-# LINE 137 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Library used incorrectly-sqlite_MISUSE :: Int-sqlite_MISUSE = 21-{-# LINE 141 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Uses OS features not supported on host-sqlite_NOLFS :: Int-sqlite_NOLFS = 22-{-# LINE 145 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | Authorization denied-sqlite_AUTH :: Int-sqlite_AUTH = 23-{-# LINE 149 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | sqlite_step() has another row ready-sqlite_ROW :: Int-sqlite_ROW = 100-{-# LINE 153 "Database/HDBC/Sqlite3/Consts.hsc" #-}---- | sqlite_step() has finished executing-sqlite_DONE :: Int-sqlite_DONE = 101-{-# LINE 157 "Database/HDBC/Sqlite3/Consts.hsc" #-}-
− Database/HDBC/Sqlite3/Statement.hs
@@ -1,271 +0,0 @@-{-# OPTIONS_GHC -optc-D__GLASGOW_HASKELL__=606 #-}-{-# INCLUDE <sqlite3.h> #-}-{-# LINE 1 "Database/HDBC/Sqlite3/Statement.hsc" #-}--- -*- mode: haskell; -*--{-# LINE 2 "Database/HDBC/Sqlite3/Statement.hsc" #-}-{-# CFILES hdbc-sqlite3-helper.c #-}--- Above line for Hugs-{- -Copyright (C) 2005 John Goerzen <jgoerzen@complete.org>--    This library is free software; you can redistribute it and/or-    modify it under the terms of the GNU Lesser General Public-    License as published by the Free Software Foundation; either-    version 2.1 of the License, or (at your option) any later version.--    This library is distributed in the hope that it will be useful,-    but WITHOUT ANY WARRANTY; without even the implied warranty of-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU-    Lesser General Public License for more details.--    You should have received a copy of the GNU Lesser General Public-    License along with this library; if not, write to the Free Software-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA---}-module Database.HDBC.Sqlite3.Statement where-import Database.HDBC.Types-import Database.HDBC-import Database.HDBC.Sqlite3.Types-import Database.HDBC.Sqlite3.Utils-import Foreign.C.Types-import Foreign.ForeignPtr-import Foreign.Ptr-import Control.Concurrent.MVar-import Foreign.C.String-import Foreign.Marshal-import Foreign.Storable-import Control.Monad-import qualified Data.ByteString as B-import Data.List-import Control.Exception-import Database.HDBC.DriverUtils---{-# LINE 41 "Database/HDBC/Sqlite3/Statement.hsc" #-}--{- One annoying thing about Sqlite is that a disconnect operation will actually-fail if there are any active statements.  This is highly annoying, and makes-for some somewhat complex algorithms. -}--data StoState = Empty           -- ^ Not initialized or last execute\/fetchrow had no results-              | Prepared Stmt   -- ^ Prepared but not executed-              | Executed Stmt   -- ^ Executed and more rows are expected--instance Show StoState where-    show Empty = "Empty"-    show (Prepared _) = "Prepared"-    show (Executed _) = "Executed"--data SState = SState {dbo :: Sqlite3,-                      stomv :: MVar StoState,-                      querys :: String,-                      colnamesmv :: MVar [String]}--newSth :: Sqlite3 -> ChildList -> String -> IO Statement-newSth indbo mchildren str = -    do newstomv <- newMVar Empty-       newcolnamesmv <- newMVar []-       let sstate = SState{dbo = indbo,-                           stomv = newstomv,-                           querys = str,-                           colnamesmv = newcolnamesmv}-       modifyMVar_ (stomv sstate) (\_ -> (fprepare sstate >>= return . Prepared))-       let retval = -               Statement {execute = fexecute sstate,-                           executeMany = fexecutemany sstate,-                           finish = public_ffinish sstate,-                           fetchRow = ffetchrow sstate,-                           originalQuery = str,-                           getColumnNames = readMVar (colnamesmv sstate),-                           describeResult = fail "Sqlite3 backend does not support describeResult"}-       addChild mchildren retval-       return retval--{- The deal with adding the \0 below is in response to an apparent bug in-sqlite3.  See debian bug #343736. --This function assumes that any existing query in the state has already-been terminated.  (FIXME: should check this at runtime.... never run fprepare-unless state is Empty)--}-fprepare :: SState -> IO Stmt-fprepare sstate = withRawSqlite3 (dbo sstate)-  (\p -> withCStringLen ((querys sstate) ++ "\0")-   (\(cs, cslen) -> alloca-    (\(newp::Ptr (Ptr CStmt)) -> -     (do res <- sqlite3_prepare p cs (fromIntegral cslen) newp nullPtr-         checkError ("prepare " ++ (show cslen) ++ ": " ++ (querys sstate)) -                    (dbo sstate) res-         newo <- peek newp-         newForeignPtr sqlite3_finalizeptr newo-     )-     )-   )-   )-                 --{- General algorithm: find out how many columns we have, check the type-of each to see if it's NULL.  If it's not, fetch it as text and return that.--Note that execute() will have already loaded up the first row -- and we-do that each time.  so this function returns the row that is already in sqlite,-then loads the next row. -}-ffetchrow :: SState -> IO (Maybe [SqlValue])-ffetchrow sstate = modifyMVar (stomv sstate) dofetchrow-    where dofetchrow Empty = return (Empty, Nothing)-          dofetchrow (Prepared _) = -              throwDyn $ SqlError {seState = "HDBC Sqlite3 fetchrow",-                                   seNativeError = (-1),-                                   seErrorMsg = "Attempt to fetch row from Statement that has not been executed.  Query was: " ++ (querys sstate)}-          dofetchrow (Executed sto) = withStmt sto (\p ->-              do ccount <- sqlite3_column_count p-                 -- fetch the data-                 res <- mapM (getCol p) [0..(ccount - 1)]-                 r <- fstep (dbo sstate) p-                 if r-                    then return (Executed sto, Just res)-                    else do ffinish (dbo sstate) sto-                            return (Empty, Just res)-                                                         )- -          getCol p icol = -             do t <- sqlite3_column_type p icol-                if t == 5-{-# LINE 130 "Database/HDBC/Sqlite3/Statement.hsc" #-}-                   then return SqlNull-                   else do text <- sqlite3_column_text p icol-                           len <- sqlite3_column_bytes p icol-                           s <- peekCStringLen (text, fromIntegral len)-                           return (SqlString s)--fstep :: Sqlite3 -> Ptr CStmt -> IO Bool-fstep dbo p =-    do r <- sqlite3_step p-       case r of-         100 -> return True-{-# LINE 141 "Database/HDBC/Sqlite3/Statement.hsc" #-}-         101 -> return False-{-# LINE 142 "Database/HDBC/Sqlite3/Statement.hsc" #-}-         1 -> checkError "step" dbo 1-{-# LINE 143 "Database/HDBC/Sqlite3/Statement.hsc" #-}-                                   >> (throwDyn $ SqlError -                                          {seState = "",-                                           seNativeError = 0,-                                           seErrorMsg = "In HDBC step, internal processing error (got SQLITE_ERROR with no error)"})-         x -> throwDyn $ SqlError {seState = "",-                                   seNativeError = fromIntegral x,-                                   seErrorMsg = "In HDBC step, unexpected result from sqlite3_step"}--fexecute sstate args = modifyMVar (stomv sstate) doexecute-    where doexecute (Executed sto) = ffinish (dbo sstate) sto >> doexecute Empty-          doexecute Empty =     -- already cleaned up from last time-              do sto <- fprepare sstate-                 doexecute (Prepared sto)-          doexecute (Prepared sto) = withStmt sto (\p -> -              do c <- sqlite3_bind_parameter_count p-                 when (c /= genericLength args)-                   (throwDyn $ SqlError {seState = "",-                                         seNativeError = (-1),-                                         seErrorMsg = "In HDBC execute, received " ++ (show args) ++ " but expected " ++ (show c) ++ " args."})-                 sqlite3_reset p >>= checkError "execute (reset)" (dbo sstate)-                 zipWithM_ (bindArgs p) [1..c] args--                 {- Logic for handling counts of changes: look at the total-                    changes before and after the query.  If they differ,-                    then look at the local changes.  (The local change counter-                    appears to not be updated unless really running a query-                    that makes a change, according to the docs.)--                    This is OK thread-wise because SQLite doesn't support-                    using a given dbh in more than one thread anyway. -}-                 origtc <- withSqlite3 (dbo sstate) sqlite3_total_changes -                 r <- fstep (dbo sstate) p-                 newtc <- withSqlite3 (dbo sstate) sqlite3_total_changes-                 changes <- if origtc == newtc-                               then return 0-                               else withSqlite3 (dbo sstate) sqlite3_changes-                 fgetcolnames p >>= swapMVar (colnamesmv sstate)-                 if r-                    then return (Executed sto, fromIntegral changes)-                    else do ffinish (dbo sstate) sto-                            return (Empty, fromIntegral changes)-                                                        )-          bindArgs p i SqlNull =-              sqlite3_bind_null p i >>= -                checkError ("execute (binding NULL column " ++ (show i) ++ ")")-                           (dbo sstate)-          bindArgs p i (SqlByteString bs) =-              B.useAsCStringLen bs (bindCStringArgs p i)-          bindArgs p i arg = withCStringLen (fromSql arg) (bindCStringArgs p i)--          bindCStringArgs p i (cs, len) =-              do r <- sqlite3_bind_text2 p i cs (fromIntegral len)-                 checkError ("execute (binding column " ++ -                             (show i) ++ ")") (dbo sstate) r--fgetcolnames csth =-        do count <- sqlite3_column_count csth-           mapM (getCol csth) [0..(count -1)]-    where getCol csth i =-              do cstr <- sqlite3_column_name csth i-                 peekCString cstr---- FIXME: needs a faster algorithm.-fexecutemany sstate arglist =-    mapM_ (fexecute sstate) arglist----ffinish o = withForeignPtr o (\p -> sqlite3_finalize p >>= checkError "finish")--- Finish and change state-public_ffinish sstate = modifyMVar_ (stomv sstate) worker-    where worker (Empty) = return Empty-          worker (Prepared sto) = ffinish (dbo sstate) sto >> return Empty-          worker (Executed sto) = ffinish (dbo sstate) sto >> return Empty-    -ffinish dbo o = withRawStmt o (\p -> do r <- sqlite3_finalize p-                                        checkError "finish" dbo r)--foreign import ccall unsafe "hdbc-sqlite3-helper.h &sqlite3_finalize_finalizer"-  sqlite3_finalizeptr :: FunPtr ((Ptr CStmt) -> IO ())--foreign import ccall unsafe "hdbc-sqlite3-helper.h sqlite3_finalize_app"-  sqlite3_finalize :: (Ptr CStmt) -> IO CInt--foreign import ccall unsafe "hdbc-sqlite3-helper.h sqlite3_prepare2"-  sqlite3_prepare :: (Ptr CSqlite3) -> CString -> CInt -> Ptr (Ptr CStmt) -> Ptr (Ptr CString) -> IO CInt--foreign import ccall unsafe "sqlite3.h sqlite3_bind_parameter_count"-  sqlite3_bind_parameter_count :: (Ptr CStmt) -> IO CInt--foreign import ccall unsafe "sqlite3.h sqlite3_step"-  sqlite3_step :: (Ptr CStmt) -> IO CInt--foreign import ccall unsafe "sqlite3.h sqlite3_reset"-  sqlite3_reset :: (Ptr CStmt) -> IO CInt--foreign import ccall unsafe "sqlite3.h sqlite3_column_count"-  sqlite3_column_count :: (Ptr CStmt) -> IO CInt--foreign import ccall unsafe "sqlite3.h sqlite3_column_name"-  sqlite3_column_name :: Ptr CStmt -> CInt -> IO CString--foreign import ccall unsafe "sqlite3.h sqlite3_column_type"-  sqlite3_column_type :: (Ptr CStmt) -> CInt -> IO CInt--foreign import ccall unsafe "sqlite3.h sqlite3_column_text"-  sqlite3_column_text :: (Ptr CStmt) -> CInt -> IO CString--foreign import ccall unsafe "sqlite3.h sqlite3_column_bytes"-  sqlite3_column_bytes :: (Ptr CStmt) -> CInt -> IO CInt--foreign import ccall unsafe "hdbc-sqlite3-helper.h sqlite3_bind_text2"-  sqlite3_bind_text2 :: (Ptr CStmt) -> CInt -> CString -> CInt -> IO CInt--foreign import ccall unsafe "sqlite3.h sqlite3_bind_null"-  sqlite3_bind_null :: (Ptr CStmt) -> CInt -> IO CInt--foreign import ccall unsafe "sqlite3.h sqlite3_changes"-  sqlite3_changes :: Ptr CSqlite3 -> IO CInt--foreign import ccall unsafe "sqlite3.h sqlite3_total_changes"-  sqlite3_total_changes :: Ptr CSqlite3 -> IO CInt
− Database/HDBC/Sqlite3/Utils.hs
@@ -1,82 +0,0 @@-{-# OPTIONS_GHC -optc-D__GLASGOW_HASKELL__=606 #-}-{-# INCLUDE "hdbc-sqlite3-helper.h" #-}-{-# LINE 1 "Database/HDBC/Sqlite3/Utils.hsc" #-}-{- -*- mode: haskell; -*- -{-# LINE 2 "Database/HDBC/Sqlite3/Utils.hsc" #-}-   vim: set filetype=haskell:-Copyright (C) 2005-2007 John Goerzen <jgoerzen@complete.org>--    This library is free software; you can redistribute it and/or-    modify it under the terms of the GNU Lesser General Public-    License as published by the Free Software Foundation; either-    version 2.1 of the License, or (at your option) any later version.--    This library is distributed in the hope that it will be useful,-    but WITHOUT ANY WARRANTY; without even the implied warranty of-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU-    Lesser General Public License for more details.--    You should have received a copy of the GNU Lesser General Public-    License along with this library; if not, write to the Free Software-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA---}--module Database.HDBC.Sqlite3.Utils where-import Foreign.C.String-import Foreign.ForeignPtr-import Foreign.Ptr-import Database.HDBC.Types-import Database.HDBC.Sqlite3.Types-import Foreign.C.Types-import Control.Exception-import Foreign.Storable---{-# LINE 32 "Database/HDBC/Sqlite3/Utils.hsc" #-}--checkError :: String -> Sqlite3 -> CInt -> IO ()-checkError _ _ 0 = return ()-checkError msg o res =-    withSqlite3 o-     (\p -> do rc <- sqlite3_errmsg p-               str <- peekCString rc-               throwDyn $ SqlError {seState = "",-                                    seNativeError = fromIntegral res,-                                    seErrorMsg = msg ++ ": " ++ str}-     )--{- This is a little hairy.--We have a CSqlite3 object that is actually a finalizeonce wrapper around-the real object.  We use withSqlite3 to dereference the foreign pointer,-and then extract the pointer to the real object from the finalizeonce struct.--But, when we close the connection, we need the finalizeonce struct, so that's-done by withRawSqlite3.--Ditto for statements. -}--withSqlite3 :: Sqlite3 -> (Ptr CSqlite3 -> IO b) -> IO b-withSqlite3 = genericUnwrap--withRawSqlite3 :: Sqlite3 -> (Ptr CSqlite3 -> IO b) -> IO b-withRawSqlite3 = withForeignPtr--withStmt :: Stmt -> (Ptr CStmt -> IO b) -> IO b-withStmt = genericUnwrap--withRawStmt :: Stmt -> (Ptr CStmt -> IO b) -> IO b-withRawStmt = withForeignPtr---genericUnwrap :: ForeignPtr a -> (Ptr a -> IO b) -> IO b-genericUnwrap fptr action = withForeignPtr fptr (\structptr ->-    do objptr <- (\hsc_ptr -> peekByteOff hsc_ptr 0) structptr-{-# LINE 71 "Database/HDBC/Sqlite3/Utils.hsc" #-}-       action objptr-                                                )--foreign import ccall unsafe "sqlite3.h sqlite3_errmsg"-  sqlite3_errmsg :: (Ptr CSqlite3) -> IO CString-
HDBC-sqlite3.cabal view
@@ -1,9 +1,9 @@ Name: HDBC-sqlite3-Version: 1.1.4.0+Version: 1.1.6.0 License: LGPL Maintainer: John Goerzen <jgoerzen@complete.org> Author: John Goerzen-Copyright: Copyright (c) 2005-2007 John Goerzen+Copyright: Copyright (c) 2005-2008 John Goerzen license-file: COPYRIGHT extra-source-files: COPYING, hdbc-sqlite3-helper.h homepage: http://software.complete.org/hdbc-sqlite3@@ -19,7 +19,7 @@  Library   if flag(splitBase)-    Build-Depends: base>=3, bytestring+    Build-Depends: base>=3 && <4, bytestring   else     Build-Depends: base<3   Build-Depends: mtl, HDBC>=1.1.0