o
    Šåg2Y  ã                
   @   sð   d dl Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lm	Z	 dd
lmZ
 ddlmZ G dd„ dƒZe	jG dd„ dƒƒZdZd(dd„Zdd„ Zdd„ Zdedefdd„Zdddddd d!d"d#d$œ	Ze  d% d&d'„ eD ƒ¡¡ZdS ))é    Né   )ÚENUM)ÚSET)ÚDATETIME)ÚTIME)Ú	TIMESTAMPé   )Úlog)Útypes)Úutilc                   @   s   e Zd ZdZdd„ ZdS )ÚReflectedStatez;Stores raw information about a SHOW CREATE TABLE statement.c                 C   s(   g | _ i | _d | _g | _g | _g | _d S ©N)ÚcolumnsÚtable_optionsÚ
table_nameÚkeysÚfk_constraintsÚck_constraints)Úself© r   ú`/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/reflection.pyÚ__init__   s   
zReflectedState.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r      s    r   c                   @   s–   e Zd ZdZdd„ Zdd„ Zdedefdd	„Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdZdd„ Zdd„ Zdd „ Zd!d"„ Zd#S )$ÚMySQLTableDefinitionParserz4Parses the results of a SHOW CREATE TABLE statement.c                 C   s   || _ || _|  ¡  d S r   )ÚdialectÚpreparerÚ_prep_regexes)r   r   r   r   r   r   r   &   s   z#MySQLTableDefinitionParser.__init__c                 C   s  t ƒ }||_t d|¡D ]r}| d| jj ¡r|  ||¡ q| d¡r*|  ||¡ q|dkr/q| d¡r;|  	||¡ qd|v rF|  
||¡ q|sIq|  |¡\}}|d u r\t d| ¡ q|dkrg|j |¡ q|d	krr|j |¡ q|d
kr}|j |¡ q	 q|S )Nz\r?\nz  z) ú)zCREATE Ú	PARTITIONzUnknown schema content: %rÚkeyÚfk_constraintÚck_constraint)r   ÚcharsetÚreÚsplitÚ
startswithr   Úinitial_quoteÚ_parse_columnÚ_parse_table_optionsÚ_parse_table_nameÚ_parse_partition_optionsÚ_parse_constraintsr   Úwarnr   Úappendr   r   )r   Úshow_creater%   ÚstateÚlineÚtype_Úspecr   r   r   Úparse+   s4   

z MySQLTableDefinitionParser.parseÚsqlÚreturnc                 C   s   t | j |¡ƒS r   )ÚboolÚ_re_is_viewÚmatch)r   r7   r   r   r   Ú_check_viewM   s   z&MySQLTableDefinitionParser._check_viewc                 C   s6  | j  |¡}|rE| ¡ }|  |d ¡|d< |d r1| j |d ¡}|r1| ¡ d r1| ¡ d |d< |d rA| j |d ¡d |d< d|fS | j |¡}|r{| ¡ }| j |d ¡|d< dd„ |  |d	 ¡D ƒ|d	< d
d„ |  |d ¡D ƒ|d< d|fS | j |¡}|r‹| ¡ }d|fS | j	 |¡}|r—d|fS d|fS )zaParse a KEY or CONSTRAINT line.

        :param line: A line of SHOW CREATE TABLE output
        r   Úversion_sqlÚparserr   r"   Útablec                 S   ó   g | ]}|d  ‘qS ©r   r   ©Ú.0Úcr   r   r   Ú
<listcomp>m   ó    zAMySQLTableDefinitionParser._parse_constraints.<locals>.<listcomp>Úlocalc                 S   r@   rA   r   rB   r   r   r   rE   n   s    ÿÚforeignr#   r$   Ú	partitionN)
Ú_re_keyr;   Ú	groupdictÚ_parse_keyexprsÚ_re_key_version_sqlr   Úunformat_identifiersÚ_re_fk_constraintÚ_re_ck_constraintÚ_re_partition)r   r3   Úmr5   Úm2r   r   r   r.   P   s@   ÿþ
ÿz-MySQLTableDefinitionParser._parse_constraintsc                 C   s0   | j \}}| |¡}|r|| d¡ƒ|_dS dS )zZExtract the table name.

        :param line: The first line of SHOW CREATE TABLE
        ÚnameN)Ú_pr_namer;   Úgroupr   )r   r3   r2   ÚregexÚcleanuprR   r   r   r   r,   ‚   s
   

ÿz,MySQLTableDefinitionParser._parse_table_namec                 C   s°   i }|r7|dkr7|}| j D ])\}}| |¡}|sq| d¡| d¡}}	|r*||	ƒ}	|	|| ¡ < | d|¡}qdD ]}
| |
d¡ q9| ¡ D ]\}}||jd| jj	|f < qFdS )zƒBuild a dictionary of all reflected table-level options.

        :param line: The final line of SHOW CREATE TABLE output.
        r    Ú	directiveÚvalÚ )Úauto_incrementzdata directoryzindex directoryNú%s_%s)
Ú_pr_optionsÚsearchrV   ÚlowerÚsubÚpopÚitemsr   r   rT   )r   r3   r2   ÚoptionsÚrest_of_linerW   rX   rR   rY   ÚvalueÚnopeÚoptrZ   r   r   r   r+   �   s"   
ÿz/MySQLTableDefinitionParser._parse_table_optionsc                 C   sÈ  i }|d d … }|  d¡s|  d¡r"|dd … }|  d¡s|  d¡s| jD ]|\}}| |¡}|r5d|jvr6q%| d¡}| ¡ }|dk}	|dksI|	rŒ| dd	¡}| d
d	¡}|	rb| d¡rb|d d… }| jj	dkr| d¡rd|v syd|v syd|v r|d d… }d| jj	|f }
|||
< n| dd¡}| d¡}|r�||ƒ}|||<  | 
¡ D ];\}}d| jj	 }d| jj	 }||ks¾||krÖ||jvrÉ||j|< q¦d|j| |f |j|< q¦||jd| jj	|f < q¦d S )Nú(ú r   r!   rY   ÚsubpartitionrI   z) */r[   ú,r    éÿÿÿÿÚmariadbÚMAXVALUEÚMINVALUEÚENGINEz%s_%s_definitionsÚ_rZ   z%s_partition_definitionsz%s_subpartition_definitionsz%s, %sr]   )r(   r^   r_   ÚpatternrV   r`   ÚreplaceÚendswithr   rT   rc   r   )r   r3   r2   rd   Únew_linerW   rX   rR   rY   Úis_subpartitionÚdefsrf   rh   rZ   Úpart_defÚsubpart_defr   r   r   r-   §   sT   ÿ




þóz3MySQLTableDefinitionParser._parse_partition_optionsc                 C   sÒ  d}| j  |¡}|r| ¡ }d|d< n| j |¡}|r#| ¡ }d|d< |s.t d| ¡ dS |d s9t d| ¡ |d |d |d	 }}}z| jj| }W n tyd   t d
||f ¡ t	j
}Y nw |du sm|dkrpg }	n|d dkrƒ|d dkrƒ| j |¡}	ndd„ | j |¡D ƒ}	i }
t|tttfƒr¡|	r¡|	 d¡|
d< dD ]}| |d¡r¯d|
|< q£dD ]}| |d¡rÀ|| |
|< q²t|ttfƒrÙt|	ƒ}	t|tƒrÙd|	v rÙd|
d< ||	i |
¤Ž}i }d|d< | dd¡dkròd|d< | dd¡dkrþd|d< | dd¡�r
d|d< nt|t	jƒ�rd|d< | dd¡}|dk�r"d}| dd¡}|du�r1t|ƒ}| d¡}|du�rTt|d�}| d ¡}|du�rP|d!k|d"< ||d#< t||||d$�}| |¡ |j |¡ dS )%z­Extract column details.

        Falls back to a 'minimal support' variant if full parse fails.

        :param line: Any column-bearing line from SHOW CREATE TABLE
        NTÚfullFzUnknown column definition %rz-Incomplete reflection of column definition %rrT   ÚcoltypeÚargz*Did not recognize type '%s' of column '%s'r[   r   ú'rm   c                 S   s   g | ]}t |ƒ‘qS r   ©Úint)rC   Úvr   r   r   rE     rF   z<MySQLTableDefinitionParser._parse_column.<locals>.<listcomp>Úfsp)ÚunsignedÚzerofill)r%   ÚcollateÚretrieve_as_bitwiseÚnullableÚnotnullúNOT NULLÚnotnull_generatedÚautoincrÚautoincrementÚdefaultÚNULLÚcommentÚ	generated)ÚsqltextÚpersistenceÚSTOREDÚ	persistedÚcomputed)rT   Útyper�   r�   )Ú
_re_columnr;   rK   Ú_re_column_looser   r/   r   Úischema_namesÚKeyErrorÚsqltypesÚNullTypeÚ_re_csv_strÚfindallÚ_re_csv_intÚ
issubclassr   r   r   rb   Úgetr   r   Ú_strip_valuesÚIntegerÚcleanup_textÚdictÚupdater   r0   )r   r3   r2   r5   rR   rT   r4   ÚargsÚcol_typeÚ	type_argsÚtype_kwÚkwÚtype_instanceÚcol_kwr�   r�   r‘   r•   r”   Úcol_dr   r   r   r*   ß   s’   

ÿ
ü€€







ÿ
z(MySQLTableDefinitionParser._parse_columnc           
         s  g }|D ]r‰ ‡ fdd„dD ƒ\}}}}}dg}	|	  | j |¡¡ |	  |¡ |s,|	  d¡ |rgd|v r3n4| d¡rH| d¡rH|	  d	¡ |	  |¡ n|d
krW|	  d	¡ |	  |¡ n|	  d	¡ |	  d| dd¡ ¡ |rn|	  |¡ |  d |	¡¡ qd d| j |¡ d |¡dg¡S )až  Re-format DESCRIBE output as a SHOW CREATE TABLE string.

        DESCRIBE is a much simpler reflection and is sufficient for
        reflecting views for runtime use.  This method formats DDL
        for columns only- keys are omitted.

        :param columns: A sequence of DESCRIBE or SHOW COLUMNS 6-tuples.
          SHOW FULL COLUMNS FROM rows must be rearranged for use with
          this function.
        c                 3   s   � | ]}ˆ | V  qd S r   r   )rC   Úi©Úrowr   r   Ú	<genexpr>W  s   € 
ÿzAMySQLTableDefinitionParser._describe_to_create.<locals>.<genexpr>)r   r   é   é   é   rj   r‰   r\   Ú	timestampÚCÚDEFAULTrŽ   z'%s'r~   ú''r[   zCREATE TABLE %s (
z,
z
) )r0   r   Úquote_identifierr(   rt   Újoin)
r   r   r   ÚbufferrT   r¨   r‡   r�   Úextrar3   r   r°   r   Ú_describe_to_createI  sD   
ÿ

ÿ




ÿúÿz.MySQLTableDefinitionParser._describe_to_createc                 C   s   dd„ | j  |¡D ƒS )z8Unpack '"col"(2),"col" ASC'-ish strings into components.c                 S   s(   g | ]\}}}||rt |ƒnd |f‘qS r   r   )rC   ÚcolnameÚlengthÚ	modifiersr   r   r   rE   �  s    ÿÿz>MySQLTableDefinitionParser._parse_keyexprs.<locals>.<listcomp>)Ú_re_keyexprsrž   )r   Úidentifiersr   r   r   rL   ~  s
   ÿþz*MySQLTableDefinitionParser._parse_keyexprsc              	   C   sL  g | _ g | _| jj}ttddd„ | jj|| j |¡fD ƒƒƒ}td| | jj	ƒ| _
tdƒ| _td| ƒ| _tdƒ| _tdƒ| _td	| ƒ| _td
| ƒ| _td| ƒ| _tdƒ| _| ¡ }d|d< td| ƒ| _td| ƒ| _tdƒ| _tD ]}|  |¡ qvdD ]}|  |¡ q€dD ]}|  |¡ qŠ|  dd¡ |  dd¡ |  dd¡ dS )z Pre-compile regular expressions.)ÚiqÚfqÚesc_fqc                 S   s   g | ]}t  |¡‘qS r   ©r&   Úescape)rC   Úsr   r   r   rE   “  s    ÿÿz<MySQLTableDefinitionParser._prep_regexes.<locals>.<listcomp>zM^CREATE (?:\w+ +)?TABLE +%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +\($z^CREATE(?! TABLE)(\s.*)?\sVIEWzW(?:(?:%(iq)s((?:%(esc_fq)s|[^%(fq)s])+)%(fq)s)(?:\((\d+)\))?(?: +(ASC|DESC))?(?=\,|$))+z\x27(?:\x27\x27|[^\x27])*\x27z\d+a°    %(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +(?P<coltype>\w+)(?:\((?P<arg>(?:\d+|\d+,\d+|(?:'(?:''|[^'])*',?)+))\))?(?: +(?P<unsigned>UNSIGNED))?(?: +(?P<zerofill>ZEROFILL))?(?: +CHARACTER SET +(?P<charset>[\w_]+))?(?: +COLLATE +(?P<collate>[\w_]+))?(?: +(?P<notnull>(?:NOT )?NULL))?(?: +DEFAULT +(?P<default>(?:NULL|'(?:''|[^'])*'|[\-\w\.\(\)]+(?: +ON UPDATE [\-\w\.\(\)]+)?)))?(?: +(?:GENERATED ALWAYS)? ?AS +(?P<generated>\(.*\))? ?(?P<persistence>VIRTUAL|STORED)?(?: +(?P<notnull_generated>(?:NOT )?NULL))?)?(?: +(?P<autoincr>AUTO_INCREMENT))?(?: +COMMENT +'(?P<comment>(?:''|[^'])*)')?(?: +COLUMN_FORMAT +(?P<colfmt>\w+))?(?: +STORAGE +(?P<storage>\w+))?(?: +(?P<extra>.*))?,?$zŸ  %(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +(?P<coltype>\w+)(?:\((?P<arg>(?:\d+|\d+,\d+|\x27(?:\x27\x27|[^\x27])+\x27))\))?.*?(?P<notnull>(?:NOT )NULL)?aX    (?:(?P<type>\S+) )?KEY(?: +%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s)?(?: +USING +(?P<using_pre>\S+))? +\((?P<columns>.+?)\)(?: +USING +(?P<using_post>\S+))?(?: +KEY_BLOCK_SIZE *[ =]? *(?P<keyblock>\S+))?(?: +WITH PARSER +(?P<parser>\S+))?(?: +COMMENT +(?P<comment>(\x27\x27|\x27([^\x27])*?\x27)+))?(?: +/\*(?P<version_sql>.+)\*/ *)?,?$z+\!\d+ (?: *WITH PARSER +(?P<parser>\S+) *)?z/RESTRICT|CASCADE|SET NULL|NO ACTION|SET DEFAULTÚonaJ    CONSTRAINT +%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +FOREIGN KEY +\((?P<local>[^\)]+?)\) REFERENCES +(?P<table>%(iq)s[^%(fq)s]+%(fq)s(?:\.%(iq)s[^%(fq)s]+%(fq)s)?) +\((?P<foreign>(?:%(iq)s[^%(fq)s]+%(fq)s(?: *, *)?)+)\)(?: +(?P<match>MATCH \w+))?(?: +ON DELETE (?P<ondelete>%(on)s))?(?: +ON UPDATE (?P<onupdate>%(on)s))?z[  CONSTRAINT +%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +CHECK +\((?P<sqltext>.+)\),?z(?:.*)(?:SUB)?PARTITION(?:.*))rq   ÚTYPEÚAUTO_INCREMENTÚAVG_ROW_LENGTHzCHARACTER SETzDEFAULT CHARSETÚCHECKSUMÚCOLLATEÚDELAY_KEY_WRITEÚINSERT_METHODÚMAX_ROWSÚMIN_ROWSÚ	PACK_KEYSÚ
ROW_FORMATÚKEY_BLOCK_SIZEÚSTATS_SAMPLE_PAGES)úPARTITION BYúSUBPARTITION BYÚ
PARTITIONSÚSUBPARTITIONSr!   ÚSUBPARTITIONÚUNIONz
\([^\)]+\)Ú
TABLESPACEz.*? STORAGE DISKÚ	RAID_TYPEz4\w+\s+RAID_CHUNKS\s*\=\s*\w+RAID_CHUNKSIZE\s*=\s*\w+N)Ú_re_columnsr^   r   Úfinal_quoter¥   Úzipr)   Ú_escape_identifierÚ_pr_compileÚ_unescape_identifierrU   Ú_re_compiler:   rÂ   r�   rŸ   r—   r˜   rJ   rM   ÚcopyrO   rP   rQ   Ú_options_of_type_stringÚ_add_option_stringÚ_add_option_wordÚ_add_partition_option_wordÚ_add_option_regex)r   Ú_finalÚquotesr«   Úoptionr   r   r   r   ˆ  sŽ   
ýþþÿÿý
þÿ

éÿüÿ
öÿÿ

öÿüÿ
þz(MySQLTableDefinitionParser._prep_regexesz(?:\s*(?:=\s*)|\s+)c                 C   s*   dt  |¡| jf }| j t|tƒ¡ d S )Nz0(?P<directive>%s)%s'(?P<val>(?:[^']|'')*?)'(?!'))r&   rÈ   Ú_optional_equalsr^   r0   rä   r¤   ©r   rY   rW   r   r   r   ré   I  s
   þz-MySQLTableDefinitionParser._add_option_stringc                 C   s(   dt  |¡| jf }| j t|ƒ¡ d S )Nz(?P<directive>%s)%s(?P<val>\w+)©r&   rÈ   rð   r^   r0   rä   rñ   r   r   r   rê   P  s
   þz+MySQLTableDefinitionParser._add_option_wordc                 C   sp   |dks|dkrdt  |¡| jf }n|dks|dkr&dt  |¡| jf }ndt  |¡f }| j t|ƒ¡ d S )NrØ   rÙ   z((?<!\S)(?P<directive>%s)%s(?P<val>\w+.*)rÛ   rÚ   z&(?<!\S)(?P<directive>%s)%s(?P<val>\d+)z(?<!\S)(?P<directive>%s)(?!\S)rò   rñ   r   r   r   rë   W  s   þþz5MySQLTableDefinitionParser._add_partition_option_wordc                 C   s*   dt  |¡| j|f }| j t|ƒ¡ d S )Nz(?P<directive>%s)%s(?P<val>%s)rò   rñ   r   r   r   rì   f  s   ýz,MySQLTableDefinitionParser._add_option_regexN)r   r   r   r   r   r6   Ústrr9   r<   r.   r,   r+   r-   r*   r¾   rL   r   rð   ré   rê   rë   rì   r   r   r   r   r   "   s&    "28j5
 @r   )ÚCOMMENTzDATA DIRECTORYzINDEX DIRECTORYÚPASSWORDÚ
CONNECTIONc                 C   s   t | ƒ|fS )z1Prepare a 2-tuple of compiled regex and callable.)ræ   )rW   rX   r   r   r   rä   x  s   rä   c                 C   s   t  | t jt jB ¡S )z)Compile a string to regex, I and UNICODE.)r&   ÚcompileÚIÚUNICODE)rW   r   r   r   ræ   ~  s   ræ   c                 C   s\   g }| D ]'}|dd… dks|dd… dkr&|dd…   |d d |d ¡}| |¡ q|S )zStrip reflected values quotesr   r   ú"r~   rm   r³   )rt   r0   )ÚvaluesÚstrip_valuesÚar   r   r   r¢   „  s     r¢   Úraw_textr8   c                 C   s&   d| v rt  tdd„ | ¡} |  dd¡S )Nú\c                 S   s   t | d  S )Nr   )Ú_control_char_map)rÉ   r   r   r   Ú<lambda>’  s    zcleanup_text.<locals>.<lambda>r¹   r~   )r&   ra   Ú_control_char_regexprt   )rþ   r   r   r   r¤   �  s
   
ÿr¤   rÿ   ú úúú	Ú
úúú)	z\\z\0z\az\bz\tz\nz\vz\fz\rú|c                 c   s   � | ]}t  |¡V  qd S r   rÇ   )rC   Úkr   r   r   r²   ¤  s   € r²   r   )r&   Ú
enumeratedr   r   r
   r   r   r   r[   r	   r›   r   r   Úclass_loggerr   rè   rä   ræ   r¢   ró   r¤   r   r÷   r»   r  r   r   r   r   Ú<module>   sD   	    P
		÷ÿ