3 $c$,@sddlZddlmZddlZddlZddlmZddlmZdIddZ dJdd Z dKd d Z dLd d Z dMddZ dNddZdOddZddedDZded<deed<deed<deed<deed<d eed!<d"eed#<dPd$d%ZdQd&d'ZdRd(d)ZdSd*d+ZdTd,d-ZdUd.d/ZdVd0d1ZdWd2d3ZdXd4d5ZdYd6d7Zd8d9Zd:d;Zejd<Z d=d>Z!ejd?Z"d@dAZ#ejdBZ$dCdDZ%dEdFZ&dGdHZ'e'Z(e)e e*ee+ee,ee-ee.e e/e e0e e1e e2e e3deej4eejeej5eejeej6eeeiZ7ej8e(ej9e*ej:e*ej;e*eje*ej?e*ej@e*ejAe!ejBe!ejCe#ejDe&ejEe'ejFe'ejGe'ejHe'ejIe'ejJe'ejKe'ejLeejMeiZNe7jOZPePjQeNeZRdS)ZN)Decimal)ProgrammingError) FIELD_TYPEc Csp|dkr t}|jt|}|sHy |t}Wntk rFtdYnX|ttfkrb||||}n |||}|S)Nz!no default type converter defined)encodersgettypestrKeyError TypeError escape_dictescape_sequence)valcharsetmappingencoderr9/tmp/pip-target-ebskqzh7/lib/python/pymysql/converters.py escape_item s   rcCs2i}x(|jD]\}}t|||}|||<qW|S)N)itemsr)rrrnkvquotedrrrr s   r cCs:g}x"|D]}t|||}|j|q Wddj|dS)N(,))rappendjoin)rrrritemrrrrr %s   r csdjfdd|DS)Nrcsg|]}t|qSr)r).0x)rrrr .szescape_set..)r)rrrr)rrr escape_set-sr#cCs tt|S)N)r int)valuerrrr escape_bool1sr&cCst|S)N)r )r%rrrr escape_int5sr'cCs0t|}|dkrtd|d|kr,|d7}|S)Ninfnanz%s can not be used with MySQLeZe0)r(r))reprr)r%rsrrr escape_float9s  r-cCsg|] }t|qSr)chr)r r!rrrr"Bsr"z\0z\\\z\n z\r z\Zz\""z\''cCs |jtS)zGescapes *value* without adding quote. Value should be unicode ) translate _escape_table)r%rrrr escape_stringLsr8cCsd|jddjtS)Nz _binary'%s'asciisurrogateescape)decoder6r7)r%rrrrescape_bytes_prefixedTsr<cCsd|jddjtS)Nz'%s'r9r:)r;r6r7)r%rrrr escape_bytesZsr=cCsdtt||S)Nz'%s')r8r )r%rrrr escape_str^sr>cCsdS)NZNULLr)r%rrrr escape_Nonebsr?cCsbt|jd}t|jdd}t|jddt|jd}|jrLd}nd}|j||||jS)N<iz!'{0:02d}:{1:02d}:{2:02d}.{3:06d}'z'{0:02d}:{1:02d}:{2:02d}')r$secondsdays microsecondsformat)objrrBminuteshoursfmtrrrescape_timedeltafs rJcCs|jr d}nd}|j|S)Nz<'{0.hour:02}:{0.minute:02}:{0.second:02}.{0.microsecond:06}'z)'{0.hour:02}:{0.minute:02}:{0.second:02}') microsecondrE)rFrrIrrr escape_timeqsrLcCs|jr d}nd}|j|S)Nz`'{0.year:04}-{0.month:02}-{0.day:02} {0.hour:02}:{0.minute:02}:{0.second:02}.{0.microsecond:06}'zM'{0.year:04}-{0.month:02}-{0.day:02} {0.hour:02}:{0.minute:02}:{0.second:02}')rKrE)rFrrIrrrescape_datetimeysrMcCsd}|j|S)Nz%'{0.year:04}-{0.month:02}-{0.day:02}')rE)rFrrIrrr escape_datesrNcCsttj|ddS)N)rMdatetime)rFrrrrescape_struct_timesrQcCs t|dS)Nf)rE)odrrrDecimal2LiteralsrUcCs$|sdS|jdd}t|ddS)NrrO0)ljustr$)r,rrr_convert_second_fractions rXzM(\d{1,4})-(\d{1,2})-(\d{1,2})[T ](\d{1,2}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?c Cs|t|ttfr|jd}tj|}|s.t|Sy0t|j}t |d|d<t j dd|DSt k rvt|SXdS)aReturns a DATETIME or TIMESTAMP column value as a datetime object: >>> datetime_or_None('2007-02-25 23:06:20') datetime.datetime(2007, 2, 25, 23, 6, 20) >>> datetime_or_None('2007-02-25T23:06:20') datetime.datetime(2007, 2, 25, 23, 6, 20) Illegal values are returned as None: >>> datetime_or_None('2007-02-31T23:06:20') is None True >>> datetime_or_None('0000-00-00 00:00:00') is None True r9rcSsg|] }t|qSr)r$)r r!rrrr"sz$convert_datetime..NrY) isinstancebytes bytearrayr; DATETIME_REmatch convert_datelistgroupsrXrP ValueError)rFmrarrrconvert_datetimes   rdz0(-)?(\d{1,3}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?c Cst|ttfr|jd}tj|}|s*|Syjt|j}t|d|d<|drTdnd}|dd\}}}}t j t |t |t |t |d|}|St k r|SXdS) aReturns a TIME column as a timedelta object: >>> timedelta_or_None('25:06:17') datetime.timedelta(1, 3977) >>> timedelta_or_None('-25:06:17') datetime.timedelta(-2, 83177) Illegal values are returned as None: >>> timedelta_or_None('random crap') is None True Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but can accept values as (+|-)DD HH:MM:SS. The latter format will not be parsed correctly by this function. r9rrN)rHrGrBrDrYrYrY) rZr[r\r; TIMEDELTA_REr^r`rarXrP timedeltar$rb) rFrcranegaterHrGrBrDZtdeltarrrconvert_timedeltas&    rhz,(\d{1,2}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?c Cst|ttfr|jd}tj|}|s*|SyJt|j}t|d|d<|\}}}}t j t |t |t |t |dSt k r|SXdS)aReturns a TIME column as a time object: >>> time_or_None('15:06:17') datetime.time(15, 6, 17) Illegal values are returned as None: >>> time_or_None('-25:06:17') is None True >>> time_or_None('random crap') is None True Note that MySQL always returns TIME columns as (+|-)HH:MM:SS, but can accept values as (+|-)DD HH:MM:SS. The latter format will not be parsed correctly by this function. Also note that MySQL's TIME column corresponds more closely to Python's timedelta and not time. However if you want TIME columns to be treated as time-of-day and not a time offset, then you can use set this function as the converter for FIELD_TYPE.TIME. r9r)hourminutesecondrKNrYrY) rZr[r\r;TIME_REr^r`rarXrPtimer$rb)rFrcrarHrGrBrDrrr convert_times      rnc CsNt|ttfr|jd}ytjdd|jddDStk rH|SXdS)aReturns a DATE column as a date object: >>> date_or_None('2007-02-26') datetime.date(2007, 2, 26) Illegal values are returned as None: >>> date_or_None('2007-02-31') is None True >>> date_or_None('0000-00-00') is None True r9cSsg|] }t|qSr)r$)r r!rrrr"(sz convert_date..-N)rZr[r\r;rPdatesplitrb)rFrrrr_s  r_cCs|S)Nr)r!rrrthrough-srs)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)SrPdecimalrrermerrr constantsrrr r r#r&r'r-ranger7ordr8r<r=r>r?rJrLrMrNrQrUrXcompiler]rdrerhrlrnr_rsZ convert_bitboolr$floatr r[tupler`set frozensetdictrrqrf struct_timerZBITZTINYZSHORTLONGFLOATZDOUBLEZLONGLONGZINT24ZYEARZ TIMESTAMPZDATETIMEZTIMEZDATEZBLOBZ TINY_BLOBZ MEDIUM_BLOBZ LONG_BLOBSTRINGZ VAR_STRINGZVARCHARZDECIMALZ NEWDECIMALZdecoderscopyZ conversionsupdateZ Thing2Literalrrrrs                          , +