o
    y¬´\ÒB  ã                   @   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eƒZe	jG dd„ deƒƒZdZddd„Zdd„ ZdS )é    Né   )Ú_EnumeratedValues)Ú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   úV/var/www/html/env/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                   @   st   e Zd Z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d„ Z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 ]g}| d| jj ¡r|  ||¡ q| d¡r*|  ||¡ q|dkr/q| d¡r;|  	||¡ q|s>q|  
|¡\}}|d u rQt d| ¡ q|dkr\|j |¡ q|dkrg|j |¡ q|d	krr|j |¡ q	 q|S )
Nz\r?\nz  z) ú)zCREATE z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_constraintsr   Úwarnr   Úappendr   r   )r   Úshow_creater$   ÚstateÚlineÚtype_Úspecr   r   r   Úparse)   s0   

z MySQLTableDefinitionParser.parsec                 C   sÞ   | j  |¡}|r| ¡ }|  |d ¡|d< d|fS | j |¡}|rO| ¡ }| j |d ¡|d< dd„ |  |d ¡D ƒ|d< dd„ |  |d ¡D ƒ|d< d	|fS | j |¡}|r_| ¡ }d
|fS | j |¡}|rkd|fS d|fS )zaParse a KEY or CONSTRAINT line.

        :param line: A line of SHOW CREATE TABLE output
        r   r!   Útablec                 S   ó   g | ]}|d  ‘qS ©r   r   ©Ú.0Úcr   r   r   Ú
<listcomp>^   ó    zAMySQLTableDefinitionParser._parse_constraints.<locals>.<listcomp>Úlocalc                 S   r6   r7   r   r8   r   r   r   r;   _   ó    ÿÚforeignr"   r#   Ú	partitionN)	Ú_re_keyÚmatchÚ	groupdictÚ_parse_keyexprsÚ_re_fk_constraintr   Úunformat_identifiersÚ_re_ck_constraintÚ_re_partition)r   r1   Úmr3   r   r   r   r,   I   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_namerB   Úgroupr   )r   r1   r0   ÚregexÚcleanuprI   r   r   r   r+   s   s
   

ÿz,MySQLTableDefinitionParser._parse_table_namec                 C   sº   i }|r|dkr	n3|dd… }| j D ])\}}| |¡}|sq| d¡| d¡}}	|r/||	ƒ}	|	|| ¡ < | d|¡}qdD ]}
| |
d¡ q>| ¡ D ]\}}||jd| jj	|f < qKdS )zƒBuild a dictionary of all reflected table-level options.

        :param line: The final line of SHOW CREATE TABLE output.
        r    NÚ	directiveÚvalÚ )Úauto_incrementzdata directoryzindex directoryz%s_%s)
Ú_pr_optionsÚsearchrL   ÚlowerÚsubÚpopÚitemsr   r   rJ   )r   r1   r0   ÚoptionsÚrest_of_linerM   rN   rI   rO   ÚvalueÚnopeÚoptrP   r   r   r   r*   ~   s$   
ÿz/MySQLTableDefinitionParser._parse_table_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ƒrØt |	¡}	t|tƒrØd|	v rØd|
d< ||	i |
¤Ž}i }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�r)| dd¡ 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 %rrJ   ÚcoltypeÚargz*Did not recognize type '%s' of column '%s'rQ   r   ú'éÿÿÿÿc                 S   s   g | ]}t |ƒ‘qS r   )Úint)r9   Úvr   r   r   r;   Ã   r<   z<MySQLTableDefinitionParser._parse_column.<locals>.<listcomp>Úfsp)ÚunsignedÚzerofill)r$   ÚcollateÚretrieve_as_bitwiseÚnullableÚnotnullúNOT NULLÚautoincrÚautoincrementÚdefaultÚNULLÚcommentú\\ú\ú'')rJ   Útypero   rq   )Ú
_re_columnrB   rC   Ú_re_column_looser   r-   r   Úischema_namesÚKeyErrorÚsqltypesÚNullTypeÚ_re_csv_strÚfindallÚ_re_csv_intÚ
issubclassr   r   r   rW   Úgetr   Ú_strip_valuesr   ÚIntegerÚreplaceÚdictÚupdater   r.   )r   r1   r0   r3   rI   rJ   r2   ÚargsÚcol_typeÚ	type_argsÚtype_kwÚkwÚtype_instanceÚcol_kwro   rq   Ú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                    s   g | ]}ˆ | ‘qS r   r   )r9   Úi©Úrowr   r   r;     r>   zBMySQLTableDefinitionParser._describe_to_create.<locals>.<listcomp>)r   r   é   é   é   ú rl   rR   Ú	timestampÚCÚDEFAULTrp   z'%s'ra   rt   rQ   zCREATE TABLE %s (
z,
z
) )r.   r   Úquote_identifierr'   rƒ   Újoin)
r   r   r   ÚbufferrJ   r‡   rj   ro   Úextrar1   r   r�   r   Ú_describe_to_createú   sD   
ÿ

ÿ




ÿúÿz.MySQLTableDefinitionParser._describe_to_createc                 C   s   | j  |¡S )z8Unpack '"col"(2),"col" ASC'-ish strings into components.)Ú_re_keyexprsr}   )r   Úidentifiersr   r   r   rD   /  ó   z*MySQLTableDefinitionParser._parse_keyexprsc              	   C   s$  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
| ƒ| _| ¡ }d|d< td| ƒ| _td| ƒ| _tdƒ| _tD ]}|  |¡ qldD ]}|  |¡ qv|  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)r9   Úsr   r   r   r;   ?  s    ÿÿz<MySQLTableDefinitionParser._prep_regexes.<locals>.<listcomp>zM^CREATE (?:\w+ +)?TABLE +%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +\($zW(?:(?:%(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\(\)]+)?)))?(?: +(?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)?a6    (?:(?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)+))?,?$z"RESTRICT|CASCADE|SET NULL|NOACTIONÚona,    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>[^\)]+?)\)(?: +(?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(?:.*))ÚENGINEÚ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ÚUNIONz
\([^\)]+\)Ú
TABLESPACEz.*? STORAGE DISKÚ	RAID_TYPEz4\w+\s+RAID_CHUNKS\s*\=\s*\w+RAID_CHUNKSIZE\s*=\s*\w+N)Ú_re_columnsrS   r   Úfinal_quoter„   Úzipr(   Ú_escape_identifierÚ_pr_compileÚ_unescape_identifierrK   Ú_re_compiler�   r|   r~   rv   rw   rA   ÚcopyrE   rG   rH   Ú_options_of_type_stringÚ_add_option_stringÚ_add_option_wordÚ_add_option_regex)r   Ú_finalÚquotesrŠ   Úoptionr   r   r   r   4  s‚   
ýþþÿÿýþÿ

íÿüÿ	÷ÿ
öÿüÿ
þz(MySQLTableDefinitionParser._prep_regexesz(?:\s*(?:=\s*)|\s+)c                 C   s.   dt  |¡| jf }| j t|dd„ ƒ¡ d S )Nz0(?P<directive>%s)%s'(?P<val>(?:[^']|'')*?)'(?!')c                 S   s   |   dd¡  dd¡S )Nrr   rs   rt   ra   )rƒ   )rd   r   r   r   Ú<lambda>ä  r<   z?MySQLTableDefinitionParser._add_option_string.<locals>.<lambda>©r%   r£   Ú_optional_equalsrS   r.   rº   ©r   rO   rM   r   r   r   r¿   Ý  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   r   rÀ   è  s
   þz+MySQLTableDefinitionParser._add_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Á   ï  s   ýz,MySQLTableDefinitionParser._add_option_regexN)r   r   r   r   r   r4   r,   r+   r*   r)   rœ   rD   r   rÇ   r¿   rÀ   rÁ   r   r   r   r   r       s      *_5 (r   )ÚCOMMENTzDATA DIRECTORYzINDEX DIRECTORYÚPASSWORDÚ
CONNECTIONc                 C   s   t | ƒ|fS )z1Prepare a 2-tuple of compiled regex and callable.)r¼   )rM   rN   r   r   r   rº     rŸ   rº   c                 C   s   t  | t jt jB ¡S )z)Compile a string to regex, I and UNICODE.)r%   ÚcompileÚIÚUNICODE)rM   r   r   r   r¼     s   r¼   r   )r%   Ú
enumeratedr   r   r
   r   r   r   rQ   r	   rz   r   Úobjectr   Úclass_loggerr   r¾   rº   r¼   r   r   r   r   Ú<module>   s$      Z
	