U e#@sdZddlmZdZddlZddlmZddZd d Zd d Z d dZ ddZ ddZ ddZ ddZddZddZddZd(ddZdd Zd!d"Zd#d$Zd)d&d'ZdS)*z Utilities )print_functionFN) struct_unpackcCszvt|tr|WSt|}|dkr,|dWS|dkrT|dd|}td|dWS|dd|}td|dWSWnYnXdS) z&Unpacks the given buffer to an integerrr +----------+------------------------- | length | a string goes here +----------+------------------------- If the string is bigger than 250, then it looks like this: <- 1b -><- 2/3/8 -> +------+-----------+------------------------- | type | length | a string goes here +------+-----------+------------------------- if type == ü: length is code in next 2 bytes elif type == ý: length is code in next 3 bytes elif type == þ: length is code in next 8 bytes NULL has a special value. If the buffer starts with û then it's a NULL and we return None as value. Returns a tuple (trucated buffer, bytes). rr(rNr!rr)r rlsizeZfstrrrread_lc_strings  r8cCsg}dddd}t|}d}||kr ||}|dkr:dS|dkrV|d|d 7}q|d kr|}|||d ||d |d |7}qd}z ||}Wntk rYdSXt||d ||d }|||d ||||d |d ||7}qt|S) zXReads all length encoded strings from the given buffer Returns a list of bytes r3r!r)r2r4r5rrNr(rr1)r appendKeyErrorrtuple)r Zbyteslstsizesbuf_lenposfirstrr7rrrread_lc_string_lists4     r@cCs|dkr|dkrtd|dk rhz||}Wntk rJtdYnX||dd|d|fS|dk rzt||StddS)zr Reads a string up until a character or for a given size. Returns a tuple (trucated buffer, string). Nz&read_string() needs either end or sizezend byte not present in bufferrrz.read_string() needs either end or size (weird))rindexr0)r endr.idxrrr read_strings rDcCs4zt|d|}WnYnX||d|fS)zMRead an integer from buffer Returns a tuple (truncated buffer, int) rNr6r-rrrread_ints rEcCs|s td|d}|dkr,|dddfS|dkrH|ddt|fS|dkrr|ddtd|dddfS|d kr|d dtd |dd d dfS|d kr|ddtd|dddfStddS)z Takes a buffer and reads an length code string from the start. Returns a tuple with buffer less the integer and the integer read. z Empty buffer.rr(rNr2r!zFsz"_digest_buffer..cSsg|]}dt|qSrI)ordrJrrrrMGs)r strjoin)r rrr_digest_bufferCs rQcCsL|r<|r"|dkr"t|d|}nt|}t|d|n tt|dS)z2Debug function printing output of _digest_buffer()rz: N)rQprint)Zabufferprefixlimitdigestrrr print_bufferIs  rW)NN)NrR)__doc__ __future__rZ__MYSQL_DEBUG__rZcatch23rrrrr"r$r&r'r,r0r8r@rDrErGrQrWrrrrs(        5)