3
S^#                 @   s   d dl mZ d dlZd dl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mZmZ W n ek
r|   dZY nX d	ZG d
d deZdS )    )unicode_literalsN)settings)BaseDatabaseOperations)sixtimezone)
force_text)datetime_to_mysqltime_to_mysqlFTc                   s   e Zd ZdZeejd;d<dZdd Zdd	 Zd
d Z	dd Z
dd Zdd Z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$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Z fd1d2Z fd3d4Zd5d6 Zd7d8 Zd9d: Z   Z!S )>DatabaseOperationszmysql.connector.django.compilerr           )ZPositiveSmallIntegerFieldZPositiveIntegerFieldc             C   s&   |dkrdj |S dj |j |S d S )Nweek_dayzDAYOFWEEK({0})zEXTRACT({0} FROM {1}))formatupper)selflookup_type
field_name r   S/tmp/pip-build-8app2_gc/mysql-connector-python/mysql/connector/django/operations.pydate_extract_sql   s    
z#DatabaseOperations.date_extract_sqlc       	      C   s   ddddddg}d}d}y|j |d }W n tk
rB   |}Y n@X djdd |d| D dd ||d D  }dj||}|S )zReturns SQL simulating DATE_TRUNC

        This function uses MySQL functions DATE_FORMAT and CAST to
        simulate DATE_TRUNC.

        The field_name is returned when lookup_type is not supported.
        yearmonthdayhourminutesecond%Y-%m-%d %H:%i:%S0000-01-01 00:00:00    c             S   s   g | ]}|qS r   r   ).0fr   r   r   
<listcomp>9   s    z5DatabaseOperations.date_trunc_sql.<locals>.<listcomp>Nc             S   s   g | ]}|qS r   r   )r*   r+   r   r   r   r,   :   s    z)CAST(DATE_FORMAT({0}, '{1}') AS DATETIME))r   r   r   r   r    r!   )r"   r#   r$   r%   r&   r'   )index
ValueErrorjoinr   )	r   r   r   fieldsr   
format_defisql
format_strr   r   r   date_trunc_sql(   s    
z!DatabaseOperations.date_trunc_sqlc             C   sH   t jrdj|}|g}ng }|dkr0dj|}ndj|j |}||fS )NzCONVERT_TZ({0}, 'UTC', %s)r   zDAYOFWEEK({0})zEXTRACT({0} FROM {1}))r   USE_TZr   r   )r   r   r   tznameparamsr3   r   r   r   datetime_extract_sql?   s    

z'DatabaseOperations.datetime_extract_sqlc             C   s   t jrdj|}|g}ng }ddddddg}d}d}y|j|d }W n tk
r^   |}	Y n@X djdd |d | D dd ||d  D  }
dj||
}	|	|fS )NzCONVERT_TZ({0}, 'UTC', %s)r   r   r   r   r   r   %Y-%m-%d %H:%i:%S0000-r#   -01 00:r&   :00r(   r)   c             S   s   g | ]}|qS r   r   )r*   r+   r   r   r   r,   ^   s    z9DatabaseOperations.datetime_trunc_sql.<locals>.<listcomp>c             S   s   g | ]}|qS r   r   )r*   r+   r   r   r   r,   _   s    z)CAST(DATE_FORMAT({0}, '{1}') AS DATETIME))r:   r;   r<   r=   r>   r?   )r@   r#   rA   rB   r&   rC   )r   r6   r   r-   r.   r/   )r   r   r   r7   r8   r0   Zformat_r1   r2   r3   r4   r   r   r   datetime_trunc_sqlP   s     

z%DatabaseOperations.datetime_trunc_sqlc             C   s   d|j |j|jf g fS )z8Returns SQL for calculating date/time intervals
        z'INTERVAL '%d 0:0:%d:%d' DAY_MICROSECOND)dayssecondsmicroseconds)r   	timedeltar   r   r   date_interval_sqld   s    z$DatabaseOperations.date_interval_sqlc             C   s   | j jjrd| S d| S d S )NzINTERVAL %s MICROSECONDz#INTERVAL FLOOR(%s / 1000000) SECOND)
connectionfeaturessupports_microsecond_precision)r   r3   r   r   r   format_for_duration_arithmeticj   s    
z1DatabaseOperations.format_for_duration_arithmeticc             C   s   dS )NzDROP FOREIGN KEYr   )r   r   r   r   drop_foreignkey_sqlp   s    z&DatabaseOperations.drop_foreignkey_sqlc             C   s   ddg dffgS )z
        "ORDER BY NULL" prevents MySQL from implicitly ordering by grouped
        columns. If no ordering would otherwise be applied, we don't want any
        implicit sorting going on.
        NZNULLFr   )r   r   r   r   force_no_orderings   s    z$DatabaseOperations.force_no_orderingc             C   s
   dj |S )Nz(MATCH ({0}) AGAINST (%s IN BOOLEAN MODE))r   )r   r   r   r   r   fulltext_search_sql{   s    z&DatabaseOperations.fulltext_search_sqlc             C   s   t |jddS )Nreplace)errors)r   Z	statement)r   cursorr3   r8   r   r   r   last_executed_query~   s    z&DatabaseOperations.last_executed_queryc             C   s   dS )Nl    r   )r   r   r   r   no_limit_value   s    z!DatabaseOperations.no_limit_valuec             C   s"   |j dr|jdr|S dj|S )N`z`{0}`)
startswithendswithr   )r   namer   r   r   
quote_name   s    zDatabaseOperations.quote_namec             C   s   dS )NzRAND()r   )r   r   r   r   random_function_sql   s    z&DatabaseOperations.random_function_sqlFc             C   sf   |r^dg}x2|D ]*}|j dj|jd|j| j|d qW |j d |j| j|| |S g S d S )NzSET FOREIGN_KEY_CHECKS = 0;z{keyword} {table};ZTRUNCATE)keywordtablezSET FOREIGN_KEY_CHECKS = 1;)appendr   ZSQL_KEYWORDZ	SQL_FIELDrZ   extendZsequence_reset_by_name_sql)r   styleZtables	sequencesZallow_cascader3   r]   r   r   r   	sql_flush   s    

zDatabaseOperations.sql_flushc             C   s   |dkrt d|S )Nr   z@The database backend does not accept 0 as a value for AutoField.)r.   )r   valuer   r   r   validate_autopk_value   s    z(DatabaseOperations.validate_autopk_valuec             C   s
   | j |S )N)value_to_db_datetime)r   rc   r   r   r   adapt_datetimefield_value   s    z,DatabaseOperations.adapt_datetimefield_valuec             C   sn   |d krd S t j|r:tjr2|jt jjd d}ntd| jj	j
sP|jdd}| jjs`t|S | jjj|S )N)tzinfoz4MySQL backend does not support timezone-aware times.r   )microsecond)r   is_awarer   r6   
astimezoneutcrQ   r.   rJ   rK   rL   use_purer   	converterto_mysql)r   rc   r   r   r   re      s    

z'DatabaseOperations.value_to_db_datetimec             C   s
   | j |S )N)value_to_db_time)r   rc   r   r   r   adapt_timefield_value   s    z(DatabaseOperations.adapt_timefield_valuec             C   s<   |d krd S t j|rtd| jjs.t|S | jjj|S )Nz4MySQL backend does not support timezone-aware times.)r   ri   r.   rJ   rl   r	   rm   rn   )r   rc   r   r   r   ro      s    
z#DatabaseOperations.value_to_db_timec             C   s   dS )N@   r   )r   r   r   r   max_name_length   s    z"DatabaseOperations.max_name_lengthc             C   s*   dd |D }dj dd |D }d| S )Nc             s   s   | ]}d j |V  qdS )z, N)r/   )r*   rowr   r   r   	<genexpr>   s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>z, c             s   s   | ]}d j |V  qdS )z({0})N)r   )r*   r3   r   r   r   rt      s    zVALUES )r/   )r   r0   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r   bulk_insert_sql   s    z"DatabaseOperations.bulk_insert_sqlc                s(   |dkrddj | S tt| j||S )zS
        MySQL requires special cases for ^ operators in query expressions
        ^zPOW(%s),)r/   superr
   combine_expression)r   Z	connectorZsub_expressions)	__class__r   r   ry      s    
z%DatabaseOperations.combine_expressionc                sZ   t t| j|}|jj }|dkr.|j| j |dkrB|j| j |dkrV|j| j |S )NBooleanFieldNullBooleanFieldZ	UUIDFieldZ	TextField)r{   r|   )	rx   r
   get_db_convertersZoutput_fieldZget_internal_typer^   convert_booleanfield_valueconvert_uuidfield_valueconvert_textfield_value)r   
expression
convertersZinternal_type)rz   r   r   r}      s    

z$DatabaseOperations.get_db_convertersc             C   s   |dkrt |}|S )Nr   r(   )r   r(   )bool)r   rc   r   rJ   contextr   r   r   r~      s    z-DatabaseOperations.convert_booleanfield_valuec             C   s   |d k	rt j|}|S )N)uuidUUID)r   rc   r   rJ   r   r   r   r   r      s    
z*DatabaseOperations.convert_uuidfield_valuec             C   s   |d k	rt |}|S )N)r   )r   rc   r   rJ   r   r   r   r   r      s    z*DatabaseOperations.convert_textfield_value)r   r   )r   r   )F)"__name__
__module____qualname__Zcompiler_moduledictr   Zinteger_field_rangesr   r5   r9   rD   rI   rM   rN   rO   rP   rT   rU   rZ   r[   rb   rd   rf   re   rp   ro   rr   ru   ry   r}   r~   r   r   __classcell__r   r   )rz   r   r
      s<   

	r
   )
__future__r   r   ZdjangoZdjango.confr   Z"django.db.backends.base.operationsr   Zdjango.utilsr   r   Zdjango.utils.encodingr   Z_mysql_connectorr   r	   ImportErrorZ	HAVE_CEXTr
   r   r   r   r   <module>   s   
