o {nh/ @sddlmZmZmZmZmZmZddlZddlm Z ddl Z ddl Z ddl m Z mZddlmZmZdWddZdWd d ZdWd d ZdWd dZdWddZdWddZdWddZdWddZddedDZded<deed<deed<deed <d!eed"<d#eed$<d%eed&<dWd'd(ZerdWd)d*ZdWd+d,ZdWd-d.Z neZed/ded0d1DZ!dWd2d,ZdWd3d.Z dWd4d5Z"dWd6d7Z#dWd8d9Z$dWd:d;Z%dWdd?Z'dWd@dAZ(dWdBdCZ)dDdEZ*e +dFZ,dGdHZ-e +dIZ.dJdKZ/e +dLZ0dMdNZ1dOdPZ2dQdRZ3dSdTZ4dUdVZ5e5Z6ie7ee8eeee9ee:e#ee"e;eeee?ee@de$ejAe(eje'ejBe%ej e&e jCe)e eiZDer\es\er`e eDeE<ie jFe6e jGe8e jHe8e jIe8e jJe9e jKe9e jLe8e jMe8e jNe8e jOe3e jPe-e jQe/e jRe2e jSe4e jTe5e jUe5e jVe5e jWe5e jXe5e jYe5e jZe5e j[e e j\e iZ]eD^Z_e_`e]e#ZadS)X)PY2 text_type long_typeJYTHON IRONPYTHONunichrN)Decimal) FIELD_TYPEFLAG) charset_by_idcharset_to_encodingcCsl|durt}|t|}|s!z|t}Wn ty tdw|ttfvr/||||}|S|||}|S)Nz!no default type converter defined)encodersgettyperKeyError TypeError escape_dictescape_sequence)valcharsetmappingencoderr=/usr/local/lib/python3.10/dist-packages/pymysql/converters.py escape_item s     rcCs.i}|D]\}}t|||}|||<q|SN)itemsr)rrrnkvquotedrrrrs   rcCs6g}|D] }t|||}||qdd|dS)N(,))rappendjoin)rrrritemr!rrrr%s   rcsdfdd|DS)Nr#csg|]}t|qSr)r.0xrrrr -szescape_set..)r&)rrrrr+r escape_set,sr-cCs tt|Sr)strintvaluerrrr escape_bool/ r2cCt|Srr.r0rrr escape_object2r6cCr4rr5r0rrr escape_int5r7r8cCsd|S)Nz%.15grr0rrr escape_float8r7r9cCg|]}t|qSr)rr(rrrr,;r,\0\\\\n \r \Z\""\''cCs |tS)zGescapes *value* without adding quote. Value should be unicode ) translate _escape_tabler0rrr_escape_unicodeDs rLcCs|t|tr t|St|ttfsJ|dd}|dd}|dd}|dd}|d d }|d d }|d d}|S)zrescape_string escapes *value* but not surround it with quotes. Value should be bytes or unicode. r?r>r=rAr@rCrBrErDrIrHrGrF) isinstanceunicoderLbytes bytearrayreplacer0rrr escape_stringLs        rScCt|ttfs Jdt|S)Ns _binary'%s'rNrPrQrSr0rrrescape_bytes_prefixed] rVcCrT)Ns'%s'rUr0rrr escape_bytesarWrXcCr:r)chr)r)irrrr,lr;iicCd|dtS)Nz _binary'%s'latin1decoderJ_escape_bytes_tabler0rrrrVncCr[)N'%s'r\r]r0rrrrXqr`cCs dt|SNra)rLr0rrrescape_unicodeur3rccCsdtt||Srb)rSr.r0rrr escape_strxsrdcCsdS)NNULLrr0rrr escape_None{rfcCsbt|jd}t|jdd}t|jddt|jd}|jr&d}nd}|||||jS)N<iz!'{0:02d}:{1:02d}:{2:02d}.{3:06d}'z'{0:02d}:{1:02d}:{2:02d}')r/secondsdays microsecondsformat)objrrjminuteshoursfmtrrrescape_timedelta~s rrcC|jrd}nd}||S)Nz<'{0.hour:02}:{0.minute:02}:{0.second:02}.{0.microsecond:06}'z)'{0.hour:02}:{0.minute:02}:{0.second:02}' microsecondrmrnrrqrrr escape_time rwcCrs)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}'rtrvrrrescape_datetimerxrycCsd}||S)Nz%'{0.year:04}-{0.month:02}-{0.day:02}')rmrvrrr escape_dates rzcCsttj|ddS)N)rydatetime)rnrrrrescape_struct_timesr}cCs$|sdS|dd}t|ddS)Nrr{0)ljustr/srrr_convert_second_fractions rzM(\d{1,4})-(\d{1,2})-(\d{1,2})[T ](\d{1,2}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?cCstst|ttfr|d}t|}|st|Szt| }t |d|d<t j dd|DWSt y?t|YSw)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 asciicSr:rr/r(rrrr,r;z$convert_datetime..) rrNrPrQr^ DATETIME_REmatch convert_datelistgroupsrr| ValueError)rnmrrrrconvert_datetimes     rz0(-)?(\d{1,3}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?c Cstst|ttfr|d}t|}|s|Sz6t|}t |d|d<|dr,dnd}|dd\}}}}t j t |t |t |t |d|}|WSt yX|YSw)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. rrrrN)rprorjrl)rrNrPrQr^ TIMEDELTA_RErrrrr| timedeltar/r) rnrrnegaterprorjrltdeltarrrconvert_timedeltas,    rz,(\d{1,2}):(\d{1,2}):(\d{1,2})(?:.(\d{1,6}))?cCstst|ttfr|d}t|}|s|Sz&t|}t |d|d<|\}}}}t j t |t |t |t |dWSt yH|YSw)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. rr)hourminutesecondru)rrNrPrQr^TIME_RErrrrr|timer/r)rnrrrprorjrlrrr convert_times      rcCsRtst|ttfr|d}ztjdd|ddDWSty(|YSw)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 rcSr:rrr(rrrr,+r;z convert_date..-) rrNrPrQr^r|datesplitr)rnrrrrs  rc Cstst|ttfr|d}|ddkrt|S|ddt|7}t|ddt|ddt|ddt|dd t|d d t|d df\}}}}}}z t||||||WSt yj|YSw) a@Convert a MySQL TIMESTAMP to a Timestamp object. MySQL >= 4.1 returns TIMESTAMP in the same format as DATETIME: >>> mysql_timestamp_converter('2007-02-25 22:32:17') datetime.datetime(2007, 2, 25, 22, 32, 17) MySQL < 4.1 uses a big string of numbers: >>> mysql_timestamp_converter('20070225223217') datetime.datetime(2007, 2, 25, 22, 32, 17) Illegal values are returned as None: >>> mysql_timestamp_converter('2007-02-31 22:32:17') is None True >>> mysql_timestamp_converter('00000000000000') is None True rrr~Nr{ ) rrNrPrQr^rlenr/r|r) timestampyearmonthdayrrrrrrconvert_mysql_timestamp0s  ** rcCs*t|ttfrt|dSt|dS)N,r#)rNrPrQsetrrrrr convert_setRsrcCs|Srr)r*rrrthroughXrgrr)b_compatrrrrrrr|decimalr rer constantsr r rr r rrrr-r2r6r8r9rangerKordrLrSrVrXr_rcrdrfrrrwryrzr}rcompilerrrrrrrrrr convert_bitboolr/floatr.tuplerr frozensetdictrrr struct_timerrPBITTINYSHORTLONGFLOATDOUBLELONGLONGINT24YEAR TIMESTAMPDATETIMETIMEDATESETBLOB TINY_BLOB MEDIUM_BLOB LONG_BLOBSTRING VAR_STRINGVARCHARDECIMAL NEWDECIMALdecoderscopy conversionsupdate Thing2Literalrrrrs                                ('"