U
    e'                     @   s   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 d dl	m
Z
 d dlmZ edZG dd dZG d	d
 d
eZe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S )!    N)contextmanager)NotSupportedError)md5)
parse_timez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-lctamlir/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   0   s    

zCursorWrapper.callprocc                 C   s   | j ||d| jdS )NFmanyexecutor)_execute_with_wrappers_executer
   sqlr   r   r   r   executeB   s       zCursorWrapper.executec                 C   s   | j ||d| jdS )NTr    )r#   _executemanyr
   r&   
param_listr   r   r   executemanyG   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#   L   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$   R   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*   r2   r   r   r   r(   [   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'   d   s    zCursorDebugWrapper.executec              
      s6   | j ||dd t ||W  5 Q R  S Q R X d S )NT)r!   )r9   r:   r+   r)   r;   r   r   r+   h   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	|rd||f n|d| d t
jd|||| jj|||| jjdd X d S )	N ?z%s times: %s%.3fr&   time(%.3f) %s; args=%s; alias=%s)durationr&   r   aliasextra)rA   	monotonicr	   opsZlast_executed_queryr   len	TypeErrorqueries_logappendloggerdebugrD   )	r
   r&   r   r8   r!   startstoprC   timesr   r   r   r9   l   s8    

zCursorDebugWrapper.debug_sql)N)NNFF)r3   r4   r5   r'   r+   r   r9   __classcell__r   r   r;   r   r7   a   s          r7   c                 c   sl   t  }z
d V  W 5 | jrft  }|| }| jd| d| d tjd||d | j||| jdd X d S )Nz%sr?   r@   rB   )rC   r&   rD   rE   )rA   rG   Zqueries_loggedrK   rL   rM   rN   rD   )r,   r&   rO   rP   rC   r   r   r   debug_transaction   s,    
rS   c                 C   sF   dD ]6}|| kr|  |d\}}|rt|r|||f  S q| ddfS )zH
    Split a time zone name into a 3-tuple of (name, sign, offset).
    )+-   N)rsplitr   )tznamesignnameoffsetr   r   r   split_tzname_delta   s    r\   c                 C   s   | rt jtt| d S d S )NrU   )datetimedatemapintsplit)sr   r   r   typecast_date   s    rc   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   )ra   r]   rA   r`   )rb   hourminutessecondsmicrosecondsr   r   r   typecast_time   s       rm   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 rU   rV   rT   rd      re   rf   r   rg   rh   )rc   ra   r]   r`   )rb   dt_datesrQ   rk   rl   r   r   r   typecast_timestamp   s0    






rt   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=   ")ra   
ValueErrorstrip)
identifier	namespacerZ   r   r   r   split_identifier   s
    rz      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=   )rz   rI   names_digest)rx   r|   Zhash_lenry   rZ   digestr   r   r   truncate_name  s    r   c                 G   s2   t dd}|D ]}||  q| d|  S )zk
    Generate a 32-bit digest of a set of arguments that can be used to shorten
    identifying names.
    F)ZusedforsecurityN)r   updateencode	hexdigest)r|   argshargr   r   r   r}     s    
r}   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.
    NrV   )r0   z{:f})decimal
getcontextcopyprecquantizeDecimalscalebZtrapsRoundedcreate_decimalformat)r   Z
max_digitsZdecimal_placesr0   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'.
    ru   rV   )
startswithendswith)Z
table_nameZ
has_quotesr   r   r   strip_quotes9  s    r   )Nr{   )r]   r   r.   loggingrA   
contextlibr   Z	django.dbr   Zdjango.utils.cryptor   Zdjango.utils.dateparser   	getLoggerrM   r   r7   rS   r\   rc   rm   rt   rz   r   r}   r   r   r   r   r   r   <module>   s,   
R1
$
