
    ؄_[G                         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e          Ze	j         G d de                      ZdZddZd ZdS )    N   )_EnumeratedValues)SET)DATETIME)TIME)	TIMESTAMP   )log)types)utilc                       e Zd ZdZd ZdS )ReflectedStatez;Stores raw information about a SHOW CREATE TABLE statement.c                 Z    g | _         i | _        d | _        g | _        g | _        g | _        d S N)columnstable_options
table_namekeysfk_constraintsck_constraints)selfs    i/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/reflection.py__init__zReflectedState.__init__   s5    	      N)__name__
__module____qualname____doc__r    r   r   r   r      s)        EE! ! ! ! !r   r   c                   ^    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdZd Zd Zd ZdS )MySQLTableDefinitionParserz4Parses the results of a SHOW CREATE TABLE statement.c                 J    || _         || _        |                                  d S r   )dialectpreparer_prep_regexes)r   r#   r$   s      r   r   z#MySQLTableDefinitionParser.__init__$   s(     r   c                    t                      }||_        t          j        d|          D ]5}|                    d| j        j        z             r|                     ||           <|                    d          r|                     ||           h|dk    ro|                    d          r| 	                    ||           |s| 
                    |          \  }}|t          j        d|z             |dk    r|j                            |           |dk    r|j                            |           |d	k    r|j                            |           57|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_specs          r   parsez MySQLTableDefinitionParser.parse)   s     HX{33 	 	Dtdm&AABB ""4////&& ))$6666++ &&tU3333  "55d;;t=I:TABBBBe^^J%%d++++o--(//5555o--(//5555r   c                    | j                             |          }|r|                                }|                     |d                   |d<   |d         rY| j                            |d                   }|r7|                                d         r|                                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|fS | j                            |          }|r|                                }d|fS | j	                            |          }|rd|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                     g | ]
}|d          S r   r   .0cs     r   
<listcomp>zAMySQLTableDefinitionParser._parse_constraints.<locals>.<listcomp>f   s    OOOaQqTOOOr   localc                     g | ]
}|d          S rA   r   rB   s     r   rE   zAMySQLTableDefinitionParser._parse_constraints.<locals>.<listcomp>g   s)       !  r   foreignr)   r*   	partitionN)
_re_keymatch	groupdict_parse_keyexprs_re_key_version_sqlr$   unformat_identifiers_re_fk_constraint_re_ck_constraint_re_partition)r   r8   mr:   m2s        r   r3   z-MySQLTableDefinitionParser._parse_constraintsI   s
    Lt$$ 	;;==D #224	?CCDOM" >-33D4GHH >",,..2 >%'\\^^H%=DNH~ !%!C!CN" ""X $; "((.. 	);;==D M>>tG}MMDMOO4+?+?W+N+NOOODM "224	?CC  DO #D(( "((.. 	);;==D"D(( $$T** 	%$$ d|r   c                     | j         \  }}|                    |          }|r% ||                    d                    |_        dS dS )zZExtract the table name.

        :param line: The first line of SHOW CREATE TABLE
        nameN)_pr_namerK   groupr   )r   r8   r7   regexcleanuprS   s         r   r2   z,MySQLTableDefinitionParser._parse_table_name{   sT     wKK 	8&wqwwv77E	8 	8r   c                    i }|r|dk    rn|dd         }| j         D ]\  }}|                    |          }|s|                    d          |                    d          }	}|r ||	          }	|	||                                <   |                    d|          }dD ]}
|                    |
d           |                                D ]\  }}||j        | j        j	        d|<   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_incrementzdata directoryzindex directory_)
_pr_optionssearchrX   lowersubpopitemsr   r#   rV   )r   r8   r7   optionsrest_of_linerY   rZ   rS   r\   valuenopeoptr]   s                r   r1   z/MySQLTableDefinitionParser._parse_table_options   s+     	;ts{{  7L"&"2 ; ;wLL.. #$77;#7#75	 +#GENNE-2	))*$yy\::K 	$ 	$DKKd#### 	J 	JHCFIE4<+<+<+<cc BCC	J 	Jr   c                 "   d}| j                             |          }|r|                                }d|d<   n5| j                            |          }|r|                                }d|d<   |st	          j        d|z             dS |d         st	          j        d|z             |d         |d         |d	         }}}	 | j        j        |         }n7# t          $ r* t	          j        d
|d|d           t          j
        }Y nw xY w||dk    rg }	nW|d         dk    r'|d         dk    r| j                            |          }	n$d | j                            |          D             }	i }
t          |t          t           t"          f          r|	r|	                    d          |
d<   dD ]}|                    |d          rd|
|<   dD ]#}|                    |d          r||         |
|<   $t          |t(                    r2t)          j        |	          }	t          |t,                    r	d|	v rd|
d<    ||	i |
}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    rd}|                    dd          }|*|                    dd                              dd          }|                    d           }|5t3          |!          }|                    d"          }|	|d#k    |d$<   ||d%<   t3          ||||&          }|                    |           |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 %rrV   coltypeargzDid not recognize type 'z' of column ''r^   r   c                 ,    g | ]}t          |          S r   )int)rC   vs     r   rE   z<MySQLTableDefinitionParser._parse_column.<locals>.<listcomp>   s    HHHAQHHHr   fsp)unsignedzerofill)r+   collateretrieve_as_bitwisenullablenotnullNOT NULLautoincrautoincrementdefaultNULLcomment\\\''	generated)sqltextpersistenceSTORED	persistedcomputed)rV   typer   r   )
_re_columnrK   rL   _re_column_looser   r4   r#   ischema_namesKeyErrorsqltypesNullType_re_csv_strfindall_re_csv_int
issubclassr   r   r   re   getr   _strip_valuesr   Integerreplacedictupdater   r5   )r   r8   r7   r:   rS   rV   r9   argscol_type	type_argstype_kwkwtype_instancecol_kwr   r   r   r   r   col_ds                       r   r0   z(MySQLTableDefinitionParser._parse_column   s    O!!$'' 	%;;==DDLL%++D11A %{{}}$V 	I4t;<<<FF| 	NIELMMM L$y/4;Te	)|1%8HH 	) 	) 	)II@EtttL    (HHH		) <42::II!W^^RC(0066IIHH)9)A)A$)G)GHHHI h4 ;<< 	2 2!*q!1!1* 	# 	#BxxE"" #"( 	' 	'BxxE"" '"2hh 122 	6)7	BBI(C(( 6R9__15-. )7w77 "z88Iu%%33!&F: 88J&& 	,&*F?##("233 	,&+F?# ((9d++fG((9d++oofd33;;D#FFG((;''G,,,H//I$(1X(=%!)F:M7G
 
 
 	VU#####s   C 1DDc                   
 g }|D ]

fddD             \  }}}}}dg}	|	                     | j                            |                     |	                     |           |s|	                     d           |rd|v rn|                    d          r@|                    d          r+|	                     d           |	                     |           nr|d	k    r+|	                     d           |	                     |           nA|	                     d           |	                     d
|                    dd          z             |r|	                     |           |                     d                    |	                     d                    d| j                            |          z  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                      g | ]
}|         S r   r   )rC   irows     r   rE   zBMySQLTableDefinitionParser._describe_to_create.<locals>.<listcomp>  s*     : : :A: : :r   )r   r             r|   r_   	timestampCDEFAULTr   z'%s'rp   r   r^   zCREATE TABLE %s (
z,
z
) )r5   r$   quote_identifierr.   r   join)r   r   r   bufferrV   r   rz   r   extrar8   r   s             @r   _describe_to_createz.MySQLTableDefinitionParser._describe_to_create
  s     	* 	*C: : : : /: : :6T8Xw 5DKK66t<<===KK!!! (J''' E#w..((55 
E':L:L; ; 
E KK	***KK((((&&KK	***KK((((KK	***KKd)C)C CDDD #E"""MM#((4..))))ww *m44Z@@A 

6""	
 	
 		
r   c                 6    | j                             |          S )z8Unpack '"col"(2),"col" ASC'-ish strings into components.)_re_keyexprsr   )r   identifierss     r   rM   z*MySQLTableDefinitionParser._parse_keyexprs?  s      ((555r   c                    g | _         g | _        | j        j        }t	          t          dd | j        j        || j                            |          fD                                 }t          d|z  | j        j	                  | _
        t          d|z            | _        t          d          | _        t          d          | _        t          d|z            | _        t          d|z            | _        t          d	|z            | _        t          d
          | _        |                                }d|d<   t          d|z            | _        t          d|z            | _        t          d          | _        t.          D ]}|                     |           dD ]}|                     |           |                     dd           |                     dd           |                     dd           dS )z Pre-compile regular expressions.)iqfqesc_fqc                 6    g | ]}t          j        |          S r   )r,   escape)rC   ss     r   rE   z<MySQLTableDefinitionParser._prep_regexes.<locals>.<listcomp>O  s0        IaLL  r   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|NOACTION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_columnsra   r$   final_quoter   zipr/   _escape_identifier_pr_compile_unescape_identifierrW   _re_compiler   r   r   r   r   rJ   rN   copyrP   rQ   rR   _options_of_type_string_add_option_string_add_option_word_add_option_regex)r   _finalquotesr   options        r   r%   z(MySQLTableDefinitionParser._prep_regexesD  s    *&  388@@  
 

 
 $DFLMM.
 
 (9;AB
 
 ''GHH 'v.. &* +
 
4 !,- 06	6!
 !
 #
 

 
  $/>$
 $
  [[]]74!,
5 8:
:"
 "
$ "-% (*	*"
 "
 ))IJJ
 . 	, 	,F##F++++
 	* 	*F" !!&))))w666|-@AAAC	
 	
 	
 	
 	
r   z(?:\s*(?:=\s*)|\s+)c                     dt          j        |          d| j        d}| j                            t          |d                      d S )N(?P<directive>r'   z'(?P<val>(?:[^']|'')*?)'(?!')c                 V    |                      dd                               dd          S )Nr   r   r   rp   )r   )rt   s    r   <lambda>z?MySQLTableDefinitionParser._add_option_string.<locals>.<lambda>  s$    64!8!8!@!@s!K!K r   r,   r   _optional_equalsra   r5   r   r   r\   rY   s      r   r   z-MySQLTableDefinitionParser._add_option_string  sg     Ii    !!!
 	KK 	
 	
 	
 	
 	
r   c                     dt          j        |          d| j        d}| j                            t          |                     d S )Nr   r'   z(?P<val>\w+)r   r   s      r   r   z+MySQLTableDefinitionParser._add_option_word  sQ     Ii    !!!
 	E 2 233333r   c                     dt          j        |          d| j        d|d}| j                            t          |                     d S )Nr   r'   z(?P<val>r   r   s      r   r   z,MySQLTableDefinitionParser._add_option_regex  sX     Ii    !!!EE

 	E 2 233333r   N)r   r   r   r   r   r;   r3   r2   r1   r0   r   rM   r%   r   r   r   r   r   r   r   r!   r!       s        >>  
  @0 0 0d	8 	8 	8J J J:e$ e$ e$N3
 3
 3
j6 6 6
n
 n
 n
` .	
 	
 	
4 4 44 4 4 4 4r   r!   )COMMENTzDATA DIRECTORYzINDEX DIRECTORYPASSWORD
CONNECTIONc                 $    t          |           |fS )z1Prepare a 2-tuple of compiled regex and callable.)r   )rY   rZ   s     r   r   r     s     ((r   c                 Z    t          j        | t           j        t           j        z            S )z)Compile a string to regex, I and UNICODE.)r,   compileIUNICODE)rY   s    r   r   r      s     :eRTBJ.///r   r   )r,   
enumeratedr   r   r   r   r   r   r^   r
   r   r   objectr   class_loggerr!   r   r   r   r   r   r   <module>r      sB   
			 ) ) ) ) ) )                               ! ! ! ! ! !      	! 	! 	! 	! 	!V 	! 	! 	! m4 m4 m4 m4 m4 m4 m4 m4` ) ) ) )0 0 0 0 0r   