U
    8ÄT_ñ   ã                   @   s¶   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 e 
d¡ZG dd„ dƒZG dd„ deƒ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S )é    N)Úcontextmanager)ÚNotSupportedErrorzdjango.db.backendsc                   @   sx   e Zd Zdd„ ZeddddgƒZdd„ Zd	d
„ Zdd„ Zdd„ Z	ddd„Z
ddd„Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚCursorWrapperc                 C   s   || _ || _d S ©N)ÚcursorÚdb)Úselfr   r   © r	   ú</tmp/pip-unpacked-wheel-dv63caxw/django/db/backends/utils.pyÚ__init__   s    zCursorWrapper.__init__ZfetchoneZ	fetchmanyZfetchallZnextsetc                 C   s*   t | j|ƒ}|tjkr"| j |¡S |S d S r   )Úgetattrr   r   ÚWRAP_ERROR_ATTRSr   Úwrap_database_errors)r   ÚattrZcursor_attrr	   r	   r
   Ú__getattr__   s    
zCursorWrapper.__getattr__c              	   c   s$   | j j� | jE d H  W 5 Q R X d S r   )r   r   r   ©r   r	   r	   r
   Ú__iter__   s    
zCursorWrapper.__iter__c                 C   s   | S r   r	   r   r	   r	   r
   Ú	__enter__    s    zCursorWrapper.__enter__c                 C   s,   z|   ¡  W n | jjjk
r&   Y nX d S r   )Úcloser   ZDatabaseÚError)r   ÚtypeÚvalueÚ	tracebackr	   r	   r
   Ú__exit__#   s    zCursorWrapper.__exit__Nc              
   C   sª   |d k	r| j jjstdƒ‚| j  ¡  | j j�t |d krV|d krV| j |¡W  5 Q R £ S |d krx| j ||¡W  5 Q R £ S |p~d}| j |||¡W  5 Q R £ S W 5 Q R X d S )NzKKeyword parameters for callproc are not supported on this database backend.r	   )r   ÚfeaturesZsupports_callproc_kwargsr   Úvalidate_no_broken_transactionr   r   Úcallproc)r   ZprocnameÚparamsZkparamsr	   r	   r
   r   /   s    ÿ

zCursorWrapper.callprocc                 C   s   | j ||d| jd�S )NF©ÚmanyÚexecutor)Ú_execute_with_wrappersÚ_execute©r   Úsqlr   r	   r	   r
   ÚexecuteA   s    zCursorWrapper.executec                 C   s   | j ||d| jd�S )NTr   )r!   Ú_executemany©r   r$   Ú
param_listr	   r	   r
   ÚexecutemanyD   s    zCursorWrapper.executemanyc                 C   s8   | j | dœ}t| j jƒD ]}t ||¡}q|||||ƒS )N)Ú
connectionr   )r   ÚreversedZexecute_wrappersÚ	functoolsÚpartial)r   r$   r   r   r    ÚcontextÚwrapperr	   r	   r
   r!   G   s    z$CursorWrapper._execute_with_wrappersc              
   G   s\   | j  ¡  | j j�@ |d kr4| j |¡W  5 Q R £ S | j ||¡W  5 Q R £ S W 5 Q R X d S r   )r   r   r   r   r%   )r   r$   r   Úignored_wrapper_argsr	   r	   r
   r"   M   s
    

zCursorWrapper._executec              
   G   s8   | j  ¡  | j j� | j ||¡W  5 Q R £ S Q R X d S r   )r   r   r   r   r)   )r   r$   r(   r0   r	   r	   r
   r&   V   s    

zCursorWrapper._executemany)NN)N)Ú__name__Ú
__module__Ú__qualname__r   Ú	frozensetr   r   r   r   r   r   r%   r)   r!   r"   r&   r	   r	   r	   r
   r      s   

	r   c                       s8   e Zd Zd	‡ fdd„	Z‡ fdd„Zed
dd„ƒZ‡  ZS )ÚCursorDebugWrapperNc              
      s6   | j ||dd�� tƒ  ||¡W  5 Q R £ S Q R X d S )NT)Úuse_last_executed_query)Ú	debug_sqlÚsuperr%   r#   ©Ú	__class__r	   r
   r%   `   s    zCursorDebugWrapper.executec              
      s6   | j ||dd�� tƒ  ||¡W  5 Q R £ S Q R X d S )NT)r   )r7   r8   r)   r'   r9   r	   r
   r)   d   s    zCursorDebugWrapper.executemanyFc           	      c   s´   t  ¡ }z
d V  W 5 t  ¡ }|| }|r<| jj | j||¡}z|rJt|ƒnd}W n tk
rh   d}Y nX | jj 	|r‚d||f n|d| dœ¡ t
jd||||||dœd� X d S )	NÚ ú?z%s times: %sz%.3f)r$   Útimez(%.3f) %s; args=%s)Údurationr$   r   )Úextra)r=   Ú	monotonicr   ÚopsZlast_executed_queryr   ÚlenÚ	TypeErrorZqueries_logÚappendÚloggerÚdebug)	r   r$   r   r6   r   ÚstartÚstopr>   Útimesr	   r	   r
   r7   h   s,    

þ
ûzCursorDebugWrapper.debug_sql)N)NNFF)r1   r2   r3   r%   r)   r   r7   Ú__classcell__r	   r	   r9   r
   r5   \   s   r5   c                 C   s   | rt jtt|  d¡ƒŽ S d S )Nú-)ÚdatetimeÚdateÚmapÚintÚsplit)Úsr	   r	   r
   Útypecast_dateˆ   s    rR   c              	   C   s`   | sd S |   d¡\}}}d|kr0|  d¡\}}nd}t t|ƒt|ƒt|ƒt|d d d… ƒ¡S )Nú:Ú.Ú0Ú000000é   )rP   rL   r=   rO   )rQ   ÚhourÚminutesÚsecondsÚmicrosecondsr	   r	   r
   Útypecast_timeŒ   s    r\   c                 C   sà   | sd S d| krt | ƒS |  ¡ \}}d|kr>| dd¡\}}nd|krV| dd¡\}}| d¡}| d¡}|d }d|krŠ| d¡\}}nd}t t|d	 ƒt|d ƒt|d ƒt|d	 ƒt|d ƒt|ƒt|d
 d d… ƒ¡S )Nú rK   é   ú+rS   é   rT   rU   r   rV   rW   )rR   rP   rL   rO   )rQ   ÚdÚtÚ_ÚdatesrI   rZ   r[   r	   r	   r
   Útypecast_timestamp—   s0    


 
 

 
 ýre   c                 C   sF   z|   d¡\}}W n tk
r0   d|  }}Y nX | d¡| d¡fS )zµ
    Split an SQL identifier into a two element tuple of (namespace, name).

    The identifier could be a table, column, or sequence name might be prefixed
    by a namespace.
    z"."r;   ú")rP   Ú
ValueErrorÚstrip)Ú
identifierÚ	namespaceÚnamer	   r	   r
   Úsplit_identifier¶   s
    rl   é   c                 C   sV   t | ƒ\}}|dks t|ƒ|kr$| S t||d�}d|r>d| nd|d|| … |f S )zÎ
    Shorten an SQL identifier to a repeatable mangled version with the given
    length.

    If a quote stripped name contains a namespace, e.g. USERNAME"."TABLE,
    truncate the table portion only.
    N)Úlengthz%s%s%sz%s"."r;   )rl   rB   Únames_digest)ri   rn   Zhash_lenrj   rk   Údigestr	   r	   r
   Útruncate_nameÄ   s
    rq   c                 G   s0   t  ¡ }|D ]}| | ¡ ¡ q| ¡ d| … S )zk
    Generate a 32-bit digest of a set of arguments that can be used to shorten
    identifying names.
    N)ÚhashlibÚmd5ÚupdateÚencodeÚ	hexdigest)rn   ÚargsÚhÚargr	   r	   r
   ro   Õ   s    ro   c                 C   sl   | dkrdS t  ¡  ¡ }|dk	r&||_|dk	rL| jt  d¡ | ¡|d�} nd|jt j< | 	| ¡} d 
| ¡S )zc
    Format a number into a string with the requisite number of digits and
    decimal places.
    Nr^   )r.   z{:f})ÚdecimalÚ
getcontextÚcopyÚprecÚquantizeÚDecimalÚscalebZtrapsÚRoundedÚcreate_decimalÚformat)r   Z
max_digitsZdecimal_placesr.   r	   r	   r
   Úformat_numberà   s    
r„   c                 C   s(   |   d¡o|  d¡}|r$| dd… S | S )zÆ
    Strip quotes off of quoted table names to make them safe for use in index
    names, sequence names, etc. For example '"USER"."TABLE"' (an Oracle naming
    scheme) becomes 'USER"."TABLE'.
    rf   r^   éÿÿÿÿ)Ú
startswithÚendswith)Z
table_nameZ
has_quotesr	   r	   r
   Ústrip_quotesò   s    rˆ   )Nrm   )rL   rz   r,   rr   Úloggingr=   Ú
contextlibr   Z	django.dbr   Ú	getLoggerrE   r   r5   rR   r\   re   rl   rq   ro   r„   rˆ   r	   r	   r	   r
   Ú<module>   s$   
N,
