F      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEportable experimental%Bryan O'Sullivan <bos@serpentine.com> :Wrap a mostly-binary string to be escaped in hexadecimal. $Wrap a list of values for use in an IN clause. Replaces a  single "?"1 character with a parenthesized list of rendered  values.  Example: = query c "select * from whatever where id in ?" (In [3,4,5]) A single-value " collection". AThis is useful if you need to supply a single parameter to a SQL 6 query, or extract a single column from a SQL result. Parameter example:  query c " select x from scores where x > ?" ( (42::Int))Result example: xs < - query_ c "select id from users"  forM_ xs $ \( id) -> {- ... -}>A query string. This type is intended to make it difficult to E construct a SQL query by concatenating string fragments, as that is A 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 OverloadedStrings 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 G, and literal Haskell strings B that contain Unicode characters will be correctly transformed to  UTF-8. A placeholder for the SQL NULL value.    portable experimental%Bryan O'Sullivan <bos@serpentine.com>HI.A type that may be converted from a SQL type. (Convert a SQL value to a Haskell value.  Throws a   if conversion fails. =Exception thrown if conversion from a SQL value to a Haskell  value fails. !0The SQL value could not be parsed, or could not 0 be represented as a valid Haskell value, or an 4 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. $%&JKLMNOPQRSTUVW  !"#$%& #"!$%&$%&$%&  #"!$%&$%&$%&!"#$%&portable experimental%Bryan O'Sullivan <bos@serpentine.com>'@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. CThis example instance demonstrates how to convert a two-column row C into a Haskell pair. Each field in the metadata is paired up with 4 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 B constructing the pair. By doing this, we guarantee two important  properties: B Keep resource usage under control by preventing the construction % of potentially long-lived thunks.  Ensure that any   that might arise is thrown A immediately, rather than some place later in application code  that cannot handle it. BYou can also declare Haskell types of your own to be instances of  '.  6data 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 (5Convert values from a row into a Haskell collection. This function will throw a   if conversion of the  collection fails. )Throw a !" exception, indicating a mismatch & between the number of columns in the X 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. 0Number of columns expected for conversion. For 5 instance, if converting to a 3-tuple, the number to  provide here would be 3. Y'()'()'(()portable experimental%Bryan O'Sullivan <bos@serpentine.com>*>A type that may be used as a single parameter to a SQL query. +6Prepare 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. /;Render without escaping or quoting. Use for non-text types  such as numbers, when you are certain that they will not A introduce formatting vulnerabilities via use of characters such  as spaces or "'". Z00Surround a string with single-quote characters: "'" This function does not perform any other escaping. *+,-./0,/.-*+0*++,/.--./0portable experimental%Bryan O'Sullivan <bos@serpentine.com>1>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. 1212122portable experimental%Bryan O'Sullivan <bos@serpentine.com>3Exception thrown if ? is used to perform an INSERT-like  operation, or < is used to perform a SELECT-like operation. [456Exception thrown if a # could not be formatted correctly. ! This may occur if the number of '?' characters in the query : string does not match the number of parameters provided. \789:Format a query string. DThis function is exposed to help with debugging and logging. Do not * use it to prepare queries for execution. DString parameters are escaped according to the character set in use  on the . Throws 6, if the query string could not be formatted  correctly. ;6Format a query string with a variable number of rows. DThis 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 6, 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 60 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 60 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. CWhen processing large results, this function will consume a lot of % client-side memory. Consider using A instead. Exceptions that may be thrown:  65: the query string could not be formatted correctly.  35: 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 B results. Results are streamed incrementally from the server, and  consumed via a left fold. 9The result consumer must be carefully written to execute E quickly. If the consumer is slow, server resources will be tied up, C and other clients may not be able to update the tables from which ! the results are being streamed. @When dealing with small results, it may be simpler (and perhaps  faster) to use ? instead.  This fold is not0 strict. The stream consumer is responsible for < forcing the evaluation of its result to avoid space leaks. Exceptions that may be thrown:  65: the query string could not be formatted correctly.  35: the result contains no columns (i.e. you should be  using < instead of ?).   : result conversion failed. Query template. Query parameters. #Initial state for result consumer. Result consumer. B A version of A+ that does not perform query substitution. Query. #Initial state for result consumer. Result consumer. C A version of A( that does not transform a state value. Query template. Query parameters. Result consumer. D A version of C+ that does not perform query substitution. Query template. Result consumer. _`aE,Execute an action inside a SQL transaction. -This function initiates a transaction with a "begin  transaction"3 statement, then executes the supplied action. If = the action succeeds, the transaction will be completed with   before this function returns. If the action throws any kind of exception (not just a E MySQL-related exception), the transaction will be rolled back using  ', then the exception will be rethrown. b1  $%&3456789:;<=>?@ABCDE7 6789345 $%&$%&$%&?@ABCD<=>E;:345456789789:;<=>?@ABCDEc       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOOPQRSTUVWXYZ[\]^_`a69bcdefghmysql-simple-0.2.2.3Database.MySQL.SimpleDatabase.MySQL.Simple.TypesDatabase.MySQL.Simple.Result"Database.MySQL.Simple.QueryResultsDatabase.MySQL.Simple.Param!Database.MySQL.Simple.QueryParams mysql-0.1.1.3Database.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.9.2.0Data.ByteString.Internal ByteStringCompatisText mkCompatsmkCompatcompatokTextok8ok16ok32ok64okWord doConvert incompatibleconversionFailedattoDatabase.MySQL.Base.TypesFieldellipsis renderNull buildQuery finishExecute finishQuery finishFold withResultfmtError