B
    þ¦†\­E  ã               @   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   úClib/python3.7/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 )N)ÚdialectÚpreparerÚ_prep_regexes)r   r   r   r   r   r   r   $   s    z#MySQLTableDefinitionParser.__init__c             C   sî   t ƒ }||_xÜt d|¡D ]Ì}| d| jj ¡r>|  ||¡ q| d¡rV|  ||¡ q|dkr`q| d¡rx|  	||¡ q|s~q|  
|¡\}}|d kr¤t d| ¡ q|dkrº|j |¡ q|dkrÐ|j |¡ q|d	kr|j |¡ qqW |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   Zshow_creater#   ÚstateÚlineÚtype_Úspecr   r   r   Úparse)   s0    

z MySQLTableDefinitionParser.parsec             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>f   s    zAMySQLTableDefinitionParser._parse_constraints.<locals>.<listcomp>Zlocalc             S   s   g | ]}|d  ‘qS )r   r   )r5   r6   r   r   r   r7   h   s    Zforeignr!   r"   Ú	partitionN)
Ú_re_keyÚmatchÚ	groupdictÚ_parse_keyexprsÚ_re_key_version_sqlr   Zunformat_identifiersÚ_re_fk_constraintÚ_re_ck_constraintÚ_re_partition)r   r/   Úmr1   Zm2r   r   r   r+   I   s8    
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   r/   r.   ÚregexÚcleanuprA   r   r   r   r*   {   s    

z,MySQLTableDefinitionParser._parse_table_namec             C   sÆ   i }|r||dkrnj|dd… }x\| j D ]R\}}| |¡}|s>q&| d¡| d¡ }}	|r`||	ƒ}	|	|| ¡ < | d|¡}q&W xdD ]}
| |
d¡ q‚W x*| ¡ D ]\}}||jd| jj	|f < q W d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ÚsearchrD   ÚlowerÚsubÚpopÚitemsr   r   rB   )r   r/   r.   ZoptionsZrest_of_linerE   rF   rA   rG   ÚvalueZnopeZoptrH   r   r   r   r)   †   s"    

z/MySQLTableDefinitionParser._parse_table_optionsc             C   sœ  d}| j  |¡}|r&| ¡ }d|d< n | j |¡}|rF| ¡ }d|d< |s\t d| ¡ dS |d srt d| ¡ |d |d |d	   }}}y| jj| }W n, tk
rÊ   t d
||f ¡ t	j
}Y nX |dk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ƒrL|	rL|	 d¡|
d< x$dD ]}| |d¡rRd|
|< qRW x(dD ] }| |d¡rx|| |
|< qxW t|tƒrÐt |	¡}	t|tƒrÐd|	krÐd|
d< ||	|
Ž}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rHd}| dd¡}|dk	rr| 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
        NTZfullFzUnknown column definition %rz-Incomplete reflection of column definition %rrB   ZcoltypeÚargz*Did not recognize type '%s' of column '%s'rI   r   ú'éÿÿÿÿc             S   s   g | ]}t |ƒ‘qS r   )Úint)r5   Úvr   r   r   r7   Ë   s    z<MySQLTableDefinitionParser._parse_column.<locals>.<listcomp>Zfsp)ZunsignedZzerofill)r#   ZcollateZretrieve_as_bitwiseÚnullableZnotnullzNOT NULLZautoincrZautoincrementÚdefaultÚNULLÚcommentz\\ú\z'')rB   ÚtyperX   rZ   )Ú
_re_columnr:   r;   Ú_re_column_looser   r,   r   Zischema_namesÚKeyErrorÚsqltypesZNullTypeÚ_re_csv_strÚfindallÚ_re_csv_intÚ
issubclassr   r   r   rO   Úgetr   Z_strip_valuesr   ZIntegerÚreplaceÚdictÚupdater   r-   )r   r/   r.   r1   rA   rB   r0   ÚargsÚcol_typeZ	type_argsZtype_kwÚkwZtype_instanceZcol_kwrX   rZ   Zcol_dr   r   r   r(   £   sv    








z(MySQLTableDefinitionParser._parse_columnc       
         s  g }xì|D ]ä‰ ‡ fdd„dD ƒ\}}}}}dg}	|	  | j |¡¡ |	  |¡ |sZ|	  d¡ |rÐd|krhnh| d¡r’| d¡r’|	  d	¡ |	  |¡ n>|d
kr°|	  d	¡ |	  |¡ n |	  d	¡ |	  d| dd¡ ¡ |rÞ|	  |¡ |  d |	¡¡ q
W 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   )r5   Úi)Úrowr   r   r7     s    zBMySQLTableDefinitionParser._describe_to_create.<locals>.<listcomp>)r   r   é   é   é   ú zNOT NULLrJ   Z	timestampÚCZDEFAULTrY   z'%s'rS   z''rI   zCREATE TABLE %s (
z,
z
) )r-   r   Zquote_identifierr&   rf   Újoin)
r   r   r   ÚbufferrB   rj   rW   rX   Zextrar/   r   )rm   r   Ú_describe_to_create  s8    






z.MySQLTableDefinitionParser._describe_to_createc             C   s   | j  |¡S )z8Unpack '"col"(2),"col" ASC'-ish strings into components.)Ú_re_keyexprsrb   )r   Zidentifiersr   r   r   r<   7  s    z*MySQLTableDefinitionParser._parse_keyexprsc          	   C   s6  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ƒ| _| ¡ }d|d< td| ƒ| _td| ƒ| _tdƒ| _xtD ]}|  |¡ qäW xdD ]}|  |¡ qüW |  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)r5   Úsr   r   r   r7   H  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)?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|NOACTIONZ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(?:.*))ZENGINEZ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UNIONz
\([^\)]+\)Z
TABLESPACEz.*? STORAGE DISKZ	RAID_TYPEz4\w+\s+RAID_CHUNKS\s*\=\s*\w+RAID_CHUNKSIZE\s*=\s*\w+N)Z_re_columnsrK   r   Zfinal_quoterg   Úzipr'   Z_escape_identifierÚ_pr_compileZ_unescape_identifierrC   Ú_re_compilerv   ra   rc   r]   r^   r9   r=   Úcopyr>   r?   r@   Ú_options_of_type_stringÚ_add_option_stringÚ_add_option_wordÚ_add_option_regex)r   Z_finalZquotesrk   Zoptionr   r   r   r   <  sb    






	




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 )Nz\\r[   z''rS   )rf   )rV   r   r   r   Ú<lambda>ó  s    z?MySQLTableDefinitionParser._add_option_string.<locals>.<lambda>)r$   rw   Ú_optional_equalsrK   r-   rz   )r   rG   rE   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$   rw   r‚   rK   r-   rz   )r   rG   rE   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$   rw   r‚   rK   r-   rz   )r   rG   rE   r   r   r   r€   þ  s
    z,MySQLTableDefinitionParser._add_option_regexN)r   r   r   r   r   r2   r+   r*   r)   r(   ru   r<   r   r‚   r~   r   r€   r   r   r   r   r       s    2_5 /r   )ÚCOMMENTzDATA DIRECTORYzINDEX DIRECTORYZPASSWORDZ
CONNECTIONc             C   s   t | ƒ|fS )z1Prepare a 2-tuple of compiled regex and callable.)r{   )rE   rF   r   r   r   rz     s    rz   c             C   s   t  | t jt jB ¡S )z)Compile a string to regex, I and UNICODE.)r$   ÚcompileÚIÚUNICODE)rE   r   r   r   r{     s    r{   )N)r$   Z
enumeratedr   r   r
   r   r   r   rI   r	   r`   r   Úobjectr   Zclass_loggerr   r}   rz   r{   r   r   r   r   Ú<module>   s"      j
