o
    =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   Z/var/www/html/gps/gps/lib/python3.10/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 r   )dialectpreparer_prep_regexes)r   r   r   r   r   r   r   $   s   z#MySQLTableDefinitionParser.__init__c                 C   s   t  }||_td|D ]g}|d| jj r| || q|dr*| || q|dkr/q|dr;| 	|| q|s>q| 
|\}}|d u rQtd|  q|dkr\|j| q|dkrg|j| q|d	krr|j| q	 q|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   show_creater$   statelinetype_specr   r   r   parse)   s0   

z MySQLTableDefinitionParser.parsec                 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   r!   tablec                 S      g | ]}|d  qS r   r   .0cr   r   r   
<listcomp>f       zAMySQLTableDefinitionParser._parse_constraints.<locals>.<listcomp>localc                 S   r8   r9   r   r:   r   r   r   r=   g       foreignr"   r#   	partitionN)
_re_keymatch	groupdict_parse_keyexprs_re_key_version_sqlr   unformat_identifiers_re_fk_constraint_re_ck_constraint_re_partition)r   r1   mr3   m2r   r   r   r,   I   s@   
z-MySQLTableDefinitionParser._parse_constraintsc                 C   s0   | j \}}||}|r||d|_dS dS )zZExtract the table name.

        :param line: The first line of SHOW CREATE TABLE
        nameN)_pr_namerD   groupr   )r   r1   r0   regexcleanuprL   r   r   r   r+   {   s
   

z,MySQLTableDefinitionParser._parse_table_namec                 C   s   i }|r|dkr	n3|dd }| j D ])\}}||}|sq|d|d}}	|r/||	}	|	|| < |d|}qdD ]}
||
d q>| D ]\}}||jd| jj	|f < qKd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_incrementzdata directoryzindex directoryz%s_%s)
_pr_optionssearchrP   lowersubpopitemsr   r   rN   )r   r1   r0   optionsrest_of_linerQ   rR   rL   rS   valuenopeoptrT   r   r   r   r*      s$   
z/MySQLTableDefinitionParser._parse_table_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rd|d< nt|t	jrd|d< |dd}|dkrd}|dd}|dur*|dddd}|d }|durMt|d!}|d"}|durI|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 %rrN   coltypeargz*Did not recognize type '%s' of column '%s'rU   r   'c                 S   s   g | ]}t |qS r   )int)r;   vr   r   r   r=      r>   z<MySQLTableDefinitionParser._parse_column.<locals>.<listcomp>fsp)unsignedzerofill)r$   collateretrieve_as_bitwisenullablenotnullNOT NULLautoincrautoincrementdefaultNULLcomment\\\''	generated)sqltextpersistenceSTORED	persistedcomputed)rN   typers   ru   )
_re_columnrD   rE   _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replacedictupdater   r.   )r   r1   r0   r3   rL   rN   r2   argscol_type	type_argstype_kwkwtype_instancecol_kwrs   ru   rz   r~   r}   col_dr   r   r   r)      s   











z(MySQLTableDefinitionParser._parse_columnc           
         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                    s   g | ]} | qS r   r   )r;   irowr   r   r=     r@   zBMySQLTableDefinitionParser._describe_to_create.<locals>.<listcomp>)r   r             rp   rV   	timestampCDEFAULTrt   z'%s're   rx   rU   zCREATE TABLE %s (
z,
z
) )r.   r   quote_identifierr'   r   join)
r   r   r   bufferrN   r   rn   rs   extrar1   r   r   r   _describe_to_create
  sD   







z.MySQLTableDefinitionParser._describe_to_createc                 C   s   | j |S )z8Unpack '"col"(2),"col" ASC'-ish strings into components.)_re_keyexprsr   )r   identifiersr   r   r   rF   ?     z*MySQLTableDefinitionParser._parse_keyexprsc              	   C   s.  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| _tD ]}| | qqd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)r;   sr   r   r   r=   O  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_LENGTHzCHARACTER SETzDEFAULT CHARSETCHECKSUMCOLLATEDELAY_KEY_WRITEINSERT_METHODMAX_ROWSMIN_ROWS	PACK_KEYS
ROW_FORMATKEY_BLOCK_SIZEUNIONz
\([^\)]+\)
TABLESPACEz.*? STORAGE DISK	RAID_TYPEz4\w+\s+RAID_CHUNKS\s*\=\s*\w+RAID_CHUNKSIZE\s*=\s*\w+N)_re_columnsrW   r   final_quoter   zipr(   _escape_identifier_pr_compile_unescape_identifierrO   _re_compiler   r   r   r   r   rC   rG   copyrI   rJ   rK   _options_of_type_string_add_option_string_add_option_word_add_option_regex)r   _finalquotesr   optionr   r   r   r   D  s   






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 )Nrv   rw   rx   re   )r   )rh   r   r   r   <lambda>  r>   z?MySQLTableDefinitionParser._add_option_string.<locals>.<lambda>r%   r   _optional_equalsrW   r.   r   r   rS   rQ   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   r   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   r   r   r   r   r     s   z,MySQLTableDefinitionParser._add_option_regexN)r   r   r   r   r   r4   r,   r+   r*   r)   r   rF   r   r   r   r   r   r   r   r   r   r       s      2g5 1r   )COMMENTzDATA DIRECTORYzINDEX DIRECTORYPASSWORD
CONNECTIONc                 C   s   t | |fS )z1Prepare a 2-tuple of compiled regex and callable.)r   )rQ   rR   r   r   r   r     r   r   c                 C   s   t | t jt jB S )z)Compile a string to regex, I and UNICODE.)r%   compileIUNICODE)rQ   r   r   r   r      s   r   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   "re   rf   r   )r   r.   )valuesstrip_valuesar   r   r   r   &  s     r   r   )r%   
enumeratedr   r   r
   r   r   r   rU   r	   r   r   objectr   class_loggerr   r   r   r   r   r   r   r   r   <module>   s&      s
	