3
gP?                 @   sZ  d 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 ydd	lZW n, ek
r Z zed
eW Y d	d	Z[X nX ddlmZ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dl%m&Z& ej'Z(e(dk r edej) eej*ej+iZ,edZ-G dd dZ.G dd de	Z/d	S )za
MySQL database backend for Django.

Requires mysqlclient: https://pypi.org/project/mysqlclient/
    )ImproperlyConfigured)IntegrityError)utils)BaseDatabaseWrapper)async_unsafe)cached_property)_lazy_re_compileNz:Error loading MySQLdb module.
Did you install mysqlclient?)CLIENT
FIELD_TYPE)conversions   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditor)DatabaseValidation   z4mysqlclient 1.4.0 or newer is required; you have %s.z(\d{1,2})\.(\d{1,2})\.(\d{1,2})c               @   s>   e Zd ZdZdZdd Zdd	d
Zdd Zdd Zdd Z	dS )CursorWrappera6  
    A thin wrapper around MySQLdb's normal cursor class that catches particular
    exception instances and reraises them with the correct types.

    Implemented as a wrapper, rather than a subclass, so that it isn't stuck
    to the particular underlying representation returned by Connection.cursor().
            c             C   s
   || _ d S )N)cursor)selfr    r   [/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/db/backends/mysql/base.py__init__C   s    zCursorWrapper.__init__Nc             C   sX   y| j j||S  tjk
rR } z&|jd | jkr@tt|j  W Y d d }~X nX d S )Nr   )r   executeDatabaseOperationalErrorargscodes_for_integrityerrorr   tuple)r   queryr"   er   r   r   r   F   s    zCursorWrapper.executec             C   sX   y| j j||S  tjk
rR } z&|jd | jkr@tt|j  W Y d d }~X nX d S )Nr   )r   executemanyr    r!   r"   r#   r   r$   )r   r%   r"   r&   r   r   r   r'   Q   s    zCursorWrapper.executemanyc             C   s   t | j|S )N)getattrr   )r   attrr   r   r   __getattr__[   s    zCursorWrapper.__getattr__c             C   s
   t | jS )N)iterr   )r   r   r   r   __iter__^   s    zCursorWrapper.__iter__)r   r   r   r   )N)
__name__
__module____qualname____doc__r#   r   r   r'   r*   r,   r   r   r   r   r   4   s      

r   c               @   sb  e Zd ZdZ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ZdVZdd d!d d"d#d$d%d!d!d d d&Zd'Zd(d)d*d+d,d-d.Zd/d0d1d2hZ	e
Z
eZeZeZeZeZeZeZd3d4 Zed5d6 Zd7d8 ZedWd:d;Zd<d= Zd>d? Zd@dA Z dBdC Z!dXdDdEZ"dFdG Z#e$dHdI Z%e$dJdK Z&e$dLdM Z'e$dNdO Z(e$dPdQ Z)e$dRdS Z*e$dTdU Z+d9S )YDatabaseWrapperZmysqlzinteger AUTO_INCREMENTzbigint AUTO_INCREMENTlongblobboolzvarchar(%(max_length)s)datezdatetime(6)z+numeric(%(max_digits)s, %(decimal_places)s)Zbigintzdouble precisionintegerzchar(15)zchar(39)jsonzbigint UNSIGNEDzinteger UNSIGNEDzsmallint UNSIGNEDzsmallint AUTO_INCREMENTZsmallintlongtextztime(6)zchar(32))Z	AutoFieldZBigAutoFieldZBinaryFieldZBooleanFieldZ	CharFieldZ	DateFieldZDateTimeFieldZDecimalFieldZDurationFieldZ	FileFieldZFilePathFieldZ
FloatFieldZIntegerFieldZBigIntegerFieldZIPAddressFieldZGenericIPAddressField	JSONFieldZNullBooleanFieldZOneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerFieldZ	SlugFieldZSmallAutoFieldZSmallIntegerFieldZ	TextFieldZ	TimeFieldZ	UUIDFieldtinyblobblob
mediumblobtinytexttext
mediumtextz= %szLIKE %szLIKE BINARY %sz> %sz>= %sz< %sz<= %s)exactZiexactcontains	icontainsgtZgteltZlte
startswithendswithistartswith	iendswithzCREPLACE(REPLACE(REPLACE({}, '\\', '\\\\'), '%%', '\%%'), '_', '\_')z"LIKE BINARY CONCAT('%%', {}, '%%')zLIKE CONCAT('%%', {}, '%%')zLIKE BINARY CONCAT({}, '%%')zLIKE CONCAT({}, '%%')zLIKE BINARY CONCAT('%%', {})zLIKE CONCAT('%%', {}))rC   rD   rG   rI   rH   rJ   zread uncommittedzread committedzrepeatable readZserializablec             C   s  t dd}| j}|d r$|d |d< |d r8|d |d< |d rL|d |d< |d	 jd
rh|d	 |d< n|d	 r||d	 |d< |d rt|d |d< tj|d< |d j }|jdd}|r|j }|| j	krt
d|djdd t| j	D f || _|j| |S )Nutf8)convcharsetUSERuserNAMEZdatabaseZPASSWORDpasswordZHOST/Zunix_sockethostZPORTportZclient_flagOPTIONSisolation_levelzread committedzKInvalid transaction isolation level '%s' specified.
Use one of %s, or None.z, c             s   s   | ]}d | V  qdS )z'%s'Nr   ).0sr   r   r   	<genexpr>   s    z8DatabaseWrapper.get_connection_params.<locals>.<genexpr>)django_conversionssettings_dictrG   intr	   Z
FOUND_ROWScopypoplowerisolation_levelsr   joinsortedrV   update)r   kwargsr[   optionsrV   r   r   r   get_connection_params   s8    

 
z%DatabaseWrapper.get_connection_paramsc             C   s,   t jf |}|jjttkr(|jjt |S )N)r    connectencodersgetbytesr^   )r   Zconn_params
connectionr   r   r   get_new_connection   s    z"DatabaseWrapper.get_new_connectionc          
   C   s\   g }| j jr|jd | jr0|jd| jj   |rX| j }|jdj| W d Q R X d S )NzSET SQL_AUTO_IS_NULL = 0z*SET SESSION TRANSACTION ISOLATION LEVEL %sz; )featuresZis_sql_auto_is_null_enabledappendrV   upperr   r   ra   )r   Zassignmentsr   r   r   r   init_connection_state   s    

z%DatabaseWrapper.init_connection_stateNc             C   s   | j j }t|S )N)rk   r   r   )r   namer   r   r   r   create_cursor  s    
zDatabaseWrapper.create_cursorc             C   s*   yt j|  W n tjk
r$   Y nX d S )N)r   	_rollbackr    ZNotSupportedError)r   r   r   r   rs     s    zDatabaseWrapper._rollbackc          	   C   s"   | j  | jj| W d Q R X d S )N)Zwrap_database_errorsrk   
autocommit)r   rt   r   r   r   _set_autocommit  s    zDatabaseWrapper._set_autocommitc          	   C   s"   | j  }|jd W dQ R X dS )z
        Disable foreign key checks, primarily for use in adding rows with
        forward references. Always return True to indicate constraint checks
        need to be re-enabled.
        zSET foreign_key_checks=0NT)r   r   )r   r   r   r   r   disable_constraint_checking  s    
z+DatabaseWrapper.disable_constraint_checkingc             C   s>   d| j  | _ }z"| j }|jd W dQ R X W d|| _ X dS )zM
        Re-enable foreign key checks after they have been disabled.
        FzSET foreign_key_checks=1N)needs_rollbackr   r   )r   rw   r   r   r   r   enable_constraint_checking  s
    
z*DatabaseWrapper.enable_constraint_checkingc       
      C   s   | j  }|dkr| jj|}x|D ]}| jj||}|s<q$| jj||}xd|D ]\\}}}|jd||||||||f  x2|j D ]&}	td||	d |||	d ||f qW qPW q$W W dQ R X dS )a]  
        Check each table name in `table_names` for rows with invalid foreign
        key references. This method is intended to be used in conjunction with
        `disable_constraint_checking()` and `enable_constraint_checking()`, to
        determine if rows with invalid references were entered while constraint
        checks were off.
        Na0  
                        SELECT REFERRING.`%s`, REFERRING.`%s` FROM `%s` as REFERRING
                        LEFT JOIN `%s` as REFERRED
                        ON (REFERRING.`%s` = REFERRED.`%s`)
                        WHERE REFERRING.`%s` IS NOT NULL AND REFERRED.`%s` IS NULL
                        zThe row in table '%s' with primary key '%s' has an invalid foreign key: %s.%s contains a value '%s' that does not have a corresponding value in %s.%s.r   r   )r   introspectiontable_namesZget_primary_key_columnZget_key_columnsr   Zfetchallr   )
r   rz   r   Z
table_nameZprimary_key_column_nameZkey_columnsZcolumn_nameZreferenced_table_nameZreferenced_column_nameZbad_rowr   r   r   check_constraints)  s&    

z!DatabaseWrapper.check_constraintsc             C   s.   y| j j  W n tjk
r$   dS X dS d S )NFT)rk   Zpingr    Error)r   r   r   r   	is_usableQ  s
    zDatabaseWrapper.is_usablec             C   s   | j r
dS dS )NZMariaDBZMySQL)mysql_is_mariadb)r   r   r   r   display_nameY  s    zDatabaseWrapper.display_namec             C   s4   | j jr0dddd}| jr,| jdk r,d|d< |S i S )	Nz`%(column)s` >= 0)r9   r:   r;   
   r      zJSON_VALID(`%(column)s`)r8   )r   r   r   )rm   Z!supports_column_check_constraintsr~   mysql_version)r   r{   r   r   r   data_type_check_constraints]  s    z+DatabaseWrapper.data_type_check_constraintsc             C   s\   | j  }|jd |j }W d Q R X |d |d |d t|d t|d t|d dS )	Na2  
                SELECT VERSION(),
                       @@sql_mode,
                       @@default_storage_engine,
                       @@sql_auto_is_null,
                       @@lower_case_table_names,
                       CONVERT_TZ('2001-01-01 01:00:00', 'UTC', 'UTC') IS NOT NULL
            r   r      r   r      )versionsql_modeZdefault_storage_engineZsql_auto_is_nullZlower_case_table_namesZhas_zoneinfo_database)Ztemporary_connectionr   Zfetchoner3   )r   r   rowr   r   r   mysql_server_datal  s    


z!DatabaseWrapper.mysql_server_datac             C   s
   | j d S )Nr   )r   )r   r   r   r   mysql_server_info  s    z!DatabaseWrapper.mysql_server_infoc             C   s4   t j| j}|std| j tdd |j D S )Nz8Unable to determine MySQL version from version string %rc             s   s   | ]}t |V  qd S )N)r\   )rW   xr   r   r   rY     s    z0DatabaseWrapper.mysql_version.<locals>.<genexpr>)server_version_rematchr   	Exceptionr$   groups)r   r   r   r   r   r     s    zDatabaseWrapper.mysql_versionc             C   s   d| j j kS )NZmariadb)r   r_   )r   r   r   r   r~     s    z DatabaseWrapper.mysql_is_mariadbc             C   s    | j d }t|r|jdnf S )Nr   ,)r   setsplit)r   r   r   r   r   r     s    
zDatabaseWrapper.sql_mode)	r<   r=   r>   r2   r?   r@   rA   r7   r6   )N)N),r-   r.   r/   vendorZ
data_typesZ_limited_data_types	operatorsZpattern_escZpattern_opsr`   r    r   ZSchemaEditorClassr   Zclient_classr   Zcreation_classr   Zfeatures_classr   Zintrospection_classr   Z	ops_classr   Zvalidation_classrf   r   rl   rp   rr   rs   ru   rv   rx   r{   r}   r   r   r   r   r   r   r~   r   r   r   r   r   r1   b   s   	 %

(r1   )r   r   r   )0r0   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.backendsr   Zbackend_utilsZdjango.db.backends.base.baser   Zdjango.utils.asyncior   Zdjango.utils.functionalr   Zdjango.utils.regex_helperr   ZMySQLdbr    ImportErrorerrZMySQLdb.constantsr	   r
   ZMySQLdb.convertersr   clientr   Zcreationr   rm   r   ry   r   
operationsr   Zschemar   Z
validationr   version_infor   __version__ZTIMEZtypecast_timerZ   r   r   r1   r   r   r   r   <module>   s<   
.