F      !"#$%&'()*+,-./0123456789:;<=>?@ABCDE(c) 2011 MailRank, Inc.BSD3%Bryan O'Sullivan <bos@serpentine.com> experimentalportableNone+-B9Wrap a mostly-binary string to be escaped in hexadecimal.$Wrap a list of values for use in an IN clause. Replaces a single "?:" character with a parenthesized list of rendered values.Example: Bquery c "select * from whatever where id in ?" (Only (In [3,4,5]))A single-value "collection".vThis is useful if you need to supply a single parameter to a SQL query, or extract a single column from a SQL result.Parameter example: ,query c "select x from scores where x > ?" ( (42::Int))Result example: 3xs <- query_ c "select id from users" forM_ xs $ \( id) -> {- ... -}A query string. This type is intended to make it difficult to construct a SQL query by concatenating string fragments, as that is an extremely common way to accidentally introduce SQL injection vulnerabilities into an application.This type is an instance of F<, so the easiest way to construct a query is to enable the OverloadedStringsF language extension and then simply write the query in double quotes. [{-# LANGUAGE OverloadedStrings #-} import Database.MySQL.Simple q :: Query q = "select ?"The underlying type is a Gg, and literal Haskell strings that contain Unicode characters will be correctly transformed to UTF-8.A placeholder for the SQL NULL value.HIJKL   HIJKL(c) 2011 MailRank, Inc.BSD3%Bryan O'Sullivan <bos@serpentine.com> experimentalportableNone+24-A type that may be converted from a SQL type.'Convert a SQL value to a Haskell value. Throws a   if conversion fails. JException thrown if conversion from a SQL value to a Haskell value fails.!The SQL value could not be parsed, or could not be represented as a valid Haskell value, or an unexpected low-level error occurred (e.g. mismatch between metadata and actual data in a row)."A SQL NULL: was encountered when the Haskell type did not permit it.#-The SQL and Haskell types are not compatible.2MN !"#$%&OPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu  !"#$%& #"!$%&$%&$%&*MN #"!$%&$%&$%&OPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu(c) 2011 MailRank, Inc.BSD3%Bryan O'Sullivan <bos@serpentine.com> experimentalportableNone'?A collection type that can be converted from a list of strings.Instances should use the  method of the @ 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 .  instance ( a,  b) => ' (a,b) where (, [fa,fb] [va,vb] = (a,b) where !a =  fa va !b =  fb vb ( fs vs = ) fs vs 2 Notice that this instance evaluates each element to WHNF before constructing the pair. By doing this, we guarantee two important properties:eKeep resource usage under control by preventing the construction of potentially long-lived thunks.Ensure that any  v that might arise is thrown immediately, rather than some place later in application code that cannot handle it.CYou can also declare Haskell types of your own to be instances of '. Gdata User = User { firstName :: String, lastName :: String } instance ' User where ( [fa,fb] [va,vb] = User  $ a  * b where !a =  fa va !b =  fb vb ( fs vs = ) fs vs 2 (4Convert values from a row into a Haskell collection.This function will throw a  ( if conversion of the collection fails.)Throw a !H exception, indicating a mismatch between the number of columns in the v? and row, and the number in the collection to be converted to.'()&Descriptors of fields to be converted.$Contents of the row to be converted.~Number of columns expected for conversion. For instance, if converting to a 3-tuple, the number to provide here would be 3.wxyz{|}~'()'()'()wxyz{|}~(c) 2011 MailRank, Inc.BSD3%Bryan O'Sullivan <bos@serpentine.com> experimentalportableNone+-24*=A type that may be used as a single parameter to a SQL query.+5Prepare a value for substitution into a query string.,;How to render an element when substituting it into a query.-*Concatenate a series of rendering actions..Escape and enclose in quotes before substituting. Use for all text-like types, and anything else that may contain unsafe characters when rendered./ZRender without escaping or quoting. Use for non-text types such as numbers, when you are certaind that they will not introduce formatting vulnerabilities via use of characters such as spaces or "'".01Surround a string with single-quote characters: "'"This function does not perform any other escaping.%*+,-./0*+,-./0,/.-*+0!*+,/.-0(c) 2011 MailRank, Inc.BSD3%Bryan O'Sullivan <bos@serpentine.com> experimentalportableNone1?A collection type that can be turned into a list of rendering ,s.Instances should use the + method of the *@ class to perform conversion of each element of the collection.2Render a collection of values.121212 12(c) 2011 MailRank, Inc.BSD3%Bryan O'Sullivan <bos@serpentine.com> experimentalportableNone+3Exception thrown if ? is used to perform an INSERT-like operation, or < is used to perform a SELECT-like operation.6Exception thrown if a E could not be formatted correctly. This may occur if the number of '?S' characters in the query string does not match the number of parameters provided.:Format a query string.mThis function is exposed to help with debugging and logging. Do not use it to prepare queries for execution.LString parameters are escaped according to the character set in use on the .Throws 67 if the query string could not be formatted correctly.;5Format a query string with a variable number of rows.mThis function is exposed to help with debugging and logging. Do not use it to prepare queries for execution.^The query string must contain exactly one substitution group, identified by the SQL keyword "VALUES&" (case insensitive) followed by an "(&" character, a series of one or more "?*" characters separated by commas, and a ")?" character. White space in a substitution group is permitted.Throws 67 if the query string could not be formatted correctly.< Execute an INSERT, UPDATE=, or other SQL query that is not expected to return results.$Returns the number of rows affected.Throws 6/ if the query could not be formatted correctly.= A version of <* that does not perform query substitution.>Execute a multi-row INSERT, UPDATE=, or other SQL query that is not expected to return results.$Returns the number of rows affected.Throws 6/ if the query could not be formatted correctly.? Perform a SELECT or other SQL query that is expected to return results. All results are retrieved and converted before this function returns.hWhen processing large results, this function will consume a lot of client-side memory. Consider using A instead.Exceptions that may be thrown:64: the query string could not be formatted correctly.3>: the result contains no columns (i.e. you should be using < instead of ?). : result conversion failed.@ A version of ?* that does not perform query substitution.A Perform a SELECT or other SQL query that is expected to return results. Results are streamed incrementally from the server, and consumed via a left fold.The result consumer must be carefully written to execute quickly. If the consumer is slow, server resources will be tied up, and other clients may not be able to update the tables from which the results are being streamed.PWhen dealing with small results, it may be simpler (and perhaps faster) to use ? instead. This fold is notk strict. The stream consumer is responsible for forcing the evaluation of its result to avoid space leaks.Exceptions that may be thrown:64: the query string could not be formatted correctly.3>: the result contains no columns (i.e. you should be using < instead of ?). : result conversion failed.B A version of A* that does not perform query substitution.C A version of A' that does not transform a state value.D A version of C* that does not perform query substitution.E+Execute an action inside a SQL transaction..This function initiates a transaction with a "begin transactionr" statement, then executes the supplied action. If the action succeeds, the transaction will be completed with  before this function returns.If the action throws anye kind of exception (not just a MySQL-related exception), the transaction will be rolled back using &, then the exception will be rethrown.3456789:;<=>?@AQuery template.Query parameters."Initial state for result consumer.Result consumer.BQuery."Initial state for result consumer.Result consumer.CQuery template.Query parameters.Result consumer.DQuery template.Result consumer.E1  $%&3456789:;<=>?@ABCDE7 6789345 $%&$%&$%&?@ABCD<=>E;:3456789:;<=>?@ABCDE       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~69mysql-simple-0.2.2.5Database.MySQL.SimpleDatabase.MySQL.Simple.TypesDatabase.MySQL.Simple.Result"Database.MySQL.Simple.QueryResultsDatabase.MySQL.Simple.Param!Database.MySQL.Simple.QueryParams mysql-0.1.1.8Database.MySQL.BaserollbackcommitinsertID autocommitcloseconnectdefaultConnectInfo connectSSL connectPathconnectOptionsconnectDatabaseconnectPassword connectUser connectPort connectHost ConnectInfo ConnectionBinaryInOnlyfromOnlyQuery fromQueryNullResultconvert ResultErrorConversionFailedUnexpectedNull Incompatible errSQLTypeerrHaskellType errMessage QueryResultsconvertResults convertErrorParamrenderActionManyEscapePlaininQuotes QueryParams renderParams QueryError qeMessageqeQuery FormatError fmtMessagefmtQuery fmtParams formatQuery formatManyexecuteexecute_ executeManyqueryquery_foldfold_forEachforEach_withTransactionbase Data.StringIsStringbytestring-0.10.4.0Data.ByteString.Internal ByteString $fMonoidQuery$fIsStringQuery $fReadQuery $fShowQuery$fEqNullCompatisText mkCompatsmkCompatcompatokTextok8ok16ok32ok64okWord doConvert incompatibleconversionFailedatto$fResultTimeOfDay $fResultDay$fResultUTCTime $fResult[] $fResultText $fResultText0$fResultByteString$fResultByteString0 $fResultRatio$fResultDouble $fResultFloat$fResultWord64 $fResultWord$fResultWord32$fResultWord16 $fResultWord8$fResultInteger $fResultInt64 $fResultInt $fResultInt32 $fResultInt16 $fResultInt8 $fResultBool $fResultMaybe$fExceptionResultErrorDatabase.MySQL.Base.TypesFieldellipsis$fQueryResults(,,,,,,,,,,,,,,)$fQueryResults(,,,,,,,,,,,,,)$fQueryResults(,,,,,,,,,,,,)$fQueryResults(,,,,,,,,,,,)$fQueryResults(,,,,,,,,,,)$fQueryResults(,,,,,,,,,)$fQueryResults(,,,,,,,,)$fQueryResults(,,,,,,,)$fQueryResults(,,,,,,)$fQueryResults(,,,,,)$fQueryResults(,,,,)$fQueryResults(,,,)$fQueryResults(,,)$fQueryResults(,)$fQueryResultsOnly renderNull$fParamTimeOfDay $fParamDay$fParamUTCTime $fParamText $fParam[] $fParamText0$fParamByteString$fParamByteString0 $fParamDouble $fParamFloat $fParamWord64 $fParamWord $fParamWord32 $fParamWord16 $fParamWord8$fParamInteger $fParamInt64 $fParamInt $fParamInt32 $fParamInt16 $fParamInt8 $fParamBool $fParamNull $fParamBinary$fParamBinary0 $fParamIn $fParamMaybe $fParamAction $fShowAction$fQueryParams[]$fQueryParams(,,,,,,,,,)$fQueryParams(,,,,,,,,)$fQueryParams(,,,,,,,)$fQueryParams(,,,,,,)$fQueryParams(,,,,,)$fQueryParams(,,,,)$fQueryParams(,,,)$fQueryParams(,,)$fQueryParams(,)$fQueryParamsOnly$fQueryParams() buildQuery finishExecute finishQuery finishFold withResultfmtError$fExceptionQueryError$fExceptionFormatError