ó
¿b›]c           @   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 d e f d „  ƒ  YZ e	 j d e f d „  ƒ  Yƒ Z d d d d d f Z e d „ Z d „  Z d S(   iÿÿÿÿNi   (   t   _EnumeratedValues(   t   SET(   t   DATETIME(   t   TIME(   t	   TIMESTAMPi   (   t   log(   t   types(   t   utilt   ReflectedStatec           B   s   e  Z d  Z d „  Z RS(   s;   Stores raw information about a SHOW CREATE TABLE statement.c         C   s:   g  |  _  i  |  _ d  |  _ g  |  _ g  |  _ g  |  _ d  S(   N(   t   columnst   table_optionst   Nonet
   table_namet   keyst   fk_constraintst   ck_constraints(   t   self(    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyt   __init__   s    					(   t   __name__t
   __module__t   __doc__R   (    (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR      s   t   MySQLTableDefinitionParserc           B   s€   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 RS(   s4   Parses the results of a SHOW CREATE TABLE statement.c         C   s    | |  _  | |  _ |  j ƒ  d  S(   N(   t   dialectt   preparert   _prep_regexes(   R   R   R   (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR   $   s    		c         C   sM  t  ƒ  } | | _ x4t j d | ƒ D] } | j d |  j j ƒ rW |  j | | ƒ q% | j d ƒ ry |  j | | ƒ q% | d k rˆ q% | j d ƒ rª |  j	 | | ƒ q% | s³ q% |  j
 | ƒ \ } } | d  k rè t j d | ƒ q% | d k r| j j | ƒ q% | d k r&| j j | ƒ q% | d	 k r% | j j | ƒ q% q% W| S(
   Ns   \r?\ns     s   ) t   )s   CREATE s   Unknown schema content: %rt   keyt   fk_constraintt   ck_constraint(   R   t   charsett   ret   splitt
   startswithR   t   initial_quotet   _parse_columnt   _parse_table_optionst   _parse_table_namet   _parse_constraintsR   R   t   warnR   t   appendR   R   (   R   t   show_createR   t   statet   linet   type_t   spec(    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyt   parse)   s0    		c         C   s¾  |  j  j | ƒ } | rÀ | j ƒ  } |  j | d ƒ | d <| d r‹ |  j j | d ƒ } | r‹ | j ƒ  d r‹ | j ƒ  d | d <q‹ n  | d r¶ |  j j | d ƒ d | d <n  d | f S|  j j | ƒ } | rd| j ƒ  } |  j j | d ƒ | d <g  |  j | d ƒ D] } | d ^ q| d <g  |  j | d ƒ D] } | d ^ q@| d <d	 | f S|  j j | ƒ } | r’| j ƒ  } d
 | f S|  j	 j | ƒ } | r´d | f Sd | f S(   sa   Parse a KEY or CONSTRAINT line.

        :param line: A line of SHOW CREATE TABLE output
        R	   t   version_sqlt   parseri    R   t   tablet   localt   foreignR   R   t	   partitionN(   t   _re_keyt   matcht	   groupdictt   _parse_keyexprst   _re_key_version_sqlR   t   unformat_identifierst   _re_fk_constraintt   _re_ck_constraintt   _re_partitionR   (   R   R*   t   mR,   t   m2t   c(    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR%   I   s8    

	

..


c         C   sC   |  j  \ } } | j | ƒ } | r? | | j d ƒ ƒ | _ n  d S(   sZ   Extract the table name.

        :param line: The first line of SHOW CREATE TABLE
        t   nameN(   t   _pr_nameR5   t   groupR   (   R   R*   R)   t   regext   cleanupR=   (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR$   {   s    c         C   s  i  } | s® | d k r n’ | } xˆ |  j  D]} \ } } | j | ƒ } | sT q- n  | j d ƒ | j d ƒ } }	 | rˆ | |	 ƒ }	 n  |	 | | j ƒ  <| j d | ƒ } q- Wx d
 D] }
 | j |
 d	 ƒ qµ Wx7 | j ƒ  D]) \ } } | | j d |  j	 j
 | f <qÜ Wd	 S(   sƒ   Build a dictionary of all reflected table-level options.

        :param line: The final line of SHOW CREATE TABLE output.
        R   t	   directivet   valt    t   auto_increments   data directorys   index directorys   %s_%sN(   RH   s   data directorys   index directory(   t   _pr_optionst   searchRB   t   lowert   subt   popR   t   itemsR
   R   R@   (   R   R*   R)   t   optionst   rest_of_lineRC   RD   R=   RE   t   valuet   nopet   optRF   (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR#   †   s"    c      	   C   sž  d } |  j j | ƒ } | r7 | j ƒ  } t | d <n1 |  j j | ƒ } | rh | j ƒ  } t | d <n  | sƒ t j d | ƒ d S| d s¡ t j d | ƒ n  | d | d | d } } } y |  j	 j
 | } Wn1 t k
 rt j d | | f ƒ t j } n X| d k s!| d	 k r*g  }	 n` | d
 d k r_| d d k r_|  j j | ƒ }	 n+ g  |  j j | ƒ D] }
 t |
 ƒ ^ qr}	 i  } t | t t t f ƒ rÇ|	 rÇ|	 j d
 ƒ | d <qÇn  x- d D]% } | j | t ƒ rÎt | | <qÎqÎWx1 d  D]) } | j | t ƒ rþ| | | | <qþqþWt | t ƒ rtt j |	 ƒ }	 t | t ƒ rtd	 |	 k rtt | d <qtn  | |	 | Ž  } i  } t | d <| j d t ƒ d k r¸t | d <n  | j d t ƒ r×t | d <n t | t j ƒ röt | d <n  | j d d ƒ } | d k rd } n  | j d d ƒ } | d k	 r\| j d d ƒ j d d ƒ } n  t d | d | d | d | ƒ } | j | ƒ | j j  | ƒ d S(!   s­   Extract column details.

        Falls back to a 'minimal support' variant if full parse fails.

        :param line: Any column-bearing line from SHOW CREATE TABLE
        t   fulls   Unknown column definition %rNs-   Incomplete reflection of column definition %rR@   t   coltypet   args*   Did not recognize type '%s' of column '%s'RG   i    t   'iÿÿÿÿt   fspt   unsignedt   zerofillR   t   collatet   retrieve_as_bitwiset   nullablet   notnulls   NOT NULLt   autoincrt   autoincrementt   defaultt   NULLt   comments   \\s   \s   ''t   type(   RY   RZ   (   R   R[   (!   R   t
   _re_columnR5   R6   t   Truet   _re_column_looset   FalseR   R&   R   t   ischema_namest   KeyErrort   sqltypest   NullTypet   _re_csv_strt   findallt   _re_csv_intt   intt
   issubclassR   R   R   RM   t   getR    t   _strip_valuesR   t   Integert   replacet   dictt   updateR	   R'   (   R   R*   R)   R,   R=   R@   R+   t   argst   col_typet	   type_argst   vt   type_kwt   kwt   type_instancet   col_kwRa   Rc   t   col_d(    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR"   £   sv    
 	 +
	!c         C   s‰  g  } xQ| D]I} g  d D] } | | ^ q \ } } } }	 }
 d g } | j  |  j j | ƒ ƒ | j  | ƒ | s„ | j  d ƒ n  |	 r*d |	 k r™ q*| j d	 ƒ rÔ |	 j d
 ƒ rÔ | j  d ƒ | j  |	 ƒ q*|	 d k rý | j  d ƒ | j  |	 ƒ q*| j  d ƒ | j  d |	 j d d ƒ ƒ n  |
 r@| j  |
 ƒ n  | j  d j | ƒ ƒ q Wd j d |  j j | ƒ d j | ƒ d g ƒ S(   sž  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.
        i    i   i   i   i   t    s   NOT NULLRH   t	   timestampt   Ct   DEFAULTRb   s   '%s'RW   s   ''RG   s   CREATE TABLE %s (
s   ,
s   
) (   i    i   i   i   i   (   R'   R   t   quote_identifierR    Ru   t   join(   R   R   R	   t   buffert   rowt   iR@   Ry   R]   Ra   t   extraR*   (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyt   _describe_to_create  s8    ,		 c         C   s   |  j  j | ƒ S(   s8   Unpack '"col"(2),"col" ASC'-ish strings into components.(   t   _re_keyexprsRn   (   R   t   identifiers(    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR7   7  s    c         C   sº  g  |  _  g  |  _ |  j j } t t d' g  |  j j | |  j j | ƒ f D] } t j	 | ƒ ^ qI ƒ ƒ } t
 d | |  j j ƒ |  _ t d | ƒ |  _ t d ƒ |  _ t d ƒ |  _ t d | ƒ |  _ t d	 | ƒ |  _ t d
 | ƒ |  _ t d ƒ |  _ | j ƒ  } d | d <t d | ƒ |  _ t d | ƒ |  _ t d ƒ |  _ x t D] } |  j | ƒ qQWx d( D] } |  j | ƒ qoW|  j d  d! ƒ |  j d" d# ƒ |  j d$ d% ƒ d& S()   s    Pre-compile regular expressions.t   iqt   fqt   esc_fqsM   ^CREATE (?:\w+ +)?TABLE +%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +\($sW   (?:(?:%(iq)s((?:%(esc_fq)s|[^%(fq)s])+)%(fq)s)(?:\((\d+)\))?(?: +(ASC|DESC))?(?=\,|$))+s   \x27(?:\x27\x27|[^\x27])*\x27s   \d+s#    %(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\(\)]+)?)))?(?: +(?P<autoincr>AUTO_INCREMENT))?(?: +COMMENT +'(?P<comment>(?:''|[^'])*)')?(?: +COLUMN_FORMAT +(?P<colfmt>\w+))?(?: +STORAGE +(?P<storage>\w+))?(?: +(?P<extra>.*))?,?$sŸ     %(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)?sX    (?:(?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>.+)\*/ +)?,?$s+   \!\d+ (?: *WITH PARSER +(?P<parser>\S+) *)?s"   RESTRICT|CASCADE|SET NULL|NOACTIONt   ons,    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))?s[     CONSTRAINT +%(iq)s(?P<name>(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +CHECK +\((?P<sqltext>.+)\),?s   (?:.*)(?:SUB)?PARTITION(?:.*)t   ENGINEt   TYPEt   AUTO_INCREMENTt   AVG_ROW_LENGTHs   CHARACTER SETs   DEFAULT CHARSETt   CHECKSUMt   COLLATEt   DELAY_KEY_WRITEt   INSERT_METHODt   MAX_ROWSt   MIN_ROWSt	   PACK_KEYSt
   ROW_FORMATt   KEY_BLOCK_SIZEt   UNIONs
   \([^\)]+\)t
   TABLESPACEs   .*? STORAGE DISKt	   RAID_TYPEs4   \w+\s+RAID_CHUNKS\s*\=\s*\w+RAID_CHUNKSIZE\s*=\s*\w+N(   RŽ   R   R   (   R’   R“   R”   R•   s   CHARACTER SETs   DEFAULT CHARSETR–   R—   R˜   R™   Rš   R›   Rœ   R   Rž   (   t   _re_columnsRI   R   t   final_quoteRv   t   zipR!   t   _escape_identifierR   t   escapet   _pr_compilet   _unescape_identifierRA   t   _re_compileRŒ   Rm   Ro   Re   Rg   R4   R8   t   copyR:   R;   R<   t   _options_of_type_stringt   _add_option_stringt   _add_option_wordt   _add_option_regex(   R   t   _finalt   st   quotesR}   t   option(    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR   <  s~    			4
	

              
s   (?:\s*(?:=\s*)|\s+)c         C   s<   d t  j | ƒ |  j f } |  j j t | d „  ƒ ƒ d  S(   Ns0   (?P<directive>%s)%s'(?P<val>(?:[^']|'')*?)'(?!')c         S   s   |  j  d d ƒ j  d d ƒ S(   Ns   \\s   \s   ''RW   (   Ru   (   R{   (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyt   <lambda>ó  RG   (   R   R¦   t   _optional_equalsRI   R'   R§   (   R   RE   RC   (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR¬   ì  s    	c         C   s6   d t  j | ƒ |  j f } |  j j t | ƒ ƒ d  S(   Ns   (?P<directive>%s)%s(?P<val>\w+)(   R   R¦   R´   RI   R'   R§   (   R   RE   RC   (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR­   ÷  s    c         C   s9   d t  j | ƒ |  j | f } |  j j t | ƒ ƒ d  S(   Ns   (?P<directive>%s)%s(?P<val>%s)(   R   R¦   R´   RI   R'   R§   (   R   RE   RC   (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR®   þ  s
    
(   R   R   R   R   R-   R%   R$   R#   R"   R‹   R7   R   R´   R¬   R­   R®   (    (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR       s   		 	2			_	5		®		t   COMMENTs   DATA DIRECTORYs   INDEX DIRECTORYt   PASSWORDt
   CONNECTIONc         C   s   t  |  ƒ | f S(   s1   Prepare a 2-tuple of compiled regex and callable.(   R©   (   RC   RD   (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR§     s    c         C   s   t  j |  t  j t  j Bƒ S(   s)   Compile a string to regex, I and UNICODE.(   R   t   compilet   It   UNICODE(   RC   (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyR©     s    (   R   t
   enumeratedR    R   R   R   R   R   RG   R   Rk   R   t   objectR   t   class_loggerR   R«   R   R§   R©   (    (    (    sC   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/reflection.pyt   <module>   s&   	ÿ è	