-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Adds a interface like mysql-simple to mysql-haskell.
--   
--   Please see README.md
@package mysql-haskell-nem
@version 0.1.0.0


-- | The <a>Result</a> typeclass, for converting a single value in a row
--   returned by a SQL query into a more useful Haskell representation.
--   
--   A Haskell numeric type is considered to be compatible with all MySQL
--   numeric types that are less accurate than it. For instance, the
--   Haskell <a>Double</a> type is compatible with the MySQL <tt>Long</tt>
--   type because it can represent a <tt>Long</tt> exactly. On the other
--   hand, since a <a>Double</a> might lose precision if representing a
--   <tt>LongLong</tt>, the two are <i>not</i> considered compatible.
module Database.MySQL.Nem.Result

-- | Exception thrown if conversion from a SQL value to a Haskell value
--   fails.
data ResultError
Incompatible :: String -> String -> String -> ResultError
[errColumnName] :: ResultError -> String
[errHaskellType] :: ResultError -> String
[errMessage] :: ResultError -> String
ConversionFailed :: String -> String -> String -> ResultError
[errColumnName] :: ResultError -> String
[errHaskellType] :: ResultError -> String
[errMessage] :: ResultError -> String

-- | A type that may be converted from a SQL type.
class Result a
convert :: Result a => ColumnDef -> MySQLValue -> a
instance GHC.Show.Show Database.MySQL.Nem.Result.ResultError
instance GHC.Classes.Eq Database.MySQL.Nem.Result.ResultError
instance Database.MySQL.Nem.Result.Result a => Database.MySQL.Nem.Result.Result (GHC.Base.Maybe a)
instance Database.MySQL.Nem.Result.Result GHC.Types.Int
instance Database.MySQL.Nem.Result.Result GHC.Int.Int8
instance Database.MySQL.Nem.Result.Result GHC.Int.Int16
instance Database.MySQL.Nem.Result.Result GHC.Int.Int32
instance Database.MySQL.Nem.Result.Result GHC.Int.Int64
instance Database.MySQL.Nem.Result.Result GHC.Types.Float
instance Database.MySQL.Nem.Result.Result GHC.Types.Double
instance Database.MySQL.Nem.Result.Result Data.Text.Internal.Text
instance Database.MySQL.Nem.Result.Result GHC.Base.String
instance Database.MySQL.Nem.Result.Result Data.ByteString.Internal.ByteString
instance Database.MySQL.Nem.Result.Result Data.Time.Calendar.Days.Day
instance Database.MySQL.Nem.Result.Result Data.Time.LocalTime.Internal.LocalTime.LocalTime
instance Database.MySQL.Nem.Result.Result Data.Scientific.Scientific
instance GHC.Exception.Exception Database.MySQL.Nem.Result.ResultError


-- | The <a>QueryResults</a> typeclass, for converting a row of results
--   returned by a SQL query into a more useful Haskell representation.
--   
--   Predefined instances are provided for tuples containing up to 24
--   elements.
module Database.MySQL.Nem.QueryResults

-- | A collection type that can be converted from a MySQL row result.
--   
--   Instances should use the <a>convert</a> method of the <a>Result</a>
--   class to perform conversion of each element of the collection.
--   
--   This example instance demonstrates how to convert a two-column row
--   into a Haskell pair. Each field in the metadata is paired up with each
--   value from the row, and the two are passed to <a>convert</a>.
--   
--   <pre>
--   instance (<a>Result</a> a, <a>Result</a> b) =&gt; <a>QueryResults</a> (a,b) where
--       <a>convertResults</a> [fa,fb] [va,vb] = (a,b)
--           where !a = <a>convert</a> fa va
--                 !b = <a>convert</a> fb vb
--       <a>convertResults</a> fs vs  = <a>convertError</a> fs vs 2
--   </pre>
--   
--   Notice that this instance evaluates each element to WHNF before
--   constructing the pair. By doing this, we guarantee two important
--   properties:
--   
--   <ul>
--   <li>Keep resource usage under control by preventing the construction
--   of potentially long-lived thunks.</li>
--   <li>Ensure that any <a>ResultError</a> that might arise is thrown
--   immediately, rather than some place later in application code that
--   cannot handle it.</li>
--   </ul>
--   
--   You can also declare Haskell types of your own to be instances of
--   <a>QueryResults</a>.
--   
--   <pre>
--   data User = User { firstName :: String, lastName :: String }
--   
--   instance <a>QueryResults</a> User where
--       <a>convertResults</a> [fa,fb] [va,vb] = User <a>$</a> a <a>*</a> b
--           where !a = <a>convert</a> fa va
--                 !b = <a>convert</a> fb vb
--       <a>convertResults</a> fs vs  = <a>convertError</a> fs vs 2
--    
--   </pre>
class QueryResults a
convertResults :: QueryResults a => [ColumnDef] -> [MySQLValue] -> a

-- | Throw a <a>ConversionFailed</a> exception, indicating a mismatch
--   between the number of columns in the <tt>Field</tt> and row, and the
--   number in the collection to be converted to.
convertError :: [ColumnDef] -> [MySQLValue] -> Int -> a
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b) => Database.MySQL.Nem.QueryResults.QueryResults (a, b)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j, Database.MySQL.Nem.Result.Result k) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j, k)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j, Database.MySQL.Nem.Result.Result k, Database.MySQL.Nem.Result.Result l) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j, k, l)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j, Database.MySQL.Nem.Result.Result k, Database.MySQL.Nem.Result.Result l, Database.MySQL.Nem.Result.Result m) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j, k, l, m)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j, Database.MySQL.Nem.Result.Result k, Database.MySQL.Nem.Result.Result l, Database.MySQL.Nem.Result.Result m, Database.MySQL.Nem.Result.Result n) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j, Database.MySQL.Nem.Result.Result k, Database.MySQL.Nem.Result.Result l, Database.MySQL.Nem.Result.Result m, Database.MySQL.Nem.Result.Result n, Database.MySQL.Nem.Result.Result o) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j, Database.MySQL.Nem.Result.Result k, Database.MySQL.Nem.Result.Result l, Database.MySQL.Nem.Result.Result m, Database.MySQL.Nem.Result.Result n, Database.MySQL.Nem.Result.Result o, Database.MySQL.Nem.Result.Result p) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j, Database.MySQL.Nem.Result.Result k, Database.MySQL.Nem.Result.Result l, Database.MySQL.Nem.Result.Result m, Database.MySQL.Nem.Result.Result n, Database.MySQL.Nem.Result.Result o, Database.MySQL.Nem.Result.Result p, Database.MySQL.Nem.Result.Result q) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j, Database.MySQL.Nem.Result.Result k, Database.MySQL.Nem.Result.Result l, Database.MySQL.Nem.Result.Result m, Database.MySQL.Nem.Result.Result n, Database.MySQL.Nem.Result.Result o, Database.MySQL.Nem.Result.Result p, Database.MySQL.Nem.Result.Result q, Database.MySQL.Nem.Result.Result r) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j, Database.MySQL.Nem.Result.Result k, Database.MySQL.Nem.Result.Result l, Database.MySQL.Nem.Result.Result m, Database.MySQL.Nem.Result.Result n, Database.MySQL.Nem.Result.Result o, Database.MySQL.Nem.Result.Result p, Database.MySQL.Nem.Result.Result q, Database.MySQL.Nem.Result.Result r, Database.MySQL.Nem.Result.Result s) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j, Database.MySQL.Nem.Result.Result k, Database.MySQL.Nem.Result.Result l, Database.MySQL.Nem.Result.Result m, Database.MySQL.Nem.Result.Result n, Database.MySQL.Nem.Result.Result o, Database.MySQL.Nem.Result.Result p, Database.MySQL.Nem.Result.Result q, Database.MySQL.Nem.Result.Result r, Database.MySQL.Nem.Result.Result s, Database.MySQL.Nem.Result.Result t, Database.MySQL.Nem.Result.Result u, Database.MySQL.Nem.Result.Result v) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j, Database.MySQL.Nem.Result.Result k, Database.MySQL.Nem.Result.Result l, Database.MySQL.Nem.Result.Result m, Database.MySQL.Nem.Result.Result n, Database.MySQL.Nem.Result.Result o, Database.MySQL.Nem.Result.Result p, Database.MySQL.Nem.Result.Result q, Database.MySQL.Nem.Result.Result r, Database.MySQL.Nem.Result.Result s, Database.MySQL.Nem.Result.Result t, Database.MySQL.Nem.Result.Result u, Database.MySQL.Nem.Result.Result v, Database.MySQL.Nem.Result.Result w) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w)
instance (Database.MySQL.Nem.Result.Result a, Database.MySQL.Nem.Result.Result b, Database.MySQL.Nem.Result.Result c, Database.MySQL.Nem.Result.Result d, Database.MySQL.Nem.Result.Result e, Database.MySQL.Nem.Result.Result f, Database.MySQL.Nem.Result.Result g, Database.MySQL.Nem.Result.Result h, Database.MySQL.Nem.Result.Result i, Database.MySQL.Nem.Result.Result j, Database.MySQL.Nem.Result.Result k, Database.MySQL.Nem.Result.Result l, Database.MySQL.Nem.Result.Result m, Database.MySQL.Nem.Result.Result n, Database.MySQL.Nem.Result.Result o, Database.MySQL.Nem.Result.Result p, Database.MySQL.Nem.Result.Result q, Database.MySQL.Nem.Result.Result r, Database.MySQL.Nem.Result.Result s, Database.MySQL.Nem.Result.Result t, Database.MySQL.Nem.Result.Result u, Database.MySQL.Nem.Result.Result v, Database.MySQL.Nem.Result.Result w, Database.MySQL.Nem.Result.Result x) => Database.MySQL.Nem.QueryResults.QueryResults (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x)

module Database.MySQL.Nem

-- | Execute a MySQL query which return a result-set converted to the
--   specified haskell type
--   
--   Note that you must fully consumed the result-set before start a new
--   query on the same <a>MySQLConn</a>, or an <a>UnconsumedResultSet</a>
--   will be thrown. if you want to skip the result-set, use
--   <a>skipToEof</a>.
queryResults :: (QueryResults r) => MySQLConn -> Query -> IO (InputStream r)

-- | Execute prepared query statement with parameters, expecting resultset.
--   
--   Note that you must fully consumed the result-set before start a new
--   query on the same <a>MySQLConn</a>, or an <a>UnconsumedResultSet</a>
--   will be thrown. if you want to skip the result-set, use
--   <a>skipToEof</a>.
queryStmtResults :: (QueryResults r) => MySQLConn -> StmtID -> [MySQLValue] -> IO (InputStream r)
