
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    SWUU                      @   s  zd dl mZ W n ek
r(   eZY nX d dl mZ d dlZd dlT zd dlmZ W n> ek
r   zd dl	mZ W n ek
r   dZY nX Y nX zd dl
mZ W n ek
r   dZY nX eddd	d
dddddddddddddddddddddd d!d"d#d$d%gZG d&d' d'eZG d(d) d)eZG d*d+ d+eZG d,d- d-eZG d.d/ d/eZG d0d1 d1eZed2d3ZG d4d5 d5eZG d6d7 d7eZd:d8d9ZdS );    )OrderedDict)
namedtupleN)*)
FIELD_TYPE)postgres_extandasassertbreakclasscontinuedefdelelifelseexceptexecfinallyforfromglobalifimportinislambdanotorpassprintraisereturntrywhilewithyieldc                   @   s   e Zd ZdS )UnknownFieldN)__name__
__module____qualname__ r*   r*   G/opt/alt/python38/lib64/python3.8/site-packages/playhouse/reflection.pyr&      s   r&   c                   @   s\   e Zd ZdZeefZdddZdd Zdd	 Z	d
d Z
dd Zdd ZdddZdd ZdS )Columnz1
    Store metadata about a database column.
    FNc	           	      C   sF   || _ || _|| _|| _|| _|| _|| _|| _d | _d | _	d | _
d S N)namefield_classraw_column_typenullableprimary_key	db_columnindexunique	rel_modelrelated_nameto_field)	selfr.   r/   r0   r1   r2   r3   r4   r5   r*   r*   r+   __init__'   s    zColumn.__init__c                    s4   dddddg}d  fdd|D }d	 j|f S )
Nr/   r0   r1   r2   r3   , c                 3   s    | ]}d |t  |f V  qdS z%s=%sN)getattr).0attrr9   r*   r+   	<genexpr>>   s   z"Column.__repr__.<locals>.<genexpr>zColumn(%s, %s))joinr.   )r9   attrsZkeyword_argsr*   r@   r+   __repr__7   s    zColumn.__repr__c                 C   s   i }| j rd|d< | jtks(| j| jkr6d| j |d< | jrN| jtk	rNd|d< |  r| j|d< | j	rtd| j	 |d< | j
rd| j
 |d< |  s| jrd	|d
< n| jr|  sd	|d< |S )NTnullz'%s'r3   r2   r6   r8   r7   Truer5   r4   )r1   r/   ForeignKeyFieldr.   r3   r2   PrimaryKeyFieldis_foreign_keyr6   r8   r7   is_primary_keyr5   r4   )r9   paramsr*   r*   r+   get_field_parametersC   s&    

zColumn.get_field_parametersc                 C   s   | j tkp| jS r-   )r/   rH   r2   r@   r*   r*   r+   rJ   _   s    zColumn.is_primary_keyc                 C   s
   | j tkS r-   )r/   rG   r@   r*   r*   r+   rI   b   s    zColumn.is_foreign_keyc                 C   s   | j tko| jdkS Nz'self')r/   rG   r6   r@   r*   r*   r+   is_self_referential_fke   s    
zColumn.is_self_referential_fkc                 C   sJ   || _ t| _|j|jkr d| _n||j | _|r6|jp8d | _|pBd | _d S rM   )	foreign_keyrG   r/   
dest_tabletabler6   r.   r8   r7   )r9   rO   model_namesdestr7   r*   r*   r+   set_foreign_keyi   s    zColumn.set_foreign_keyc                 C   sT   |   }ddd t| D }d| j| jj|f }| jtkrPd|| jf }|S )Nr;   c                 s   s   | ]\}}d ||f V  qdS r<   r*   )r>   kvr*   r*   r+   rA   w   s   z#Column.get_field.<locals>.<genexpr>z%s = %s(%s)z%s  # %s)	rL   rB   sorteditemsr.   r/   r'   r&   r0   )r9   Zfield_paramsZ	param_strfieldr*   r*   r+   	get_fieldt   s    


zColumn.get_field)FNFF)NN)r'   r(   r)   __doc__IntegerFieldrH   Zprimary_key_typesr:   rD   rL   rJ   rI   rN   rT   rZ   r*   r*   r*   r+   r,   !   s           
  
r,   c                   @   sV   e Zd Zi ZdZdd Zdd ZdddZdd	d
ZdddZ	dddZ
dddZdS )Metadata c                 C   s   || _ d| _d S )NF)databaserequires_extension)r9   r_   r*   r*   r+   r:      s    zMetadata.__init__c                 G   s   | j ||S r-   )r_   execute_sql)r9   sqlrK   r*   r*   r+   execute   s    zMetadata.executeNc           
   	   C   s   t dd | j||D }| ||}| ||}t|dkr\|d }|| tkr\t||< t  }| D ]*\}}	t	||| |	j
|	j|	j|d||< qj|S )Nc                 s   s   | ]}|j |fV  qd S r-   r.   )r>   metadatar*   r*   r+   rA      s   z'Metadata.get_columns.<locals>.<genexpr>   r   )r/   r0   r1   r2   r3   )r   r_   get_columnsget_column_typesget_primary_keyslenr\   rH   rX   r,   	data_typerE   r2   )
r9   rQ   schemare   column_typesZpk_namespkcolumnsr.   column_datar*   r*   r+   rg      s(    zMetadata.get_columnsc                 C   s   t d S r-   )NotImplementedErrorr9   rQ   rl   r*   r*   r+   rh      s    zMetadata.get_column_typesc                 C   s   | j ||S r-   )r_   get_foreign_keysrr   r*   r*   r+   rs      s    zMetadata.get_foreign_keysc                 C   s   | j ||S r-   )r_   ri   rr   r*   r*   r+   ri      s    zMetadata.get_primary_keysc                 C   s   | j ||S r-   )r_   get_indexesrr   r*   r*   r+   rt      s    zMetadata.get_indexes)N)N)N)N)N)r'   r(   r)   
column_mapextension_importr:   rc   rg   rh   rs   ri   rt   r*   r*   r*   r+   r]      s   



r]   c                       s   e Zd Zeeeeeeeee	e	e
eeeeeedZdZ fddZdd Zd fdd		Zd fd
d	Zd fdd	Zd fdd	Z  ZS )PostgresqlMetadata)                  i  i  i  i  i:  iZ  i  i;  i  i  i  z$from playhouse.postgres_ext import *c                    s|   t t| | td k	rx| d}| }|D ]H\}}d|krLtj| j|< q.d|krbtj| j|< q.d|kr.tj	| j|< q.d S )Nz!select oid, typname from pg_type;ZjsonZhstoreZtsvector)
superrw   r:   r   rc   fetchall	JSONFieldru   HStoreFieldTSVectorField)r9   r_   cursorresultsZoidZtypname	__class__r*   r+   r:      s    
zPostgresqlMetadata.__init__c                 C   sz   i }t d k	r tt jt jt jfnt }d||f }| d| }|jD ].}| j|j	t
||j< ||j |krFd| _qF|S )Nz	"%s"."%s"zSELECT * FROM %s LIMIT 1T)r   setr   r   r   rc   descriptionru   get	type_coder&   r.   r`   )r9   rQ   rl   rm   Zextension_types
identifierr   column_descriptionr*   r*   r+   rh      s&    

z#PostgresqlMetadata.get_column_typesNc                    s   |pd}t t| ||S Npublic)r~   rw   rg   rr   r   r*   r+   rg      s    zPostgresqlMetadata.get_columnsc                    s   |pd}t t| ||S r   )r~   rw   rs   rr   r   r*   r+   rs      s    z#PostgresqlMetadata.get_foreign_keysc                    s   |pd}t t| ||S r   )r~   rw   ri   rr   r   r*   r+   ri      s    z#PostgresqlMetadata.get_primary_keysc                    s   |pd}t t| ||S r   )r~   rw   rt   rr   r   r*   r+   rt      s    zPostgresqlMetadata.get_indexes)N)N)N)N)r'   r(   r)   BooleanField	BlobFieldBigIntegerFieldr\   	TextField
FloatField	CharField	DateFieldDateTimeField	TimeFieldDecimalFieldru   rv   r:   rh   rg   rs   ri   rt   __classcell__r*   r*   r   r+   rw      s2   rw   c                (       s   e Zd Zedkri Zn|ejeejeej	e
ejeejeejeejeejeejeejeejeejeejeejeejeejeejeejeej eej!eiZ fddZ"dddZ#  Z$S )MySQLMetadataNc                    s.   d|kr| d|d< tt| j|f| d S )Npasswordpasswd)popr~   r   r:   )r9   r_   kwargsr   r*   r+   r:     s    zMySQLMetadata.__init__c                 C   sD   i }|  d| }|jD ]&}|d d \}}| j|t||< q|S )NzSELECT * FROM `%s` LIMIT 1   )rc   r   ru   r   r&   )r9   rQ   rl   rm   r   r   r.   r   r*   r*   r+   rh   #  s    
zMySQLMetadata.get_column_types)N)%r'   r(   r)   r   ru   BLOBr   CHARr   DATEr   DATETIMEr   DECIMALr   ZDOUBLEr   FLOATZINT24r\   Z	LONG_BLOBZLONGZLONGLONGr   ZMEDIUM_BLOBZ
NEWDECIMALZSHORTSTRING	TIMESTAMPTIMEr   Z	TINY_BLOBZTINYZ
VAR_STRINGr:   rh   r   r*   r*   r   r+   r     sZ                       r   c                   @   sb   e Zd Zeeeeeeee	e
e
e
eee
e
e
eedZdZdZdjeedZdZdd Zdd
dZd	S )SqliteMetadata)bigintblobboolZbooleanchardatedatetimedecimalZintegerzinteger unsignedintlongrealZsmallintegersmallintzsmallint unsignedtexttimez(?:["\[\(]+)?z(?:["\]\)]+)?zi(?:FOREIGN KEY\s*)?{begin}(.+?){end}\s+(?:.+\s+)?references\s+{begin}(.+?){end}\s*\(["|\[]?(.+?)["|\]]?\))beginendz&^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$c                 C   sR   |  }|| jkr| j| }n0t| j|r2t}ntdd|}| j|t}|S )Nz\(.+\)r^   )	lowerru   research
re_varcharr   subr   r&   )r9   column_typer0   r/   r*   r*   r+   _map_colP  s    
zSqliteMetadata._map_colNc                 C   s0   i }| j |}|D ]}| |j||j< q|S r-   )r_   rg   r   rk   r.   )r9   rQ   rl   rm   ro   columnr*   r*   r+   rh   [  s
    zSqliteMetadata.get_column_types)N)r'   r(   r)   r   r   r   r   r   r   r   r\   r   r   r   ru   r   r   formatZre_foreign_keyr   r   rh   r*   r*   r*   r+   r   1  s:    r   _DatabaseMetadata)ro   primary_keysforeign_keysrR   indexesc                   @   s   e Zd Zdd Zdd ZdS )DatabaseMetadatac                    sL   g } j  D ]8}t|jdkr fdd|jD }|||jf q|S )Nrf   c                    s*   g | ]"}| j  kr j  | jqS r*   )ro   r.   )r>   r   r9   rQ   r*   r+   
<listcomp>r  s   z9DatabaseMetadata.multi_column_indexes.<locals>.<listcomp>)r   rj   ro   appendr5   )r9   rQ   accumr4   field_namesr*   r   r+   multi_column_indexesn  s    z%DatabaseMetadata.multi_column_indexesc                 C   s6   i }| j | D ]"}t|jdkr|j||jd < q|S )Nrf   r   )r   rj   ro   r5   )r9   rQ   r   r4   r*   r*   r+   column_indexesx  s
    zDatabaseMetadata.column_indexesN)r'   r(   r)   r   r   r*   r*   r*   r+   r   m  s   
r   c                   @   sx   e Zd ZeegZdddZdd ZedddZ	dd	 Z
d
d Zdd Zdd Zdd Zdd ZdddZdddZdS )IntrospectorNc                 C   s   || _ || _d S r-   )re   rl   )r9   re   rl   r*   r*   r+   r:     s    zIntrospector.__init__c                 C   s   d| j j S )Nz<Introspector: %s>re   r_   r@   r*   r*   r+   rD     s    zIntrospector.__repr__c                 C   s<   t |trt|}nt |tr(t|}nt|}| ||dS Nrl   )
isinstancePostgresqlDatabaserw   MySQLDatabaser   r   )clsr_   rl   re   r*   r*   r+   from_database  s    



zIntrospector.from_databasec                 C   s   t | jjS r-   )typere   r_   r@   r*   r*   r+   get_database_class  s    zIntrospector.get_database_classc                 C   s
   | j jjS r-   r   r@   r*   r*   r+   get_database_name  s    zIntrospector.get_database_namec                 C   s
   | j jjS r-   )re   r_   connect_kwargsr@   r*   r*   r+   get_database_kwargs  s    z Introspector.get_database_kwargsc                 C   s   | j jrd| j j S dS )N
r^   )re   r`   rv   r@   r*   r*   r+   get_additional_imports  s    z#Introspector.get_additional_importsc                 C   s@   t dd|}ddd |dD }|d  s<d| }|S )N[^\w]+r^   c                 s   s   | ]}|  V  qd S r-   )title)r>   r   r*   r*   r+   rA     s     z/Introspector.make_model_name.<locals>.<genexpr>_r   T)r   r   rB   splitisalpha)r9   rQ   modelZ
model_namer*   r*   r+   make_model_name  s
    zIntrospector.make_model_namec                 C   s@   t dd|  p| }t dd|}|tkr<|d7 }|S )Nz_id$r^   r   r   )r   r   r   stripRESERVED_WORDS)r9   r   r*   r*   r+   make_column_name  s
    zIntrospector.make_column_namec                    s  | j r| jjj| j d}n| jj } d k	r@ fdd|D }i }i }i }i }i }|D ]D}| j|| j }	| j|| j }
z| j|| j ||< W n4 tk
r } zt|j	  g ||< W 5 d }~X Y nX | 
|||< tdd |
D }|
 D ]>\}}| |}| }|dr,||kr,| }||_q|	D ]@}t|jdkr8|jd }||
kr8|j|
| _d	|
| _q8| j|| j ||< |
||< |	||< qXi }d
d }|D ]}t }t|| |dD ]d}z|| |j }W n tk
r   Y qY nX |j}||kr"d||jf ||< n
|| qʐq|D ]n}|| D ]^}||j |j }z||j |j }W n tk
r   d }Y nX |j|||||d qDq8t|||||S )Nr   c                    s   g | ]}| kr|qS r*   r*   )r>   rQ   table_namesr*   r+   r     s      z+Introspector.introspect.<locals>.<listcomp>c                 s   s   | ]}|  V  qd S r-   )r   )r>   Zcolumn_namer*   r*   r+   rA     s   z*Introspector.introspect.<locals>.<genexpr>_idrf   r   Tc                 S   s   | j S r-   )r   )rO   r*   r*   r+   <lambda>      z)Introspector.introspect.<locals>.<lambda>)keyz	%s_%s_set)rO   rR   rS   r7   ) rl   re   r_   
get_tablesrt   rg   rs   
ValueErrorerrargsr   r   rX   r   r   endswithr.   rj   ro   r5   r4   ri   rW   r   KeyErrorrP   addrQ   dest_columnrT   r   r   )r9   r   Ztablesro   r   r   rR   r   rQ   Ztable_indexesZtable_columnsexcZlower_col_namescol_namer   new_nameZ
lower_namer4   Zrelated_namesZsort_fnZmodels_referencedrO   rP   srcrS   r*   r   r+   
introspect  s    
 



 


zIntrospector.introspectFc                    sd   j |di }G fdddt  fddtj D ]\}}||krD|| qD|S )Nr   c                       s   e Zd ZG  fdddZdS )z/Introspector.generate_models.<locals>.BaseModelc                       s   e Zd Z jjZdS )z4Introspector.generate_models.<locals>.BaseModel.MetaN)r'   r(   r)   re   r_   r*   r@   r*   r+   Meta!  s   r   N)r'   r(   r)   r   r*   r@   r*   r+   	BaseModel   s   r   c                    s"  j |  D ]$}|j}||kr
|| kr
|| q
g j|  }| D ]\}}|jrF|j qF|  | }G  fddd}d}	t	dkr|
 t	dkrtfdd| D  |_d}	d|i}
| D ]\}}|j}|tkrt}||jd	}|jr*|	r*|tkr t}d|d
< n|jrD|tk	rDd|d
< | r| rbd|d< n|jj}|| |d< |jr|j|d< d| |f |d< ||kr| s|| rd|d< n| sd|d< |f ||
|j< qztt| f|
|| < W n tk
r   s Y nX d S )Nc                       s   e Zd Z ZdS )zAIntrospector.generate_models.<locals>._create_model.<locals>.MetaN)r'   r(   r)   r   r*   )r   r*   r+   r   4  s   r   Fr   rf   c                    s   g | ]\}}| kr|j qS r*   rd   )r>   colrY   )r   r*   r+   r   <  s   zGIntrospector.generate_models.<locals>._create_model.<locals>.<listcomp>T)r3   rE   r2   r9   r6   r8   z	%s_%s_relr7   r5   r4   )r   rP   ro   rX   r2   r   r.   r   r   rj   keysCompositeKeyr/   r&   	BareFieldr1   rH   r\   rI   rN   rO   r8   rJ   r   strr   )rQ   modelsrO   rS   ro   r3   r   r   r   composite_keyrC   Z
FieldClassrK   rP   )r   _create_modelr_   skip_invalid)r   r   r+   r  $  sj    












z3Introspector.generate_models.<locals>._create_model)r   ModelrW   rR   rX   )r9   r  r   r  rQ   r   r*   )r   r  r_   r9   r  r+   generate_models  s    FzIntrospector.generate_models)N)N)N)FN)r'   r(   r)   rH   r\   Z
pk_classesr:   rD   classmethodr   r   r   r   r   r   r   r   r  r*   r*   r*   r+   r     s   
	
lr   c                 C   s   t j| |d}| S r   )r   r   r   )r_   rl   Zintrospectorr*   r*   r+   r   q  s    r   )N)collectionsr   ImportErrordictr   r   peeweeZMySQLdb.constantsr   Zpymysql.constants	playhouser   r   r   objectr&   r,   r]   rw   r   r   r   r   r   r   r*   r*   r*   r+   <module>   sz   

                           c3L.4
 r