3
Šãde"^  ã               @   s4  d Z ddlZddlmZmZ ddlmZmZmZmZm	Z	m
Z
mZ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mZ dd
lmZ y|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,m-Z-m.Z.m/Z/m0Z0 W n4 e1k
�rD Z2 zede2› �ƒe2‚W Y ddZ2[2X nX yddl3m4Z4 W n e1k
�rp   dZ5Y nX dZ5ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZC ejDjEZEejDjFZFejDjGZGejDjHZHejDjIZIee0dœd d!„ZJG d"d#„ d#ƒZKG d$d%„ d%eƒZLG d&d'„ d'e"ƒZMdS )(a¥  Django database Backend using MySQL Connector/Python.

This Django database backend is heavily based on the MySQL backend from Django.

Changes include:
* Support for microseconds (MySQL 5.6.3 and later)
* Using INFORMATION_SCHEMA where possible
* Using new defaults for, for example SQL_AUTO_IS_NULL

Requires and comes with MySQL Connector/Python v8.0.22 and later:
    http://dev.mysql.com/downloads/connector/python/
é    N)ÚdatetimeÚtime)	ÚAnyÚDictÚ	GeneratorÚIteratorÚListÚOptionalÚSetÚTupleÚUnion)Úsettings)ÚImproperlyConfigured)ÚIntegrityError)ÚBaseDatabaseWrapper)Ú	dateparseÚtimezone)Úcached_property)ÚMySQLConnection)ÚCMySQLConnection)ÚMySQLConverter)ÚMySQLCursor)ÚCMySQLCursor)Ú
HexLiteral)ÚPooledMySQLConnection)ÚParamsDictTypeÚParamsSequenceOrDictTypeÚParamsSequenceTypeÚRowTypeÚ
StrOrBytesz&Error loading mysql.connector module: )Údatetime_to_mysqlFTé   )ÚDatabaseClient)ÚDatabaseCreation)ÚDatabaseFeatures)ÚDatabaseIntrospection)ÚDatabaseOperations)ÚDatabaseSchemaEditor)ÚDatabaseValidation)ÚvalueÚreturnc             C   sf   t jrLtj| ƒr8tjd| › d�tƒ tjƒ }tj| |ƒ} | j	tj
ƒjdd�} tr\t| ƒ}|S | jdƒS )zDEquivalent to DateTimeField.get_db_prep_value. Used only by raw SQL.z!MySQL received a naive datetime (z$) while time zone support is active.N)Útzinfoz%Y-%m-%d %H:%M:%S.%f)r   ZUSE_TZr   Zis_naiveÚwarningsÚwarnÚRuntimeWarningZget_default_timezoneZ
make_awareÚ
astimezoneÚutcÚreplaceÚ	HAVE_CEXTr    Ústrftime)r)   Zdefault_timezoneZmysql_datetime© r4   úR/var/www/agendate/envp3/lib/python3.6/site-packages/mysql/connector/django/base.pyÚ$adapt_datetime_with_timezone_supportb   s    

r6   c               @   sè   e Zd ZdZdZeeef ddœdd	„Ze	e
e
d
œdd„ƒZe	ee ee d
œdd„ƒZdeee eeeeef ddf  dœdd„Zeeeedf ee f eeeeef ddf  dœdd„Zeedœdd„Zee dœdd„ZdS )ÚCursorWrapperzãWrapper around MySQL Connector/Python's cursor class.

    The cursor class is defined by the options passed to MySQL
    Connector/Python. If buffered option is True in those options,
    MySQLCursorBuffered will be used.
    é  éš  éë  é¹  N)Úcursorr*   c             C   s
   || _ d S )N)r<   )Úselfr<   r4   r4   r5   Ú__init__ƒ   s    zCursorWrapper.__init__)Úargsr*   c             C   s@   | s| S t | ƒ}x*| jƒ D ]\}}t|tƒrt|ƒ||< qW |S )N)ÚdictÚitemsÚ
isinstancer   r6   )r?   Únew_argsÚkeyr)   r4   r4   r5   Ú_adapt_execute_args_dict†   s    
z&CursorWrapper._adapt_execute_args_dictc             C   sD   | s| S t | ƒ}x*t| ƒD ]\}}t|tƒrt|ƒ||< qW t|ƒS )N)ÚlistÚ	enumeraterB   r   r6   Útuple)r?   rC   ÚiÚargr4   r4   r5   Ú_adapt_execute_args‘   s    
z!CursorWrapper._adapt_execute_args)Úqueryr?   r*   c             C   s€   d}t |tƒr| j|ƒ}n
| j|ƒ}y| jj||ƒS  tjjk
rz } z(|j	d | j
krhtt|j	ƒŽ d‚‚ W Y dd}~X nX dS )z­Executes the given operation

        This wrapper method around the execute()-method of the cursor is
        mainly needed to re-raise using different exceptions.
        Nr   )rB   r@   rE   rK   r<   ÚexecuteÚmysqlÚ	connectorÚOperationalErrorr?   Úcodes_for_integrityerrorr   rH   )r=   rL   r?   rC   Úexcr4   r4   r5   rM   ž   s    

zCursorWrapper.execute.c             C   s\   y| j j||ƒS  tjjk
rV } z(|jd | jkrDtt|jƒŽ d‚‚ W Y dd}~X nX dS )z±Executes the given operation

        This wrapper method around the executemany()-method of the cursor is
        mainly needed to re-raise using different exceptions.
        r   N)	r<   ÚexecutemanyrN   rO   rP   r?   rQ   r   rH   )r=   rL   r?   rR   r4   r4   r5   rS   ²   s    zCursorWrapper.executemany)Úattrr*   c             C   s   t | j|ƒS )z%Return an attribute of wrapped cursor)Úgetattrr<   )r=   rT   r4   r4   r5   Ú__getattr__Æ   s    zCursorWrapper.__getattr__)r*   c             C   s
   t | jƒS )z&Return an iterator over wrapped cursor)Úiterr<   )r=   r4   r4   r5   Ú__iter__Ê   s    zCursorWrapper.__iter__)r8   r9   r:   r;   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rQ   r   r   r   r>   Ústaticmethodr   rE   r	   r   rK   Ústrr   r   rM   r   r   rS   r   rV   r   r   rX   r4   r4   r4   r5   r7   t   s(      

$

$r7   c                   sL  e Zd ZU 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deZd d!d"d!d#d$d%d&d'd(d"d"d!d!d)œZd*Zd+d,d-d.d/d0d1œZ	d2Z
ee 
d3d4d5d6hZejZeZeZeZeZeZeZeZeed2d7œ‡ fd8d9„Z ee!d:œd;d<„Z"e#eef d=œd>d?„Z$e#eef e%e&e'e(f d@œdAdB„Z)d2d=œdCdD„Z*dfee+dEœdFdG„Z,d2d=œdHdI„Z-e!d2dJœdKdL„Z.e!d=œdMdN„Z/d2d=œdOdP„Z0dgee1e  d2dQœdRdS„Z2e!d=œdTdU„Z3e4e5ed=œdVdW„ƒƒZ6e4e#eef d=œdXdY„ƒZ7e4e#eef d=œdZd[„ƒZ8e4ed=œd\d]„ƒZ9e4e:e;d^f d=œd_d`„ƒZ<e4e=e d=œdadb„ƒZ>e?e!d=œdcdd„ƒZ@‡  ZAS )hÚDatabaseWrapperz Represent a database connection.rN   z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GenericIPAddressFieldZ	JSONFieldZNullBooleanFieldZOneToOneFieldÚPositiveBigIntegerFieldÚPositiveIntegerFieldÚPositiveSmallIntegerFieldZ	SlugFieldZSmallAutoFieldZSmallIntegerFieldZ	TextFieldZ	TimeFieldZ	UUIDFieldÚtinyblobÚblobÚ
mediumblobÚtinytextÚtextÚ
mediumtextz= %szLIKE %szLIKE BINARY %szREGEXP BINARY %sz	REGEXP %sz> %sz>= %sz< %sz<= %s)ÚexactZiexactÚcontainsÚ	icontainsÚregexZiregexÚ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('%%', {}))rp   rq   ru   rw   rv   rx   Nzread uncommittedzread committedzrepeatable readZserializable)r?   Úkwargsr*   c                sj   t ƒ j||Ž | jjdƒ}|rV|jdt ƒ| _|jdtƒ}t|tƒsLtdƒ‚|ƒ | _	ntƒ | _	t | _d S )NÚOPTIONSÚuse_pureÚconverter_classzXConverter class should be a subclass of mysql.connector.django.base.DjangoMySQLConverter)
Úsuperr>   Úsettings_dictÚgetr2   Ú	_use_pureÚDjangoMySQLConverterÚ
issubclassÚProgrammingErrorÚ	converter)r=   r?   ry   Úoptionsr|   )Ú	__class__r4   r5   r>   <  s    

zDatabaseWrapper.__init__)rT   r*   c             C   s   |j dƒrdS t‚d S )NZmysql_isF)ru   ÚAttributeError)r=   rT   r4   r4   r5   rV   P  s    
zDatabaseWrapper.__getattr__)r*   c             C   sf  dddddœ}| j }|d r(|d |d< |d r<|d |d< |d	 rP|d	 |d
< |d jdƒrl|d |d< n|d r€|d |d< |d r˜t|d ƒ|d< |jdi ƒjdƒrº|d d |d< tj|d< tjjj	j
g|d< yt|d jƒ }|jdƒ}|�r8|jƒ }|| jk�r8djdd„ t| jƒD ƒƒ}td|› d|› d�ƒ‚|| _|j|ƒ W n tk
�r`   Y nX |S )NÚutf8TF)ÚcharsetZuse_unicodeZbufferedZconsume_resultsÚUSERÚuserÚNAMEZdatabaseZPASSWORDÚpasswdZHOSTú/Zunix_socketÚhostZPORTÚportrz   Zinit_commandZraise_on_warningsZclient_flagsÚisolation_levelz, c             s   s   | ]}d |› d �V  qdS )ú'Nr4   )Ú.0Úlevelr4   r4   r5   ú	<genexpr>}  s    z8DatabaseWrapper.get_connection_params.<locals>.<genexpr>z%Invalid transaction isolation level 'z' specified.
Use one of z
, or None.)r~   ru   Úintr   r   ÚDEBUGrN   rO   Ú	constantsZ
ClientFlagZ
FOUND_ROWSÚcopyÚpopÚlowerÚisolation_levelsÚjoinÚsortedr   r‘   ÚupdateÚKeyError)r=   ry   r~   r…   r‘   Zvalid_levelsr4   r4   r5   Úget_connection_paramsU  sH    

z%DatabaseWrapper.get_connection_params)Úconn_paramsr*   c             C   s"   d|krt |d< tjjf |Ž}|S )Nr|   )r�   rN   rO   Úconnect)r=   r¢   Zcnxr4   r4   r5   Úget_new_connectionŠ  s    z"DatabaseWrapper.get_new_connectionc             C   s¢   g }| j jr|jdƒ | jr2|jd| jjƒ › �ƒ |rZ| jƒ �}|jdj|ƒƒ W d Q R X d| jkržy| j	| jd ƒ W n$ t
k
rœ   | j| jd ƒ Y nX d S )NzSET SQL_AUTO_IS_NULL = 0z(SET SESSION TRANSACTION ISOLATION LEVEL z; Z
AUTOCOMMIT)ÚfeaturesZis_sql_auto_is_null_enabledÚappendr‘   Úupperr<   rM   r�   r~   Zset_autocommitr‡   Ú_set_autocommit)r=   Zassignmentsr<   r4   r4   r5   Úinit_connection_state“  s    


z%DatabaseWrapper.init_connection_state)Únamer*   c             C   s   | j jƒ }t|ƒS )N)Ú
connectionr<   r7   )r=   rª   r<   r4   r4   r5   Úcreate_cursor¬  s    
zDatabaseWrapper.create_cursorc             C   s(   yt j| ƒ W n tk
r"   Y nX d S )N)r   Ú	_rollbackÚNotSupportedError)r=   r4   r4   r5   r­   °  s    zDatabaseWrapper._rollback)Ú
autocommitr*   c          	   C   s   | j � || j_W d Q R X d S )N)Zwrap_database_errorsr«   r¯   )r=   r¯   r4   r4   r5   r¨   ¶  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<   rM   )r=   r<   r4   r4   r5   Ú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<   rM   )r=   r±   r<   r4   r4   r5   Úenable_constraint_checkingÄ  s
    
z*DatabaseWrapper.enable_constraint_checking)Útable_namesr*   c       
      C   sú   | j ƒ �è}|dkr| jj|ƒ}xÌ|D ]Ä}| jj||ƒ}|s<q$| jj||ƒ}xœ|D ]”\}}}|jd|› d|› d|› d|› d|› d|› d|› d	|› d
�ƒ xL|jƒ D ]@}	td|› d|	d › d|› d|› d|	d › d|› d|› d�ƒ‚q W 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.
        Nz+
                        SELECT REFERRING.`z&`,
                        REFERRING.`z `
                        FROM `z2` as REFERRING
                        LEFT JOIN `zR` as REFERRED
                        ON (
                            REFERRING.`z*` =
                            REFERRED.`zE`
                        )
                        WHERE REFERRING.`z4` IS NOT NULL
                        AND REFERRED.`z"` IS NULL
                        zThe row in table 'z' with primary key 'r   z' has an invalid foreign key: Ú.z contains a value 'r!   z.' that does not have a corresponding value in )r<   Úintrospectionr³   Zget_primary_key_columnZget_key_columnsrM   Zfetchallr   )
r=   r³   r<   Z
table_nameZprimary_key_column_nameZkey_columnsZcolumn_nameZreferenced_table_nameZreferenced_column_nameZbad_rowr4   r4   r5   Úcheck_constraintsÑ  s     

8z!DatabaseWrapper.check_constraintsc             C   s(   y| j jƒ  W n tk
r"   dS X dS )NFT)r«   ZpingÚError)r=   r4   r4   r5   Ú	is_usable  s
    zDatabaseWrapper.is_usablec               C   s   dS )zDisplay name.ZMySQLr4   r4   r4   r4   r5   Údisplay_name  s    zDatabaseWrapper.display_namec             C   s   | j jrddddœ}|S i S )z<Mapping of Field objects to their SQL for CHECK constraints.z`%(column)s` >= 0)rf   rg   rh   )r¥   Z!supports_column_check_constraints)r=   r¶   r4   r4   r5   Ú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 )
zReturn MySQL server data.a2  
                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
            Nr   r!   é   é   é   é   )ÚversionÚsql_modeZdefault_storage_engineZsql_auto_is_nullZlower_case_table_namesZhas_zoneinfo_database)Útemporary_connectionrM   Úfetchonera   )r=   r<   Úrowr4   r4   r5   Úmysql_server_data  s    


z!DatabaseWrapper.mysql_server_datac          	   C   s*   | j ƒ �}|jdƒ |jƒ d S Q R X dS )zReturn MySQL version.zSELECT VERSION()r   N)rÁ   rM   rÂ   )r=   r<   r4   r4   r5   Úmysql_server_info5  s    

z!DatabaseWrapper.mysql_server_info.c          	   C   s.   | j ƒ }tjjf |Ž�}|jƒ }W dQ R X |S )zReturn MySQL version.N)r¡   rN   rO   r£   Zget_server_version)r=   ÚconfigÚconnZserver_versionr4   r4   r5   Úmysql_version<  s    zDatabaseWrapper.mysql_versionc          
   C   s@   | j ƒ �}|jdƒ |jƒ }W dQ R X t|r:|d jdƒnf ƒS )zReturn SQL mode.zSELECT @@sql_modeNr   ú,)r<   rM   rÂ   ÚsetÚsplit)r=   r<   rÀ   r4   r4   r5   rÀ   D  s    

zDatabaseWrapper.sql_modec             C   s
   | j }|S )z1Return True if pure Python version is being used.)r€   )r=   Zansr4   r4   r5   r{   L  s    zDatabaseWrapper.use_pure)	ri   rj   rk   r`   rl   rm   rn   re   rd   )N)N)BrY   rZ   r[   r\   ÚvendorZ
data_typesZ_limited_data_typesÚ	operatorsZpattern_escZpattern_opsr‘   r	   r^   rœ   rN   rO   ZDatabaser'   ZSchemaEditorClassr"   Zclient_classr#   Zcreation_classr$   Zfeatures_classr%   Zintrospection_classr&   Z	ops_classr(   Zvalidation_classr   r>   ra   rV   r   r¡   r   r   r   r   r¤   r©   r7   r¬   r­   r¨   r°   r²   r   r¶   r¸   r   r]   r¹   rº   rÄ   rÅ   r   r–   rÈ   r
   rÀ   Úpropertyr{   Ú__classcell__r4   r4   )r†   r5   r_   Ï   sÊ   
	        6

0r_   c               @   sˆ   e Zd ZdZedeeee dœdd„ƒZ	edeeee
 dœdd„ƒZeeeef dœd	d
„Zeeeef dœdd„Zeedœdd„ZdS )r�   zCustom converter for Django.N)r)   Údscr*   c             C   s   t j| jdƒƒS )zXReturn MySQL TIME data type as datetime.time()

        Returns datetime.time()
        zutf-8)r   Z
parse_timeÚdecode)r)   rÐ   r4   r4   r5   Ú_time_to_pythonX  s    z$DjangoMySQLConverter._time_to_pythonc             C   s   | rt j| ƒS dS )ao  Connector/Python always returns naive datetime.datetime

        Connector/Python always returns naive timestamps since MySQL has
        no time zone support.

        - A naive datetime is a datetime that doesn't know its own timezone.

        Django needs a non-naive datetime, but in this method we don't need
        to make a datetime value time zone aware since Django itself at some
        point will make it aware (at least in versions 3.2.16 and 4.1.2) when
        USE_TZ=True. This may change in a future release, we need to keep an
        eye on this behaviour.

        Returns datetime.datetime()
        N)r   Ú_datetime_to_python)r)   rÐ   r4   r4   r5   rÓ   `  s    z(DjangoMySQLConverter._datetime_to_python)r)   r*   c             C   s
   | j |ƒS )N)Ú_str_to_mysql)r=   r)   r4   r4   r5   Ú_safestring_to_mysqlu  s    z)DjangoMySQLConverter._safestring_to_mysqlc             C   s
   | j |ƒS )N)rÔ   )r=   r)   r4   r4   r5   Ú_safetext_to_mysqlx  s    z'DjangoMySQLConverter._safetext_to_mysqlc             C   s
   | j |ƒS )N)Z_bytes_to_mysql)r=   r)   r4   r4   r5   Ú_safebytes_to_mysql{  s    z(DjangoMySQLConverter._safebytes_to_mysql)N)N)rY   rZ   r[   r\   r]   Úbytesr   r	   r   rÒ   r   rÓ   r^   r   r   rÕ   rÖ   r×   r4   r4   r4   r5   r�   S  s   r�   )Nr\   r,   r   r   Útypingr   r   r   r   r   r	   r
   r   r   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.backends.base.baser   Zdjango.utilsr   r   Zdjango.utils.functionalr   Zmysql.connectorrN   Zmysql.connector.connectionr   Zmysql.connector.connection_cextr   Zmysql.connector.conversionr   Zmysql.connector.cursorr   Zmysql.connector.cursor_cextr   Zmysql.connector.custom_typesr   Zmysql.connector.poolingr   Zmysql.connector.typesr   r   r   r   r   ÚImportErrorÚerrZ_mysql_connectorr    r2   Úclientr"   Zcreationr#   r¥   r$   rµ   r%   Ú
operationsr&   Zschemar'   Z
validationr(   rO   r·   ZDatabaseErrorr®   rP   rƒ   r6   r7   r_   r�   r4   r4   r4   r5   Ú<module>*   sZ   , "
[   