a
    ~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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   i/var/www/html/emsaiapi.evdpl.com/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|sq| |\}}|d u rt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   foreignr#   r$   	partitionN)
_re_keyr:   	groupdict_parse_keyexprs_re_key_version_sqlr   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cleanuprO   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 < qdS )zBuild 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searchrS   lowersubpopitemsr   r   rQ   )r   r2   r1   optionsZrest_of_linerT   rU   rO   rV   valueZnopeoptrW   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rd|v sd|v sd|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!   rV   ZsubpartitionrF   z) */rX   ,r    mariadbZMAXVALUEZMINVALUEENGINEz%s_%s_definitions_rW   z%s_partition_definitionsz%s_subpartition_definitionsz%s, %srZ   )r(   r[   r\   patternrS   r]   replaceendswithr   rQ   r`   r   )r   r2   r1   ra   Znew_linerT   rU   rO   rV   Zis_subpartitionZdefsrb   rc   rW   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rg }	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rt|	}	t|trd|	v rd|
d< ||	i |
}i }d|d< |dddkrd|d< |dddkrd|d< |ddr.d|d< nt|t	jrDd|d< |dd}|dkr^d}|dd}|dur|t|}|d}|durt|d}|d }|dur|d!k|d"< ||d#< t||||d$}|| |j| dS )%zExtract 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 %rrQ   coltypeargz*Did not recognize type '%s' of column '%s'rX   r   'rg   c                 S   s   g | ]}t |qS r   int)r@   vr   r   r   rB     rC   z<MySQLTableDefinitionParser._parse_column.<locals>.<listcomp>fsp)unsignedzerofill)r%   collateZretrieve_as_bitwisenullablenotnullNOT NULLZnotnull_generatedZautoincrautoincrementdefaultNULLcomment	generated)sqltextpersistenceZSTORED	persistedcomputed)rQ   typer}   r   )
_re_columnr:   rH   _re_column_looser   r/   r   ischema_namesKeyErrorsqltypesNullType_re_csv_strfindall_re_csv_int
issubclassr   r   r   r_   getr   r   _strip_valuesIntegercleanup_textdictupdater   r0   )r   r2   r1   r4   rO   rQ   r3   argscol_typeZ	type_argsZtype_kwkwZtype_instancecol_kwr}   r   r   r   r   col_dr   r   r   r*      s    










z(MySQLTableDefinitionParser._parse_columnc           
         s  g }|D ]  fdddD \}}}}}dg}	|	 | j| |	 | |sX|	 d |rd|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>W  s   zAMySQLTableDefinitionParser._describe_to_create.<locals>.<genexpr>)r   r            re   r{   rY   	timestampCDEFAULTr~   z'%s'rq   ''rX   zCREATE TABLE %s (
z,
z
) )r0   r   quote_identifierr(   rl   join)
r   r   r   bufferrQ   r   ry   r}   extrar2   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   rr   )r@   colnamelength	modifiersr   r   r   rB     s   z>MySQLTableDefinitionParser._parse_keyexprs.<locals>.<listcomp>)_re_keyexprsr   )r   identifiersr   r   r   rI   ~  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 ]}| | qd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<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(?:.*))ri   ZTYPEAUTO_INCREMENTZAVG_ROW_LENGTHzCHARACTER SETzDEFAULT CHARSETZCHECKSUM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SUBPARTITIONUNIONz
\([^\)]+\)
TABLESPACEz.*? STORAGE DISKZ	RAID_TYPEz4\w+\s+RAID_CHUNKS\s*\=\s*\w+RAID_CHUNKSIZE\s*=\s*\w+N)Z_re_columnsr[   r   final_quoter   zipr)   _escape_identifier_pr_compile_unescape_identifierrR   _re_compiler9   r   r   r   r   r   rG   rJ   copyrL   rM   rN   _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_equalsr[   r0   r   r   r   rV   rT   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 }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   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   r5   strr8   r;   r.   r,   r+   r-   r*   r   rI   r   r   r   r   r   r   r   r   r   r   r   "   s$   "28j5
 @r   )COMMENTzDATA DIRECTORYzINDEX DIRECTORYZPASSWORDZ
CONNECTIONc                 C   s   t | |fS )z1Prepare a 2-tuple of compiled regex and callable.)r   )rT   rU   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)rT   r   r   r   r   ~  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   "rq   rg   r   )rl   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   rq   )r&   r^   _control_char_regexprl   )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&   
enumeratedr   r   r
   r   r   r   rX   r	   r   r   r   class_loggerr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>
   sB       P	
	