3
ayH                 @   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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   J/tmp/pip-build-6_cqtusv/SQLAlchemy/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   || _ || _| j  d S )N)dialectpreparer_prep_regexes)r   r   r   r   r   r   r   $   s    z#MySQLTableDefinitionParser.__init__c             C   s   t  }||_xtjd|D ]}|jd| jj r>| j|| q|jdrV| j|| q|dkr`q|jdrx| j	|| q|s~q| j
|\}}|d krtjd|  q|dkr|jj| q|dkr|jj| q|d	kr|j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 j|}|r|j }| j|d |d< |d rb| jj|d }|rb|j d rb|j d |d< |d r| jj|d d |d< d|fS | jj|}|r|j }| jj|d |d< dd | j|d	 D |d	< d
d | j|d D |d< d|fS | jj|}|r|j }d|fS | j	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>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   m2r   r   r   r+   I   s8    
z-MySQLTableDefinitionParser._parse_constraintsc             C   s,   | j \}}|j|}|r(||jd|_dS )zZExtract the table name.

        :param line: The first line of SHOW CREATE TABLE
        nameN)_pr_namer;   groupr   )r   r/   r.   regexcleanuprB   r   r   r   r*   {   s    

z,MySQLTableDefinitionParser._parse_table_namec             C   s   i }| s~|dkrnj|dd }x\| j D ]R\}}|j|}|s@q(|jd|jd }}	|rb||	}	|	||j < |jd|}q(W xd
D ]}
|j|
d qW x*|j D ]\}}||jd	| jj	|f < qW dS )zBuild a dictionary of all reflected table-level options.

        :param line: The final line of SHOW CREATE TABLE output.
        r   N	directiveval auto_incrementdata directoryindex directoryz%s_%s)rL   rM   rN   )
_pr_optionssearchrF   lowersubpopitemsr   r   rD   )r   r/   r.   optionsZrest_of_linerG   rH   rB   rI   valueZnopeoptrJ   r   r   r   r)      s"    

z/MySQLTableDefinitionParser._parse_table_optionsc             C   s  d}| j j|}|r&|j }d|d< n | jj|}|rF|j }d|d< |s\tjd|  dS |d srtjd|  |d |d |d	   }}}y| jj| }W n, tk
r   tjd
||f  t	j
}Y nX |dks|dkrg }	n>|d dko|d) dkr
| jj|}	ndd | jj|D }	i }
t|tttfrJ|	rJ|	jd|
d< x$d*D ]}|j|drPd|
|< qPW x(d+D ] }|j|drv|| |
|< qvW t|ttfrt|	}	t|trd|	krd|
d< ||	|
}i }d|d< |jdddkr d|d< |jddrd|d< nt|t	jr.d|d< |jdd}|dkrHd}|jdd}|dk	rr|jdd jd!d}|jd"}|dk	rt|d#}|jd$}|dk	r|d%k|d&< ||d'< t||||d(}|j| |j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 %rrD   Zcoltypeargz*Did not recognize type '%s' of column '%s'rK   r   'r   c             S   s   g | ]}t |qS r   )int)r5   vr   r   r   r7      s    z<MySQLTableDefinitionParser._parse_column.<locals>.<listcomp>Zfspunsignedzerofillr#   collateZretrieve_as_bitwisenullableZnotnullzNOT NULLZautoincrZautoincrementdefaultNULLcommentz\\\z''	generated)sqltextZpersistenceZSTORED	persistedcomputed)rD   typera   rc   )r]   r^   )r#   r_   )
_re_columnr;   r<   _re_column_looser   r,   r   Zischema_namesKeyErrorsqltypesZNullType_re_csv_strfindall_re_csv_int
issubclassr   r   r   rS   getr   r   _strip_valuesZIntegerreplacedictupdater   r-   )r   r/   r.   r1   rB   rD   r0   argscol_typeZ	type_argsZtype_kwkwZtype_instanceZcol_kwra   rc   rf   rh   rg   Zcol_dr   r   r   r(      s    












z(MySQLTableDefinitionParser._parse_columnc       
         s  g }x|D ]  fdddD \}}}}}dg}	|	j | jj| |	j | |sZ|	j d	 |rd
|krhnh|jdr|jdr|	j d |	j | n>|dkr|	j d |	j | n |	j d |	j d|jdd  |r|	j | |j dj|	 q
W djd| jj| dj|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 NULLrL   	timestampCDEFAULTrb   z'%s'rZ   z''rK   zCREATE TABLE %s (
z,
z
) )r   r   r}   r~   r   )r-   r   Zquote_identifierr&   ru   join)
r   r   r   bufferrD   ry   r`   ra   extrar/   r   )r|   r   _describe_to_create
  s8    






z.MySQLTableDefinitionParser._describe_to_createc             C   s   | j j|S )z8Unpack '"col"(2),"col" ASC'-ish strings into components.)_re_keyexprsrp   )r   Zidentifiersr   r   r   r=   ?  s    z*MySQLTableDefinitionParser._parse_keyexprsc             C   s8  g | _ g | _| jj}ttd)dd | jj|| jj|fD }td| | jj	| _
td| | _td| _td	| _td
| | _td| | _td| | _td| _|j }d|d< td| | _td| | _td| _xtD ]}| j| qW xd*D ]}| j|  qW | jd"d# | jd$d% | jd&d' d(S )+z Pre-compile regular expressions.iqfqesc_fqc             S   s   g | ]}t j|qS r   )r$   escape)r5   sr   r   r   r7   P  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\.\(\)]+)?)))?(?: +(?: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(?:.*)ENGINETYPEAUTO_INCREMENTAVG_ROW_LENGTHCHARACTER SETDEFAULT CHARSETCHECKSUMCOLLATEDELAY_KEY_WRITEINSERT_METHODMAX_ROWSMIN_ROWS	PACK_KEYS
ROW_FORMATKEY_BLOCK_SIZEZUNIONz
\([^\)]+\)Z
TABLESPACEz.*? STORAGE DISKZ	RAID_TYPEz4\w+\s+RAID_CHUNKS\s*\=\s*\w+RAID_CHUNKSIZE\s*=\s*\w+N)r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )Z_re_columnsrO   r   Zfinal_quoterv   zipr'   Z_escape_identifier_pr_compileZ_unescape_identifierrE   _re_compiler   ro   rq   rk   rl   r:   r>   copyr?   r@   rA   _options_of_type_string_add_option_string_add_option_word_add_option_regex)r   Z_finalquotesrz   optionr   r   r   r   D  s~    






	




              z(MySQLTableDefinitionParser._prep_regexesz(?:\s*(?:=\s*)|\s+)c             C   s.   dt j|| jf }| jjt|dd  d S )Nz0(?P<directive>%s)%s'(?P<val>(?:[^']|'')*?)'(?!')c             S   s   | j ddj ddS )Nz\\rd   z''rZ   )ru   )r\   r   r   r   <lambda>  s    z?MySQLTableDefinitionParser._add_option_string.<locals>.<lambda>)r$   r   _optional_equalsrO   r-   r   )r   rI   rG   r   r   r   r     s    
z-MySQLTableDefinitionParser._add_option_stringc             C   s(   dt j|| jf }| jjt| d S )Nz(?P<directive>%s)%s(?P<val>\w+))r$   r   r   rO   r-   r   )r   rI   rG   r   r   r   r     s    
z+MySQLTableDefinitionParser._add_option_wordc             C   s*   dt j|| j|f }| jjt| d S )Nz(?P<directive>%s)%s(?P<val>%s))r$   r   r   rO   r-   r   )r   rI   rG   r   r   r   r     s
    z,MySQLTableDefinitionParser._add_option_regexN)r   r   r   r   r   r2   r+   r*   r)   r(   r   r=   r   r   r   r   r   r   r   r   r   r       s    2g5 1r   COMMENTDATA DIRECTORYINDEX DIRECTORYPASSWORD
CONNECTIONc             C   s   t | |fS )z1Prepare a 2-tuple of compiled regex and callable.)r   )rG   rH   r   r   r   r     s    r   c             C   s   t j| t jt jB S )z)Compile a string to regex, I and UNICODE.)r$   compileIUNICODE)rG   r   r   r   r      s    r   c             C   s`   g }xV| D ]N}|dd dks.|dd dkrN|dd j |d d |d }|j| q
W |S )zStrip reflected values quotesr   r   "rZ   r}   rj   )ru   r-   )valuesZstrip_valuesar   r   r   rt   &  s    
  rt   )r   r   r   r   r   )N)r$   Z
enumeratedr   r   r
   r   r   r   rK   r	   rn   r   objectr   Zclass_loggerr   r   r   r   rt   r   r   r   r   <module>   s,      t    
