
    +hI                         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 Zy)    N   )ENUM)SET)DATETIME)TIME)	TIMESTAMP   )log)types)utilc                       e Zd ZdZd Zy)ReflectedStatez;Stores raw information about a SHOW CREATE TABLE statement.c                 X    g | _         i | _        d | _        g | _        g | _        g | _        y N)columnstable_options
table_namekeysfk_constraintsck_constraints)selfs    W/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/reflection.py__init__zReflectedState.__init__   s/    	      N)__name__
__module____qualname____doc__r    r   r   r   r      s
    E!r   r   c                   b    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 Zy)MySQLTableDefinitionParserz4Parses the results of a SHOW CREATE TABLE statement.c                 @    || _         || _        | j                          y r   )dialectpreparer_prep_regexes)r   r#   r$   s      r   r   z#MySQLTableDefinitionParser.__init__$   s     r   c                    t               }||_        t        j                  d|      D ]#  }|j	                  d| j
                  j                  z         r| j                  ||       ?|j	                  d      r| j                  ||       c|dk(  ri|j	                  d      r| j                  ||       |s| j                  |      \  }}|t        j                  d|z         |dk(  r|j                  j                  |       |dk(  r|j                  j                  |       |d	k(  r|j                   j                  |       $& |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&    HHX{3 	Dtdmm&A&AAB""4/&))$6+&&tU3 "55d;t=II:TABe^JJ%%d+o-((//5o-((//55	6 r   c                 J    t        | j                  j                  |            S r   )bool_re_is_viewmatch)r   sqls     r   _check_viewz&MySQLTableDefinitionParser._check_viewI   s    D$$**3/00r   c                    | j                   j                  |      }|r|j                         }| j                  |d         |d<   |d   rI| j                  j                  |d         }|r)|j                         d   r|j                         d   |d<   |d   r$| j
                  j                  |d         d   |d<   d|fS | j                  j                  |      }|r|j                         }| j
                  j                  |d         |d<   | j                  |d         D cg c]  }|d   	 c}|d<   | j                  |d         D cg c]  }|d   	 c}|d<   d	|fS | j                  j                  |      }|r|j                         }d
|fS | j                  j                  |      }|rd|fS d|fS c c}w c c}w )zaParse a KEY or CONSTRAINT line.

        :param line: A line of SHOW CREATE TABLE output
        r   version_sqlparserr   r(   tablelocalforeignr)   r*   	partitionN)
_re_keyr?   	groupdict_parse_keyexprs_re_key_version_sqlr$   unformat_identifiers_re_fk_constraint_re_ck_constraint_re_partition)r   r8   mr:   m2cs         r   r3   z-MySQLTableDefinitionParser._parse_constraintsL   s    LLt$;;=D #224	?CDOM"--33D4GH",,.2%'\\^H%=DNH~!%!C!CN""X $; ""((.;;=D MM>>tG}MDM+/+?+?W+NOaQqTODM"224	?C!DO #D(( ""((.;;=D"D(( $$T*$$ d|' Ps   $F8F=c                     | j                   \  }}|j                  |      }|r ||j                  d            |_        yy)zZExtract the table name.

        :param line: The first line of SHOW CREATE TABLE
        nameN)_pr_namer?   groupr   )r   r8   r7   regexcleanuprQ   s         r   r2   z,MySQLTableDefinitionParser._parse_table_name~   s<     wKK&qwwv7E r   c                    i }|r|dk(  rn~|dd }| j                   D ]j  \  }}|j                  |      }|s|j                  d      |j                  d      }	}|r ||	      }	|	||j                         <   |j	                  d|      }l dD ]  }
|j                  |
d        |j                         D ]-  \  }}||j                  | j                  j                  d|<   / y)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searchrW   lowersubpopitemsr   r#   rU   )r   r8   r7   optionsrest_of_linerX   rY   rQ   r[   valuenopeoptr\   s                r   r1   z/MySQLTableDefinitionParser._parse_table_options   s     ts{  7L"&"2"2 ;wLL.#$77;#75	#ENE-2	)*$yy\:; L 	$DKKd#	$   	JHCFIE4<<+<+<c BC	Jr   c                    d}| j                   j                  |      }|r|j                         }d|d<   n2| j                  j                  |      }|r|j                         }d|d<   |st	        j
                  d|z         y|d   st	        j
                  d|z         |d   |d   |d	   }}}	 | j                  j                  |   }||dk(  rg }	n]|d   dk(  r$|d   dk(  r| j                  j                  |      }	n1| j                  j                  |      D 
cg c]  }
t        |
       }	}
i }t        |t         t"        t$        f      r|	r|	j'                  d      |d<   dD ]  }|j)                  |d      sd||<    dD ]  }|j)                  |d      s||   ||<    t        |t*        t,        f      r$t/        |	      }	t        |t,              r	d|	v rd|d<    ||	i |}i }d|d<   |j)                  dd      dk(  rd|d<   |j)                  dd      rd|d<   nt        |t        j0                        rd|d<   |j)                  dd      }|dk(  rd}|j)                  dd      }|"|j3                  dd      j3                  dd      }|j)                  d      }|,t5        |       }|j)                  d!      }||d"k(  |d#<   ||d$<   t5        ||||%      }|j7                  |       |j8                  j;                  |       y# t        $ r0 t	        j
                  d
|d|d       t        j                  }Y ww xY wc c}
w )&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 %rrU   coltypeargzDid not recognize type 'z' of column ''r]   r   fsp)unsignedzerofill)r+   collateretrieve_as_bitwisenullablenotnullNOT NULLautoincrautoincrementdefaultNULLcomment\\\''	generated)sqltextpersistenceSTORED	persistedcomputed)rU   typer{   r}   )
_re_columnr?   rJ   _re_column_looser   r4   r#   ischema_namesKeyErrorsqltypesNullType_re_csv_strfindall_re_csv_intint
issubclassr   r   r   rd   getr   r   _strip_valuesIntegerreplacedictupdater   r5   )r   r8   r7   r:   rQ   rU   r9   argscol_type	type_argsvtype_kwkwtype_instancecol_kwr{   r}   r   r   r   col_ds                        r   r0   z(MySQLTableDefinitionParser._parse_column   sV    OO!!$';;=DDL%%++D1A{{}$VII4t;<F|IIELM L$y/4;Te	)||11%8H <42:I!W^RC((006I)-)9)9)A)A$)GHAQHIH h4 ;<!*q!1* 	#BxxE""	# ) 	'BxxE""2h	' hs,%i0I(C(R9_15-. )7w7 "z88Iu%3!&F: 88J&&*F?#("2"23&+F?# ((9d+fG((9d+oofd3;;D#FG((;'G,H/I$(1X(=%!)F:M7G
 	VU#S  	)II@EtL  ((H		) Is   0L M5M Mc                 ,   g }|D ]I  }dD cg c]  }||   	 c}\  }}}}	}
dg}|j                  | j                  j                  |             |j                  |       |s|j                  d       |	rd|	v rn|j                  d      r4|	j                  d      r#|j                  d       |j                  |	       n]|	dk(  r#|j                  d       |j                  |	       n5|j                  d       |j                  d	|	j	                  d
d      z         |
r|j                  |
       |j                  dj                  |             L dj                  d| j                  j                  |      z  dj                  |      dg      S c c}w )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.
        )r   r             rx   r^   	timestampCDEFAULTr|   z'%s'ro   r   r]   zCREATE TABLE %s (
z,
z
) )r5   r$   quote_identifierr.   r   join)r   r   r   bufferrowirU   r   rv   r{   extrar8   s               r   _describe_to_createz.MySQLTableDefinitionParser._describe_to_create  sw     	*C /:A:6T8Xw 5DKK66t<=KK!J'#w.((5':L:L; KK	*KK(&KK	*KK(KK	*KKd)C CDE"MM#((4.)7	*: ww *mm44Z@A 

6"	
 		
9:s   Fc           	          | j                   j                  |      D cg c]  \  }}}||rt        |      nd|f c}}}S c c}}}w )z8Unpack '"col"(2),"col" ASC'-ish strings into components.N)_re_keyexprsr   r   )r   identifierscolnamelength	modifierss        r   rK   z*MySQLTableDefinitionParser._parse_keyexprsB  sR    
 /3.?.?.G.G/
 
* Vc&kyA
 	
 
s   Ac                    g | _         g | _        | j                  j                  }t	        t        d| j                  j                  || j                  j                  |      fD cg c]  }t        j                  |       c}            }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
      | _        |j-                         }d|d<   t        d|z        | _        t        d|z        | _        t        d      | _        t4        D ]  }| j7                  |        dD ]  }| j9                  |        | j;                  dd       | j;                  dd       | j;                  dd       yc c}w )z Pre-compile regular expressions.)iqfqesc_fqzM^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<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_columnsr`   r$   final_quoter   zipr/   _escape_identifierr,   escape_pr_compile_unescape_identifierrV   _re_compiler>   r   r   r   r   r   rI   rL   copyrN   rO   rP   _options_of_type_string_add_option_string_add_option_word_add_option_regex)r   _finalsquotesr   options         r   r%   z(MySQLTableDefinitionParser._prep_regexesL  s9    **& 3388@ IIaL

 $DFLMMM..
 ''HI (9;AB
 ''GH 'v. &* +
4 !,- 06	6!
 #
 

  $/>$
  [[]84!,
5 8:
:"
$ "-% (*	*"
 ))IJ
 . 	,F##F+	,
 	*F" !!&)#	*& 	w6|-@AC	
Es   $G5z(?:\s*(?:=\s*)|\s+)c                     dt        j                  |      d| j                  d}| j                  j	                  t        |d              y )N(?P<directive>r'   z'(?P<val>(?:[^']|'')*?)'(?!')c                 F    | j                  dd      j                  dd      S )Nr~   r   r   ro   )r   )r   s    r   <lambda>z?MySQLTableDefinitionParser._add_option_string.<locals>.<lambda>  s    64!8!@!@s!K r   r,   r   _optional_equalsr`   r5   r   r   r[   rX   s      r   r   z-MySQLTableDefinitionParser._add_option_string   sB    IIi !!
 	K	
r   c                     dt        j                  |      d| j                  d}| j                  j	                  t        |             y )Nr   r'   z(?P<val>\w+)r   r   s      r   r   z+MySQLTableDefinitionParser._add_option_word  s9    IIi !!
 	E 23r   c                     dt        j                  |      d| j                  d|d}| j                  j	                  t        |             y )Nr   r'   z(?P<val>r   r   s      r   r   z,MySQLTableDefinitionParser._add_option_regex  s<    IIi !!

 	E 23r   N)r   r   r   r   r   r;   rA   r3   r2   r1   r0   r   rK   r%   r   r   r   r   r   r   r   r!   r!       sV    >
@10d	8J:e$N3
j
p
d .	
44r   r!   )COMMENTzDATA DIRECTORYzINDEX DIRECTORYPASSWORD
CONNECTIONc                     t        |       |fS )z1Prepare a 2-tuple of compiled regex and callable.)r   )rX   rY   s     r   r   r   $  s     ((r   c                 l    t        j                  | t         j                  t         j                  z        S )z)Compile a string to regex, I and UNICODE.)r,   compileIUNICODE)rX   s    r   r   r   *  s"     ::eRTTBJJ.//r   c                     g }| D ]A  }|dd dk(  s|dd dk(  r|dd j                  |d   dz  |d         }|j                  |       C |S )zStrip reflected values quotesr   r   "ro   rp   r   )r   r5   )valuesstrip_valuesas      r   r   r   0  sg    L Qq6S=AaFcM!B!q!A$/AA	
 r   r   )r,   
enumeratedr   r   r   r   r   r   r]   r
   r   r   objectr   class_loggerr!   r   r   r   r   r   r   r   <module>r      sj    
       ! 	!V 	! w4 w4 w4t )0r   