Skip to content
Browse files

Initial revision.

--HG--
extra : convert_revision : 3aa24235338138adbfa5ff3ec58dbeb7a5ce9986
  • Loading branch information...
0 parents commit 5ef825c6027c9d9ab81a6155cd4670b00bd1be37 @waterson waterson committed Jan 13, 2009
Showing with 3,375 additions and 0 deletions.
  1. +2 −0 Database/HDBC/MySQL.hs
  2. +596 −0 Database/HDBC/MySQL/Connection.hsc
  3. +2 −0 HDBC-mysql.buildinfo.in
  4. +16 −0 HDBC-mysql.cabal
  5. +29 −0 NOTES
  6. +5 −0 Setup.lhs
  7. +21 −0 Test.hs
  8. +2,683 −0 configure
  9. +21 −0 configure.ac
2 Database/HDBC/MySQL.hs
@@ -0,0 +1,2 @@
+module Database.HDBC.MySQL (connectMySQL) where
+import Database.HDBC.MySQL.Connection(connectMySQL)
596 Database/HDBC/MySQL/Connection.hsc
@@ -0,0 +1,596 @@
+-- -*- mode: haskell; -*-
+{-# OPTIONS -fglasgow-exts #-}
+
+module Database.HDBC.MySQL.Connection
+ (connectMySQL, Connection())
+where
+
+import Control.Exception
+import Control.Monad
+import Foreign
+import Foreign.C
+import Data.Time
+import Data.Time.Clock.POSIX
+
+import qualified Database.HDBC.Types as Types
+import Database.HDBC.ColTypes as ColTypes
+
+#include <mysql.h>
+
+data Connection = Connection
+ { disconnect :: IO ()
+ , commit :: IO ()
+ , rollback :: IO ()
+ , run :: String -> [Types.SqlValue] -> IO Integer
+ , prepare :: String -> IO Types.Statement
+ , clone :: IO Connection
+ , hdbcDriverName :: String
+ , hdbcClientVer :: String
+ , proxiedClientName :: String
+ , proxiedClientVer :: String
+ , dbServerVer :: String
+ , dbTransactionSupport :: Bool
+ , getTables :: IO [String]
+ , describeTable :: String -> IO [(String, ColTypes.SqlColDesc)]
+ }
+
+instance Types.IConnection Connection where
+ disconnect = disconnect
+ commit = commit
+ rollback = rollback
+ run = run
+ prepare = prepare
+ clone = clone
+ hdbcDriverName = hdbcDriverName
+ hdbcClientVer = hdbcClientVer
+ proxiedClientName = proxiedClientName
+ proxiedClientVer = proxiedClientVer
+ dbServerVer = dbServerVer
+ dbTransactionSupport = dbTransactionSupport
+ getTables = getTables
+ describeTable = describeTable
+
+-- The "real" connection to the MySQL server. Wraps mysql.h's MYSQL
+-- struct. We don't ever need to look inside it.
+data MYSQL
+
+-- Connects to the MySQL database.
+connectMySQL :: String -> String -> String -> String -> Int -> String -> IO Connection
+connectMySQL host user passwd db port unixSocket = do
+ mysql_ <- mysql_init nullPtr
+ when (mysql_ == nullPtr) (error "mysql_init failed")
+ withCString host $ \host_ ->
+ withCString user $ \user_ ->
+ withCString passwd $ \passwd_ ->
+ withCString db $ \db_ ->
+ withCString unixSocket $ \unixSocket_ ->
+ do rv <- mysql_real_connect mysql_ host_ user_ passwd_ db_ (fromIntegral port) unixSocket_
+ when (rv == nullPtr) (connectionError mysql_)
+ wrap mysql_
+ where
+ -- Returns the HDBC wrapper for the native MySQL connection
+ -- object.
+ wrap :: Ptr MYSQL -> IO Connection
+ wrap mysql_ = do
+ clientver <- peekCString =<< mysql_get_client_info
+ serverver <- peekCString =<< mysql_get_server_info mysql_
+ protover <- mysql_get_proto_info mysql_
+
+ -- HDBC assumes that there is no such thing as auto-commit.
+ -- So we'll turn it off here and start our first transaction.
+ mysql_autocommit mysql_ 0
+ doStartTransaction mysql_
+
+ return $ Connection
+ { disconnect = mysql_close mysql_
+ , commit = doCommit mysql_
+ , rollback = doRollback mysql_
+ , run = doRun mysql_
+ , prepare = newStatement mysql_
+ , clone = connectMySQL host user passwd db port unixSocket
+ , hdbcDriverName = "mysql"
+ , hdbcClientVer = clientver
+ , proxiedClientName = "mysql"
+ , proxiedClientVer = show protover
+ , dbServerVer = serverver
+ , dbTransactionSupport = True
+ , getTables = doGetTables mysql_
+ , describeTable = error "describeTable"
+ }
+
+-- A MySQL statement: wraps mysql.h's MYSQL_STMT struct.
+data MYSQL_STMT
+
+-- A MySQL result: wraps mysql.h's MYSQL_RES struct.
+data MYSQL_RES
+
+-- A MySQL field: wraps mysql.h's MYSQL_FIELD struct. We do actually
+-- have to spelunk this structure, so it's a Storable instance.
+data MYSQL_FIELD = MYSQL_FIELD
+ { fieldName :: String
+ , fieldLength :: CULong
+ , fieldMaxLength :: CULong
+ , fieldType :: CInt
+ , fieldDecimals :: CUInt
+ }
+
+instance Storable MYSQL_FIELD where
+ sizeOf _ = #const sizeof(MYSQL_FIELD)
+ alignment _ = alignment (undefined :: CInt)
+
+ peek p = do
+ fname <- peekCString =<< (#peek MYSQL_FIELD, name) p
+ flength <- (#peek MYSQL_FIELD, length) p
+ fmaxlen <- (#peek MYSQL_FIELD, max_length) p
+ ftype <- (#peek MYSQL_FIELD, type) p
+ fdec <- (#peek MYSQL_FIELD, decimals) p
+ return $ MYSQL_FIELD
+ { fieldName = fname
+ , fieldLength = flength
+ , fieldMaxLength = fmaxlen
+ , fieldType = ftype
+ , fieldDecimals = fdec
+ }
+
+ poke _ _ = error "MYSQL_FIELD: poke"
+
+-- A MySQL binding to a query parameter or result. This wraps
+-- mysql.h's MYSQL_BIND struct, and it's also Storable -- in this
+-- case, so that we can create them.
+data MYSQL_BIND = MYSQL_BIND
+ { bindLength :: Ptr CULong
+ , bindIsNull :: Ptr CChar
+ , bindBuffer :: Ptr ()
+ , bindError :: Ptr CChar
+ , bindBufferType :: CInt
+ , bindBufferLength :: CULong
+ }
+
+instance Storable MYSQL_BIND where
+ sizeOf _ = #const sizeof(MYSQL_BIND)
+ alignment _ = alignment (undefined :: CInt)
+
+ peek _ = error "MYSQL_BIND: peek"
+
+ poke p (MYSQL_BIND len_ isNull_ buf_ err_ buftyp buflen) = do
+ memset (castPtr p) 0 #{const sizeof(MYSQL_BIND)}
+ (#poke MYSQL_BIND, length) p len_
+ (#poke MYSQL_BIND, is_null) p isNull_
+ (#poke MYSQL_BIND, buffer) p buf_
+ (#poke MYSQL_BIND, error) p err_
+ (#poke MYSQL_BIND, buffer_type) p buftyp
+ (#poke MYSQL_BIND, buffer_length) p buflen
+
+data MYSQL_TIME = MYSQL_TIME
+ { timeYear :: CInt
+ , timeMonth :: CInt
+ , timeDay :: CInt
+ , timeHour :: CInt
+ , timeMinute :: CInt
+ , timeSecond :: CInt
+ }
+
+instance Storable MYSQL_TIME where
+ sizeOf _ = #const sizeof(MYSQL_TIME)
+ alignment _ = alignment (undefined :: CInt)
+
+ peek p = do
+ year <- (#peek MYSQL_TIME, year) p
+ month <- (#peek MYSQL_TIME, month) p
+ day <- (#peek MYSQL_TIME, day) p
+ hour <- (#peek MYSQL_TIME, hour) p
+ minute <- (#peek MYSQL_TIME, minute) p
+ second <- (#peek MYSQL_TIME, second) p
+ return (MYSQL_TIME year month day hour minute second)
+
+ poke p t = do
+ memset (castPtr p) 0 #{const sizeof(MYSQL_TIME)}
+ (#poke MYSQL_TIME, year) p (timeYear t)
+ (#poke MYSQL_TIME, month) p (timeMonth t)
+ (#poke MYSQL_TIME, day) p (timeDay t)
+ (#poke MYSQL_TIME, hour) p (timeHour t)
+ (#poke MYSQL_TIME, minute) p (timeMinute t)
+ (#poke MYSQL_TIME, second) p (timeSecond t)
+
+-- Prepares a new Statement for execution.
+newStatement :: Ptr MYSQL -> String -> IO Types.Statement
+newStatement mysql_ query = do
+ -- XXX it would probably make sense to revisit the flow-of-control
+ -- here: if we blow up while preparing the statement, we'll bail
+ -- without closing it.
+ stmt_ <- mysql_stmt_init mysql_
+ when (stmt_ == nullPtr) (connectionError mysql_)
+
+ withCString query $ \query_ -> do
+ rv <- mysql_stmt_prepare stmt_ query_ (fromIntegral $ length query)
+ when (rv /= 0) (statementError stmt_)
+
+ -- Collect the result fields of the statement; this will simply be
+ -- the empty list if we're doing something that doesn't generate
+ -- results.
+ fields <- fieldsOf stmt_
+
+ -- Create MYSQL_BIND structures for each field and point the the
+ -- statement at those buffers. Again, if there are no fields,
+ -- this'll be a no-op.
+ results <- mapM resultOfField fields
+ withArray results $ \bind_ -> do
+ rv' <- mysql_stmt_bind_result stmt_ bind_
+ when (rv' /= 0) (statementError stmt_)
+
+ return $ Types.Statement
+ { Types.execute = execute stmt_
+ , Types.executeMany = mapM_ $ execute stmt_
+ , Types.finish = mysql_stmt_close stmt_ >> return ()
+ , Types.fetchRow = fetchRow stmt_ results
+ , Types.originalQuery = query
+ , Types.getColumnNames = return $ map fieldName fields
+ , Types.describeResult = error "describeResult"
+ }
+
+-- Returns the list of fields from a prepared statement.
+fieldsOf :: Ptr MYSQL_STMT -> IO [MYSQL_FIELD]
+fieldsOf stmt_ = bracket acquire release fieldsOf'
+ where acquire = mysql_stmt_result_metadata stmt_
+ release res_ | res_ == nullPtr = return ()
+ | otherwise = mysql_free_result res_
+ fieldsOf' res_ | res_ == nullPtr = return []
+ | otherwise = fieldsOfResult res_
+
+-- Builds the list of fields from the result set metadata: this is
+-- just a helper function for fieldOf, above.
+fieldsOfResult :: Ptr MYSQL_RES -> IO [MYSQL_FIELD]
+fieldsOfResult res_ = do
+ field_ <- mysql_fetch_field res_
+ if (field_ == nullPtr)
+ then return []
+ else liftM2 (:) (peek field_) (fieldsOfResult res_)
+
+-- Executes a statement with the specified binding parameters.
+execute :: Ptr MYSQL_STMT -> [Types.SqlValue] -> IO Integer
+execute stmt_ params = do
+ bindParams stmt_ params
+ rv <- mysql_stmt_execute stmt_
+ when (rv /= 0) (statementError stmt_)
+ nrows <- mysql_stmt_affected_rows stmt_
+ return $ fromIntegral nrows
+
+-- Binds placeholder parameters to values.
+bindParams :: Ptr MYSQL_STMT -> [Types.SqlValue] -> IO ()
+bindParams stmt_ params = do
+ param_count <- mysql_stmt_param_count stmt_
+ let nparams = fromIntegral param_count
+
+ -- XXX i'm not sure if it makes more sense to keep this paranoia, or
+ -- to simply remove it. The code that immediately follows pads
+ -- extra bind parameters with nulls.
+ when (nparams /= length params)
+ (error "the number of parameter placeholders in the prepared SQL is different than the number of parameters provided")
+
+ let params' = take nparams $ params ++ repeat Types.SqlNull
+ binds <- mapM bindOfSqlValue params'
+ withArray binds $ \bind_ -> do
+ rv <- mysql_stmt_bind_param stmt_ bind_
+ when (rv /= 0) (statementError stmt_)
+
+-- Given a SqlValue, return a MYSQL_BIND structure that we can use to
+-- pass its value.
+bindOfSqlValue :: Types.SqlValue -> IO MYSQL_BIND
+
+bindOfSqlValue Types.SqlNull =
+ with (1 :: CChar) $ \isNull_ ->
+ return $ MYSQL_BIND
+ { bindLength = nullPtr
+ , bindIsNull = isNull_
+ , bindBuffer = nullPtr
+ , bindError = nullPtr
+ , bindBufferType = #{const MYSQL_TYPE_NULL}
+ , bindBufferLength = 0
+ }
+
+bindOfSqlValue (Types.SqlString s) =
+ bindOfSqlValue' (length s) (withCString s) #{const MYSQL_TYPE_VAR_STRING}
+
+bindOfSqlValue (Types.SqlByteString _) =
+ error "bindOfSqlValue :: SqlByteString"
+
+bindOfSqlValue (Types.SqlInteger n) =
+ bindOfSqlValue' (8::Int) (with (fromIntegral n :: CLLong)) #{const MYSQL_TYPE_LONGLONG}
+
+bindOfSqlValue (Types.SqlBool b) =
+ bindOfSqlValue' (1::Int) (with (if b then 1 else 0 :: CChar)) #{const MYSQL_TYPE_TINY}
+
+bindOfSqlValue (Types.SqlChar c) =
+ bindOfSqlValue' (1::Int) (with c) #{const MYSQL_TYPE_TINY}
+
+bindOfSqlValue (Types.SqlDouble d) =
+ bindOfSqlValue' (8::Int) (with (realToFrac d :: CDouble)) #{const MYSQL_TYPE_DOUBLE}
+
+bindOfSqlValue (Types.SqlInt32 n) =
+ bindOfSqlValue' (4::Int) (with n) #{const MYSQL_TYPE_LONG}
+
+bindOfSqlValue (Types.SqlInt64 n) =
+ bindOfSqlValue' (8::Int) (with n) #{const MYSQL_TYPE_LONGLONG}
+
+bindOfSqlValue (Types.SqlRational n) =
+ bindOfSqlValue' (8::Int) (with (realToFrac n :: CDouble)) #{const MYSQL_TYPE_DOUBLE}
+
+bindOfSqlValue (Types.SqlWord32 n) =
+ bindOfSqlValue' (4::Int) (with n) #{const MYSQL_TYPE_LONG}
+
+bindOfSqlValue (Types.SqlWord64 n) =
+ bindOfSqlValue' (8::Int) (with n) #{const MYSQL_TYPE_LONGLONG}
+
+bindOfSqlValue (Types.SqlEpochTime epoch) =
+ let t = utcToMysqlTime $ posixSecondsToUTCTime (fromIntegral epoch) in
+ bindOfSqlValue' (#{const sizeof(MYSQL_TIME)}::Int) (with t) #{const MYSQL_TYPE_DATETIME}
+ where utcToMysqlTime :: UTCTime -> MYSQL_TIME
+ utcToMysqlTime (UTCTime day difftime) =
+ let (y, m, d) = toGregorian day
+ t = floor $ (realToFrac difftime :: Double)
+ h = t `div` 3600
+ mn = t `div` 60 `mod` 60
+ s = t `mod` 60
+ in MYSQL_TIME (fromIntegral y) (fromIntegral m) (fromIntegral d) h mn s
+
+bindOfSqlValue (Types.SqlTimeDiff _) =
+ error "bindOfSqlValue :: SqlTimeDiff"
+
+-- A nasty helper function that cuts down on the boilerplate a bit.
+bindOfSqlValue' :: (Integral a, Storable b) =>
+ a ->
+ ((Ptr b -> IO MYSQL_BIND) -> IO MYSQL_BIND) ->
+ CInt ->
+ IO MYSQL_BIND
+
+bindOfSqlValue' len buf btype =
+ let buflen = fromIntegral len in
+ with (0 :: CChar) $ \isNull_ ->
+ with buflen $ \len_ ->
+ buf $ \buf_ ->
+ return $ MYSQL_BIND
+ { bindLength = len_
+ , bindIsNull = isNull_
+ , bindBuffer = castPtr buf_
+ , bindError = nullPtr
+ , bindBufferType = btype
+ , bindBufferLength = buflen
+ }
+
+-- Returns an appropriate binding structure for a field.
+resultOfField :: MYSQL_FIELD -> IO MYSQL_BIND
+resultOfField field =
+ let ftype = fieldType field
+ btype = boundType ftype (fieldDecimals field)
+ size = boundSize btype (fieldLength field) in
+ with size $ \size_ ->
+ with (0 :: CChar) $ \isNull_ ->
+ with (0 :: CChar) $ \error_ ->
+ allocaBytes (fromIntegral size) $ \buffer_ ->
+ return $ MYSQL_BIND { bindLength = size_
+ , bindIsNull = isNull_
+ , bindBuffer = buffer_
+ , bindError = error_
+ , bindBufferType = btype
+ , bindBufferLength = size
+ }
+
+-- Returns the appropriate result type for a particular host type.
+boundType :: CInt -> CUInt -> CInt
+boundType #{const MYSQL_TYPE_STRING} _ = #{const MYSQL_TYPE_VAR_STRING}
+boundType #{const MYSQL_TYPE_TINY} _ = #{const MYSQL_TYPE_LONG}
+boundType #{const MYSQL_TYPE_SHORT} _ = #{const MYSQL_TYPE_LONG}
+boundType #{const MYSQL_TYPE_INT24} _ = #{const MYSQL_TYPE_LONG}
+boundType #{const MYSQL_TYPE_YEAR} _ = #{const MYSQL_TYPE_LONG}
+boundType #{const MYSQL_TYPE_ENUM} _ = #{const MYSQL_TYPE_LONG}
+boundType #{const MYSQL_TYPE_DECIMAL} 0 = #{const MYSQL_TYPE_LONGLONG}
+boundType #{const MYSQL_TYPE_DECIMAL} _ = #{const MYSQL_TYPE_DOUBLE}
+boundType #{const MYSQL_TYPE_NEWDECIMAL} 0 = #{const MYSQL_TYPE_LONGLONG}
+boundType #{const MYSQL_TYPE_NEWDECIMAL} _ = #{const MYSQL_TYPE_DOUBLE}
+boundType #{const MYSQL_TYPE_FLOAT} _ = #{const MYSQL_TYPE_DOUBLE}
+boundType #{const MYSQL_TYPE_DATE} _ = #{const MYSQL_TYPE_DATETIME}
+boundType #{const MYSQL_TYPE_TIMESTAMP} _ = #{const MYSQL_TYPE_DATETIME}
+boundType #{const MYSQL_TYPE_NEWDATE} _ = #{const MYSQL_TYPE_DATETIME}
+boundType t _ = t
+
+-- Returns the amount of storage required for a particular result
+-- type.
+boundSize :: CInt -> CULong -> CULong
+boundSize #{const MYSQL_TYPE_LONG} _ = 4
+boundSize #{const MYSQL_TYPE_DOUBLE} _ = 8
+boundSize _ n = n
+
+-- Fetches a row from an executed statement and converts the cell
+-- values into a list of SqlValue types.
+fetchRow :: Ptr MYSQL_STMT -> [MYSQL_BIND] -> IO (Maybe [Types.SqlValue])
+fetchRow stmt_ results = do
+ rv <- mysql_stmt_fetch stmt_
+ case rv of
+ 0 -> row
+ #{const MYSQL_DATA_TRUNCATED} -> row
+ #{const MYSQL_NO_DATA} -> return Nothing
+ _ -> statementError stmt_
+ where row = mapM cellValue results >>= \cells -> return $ Just cells
+
+-- Produces a single SqlValue cell value given the binding, handling
+-- nulls appropriately.
+cellValue :: MYSQL_BIND -> IO Types.SqlValue
+cellValue bind = do
+ isNull <- peek $ bindIsNull bind
+ if isNull == 0
+ then nonNullCellValue (bindBufferType bind) (bindBuffer bind)
+ else return Types.SqlNull
+
+-- Produces a single SqlValue from the binding's type and buffer
+-- pointer.
+nonNullCellValue :: CInt -> Ptr () -> IO Types.SqlValue
+
+nonNullCellValue #{const MYSQL_TYPE_LONG} p = do
+ n :: CLong <- peek $ castPtr p
+ return $ Types.SqlInteger (fromIntegral n)
+
+nonNullCellValue #{const MYSQL_TYPE_LONGLONG} p = do
+ n :: CLLong <- peek $ castPtr p
+ return $ Types.SqlInteger (fromIntegral n)
+
+nonNullCellValue #{const MYSQL_TYPE_DOUBLE} p = do
+ n :: CDouble <- peek $ castPtr p
+ return $ Types.SqlDouble (realToFrac n)
+
+nonNullCellValue #{const MYSQL_TYPE_VAR_STRING} p =
+ peekCString (castPtr p) >>= return . Types.SqlString
+
+nonNullCellValue #{const MYSQL_TYPE_DATETIME} p = do
+ t :: MYSQL_TIME <- peek $ castPtr p
+ let epoch = (floor . toRational . utcTimeToPOSIXSeconds . mysqlTimeToUTC) t
+ return $ Types.SqlEpochTime epoch
+ where mysqlTimeToUTC :: MYSQL_TIME -> UTCTime
+ mysqlTimeToUTC (MYSQL_TIME y m d h mn s) =
+ let day = fromGregorian (fromIntegral y) (fromIntegral m) (fromIntegral d)
+ time = s + mn * 60 + h * 3600
+ in UTCTime day (secondsToDiffTime $ fromIntegral time)
+
+
+
+nonNullCellValue t _ = return $ Types.SqlString ("unknown type " ++ show t)
+
+doRun :: Ptr MYSQL -> String -> [Types.SqlValue] -> IO Integer
+doRun mysql_ query params = do
+ stmt <- newStatement mysql_ query
+ Types.execute stmt params
+
+doQuery :: Ptr MYSQL -> String -> IO ()
+doQuery mysql_ stmt =
+ withCString stmt $ \stmt_ -> do
+ rv <- mysql_query mysql_ stmt_
+ when (rv /= 0) (connectionError mysql_)
+
+doCommit :: Ptr MYSQL -> IO ()
+doCommit = flip doQuery $ "COMMIT"
+
+doRollback :: Ptr MYSQL -> IO ()
+doRollback = flip doQuery $ "ROLLBACK"
+
+doStartTransaction :: Ptr MYSQL -> IO ()
+doStartTransaction = flip doQuery $ "START TRANSACTION"
+
+doGetTables :: Ptr MYSQL -> IO [String]
+doGetTables mysql_ = do
+ stmt <- newStatement mysql_ "SHOW TABLES"
+ Types.execute stmt []
+ rows <- unfoldRows stmt
+ return $ map (fromSql . head) rows
+ where unfoldRows stmt = do
+ row <- Types.fetchRow stmt
+ case row of
+ Nothing -> return []
+ Just (vals) -> do rows <- unfoldRows stmt
+ return (vals : rows)
+
+ fromSql :: Types.SqlValue -> String
+ fromSql (Types.SqlString s) = s
+ fromSql _ = error "SHOW TABLES returned a table whose name wasn't a string"
+
+-- Returns the last statement-level error.
+statementError :: Ptr MYSQL_STMT -> IO a
+statementError stmt_ = do
+ errno <- mysql_stmt_errno stmt_
+ msg <- peekCString =<< mysql_stmt_error stmt_
+ --throwDyn $ Types.SqlError "" errno msg
+ error (msg ++ " (" ++ show errno ++ ")")
+
+-- Returns the last connection-level error.
+connectionError :: Ptr MYSQL -> IO a
+connectionError mysql_ = do
+ errno <- mysql_errno mysql_
+ msg <- peekCString =<< mysql_error mysql_
+ --throwDyn $ Types.SqlError "" errno msg
+ error (msg ++ " (" ++ show errno ++ ")")
+
+{- ---------------------------------------------------------------------- -}
+
+-- Here are all the FFI imports.
+
+foreign import ccall unsafe mysql_get_client_info
+ :: IO CString
+
+foreign import ccall unsafe mysql_get_server_info
+ :: Ptr MYSQL -> IO CString
+
+foreign import ccall unsafe mysql_get_proto_info
+ :: Ptr MYSQL -> IO CUInt
+
+foreign import ccall unsafe mysql_init
+ :: Ptr MYSQL
+ -> IO (Ptr MYSQL)
+
+foreign import ccall unsafe mysql_real_connect
+ :: Ptr MYSQL -- the context
+ -> CString -- hostname
+ -> CString -- username
+ -> CString -- password
+ -> CString -- database
+ -> CInt -- port
+ -> CString -- unix socket
+ -> IO (Ptr MYSQL)
+
+foreign import ccall unsafe mysql_close
+ :: Ptr MYSQL -> IO ()
+
+foreign import ccall unsafe mysql_stmt_init
+ :: Ptr MYSQL -> IO (Ptr MYSQL_STMT)
+
+foreign import ccall unsafe mysql_stmt_prepare
+ :: Ptr MYSQL_STMT -> CString -> CInt -> IO CInt
+
+foreign import ccall unsafe mysql_stmt_result_metadata
+ :: Ptr MYSQL_STMT -> IO (Ptr MYSQL_RES)
+
+foreign import ccall unsafe mysql_stmt_bind_param
+ :: Ptr MYSQL_STMT -> Ptr MYSQL_BIND -> IO CChar
+
+foreign import ccall unsafe mysql_stmt_bind_result
+ :: Ptr MYSQL_STMT -> Ptr MYSQL_BIND -> IO CChar
+
+foreign import ccall unsafe mysql_stmt_param_count
+ :: Ptr MYSQL_STMT -> IO CULong
+
+foreign import ccall unsafe mysql_free_result
+ :: Ptr MYSQL_RES -> IO ()
+
+foreign import ccall unsafe mysql_stmt_execute
+ :: Ptr MYSQL_STMT -> IO CInt
+
+foreign import ccall unsafe mysql_stmt_affected_rows
+ :: Ptr MYSQL_STMT -> IO CULLong
+
+foreign import ccall unsafe mysql_fetch_field
+ :: Ptr MYSQL_RES -> IO (Ptr MYSQL_FIELD)
+
+foreign import ccall unsafe mysql_stmt_fetch
+ :: Ptr MYSQL_STMT -> IO CInt
+
+foreign import ccall unsafe mysql_stmt_close
+ :: Ptr MYSQL_STMT -> IO CChar
+
+foreign import ccall unsafe mysql_stmt_errno
+ :: Ptr MYSQL_STMT -> IO CInt
+
+foreign import ccall unsafe mysql_stmt_error
+ :: Ptr MYSQL_STMT -> IO CString
+
+foreign import ccall unsafe mysql_errno
+ :: Ptr MYSQL -> IO CInt
+
+foreign import ccall unsafe mysql_error
+ :: Ptr MYSQL -> IO CString
+
+foreign import ccall unsafe mysql_autocommit
+ :: Ptr MYSQL -> CChar -> IO CChar
+
+foreign import ccall unsafe mysql_query
+ :: Ptr MYSQL -> CString -> IO CInt
+
+foreign import ccall unsafe memset
+ :: Ptr () -> CInt -> CSize -> IO ()
+
2 HDBC-mysql.buildinfo.in
@@ -0,0 +1,2 @@
+extra-lib-dirs: @MYSQLLIBDIR@
+include-dirs: @MYSQLINCDIR@
16 HDBC-mysql.cabal
@@ -0,0 +1,16 @@
+Name: HDBC-mysql
+Version: 0.1
+Description: This package provides a MySQL driver for HDBC.
+Maintainer: Chris Waterson <waterson@maubi.net>
+Author: Chris Waterson
+Copyright: Copyright (c) 2009 Chris Waterson
+License: LGPL
+License-file: COPYING
+Author: Chris Waterson
+Maintainer: waterson@maubi.net
+Build-Depends: base, time, HDBC>=1.1.0
+Exposed-modules: Database.HDBC.MySQL
+Other-modules: Database.HDBC.MySQL.Connection
+ghc-options: -Wall -O
+Extra-Libraries: mysqlclient
+Build-Type: Custom
29 NOTES
@@ -0,0 +1,29 @@
+This works with 5.0.75. I haven't tried with 4.x nor 5.1. I suspect
+the former won't work, but the latter probably will.
+
+N.B. that all the paths are hard-coded and assume MacPorts-ish
+locations.
+
+Things to do:
+
+ * Complete coverage for SqlValue types in parameter binding. I
+ don't think MySQL has anything that maps onto the SqlTimeDiff
+ type.
+
+ * Double-check coverage for result bindings.
+
+ * Throw exceptions instead of "error". Where is throwDyn?
+
+ * Fill in various other missing holes (notably, table and statement
+ description).
+
+ * Verify that FFI's "with*" functions create a pinned pointer.
+
+ * All the parameters that you need to create a connection is a bit
+ nasty. I could go parse a JDBC-like string, but, ...
+
+There's a little test program that runs a query and spews out the
+results. To compile it,
+
+ ghc -idist/build -L/opt/local/lib/mysql5/mysql -lmysqlclient --make Test
+
5 Setup.lhs
@@ -0,0 +1,5 @@
+#!/usr/bin/env runhaskell
+
+> import Distribution.Simple
+> main = defaultMainWithHooks autoconfUserHooks
+
21 Test.hs
@@ -0,0 +1,21 @@
+module Main where
+
+import Control.Monad
+import Database.HDBC
+import Database.HDBC.MySQL
+
+main :: IO ()
+main = do conn <- connectMySQL "127.0.0.1" "root" "" "event" 3306 ""
+
+ putStrLn $ "you are connected to " ++ (hdbcDriverName conn) ++
+ " server version " ++ (dbServerVer conn) ++
+ " via client version " ++ (hdbcClientVer conn)
+
+ tables <- getTables conn
+ putStrLn $ "the tables in this database are " ++ (show tables)
+
+ stmt <- prepare conn "SELECT NOW()"
+ execute stmt []
+ rows <- fetchAllRows stmt
+ forM_ rows $ \row -> putStrLn $ show row
+ disconnect conn
2,683 configure
@@ -0,0 +1,2683 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61 for HDBC-mysql package 0.1.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+ if (eval ":") 2>/dev/null; then
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+
+ if test $as_have_required = yes && (eval ":
+(as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=\$LINENO
+ as_lineno_2=\$LINENO
+ test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+ test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+ :
+else
+ as_candidate_shells=
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ case $as_dir in
+ /*)
+ for as_base in sh bash ksh sh5; do
+ as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+ done;;
+ esac
+done
+IFS=$as_save_IFS
+
+
+ for as_shell in $as_candidate_shells $SHELL; do
+ # Try only shells that exist, to save several forks.
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+ CONFIG_SHELL=$as_shell
+ as_have_required=yes
+ if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+ (exit $1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+ break
+fi
+
+fi
+
+ done
+
+ if test "x$CONFIG_SHELL" != x; then
+ for as_var in BASH_ENV ENV
+ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ done
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+ if test $as_have_required = no; then
+ echo This script requires a shell more modern than all the
+ echo shells that I found on your system. Please install a
+ echo modern shell, or manually run the script under such a
+ echo shell if you do have one.
+ { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+ echo No shell found that supports shell functions.
+ echo Please tell autoconf@gnu.org about your system,
+ echo including any error possibly output before this
+ echo message
+}
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. Blame Lee
+ # E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+ as_test_x='test -x'
+else
+ if ls -dL / >/dev/null 2>&1; then
+ as_ls_L_option=L
+ else
+ as_ls_L_option=
+ fi
+ as_test_x='
+ eval sh -c '\''
+ if test -d "$1"; then
+ test -d "$1/.";
+ else
+ case $1 in
+ -*)set "./$1";;
+ esac;
+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+ ???[sx]*):;;*)false;;esac;fi
+ '\'' sh
+ '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME='HDBC-mysql package'
+PACKAGE_TARNAME='hdbc-mysql-package'
+PACKAGE_VERSION='0.1'
+PACKAGE_STRING='HDBC-mysql package 0.1'
+PACKAGE_BUGREPORT=''
+
+ac_unique_file="HDBC-mysql.cabal"
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+mysql_config
+MYSQLINCDIR
+MYSQLLIBDIR
+LIBOBJS
+LTLIBOBJS'
+ac_subst_files=''
+ ac_precious_vars='build_alias
+host_alias
+target_alias'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+ eval enable_$ac_feature=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+ eval enable_$ac_feature=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+ eval with_$ac_package=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+ eval with_$ac_package=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ { echo "$as_me: error: Working directory cannot be determined" >&2
+ { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ { echo "$as_me: error: pwd does not report name of working directory" >&2
+ { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+ { (exit 1); exit 1; }; }
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures HDBC-mysql package 0.1 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/hdbc-mysql-package]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of HDBC-mysql package 0.1:";;
+ esac
+ cat <<\_ACEOF
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" || continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+HDBC-mysql package configure 0.1
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by HDBC-mysql package $as_me 0.1, which was
+generated by GNU Autoconf 2.61. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args '$ac_arg'"
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ *) $as_unset $ac_var ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+ set x "$ac_default_prefix/share/config.site" \
+ "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# Safety check: Ensure that we are in the correct source directory.
+
+
+# Extract the first word of "mysql_config", so it can be a program name with args.
+set dummy mysql_config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_mysql_config+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $mysql_config in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_mysql_config="$mysql_config" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_mysql_config="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+mysql_config=$ac_cv_path_mysql_config
+if test -n "$mysql_config"; then
+ { echo "$as_me:$LINENO: result: $mysql_config" >&5
+echo "${ECHO_T}$mysql_config" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+if test -z "$mysql_config" ; then
+ { { echo "$as_me:$LINENO: error: mysql_config executable not found. Make sure mysql_config is in your path" >&5
+echo "$as_me: error: mysql_config executable not found. Make sure mysql_config is in your path" >&2;}
+ { (exit 1); exit 1; }; }
+else
+ { echo "$as_me:$LINENO: checking MySQL header dir" >&5
+echo $ECHO_N "checking MySQL header dir... $ECHO_C" >&6; }
+ MYSQLINCDIR=`${mysql_config} --include`
+ { echo "$as_me:$LINENO: result: $MYSQLINCDIR" >&5
+echo "${ECHO_T}$MYSQLINCDIR" >&6; }
+ { echo "$as_me:$LINENO: checking MySQL library dir" >&5
+echo $ECHO_N "checking MySQL library dir... $ECHO_C" >&6; }
+ PGLIBDIR=`${mysql_config} --libs`
+ { echo "$as_me:$LINENO: result: $MYSQLLIBDIR" >&5
+echo "${ECHO_T}$MYSQLLIBDIR" >&6; }
+fi
+
+
+
+ac_config_files="$ac_config_files HDBC-mysql.buildinfo"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ *) $as_unset $ac_var ;;
+ esac ;;
+