o
     hr`                  
   @  s  d dl mZ 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 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 ddlmZ ddlmZ erddlmZ ddlmZ ddlmZ G dd dZG dd dZ dZ!e	dEd%d&Z"e		dFdGd)d&Z"	dFdHd,d&Z"dId.d/Z#dJd3d4Z$dKd6d7Z%d8d9d:d;d<d=d>d?d@dA	Z&e'dB(dCdD e&D Z)dS )L    )annotationsN)Any)Callable)Dict)List)Optional)overload)Sequence)Tuple)TYPE_CHECKING)Union   )ENUM)SET)DATETIME)TIME)	TIMESTAMP   )types)util)Literal)MySQLDialect)MySQLIdentifierPreparer)ReflectedColumnc                   @  s$   e Zd ZU dZded< d	ddZdS )
ReflectedStatez;Stores raw information about a SHOW CREATE TABLE statement.Optional[str]charsetreturnNonec                 C  s(   g | _ i | _d | _g | _g | _g | _d S N)columnstable_options
table_namekeysfk_constraintsck_constraints)self r'   W/var/www/html/venv/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/reflection.py__init__)   s   
zReflectedState.__init__Nr   r   )__name__
__module____qualname____doc____annotations__r)   r'   r'   r'   r(   r   $   s   
 r   c                   @  s   e Zd ZdZd9ddZd:ddZd;ddZd<ddZd=ddZd=ddZ	d=ddZ
d=d d!Zd>d%d&Zd?d)d*Zd@d+d,Zd-ZdAd/d0ZdAd1d2ZdAd3d4ZdBd6d7Zd8S )CMySQLTableDefinitionParserz4Parses the results of a SHOW CREATE TABLE statement.dialectr   preparerr   c                 C  s   || _ || _|   d S r   )r1   r2   _prep_regexes)r&   r1   r2   r'   r'   r(   r)   5   s   z#MySQLTableDefinitionParser.__init__show_createstrr   r   r   r   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   r   resplit
startswithr2   initial_quote_parse_column_parse_table_options_parse_table_name_parse_partition_options_parse_constraintsr   warnr#   appendr$   r%   )r&   r4   r   statelinetype_specr'   r'   r(   parse<   s4   

z MySQLTableDefinitionParser.parsesqlboolc                 C  s   t | j|S r   )rL   _re_is_viewmatch)r&   rK   r'   r'   r(   _check_view`   s   z&MySQLTableDefinitionParser._check_viewrG   Union[Tuple[None, str], Tuple[Literal['partition'], str], Tuple[Literal['ck_constraint', 'fk_constraint', 'key'], Dict[str, str]]]c                 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	|}|rd|fS d|fS )zaParse a KEY or CONSTRAINT line.

        :param line: A line of SHOW CREATE TABLE output
        r    version_sqlparserr   r8   tablec                 S     g | ]}|d  qS r   r'   .0cr'   r'   r(   
<listcomp>       zAMySQLTableDefinitionParser._parse_constraints.<locals>.<listcomp>localc                 S  rT   rU   r'   rV   r'   r'   r(   rY      s    foreignr9   r:   	partitionN)
_re_keyrN   	groupdict_parse_keyexprs_re_key_version_sqlr2   unformat_identifiers_re_fk_constraint_re_ck_constraint_re_partition)r&   rG   mrI   m2r'   r'   r(   rC   c   s@   
z-MySQLTableDefinitionParser._parse_constraintsrF   r   c                 C  s0   | j \}}||}|r||d|_dS dS )zZExtract the table name.

        :param line: The first line of SHOW CREATE TABLE
        nameN)_pr_namerN   groupr"   )r&   rG   rF   regexcleanuprf   r'   r'   r(   rA      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 )zBuild a dictionary of all reflected table-level options.

        :param line: The final line of SHOW CREATE TABLE output.
        r6   	directiveval )auto_incrementzdata directoryzindex directoryN%s_%s)
_pr_optionssearchrj   lowersubpopitemsr!   r1   rh   )r&   rG   rF   optionsrest_of_linerk   rl   rf   rm   valuenopeoptrn   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|< qd|j| |f |j|< q||jd| jj	|f < qd S )N( r   r7   rm   subpartitionr]   z) */ro   ,r6   mariadbMAXVALUEMINVALUEENGINEz%s_%s_definitions_rn   z%s_partition_definitionsz%s_subpartition_definitionsz%s, %srq   )r=   rr   rs   patternrj   rt   replaceendswithr1   rh   rw   r!   )r&   rG   rF   rx   new_linerk   rl   rf   rm   is_subpartitiondefsrz   r|   rn   part_defsubpart_defr'   r'   r(   rB      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rd|
|< qdD ]}||dr|| |
|< qt|ttfrt|	}	t|trd|	v rd|
d< ||	i |
}i }d|d< |dddkrd|d< |dddkrd|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 )%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 %rrh   coltypeargz*Did not recognize type '%s' of column '%s'ro   r   'r   c                 S  s   g | ]}t |qS r'   int)rW   vr'   r'   r(   rY   "  rZ   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)rh   typer   r   )
_re_columnrN   r_   _re_column_looser   rD   r1   ischema_namesKeyErrorsqltypesNullType_re_csv_strfindall_re_csv_int
issubclassr   r   r   rv   getr   r   _strip_valuesIntegercleanup_textdictupdater    rE   )r&   rG   rF   rI   rf   rh   rH   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_columnr"   r    -Sequence[Tuple[str, str, str, str, str, str]]c           
        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'   )rW   irowr'   r(   	<genexpr>v  s    
zAMySQLTableDefinitionParser._describe_to_create.<locals>.<genexpr>)r   r            r~   r   rp   	timestampCDEFAULTr   z'%s'r   ''ro   zCREATE TABLE %s (
z,
z
) )rE   r2   quote_identifierr=   r   join)
r&   r"   r    bufferrh   r   r   r   extrarG   r'   r   r(   _describe_to_created  sD   







z.MySQLTableDefinitionParser._describe_to_createidentifiers$List[Tuple[str, Optional[int], str]]c                 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   )rW   colnamelength	modifiersr'   r'   r(   rY     s    z>MySQLTableDefinitionParser._parse_keyexprs.<locals>.<listcomp>)_re_keyexprsr   )r&   r   r'   r'   r(   r`     s
   z*MySQLTableDefinitionParser._parse_keyexprsc              	   C  sF  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 ]}| | qsd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)rW   sr'   r'   r(   rY     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(?:.*))r   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SUBPARTITIONSr7   SUBPARTITIONUNIONz
\([^\)]+\)
TABLESPACEz.*? STORAGE DISK	RAID_TYPEz4\w+\s+RAID_CHUNKS\s*\=\s*\w+RAID_CHUNKSIZE\s*=\s*\w+N)rr   r2   final_quoter   zipr>   _escape_identifier_pr_compile_unescape_identifierri   _re_compilerM   r   r   r   r   r   r^   ra   copyrc   rd   re   _options_of_type_string_add_option_string_add_option_word_add_partition_option_word_add_option_regex)r&   _finalquotesr   optionr'   r'   r(   r3     s   







z(MySQLTableDefinitionParser._prep_regexesz(?:\s*(?:=\s*)|\s+)rm   c                 C  s*   dt || jf }| jt|t d S )Nz0(?P<directive>%s)%s'(?P<val>(?:[^']|'')*?)'(?!'))r;   r   _optional_equalsrr   rE   r   r   r&   rm   rk   r'   r'   r(   r   k  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  rr   rE   r   r  r'   r'   r(   r   r  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   y  s   z5MySQLTableDefinitionParser._add_partition_option_wordrk   c                 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)r1   r   r2   r   )r4   r5   r   r   r   r   )rK   r5   r   rL   )rG   r5   r   rP   )rG   r5   rF   r   r   r   )r"   r5   r    r   r   r5   )r   r5   r   r   r*   )rm   r5   r   r   )rm   r5   rk   r5   r   r   )r+   r,   r-   r.   r)   rJ   rO   rC   rA   r@   rB   r?   r   r`   r3   r  r   r   r   r  r'   r'   r'   r(   r0   2   s&    


$

8


:
j
9
 A


r0   )COMMENTzDATA DIRECTORYzINDEX DIRECTORYPASSWORD
CONNECTIONrk   r5   rl   Callable[[str], str]r   ,Tuple[re.Pattern[Any], Callable[[str], str]]c                 C     d S r   r'   rk   rl   r'   r'   r(   r        r   r   Tuple[re.Pattern[Any], None]c                 C  r  r   r'   r  r'   r'   r(   r     r  Optional[Callable[[str], str]]6Tuple[re.Pattern[Any], Optional[Callable[[str], str]]]c                 C  s   t | |fS )z1Prepare a 2-tuple of compiled regex and callable.)r   r  r'   r'   r(   r     s   re.Pattern[Any]c                 C  s   t | t jt jB S )z)Compile a string to regex, I and UNICODE.)r;   compileIUNICODE)rk   r'   r'   r(   r     s   r   valuesSequence[str]	List[str]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   r   r   )r   rE   )r  strip_valuesar'   r'   r(   r     s     r   raw_textc                 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;   ru   _control_char_regexpr   )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   )rW   kr'   r'   r(   r     s    r   )rk   r5   rl   r  r   r  r   )rk   r5   rl   r   r   r  )rk   r5   rl   r  r   r  )rk   r5   r   r  )r  r  r   r  )r  r5   r   r5   )*
__future__r   r;   typingr   r   r   r   r   r   r	   r
   r   r   
enumeratedr   r   r   r   r   r   ro   r   r   util.typingr   baser   r   engine.interfacesr   r   r0   r   r   r   r   r   r  r  r   r!  r'   r'   r'   r(   <module>   sl       c	


