o
    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dedef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   f/var/www/html/ecg_monitoring/venv/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                   @   s   e Zd ZdZdd Zdd Zdedef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 ]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   charsetresplit
startswithr   initial_quote_parse_column_parse_table_options_parse_table_name_parse_partition_options_parse_constraintsr   warnr   appendr   r   )r   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   r7   r   r   r   _check_viewM   s   z&MySQLTableDefinitionParser._check_viewc                 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>m       zAMySQLTableDefinitionParser._parse_constraints.<locals>.<listcomp>localc                 S   r@   rA   r   rB   r   r   r   rE   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   r3   mr5   m2r   r   r   r.   P   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_namer;   groupr   )r   r3   r2   regexcleanuprR   r   r   r   r,      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.
        r    	directiveval )auto_incrementzdata directoryzindex directoryN%s_%s)
_pr_optionssearchrV   lowersubpopitemsr   r   rT   )r   r3   r2   optionsrest_of_linerW   rX   rR   rY   valuenopeoptrZ   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   r!   rY   subpartitionrI   z) */r[   ,r    mariadbMAXVALUEMINVALUEENGINEz%s_%s_definitions_rZ   z%s_partition_definitionsz%s_subpartition_definitionsz%s, %sr]   )r(   r^   r_   patternrV   r`   replaceendswithr   rT   rc   r   )r   r3   r2   rd   new_linerW   rX   rR   rY   is_subpartitiondefsrf   rh   rZ   part_defsubpart_defr   r   r   r-      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 %rrT   coltypeargz*Did not recognize type '%s' of column '%s'r[   r   'rm   c                 S   s   g | ]}t |qS r   int)rC   vr   r   r   rE     rF   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)rT   typer   r   )
_re_columnr;   rK   _re_column_looser   r/   r   ischema_namesKeyErrorsqltypesNullType_re_csv_strfindall_re_csv_int
issubclassr   r   r   rb   getr   r   _strip_valuesIntegercleanup_textdictupdater   r0   )r   r3   r2   r5   rR   rT   r4   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_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                 3   s    | ]} | V  qd S r   r   )rC   irowr   r   	<genexpr>W  s    
zAMySQLTableDefinitionParser._describe_to_create.<locals>.<genexpr>)r   r            rj   r   r\   	timestampCDEFAULTr   z'%s'r~   ''r[   zCREATE TABLE %s (
z,
z
) )r0   r   quote_identifierr(   rt   join)
r   r   r   bufferrT   r   r   r   extrar3   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   r   )rC   colnamelength	modifiersr   r   r   rE     s    z>MySQLTableDefinitionParser._parse_keyexprs.<locals>.<listcomp>)_re_keyexprsr   )r   identifiersr   r   r   rL   ~  s
   z*MySQLTableDefinitionParser._parse_keyexprsc              	   C   sL  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 ]}| | qvdD ]}| | qd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)rC   sr   r   r   rE     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(?:.*))rq   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SUBPARTITIONSr!   SUBPARTITIONUNIONz
\([^\)]+\)
TABLESPACEz.*? STORAGE DISK	RAID_TYPEz4\w+\s+RAID_CHUNKS\s*\=\s*\w+RAID_CHUNKSIZE\s*=\s*\w+N)_re_columnsr^   r   final_quoter   zipr)   _escape_identifier_pr_compile_unescape_identifierrU   _re_compiler:   r   r   r   r   r   rJ   rM   copyrO   rP   rQ   _options_of_type_string_add_option_string_add_option_word_add_partition_option_word_add_option_regex)r   _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   rY   rW   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 }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   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   r6   strr9   r<   r.   r,   r+   r-   r*   r   rL   r   r   r   r   r   r   r   r   r   r   r   "   s&    "28j5
 @r   )COMMENTzDATA DIRECTORYzINDEX DIRECTORYPASSWORD
CONNECTIONc                 C   s   t | |fS )z1Prepare a 2-tuple of compiled regex and callable.)r   )rW   rX   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)rW   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   "r~   rm   r   )rt   r0   )valuesstrip_valuesar   r   r   r     s     r   raw_textr8   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>  s    zcleanup_text.<locals>.<lambda>r   r~   )r&   ra   _control_char_regexprt   )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   )rC   kr   r   r   r     s    r   r   )r&   
enumeratedr   r   r
   r   r   r   r[   r	   r   r   r   class_loggerr   r   r   r   r   r   r   r   r   r   r  r   r   r   r   <module>   sD   	    P
		