a
    c	gþW  ã                
   @   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eedœ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   úg/var/www/html/llm_bihealth/app/venv/lib/python3.9/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eedœ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 ]â}| d| jj ¡r<|  ||¡ q| d¡rT|  ||¡ q|dkr^q| d¡rv|  	||¡ qd|v rŒ|  
||¡ q|s’q|  |¡\}}|d u r¸t d| ¡ q|dkrÎ|j |¡ q|d	krä|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   Z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   r6   r   r   r   Ú_check_viewM   s    z&MySQLTableDefinitionParser._check_viewc                 C   s:  | j  |¡}|rŠ| ¡ }|  |d ¡|d< |d rb| j |d ¡}|rb| ¡ d rb| ¡ d |d< |d r‚| 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	 |¡}|r2d|fS d|fS )zaParse a KEY or CONSTRAINT line.

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

        :param line: The first line of SHOW CREATE TABLE
        ÚnameN)Ú_pr_namer:   Úgroupr   )r   r2   r1   ÚregexÚcleanuprM   r   r   r   r,   ‚   s    

z,MySQLTableDefinitionParser._parse_table_namec                 C   s°   i }|rn|dkrn|}| j D ]R\}}| |¡}|s2q| d¡| d¡ }}	|rT||	ƒ}	|	|| ¡ < | d|¡}qdD ]}
| |
d¡ qr| ¡ D ]\}}||jd| jj	|f < qŒd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ÚsearchrQ   ÚlowerÚsubÚpopÚitemsr   r   rO   )r   r2   r1   ÚoptionsZrest_of_linerR   rS   rM   rT   ÚvalueZnopeÚoptrU   r   r   r   r+      s     
z/MySQLTableDefinitionParser._parse_table_optionsc                 C   sÊ  i }|d d … }|  d¡s$|  d¡r2|dd … }q| jD ]\}}| |¡}|r8d|jvr\q8| d¡}| ¡ }|dk}	|dks„|	r
| dd	¡}| d
d	¡}|	r¶| d¡r¶|d d… }| jj	dkrð| d¡rðd|v säd|v säd|v rð|d d… }d| jj	|f }
|||
< n,| dd¡}| d¡}|r.||ƒ}|||<  q>q8| 
¡ D ]~\}}d| jj	 }d| jj	 }||ksz||kr¬||jvr’||j|< nd|j| |f |j|< n||jd| jj	|f < qFd S )Nú(ú r   r!   rT   ZsubpartitionrE   z) */rV   ú,r    éÿÿÿÿZmariadbZMAXVALUEZMINVALUEÚENGINEz%s_%s_definitionsÚ_rU   z%s_partition_definitionsz%s_subpartition_definitionsz%s, %srX   )r(   rY   rZ   ÚpatternrQ   r[   ÚreplaceÚendswithr   rO   r^   r   )r   r2   r1   r_   Únew_linerR   rS   rM   rT   Zis_subpartitionZdefsr`   ra   rU   Zpart_defZsubpart_defr   r   r   r-   §   sV    

ÿþý

þz3MySQLTableDefinitionParser._parse_partition_optionsc                 C   sÒ  d}| j  |¡}|r&| ¡ }d|d< n | j |¡}|rF| ¡ }d|d< |s\t d| ¡ dS |d srt d| ¡ |d |d |d	   }}}z| jj| }W n* tyÈ   t d
||f ¡ t	j
}Y n0 |du sÚ|dkràg }	n@|d dkr
|d dkr
| j |¡}	ndd„ | j |¡D ƒ}	i }
t|tttfƒrJ|	rJ|	 d¡|
d< dD ]}| |d¡rNd|
|< qNdD ] }| |d¡rp|| |
|< qpt|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¡rd|d< nt|t	jƒr*d|d< | dd¡}|dkrDd}| dd¡}|durbt|ƒ}| d¡}|dur¨t|d}| d¡}|dur |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 %rrO   ZcoltypeÚargz*Did not recognize type '%s' of column '%s'rV   r   ú're   c                 S   s   g | ]}t |ƒ‘qS r   ©Úint)r@   Úvr   r   r   rB     rC   z<MySQLTableDefinitionParser._parse_column.<locals>.<listcomp>Zfsp)ZunsignedZzerofill)r%   ZcollateZretrieve_as_bitwiseÚnullableZnotnullúNOT NULLZautoincrZautoincrementÚdefaultÚNULLÚcommentÚ	generated)ÚsqltextZpersistenceZSTOREDÚ	persistedÚcomputed)rO   Útypert   rv   )Ú
_re_columnr:   rG   Ú_re_column_looser   r/   r   Zischema_namesÚKeyErrorÚsqltypesZNullTypeÚ_re_csv_strÚfindallÚ_re_csv_intÚ
issubclassr   r   r   r]   Úgetr   r   Ú_strip_valuesZIntegerÚcleanup_textÚdictÚupdater   r0   )r   r2   r1   r4   rM   rO   r3   ÚargsÚcol_typeZ	type_argsZtype_kwÚkwZtype_instanceZcol_kwrt   rv   rx   rz   ry   Zcol_dr   r   r   r*   ß   sˆ    

ÿ







ÿ
z(MySQLTableDefinitionParser._parse_columnc           
         s  g }|D ]ä‰ ‡ fdd„dD ƒ\}}}}}dg}	|	  | j |¡¡ |	  |¡ |sX|	  d¡ |rÎd|v rfnh| d¡r| d¡r|	  d	¡ |	  |¡ n>|d
kr®|	  d	¡ |	  |¡ n |	  d	¡ |	  d| dd¡ ¡ |rÜ|	  |¡ |  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   )r@   Úi©Úrowr   r   Ú	<genexpr>T  s   zAMySQLTableDefinitionParser._describe_to_create.<locals>.<genexpr>)r   r   é   é   é   rc   rs   rW   Ú	timestampÚCÚDEFAULTru   z'%s'rn   ú''rV   zCREATE TABLE %s (
z,
z
) )r0   r   Zquote_identifierr(   ri   Újoin)
r   r   r   ÚbufferrO   rŠ   rr   rt   Úextrar2   r   r   r   Ú_describe_to_createF  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   ro   )r@   ZcolnameÚlengthÚ	modifiersr   r   r   rB   ~  s   ÿz>MySQLTableDefinitionParser._parse_keyexprs.<locals>.<listcomp>)Ú_re_keyexprsr   )r   Zidentifiersr   r   r   rH   {  s
    ÿþz*MySQLTableDefinitionParser._parse_keyexprsc              	   C   sP  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 ]}|  |¡ qìdD ]}|  |¡ q dD ]}|  |¡ q|  dd¡ |  dd¡ |  dd¡ dS )z Pre-compile regular expressions.)ZiqZfqZesc_fqc                 S   s   g | ]}t  |¡‘qS r   ©r&   Úescape)r@   Úsr   r   r   rB     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<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Ú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(?:.*))rf   ZTYPEZAUTO_INCREMENTZAVG_ROW_LENGTHzCHARACTER SETzDEFAULT CHARSETZCHECKSUMZCOLLATEZDELAY_KEY_WRITEZINSERT_METHODZMAX_ROWSZMIN_ROWSZ	PACK_KEYSZ
ROW_FORMATZKEY_BLOCK_SIZEZSTATS_SAMPLE_PAGES)úPARTITION BYúSUBPARTITION BYÚ
PARTITIONSÚSUBPARTITIONSr!   ZSUBPARTITIONZUNIONz
\([^\)]+\)Z
TABLESPACEz.*? STORAGE DISKZ	RAID_TYPEz4\w+\s+RAID_CHUNKS\s*\=\s*\w+RAID_CHUNKSIZE\s*=\s*\w+N)Z_re_columnsrY   r   Zfinal_quoter‡   Úzipr)   Z_escape_identifierÚ_pr_compileZ_unescape_identifierrP   Ú_re_compiler9   r   r€   r‚   r|   r}   rF   rI   ÚcopyrJ   rK   rL   Ú_options_of_type_stringÚ_add_option_stringÚ_add_option_wordÚ_add_partition_option_wordÚ_add_option_regex)r   Z_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_equalsrY   r0   r§   r†   ©r   rT   rR   r   r   r   r«   D  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±   rY   r0   r§   r²   r   r   r   r¬   K  s
    þz+MySQLTableDefinitionParser._add_option_wordc                 C   sp   |dks|dkr&dt  |¡| jf }n6|dks6|dkrLd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­   R  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®   a  s    ýz,MySQLTableDefinitionParser._add_option_regexN)r   r   r   r   r   r5   Ústrr8   r;   r.   r,   r+   r-   r*   rš   rH   r   r±   r«   r¬   r­   r®   r   r   r   r   r   "   s$   "28g5
 >r   )ÚCOMMENTzDATA DIRECTORYzINDEX DIRECTORYZPASSWORDZ
CONNECTIONc                 C   s   t | ƒ|fS )z1Prepare a 2-tuple of compiled regex and callable.)r¨   )rR   rS   r   r   r   r§   s  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)rR   r   r   r   r¨   y  s    r¨   c                 C   s\   g }| D ]N}|dd… dks,|dd… dkrL|dd…   |d d |d ¡}| |¡ q|S )zStrip reflected values quotesr   r   ú"rn   re   r   )ri   r0   )ÚvaluesZstrip_valuesÚar   r   r   r…     s      r…   )Úraw_textr7   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>  rC   zcleanup_text.<locals>.<lambda>r–   rn   )r&   r\   Ú_control_char_regexpri   )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ž   )r@   Úkr   r   r   r   Ÿ  rC   r   )N)r&   Z
enumeratedr   r   r
   r   r   r   rV   r	   r   r   r   Zclass_loggerr   rª   r§   r¨   r…   r´   r†   r¾   r¶   r—   rÀ   r   r   r   r   Ú<module>
   sB       K	
	÷ÿ