
    [h:Y              
       V   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          Ze	j         G d d                      ZdZd#dZd Zd ZdedefdZdddddddddd 	Z e j        d!                    d" eD                                 ZdS )$    N   )ENUM)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    s/var/www/api.easyaligner.net/htdocs/venv_linux/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                   z    e Zd ZdZd Zd Zdedef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 ]Q}|                    d| j        j        z             r|                     ||           <|                    d          r|                     ||           h|dk    ro|                    d          r| 	                    ||           d|v r| 
                    ||           |s|                     |          \  }}|t          j        d|z             |dk    r|j                            |           |d	k    r|j                            |           /|d
k    r|j                            |           QS|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_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$$--dE::::  "55d;;t=I:TABBBBe^^J%%d++++o--(//5555o--(//5555r   sqlreturnc                 P    t          | j                            |                    S r   )bool_re_is_viewmatch)r   r>   s     r   _check_viewz&MySQLTableDefinitionParser._check_viewM   s!    D$**3//000r   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>m   s    OOOaQqTOOOr   localc                     g | ]
}|d          S rJ   r   rK   s     r   rN   zAMySQLTableDefinitionParser._parse_constraints.<locals>.<listcomp>n   s)       !  r   foreignr*   r+   	partitionN)
_re_keyrC   	groupdict_parse_keyexprs_re_key_version_sqlr$   unformat_identifiers_re_fk_constraint_re_ck_constraint_re_partition)r   r:   mr<   m2s        r   r5   z-MySQLTableDefinitionParser._parse_constraintsP   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_namerC   groupr   )r   r:   r9   regexcleanupr[   s         r   r3   z,MySQLTableDefinitionParser._parse_table_name   sT     wKK 	8&wqwwv77E	8 	8r   c                    i }|r|dk    r|}| 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'   	directiveval )auto_incrementzdata directoryzindex directoryN_)
_pr_optionssearchr`   lowersubpopitemsr   r#   r^   )r   r:   r9   optionsrest_of_linera   rb   r[   rd   valuenopeoptre   s                r   r2   z/MySQLTableDefinitionParser._parse_table_options   s     
	;DCKKL"&"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                 x   i }|d d          }|                     d          s|                     d          r4|dd          }|                     d          |                     d          4| j        D ]:\  }}|                    |          }|r	d|j        vr'|                    d          }|                                }|dk    }	|dk    s|	r|                    dd	          }|                    d
d	          }|	r|                    d          r
|d d         }| j        j	        dk    r+|                    d          rd|v sd|v sd|v r
|d d         }| j        j	        d|d}
|||
<   n=|                    dd          }|                    d          }|r ||          }|||<    |
                                D ]w\  }}d| j        j	        z  }d| j        j	        z  }||k    s||k    r/||j        vr||j        |<   C|j        |         d||j        |<   ^||j        | j        j	        d|<   xd S )N( r   r(   rd   subpartitionrR   z) */rf   ,r'   mariadbMAXVALUEMINVALUEENGINErh   _definitionsre   z%s_partition_definitionsz%s_subpartition_definitionsz, )r/   ri   rj   patternr`   rk   replaceendswithr#   r^   rn   r   )r   r:   r9   ro   new_linera   rb   r[   rd   is_subpartitiondefsrq   rs   re   part_defsubpart_defs                   r   r4   z3MySQLTableDefinitionParser._parse_partition_options   s   7!!#&& 	$(*=*=c*B*B 	$|H !!#&& 	$(*=*=c*B*B 	$ #.  	  	NE7X&&A 5=88,,I!))I'>9OK''?'#++FB77#++C44" -x'8'8'='= -'}H<$	11h6G6G6L6L1"h..%11#x// $,CRC=.2l.?.?.?K ( &--c377	 +#GENNE%*	" 	N 	NHC1T\5FGH74<;LMKh#"4"4e111/2E',, +C0000E',,
 KN#t|/@/@/@##$FGG	N 	N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(          t*          f          r-t-          |	          }	t          |t*                    r	d|	v rd|
d<    ||	i |
}i }d|d<   |                    dd          dk    r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          }|t1          |          }|                    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 %rr^   coltypeargzDid not recognize type 'z' of column ''rf   r   ry   c                 ,    g | ]}t          |          S r   int)rL   vs     r   rN   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notnull_generatedautoincrautoincrementdefaultNULLcomment	generated)sqltextpersistenceSTORED	persistedcomputed)r^   typer   r   )
_re_columnrC   rT   _re_column_looser   r6   r#   ischema_namesKeyErrorsqltypesNullType_re_csv_strfindall_re_csv_int
issubclassr   r   r   rm   getr   r   _strip_valuesIntegercleanup_textdictupdater   r7   )r   r:   r9   r<   r[   r^   r;   argscol_type	type_argstype_kwkwtype_instancecol_kwr   r   r   r   r   col_ds                       r   r1   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s,, 	6%i00I(C(( 6R9__15-. )7w77 "z88Iu%%33!&F:88'//:==!&F: 88J&& 	,&*F?##("233 	,&+F?# ((9d++fG((9d++"7++G((;''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              3   (   K   | ]}|         V  d S r   r   )rL   irows     r   	<genexpr>zAMySQLTableDefinitionParser._describe_to_create.<locals>.<genexpr>W  s8       : :A: : : : : :r   )r   r            rv   r   rg   	timestampCDEFAULTr   z'%s'r   ''rf   zCREATE TABLE %s (
z,
z
) )r7   r$   quote_identifierr/   r   join)r   r   r   bufferr^   r   r   r   extrar:   r   s             @r   _describe_to_createz.MySQLTableDefinitionParser._describe_to_createI  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                 J    d | j                             |          D             S )z8Unpack '"col"(2),"col" ASC'-ish strings into components.c                 B    g | ]\  }}}||rt          |          nd |fS r   r   )rL   colnamelength	modifierss       r   rN   z>MySQLTableDefinitionParser._parse_keyexprs.<locals>.<listcomp>  sD     
 
 
* V5c&kkkyA
 
 
r   )_re_keyexprsr   )r   identifierss     r   rU   z*MySQLTableDefinitionParser._parse_keyexprs~  s9    
 
.2.?.G.G/ /
 
 
 	
r   c                 N   g | _         g | _        | j        j        }t	          t          dd | j        j        || j                            |          fD                                 }t          d|z  | j        j	                  | _
        t          d          | _        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          | _        t0          D ]}|                     |           d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)rL   ss     r   rN   z<MySQLTableDefinitionParser._prep_regexes.<locals>.<listcomp>  s0        IaLL  r   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(?:.*))r}   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_columnsri   r$   final_quoter   zipr0   _escape_identifier_pr_compile_unescape_identifierr_   _re_compilerB   r   r   r   r   r   rS   rV   copyrX   rY   rZ   _options_of_type_string_add_option_string_add_option_word_add_partition_option_word_add_option_regex)r   _finalquotesr   options        r   r%   z(MySQLTableDefinitionParser._prep_regexes  s    *&  388@@  
 

 
 $DFLMM.
 
 ''HII (9;AB
 
 ''GHH 'v.. &. /
 
8 !,- 06	6!
 !
 #
 

 
  $/>$
 $
  [[]]D4!,
5 8:
:"
 "
$ "-% (*	*"
 "
 ))IJJ
 . 	, 	,F##F++++
 	* 	*F$ !!&))))
 	4 	4F ++F3333w666|-@AAAC	
 	
 	
 	
 	
r   z(?:\s*(?:=\s*)|\s+)c                     dt          j        |          d| j        d}| j                            t          |t                               d S )N(?P<directive>r'   z'(?P<val>(?:[^']|'')*?)'(?!'))r-   r   _optional_equalsri   r7   r   r   r   rd   ra   s      r   r   z-MySQLTableDefinitionParser._add_option_stringI  sS     Ii    !!!
 	E< @ @AAAAAr   c                     dt          j        |          d| j        d}| j                            t          |                     d S )Nr  r'   z(?P<val>\w+)r-   r   r  ri   r7   r   r  s      r   r   z+MySQLTableDefinitionParser._add_option_wordP  sQ     Ii    !!!
 	E 2 233333r   c                 8   |dk    s|dk    r!dt          j        |          d| j        d}nE|dk    s|dk    r!dt          j        |          d| j        d}ndt          j        |          d	}| j                            t          |                     d S )
Nr   r   z(?<!\S)(?P<directive>r'   z(?P<val>\w+.*)r   r   z(?P<val>\d+)z)(?!\S)r  r  s      r   r   z5MySQLTableDefinitionParser._add_partition_option_wordW  s    &&)7H*H*H	)$$$$%%%EE /))Y,-F-F	)$$$$%%%EE .G :<99M9M9M9MOE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_regexf  sX     Ii    !!!EE

 	E 2 233333r   N)r   r   r   r   r   r=   strrA   rD   r5   r3   r2   r4   r1   r   rU   r%   r  r   r   r   r   r   r   r   r!   r!   "   s+       >>  
     D1s 1t 1 1 1 10 0 0d	8 	8 	8J J J46N 6N 6Nph$ h$ h$T3
 3
 3
j
 
 
}
 }
 }
~ .B B B4 4 4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   )ra   rb   s     r   r   r   x  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)ra   s    r   r   r   ~  s     :eRTBJ.///r   c                     g }| D ]`}|dd         dk    s|dd         dk    r-|dd                              |d         dz  |d                   }|                    |           a|S )zStrip reflected values quotesr   r   "r   ry   r   )r   r7   )valuesstrip_valuesas      r   r   r     s{    L  QqS6S==AacFcMM!B$!q!A$//AAr   raw_textr?   c                 n    d| v rt          j        t          d |           } |                     dd          S )N\c                 (    t           | d                  S )Nr   )_control_char_map)r   s    r   <lambda>zcleanup_text.<locals>.<lambda>  s    ,=ad,C r   r   r   )r-   rl   _control_char_regexpr   )r  s    r   r   r     sA    x6 "C"CX
 
 D#&&&r   r   	
)	z\\z\0z\az\bz\tz\nz\vz\fz\r|c              #   >   K   | ]}t          j        |          V  d S r   r   )rL   ks     r   r   r     s*      55aRYq\\555555r   r   )r-   
enumeratedr   r   r   r   r   r   rf   r
   r   r   r   class_loggerr!   r   r   r   r   r  r   r  r  r   r  r   r   r   <module>r-     s   
			                                     ! ! ! ! ! !      	! 	! 	! 	! 	! 	! 	! 	! I	4 I	4 I	4 I	4 I	4 I	4 I	4 I	4X ) ) ) )0 0 0  '3 '3 ' ' ' '    "rzHH55#455555    r   