
    g2Y              
       B   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!j/                  d" e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    c/var/www/html/AdoubleTech/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                   x    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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                  ||       d|v 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 	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>    HHX{3 	Dtdmm&A&AAB""4/&))$6+&&tU3$--dE: "55d;t=II:TABe^JJ%%d+o-((//5o-((//59	: r   sqlreturnc                 J    t        | j                  j                  |            S r   )bool_re_is_viewmatch)r   r>   s     r   _check_viewz&MySQLTableDefinitionParser._check_viewM   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_keyrC   	groupdict_parse_keyexprs_re_key_version_sqlr$   unformat_identifiers_re_fk_constraint_re_ck_constraint_re_partition)r   r:   mr<   m2cs         r   r5   z-MySQLTableDefinitionParser._parse_constraintsP   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_namerC   groupr   )r   r:   r9   regexcleanuprT   s         r   r3   z,MySQLTableDefinitionParser._parse_table_name   s<     wKK&qwwv7E r   c                    i }|r|dk7  r{|}| 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'   	directiveval )auto_incrementzdata directoryzindex directoryN_)
_pr_optionssearchrZ   lowersubpopitemsr   r#   rX   )r   r:   r9   optionsrest_of_liner[   r\   rT   r^   valuenopeoptr_   s                r   r2   z/MySQLTableDefinitionParser._parse_table_options   s     DCKL"&"2"2 ;wLL.#$77;#75	#ENE-2	)*$yy\:; L 	$DKKd#	$   	JHCFIE4<<+<+<c BC	Jr   c                    i }|d d  }|j                  d      s|j                  d      r)|dd  }|j                  d      r|j                  d      r)| j                  D ]   \  }}|j                  |      }|rd|j                  vr)|j	                  d      }|j                         }|dk(  }	|dk(  s|	r|j                  dd	      }|j                  d
d	      }|	r|j                  d      r|d d }| j                  j                  dk(  r"|j                  d      rd|v sd|v sd|v r|d d }| j                  j                  d|d}
|||
<   n2|j                  dd      }|j	                  d      }|r ||      }|||<    n |j                         D ]  \  }}d| j                  j                  z  }d| j                  j                  z  }||k(  s||k(  r@||j                  vr||j                  |<   `|j                  |   d||j                  |<   ||j                  | j                  j                  d|<    y )N( r   r(   r^   subpartitionrK   z) */r`   ,r'   mariadbMAXVALUEMINVALUEENGINErb   _definitionsr_   z%s_partition_definitionsz%s_subpartition_definitionsz, )r/   rc   rd   patternrZ   re   replaceendswithr#   rX   rh   r   )r   r:   r9   ri   new_liner[   r\   rT   r^   is_subpartitiondefsrk   rm   r_   part_defsubpart_defs                   r   r4   z3MySQLTableDefinitionParser._parse_partition_options   sP   7!!#&(*=*=c*B|H !!#&(*=*=c*B #..  	NE7X&A5==8,I!)I'>9OK'?#++FB7#++C4"x'8'8'='}H<<$$	1h6G6G6L"h.%1#x/ $,CR=.2ll.?.?K ( &--c37	#ENE%*	"A 	D   	NHC1T\\5F5FGH74<<;L;LMKh#"4e111/2E'', ++C00E'',
 KN##t||/@/@#$FG	N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      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      }|t3        |      }|j)                  d      }|,t5        |      }|j)                  d      }||d k(  |d!<   ||d"<   t5        ||||#      }|j7                  |       |j8                  j;                  |       y# t        $ r0 t	        j
                  d
|d|d       t        j                  }Y zw 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 %rrX   coltypeargzDid not recognize type 'z' of column ''r`   r   rs   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)rX   typer   r   )
_re_columnrC   rM   _re_column_looser   r6   r#   ischema_namesKeyErrorsqltypesNullType_re_csv_strfindall_re_csv_intint
issubclassr   r   r   rg   getr   r   _strip_valuesIntegercleanup_textdictupdater   r7   )r   r:   r9   r<   rT   rX   r;   argscol_type	type_argsvtype_kwkwtype_instancecol_kwr   r   r   r   r   col_ds                        r   r1   z(MySQLTableDefinitionParser._parse_column   sa    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:88'/:=!&F: 88J&&*F?#("2"23&+F?# ((9d+fG((9d+"7+G((;'G,H/I$(1X(=%!)F:M7G
 	VU#Y  	)II@EtL  ((H		) Is   0L M5MMc                   
 g }|D ]A  

fddD        \  }}}}}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                  |	             D dj                  d| j                  j                  |      z  dj                  |      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   | ]	  }|     y wr   r   ).0irows     r   	<genexpr>zAMySQLTableDefinitionParser._describe_to_create.<locals>.<genexpr>W  s      :A:s   )r   r            rp   r   ra   	timestampCDEFAULTr   z'%s'r   ''r`   zCREATE TABLE %s (
z,
z
) )r7   r$   quote_identifierr/   rz   join)r   r   r   bufferrX   r   r   r   extrar:   r   s             @r   _describe_to_createz.MySQLTableDefinitionParser._describe_to_createI  si     	*C: /: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"	
 		
r   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   rN   z*MySQLTableDefinitionParser._parse_keyexprs~  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                  |        dD ]  }| j;                  |        | 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<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(?:.*))rw   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_columnsrc   r$   final_quoter   zipr0   _escape_identifierr-   escape_pr_compile_unescape_identifierrY   _re_compilerB   r   r   r   r   r   rL   rO   copyrQ   rR   rS   _options_of_type_string_add_option_string_add_option_word_add_partition_option_word_add_option_regex)r   _finalsquotesr   options         r   r%   z(MySQLTableDefinitionParser._prep_regexes  sZ    **& 3388@ IIaL

 $DFLMMM..
 ''HI (9;AB
 ''GH 'v. &. /
8 !,- 06	6!
 #
 

  $/>$
  [[]D4!,
5 8:
:"
$ "-% (*	*"
 ))IJ
 . 	,F##F+	,
 	*F$ !!&)%	*(
 	4F ++F3	4 	w6|-@AC	
_s   $Hz(?:\s*(?:=\s*)|\s+)c                     dt        j                  |      d| j                  d}| j                  j	                  t        |t                     y )N(?P<directive>r'   z'(?P<val>(?:[^']|'')*?)'(?!'))r-   r   _optional_equalsrc   r7   r   r   r   r^   r[   s      r   r   z-MySQLTableDefinitionParser._add_option_stringI  s;    IIi !!
 	E< @Ar   c                     dt        j                  |      d| j                  d}| j                  j	                  t        |             y )Nr   r'   z(?P<val>\w+)r-   r   r   rc   r7   r   r   s      r   r   z+MySQLTableDefinitionParser._add_option_wordP  s9    IIi !!
 	E 23r   c                 B   |dk(  s|dk(  r'dt        j                  |      d| j                  d}nJ|dk(  s|dk(  r'dt        j                  |      d| j                  d}ndt        j                  |      d	}| j                  j	                  t        |             y )
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		)$%%E /)Y,-F		)$%%E .G :<99MOE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_regexf  s<    IIi !!

 	E 23r   N)r   r   r   r   r   r=   strrA   rD   r5   r3   r2   r4   r1   r   rN   r%   r   r   r   r   r   r   r   r   r!   r!   "   sq    >
 D1s 1t 10d	8J46Nph$T3
j
}
~ .B444r   r!   )COMMENTzDATA DIRECTORYzINDEX DIRECTORYPASSWORD
CONNECTIONc                     t        |       |fS )z1Prepare a 2-tuple of compiled regex and callable.)r   )r[   r\   s     r   r   r   x  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)r[   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   "r   rs   r   )rz   r7   )valuesstrip_valuesas      r   r   r     sg    L Qq6S=AaFcM!B!q!A$/AA	
 r   raw_textr?   c                 f    d| v rt        j                  t        d |       } | j                  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-   rf   _control_char_regexprz   )r  s    r   r   r     s5    x66 "CX
 D#&&r   r   	
)	z\\z\0z\az\bz\tz\nz\vz\fz\r|c              #   F   K   | ]  }t        j                  |        y wr   )r-   r   )r   ks     r   r   r     s     5aRYYq\5s   !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   <module>r#     s    
       ! 	! 	! I	4 I	4 I	4X )0'3 '3 '   "rzzHH5#455 r   