B
    CVvgñ   ã               @   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-install-o3oxmrkh/Django/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 )N)Ú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 d Q R X d S )N)r   r   r   )r   r   r   r	   Ú__iter__   s    
zCursorWrapper.__iter__c             C   s   | S )Nr   )r   r   r   r	   Ú	__enter__    s    zCursorWrapper.__enter__c             C   s,   y|   ¡  W n | jjjk
r&   Y nX d S )N)Ú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�P |d krJ|d krJ| j |¡S |d kr`| j ||¡S |pfd}| j |||¡S W d 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 )NT)r   r   )r   Ú_executemany)r   r    Ú
param_listr   r   r	   ÚexecutemanyD   s    zCursorWrapper.executemanyc             C   s<   | j | dœ}x t| j jƒD ]}t ||¡}qW |||||ƒ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   sD   | j  ¡  | j j�( |d kr(| j |¡S | j ||¡S W d Q R X d S )N)r   r   r   r   r!   )r   r    r   Úignored_wrapper_argsr   r   r	   r   M   s
    

zCursorWrapper._executec          	   G   s,   | j  ¡  | j j� | j ||¡S Q R X d S )N)r   r   r   r   r$   )r   r    r#   r+   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          	      s*   | j ||dd�� tƒ  ||¡S Q R X d S )NT)Úuse_last_executed_query)Ú	debug_sqlÚsuperr!   )r   r    r   )Ú	__class__r   r	   r!   `   s    zCursorDebugWrapper.executec          	      s*   | j ||dd�� tƒ  ||¡S Q R X d S )NT)r   )r2   r3   r$   )r   r    r#   )r4   r   r	   r$   d   s    zCursorDebugWrapper.executemanyFc       	      c   s´   t  ¡ }z
d V  W d t  ¡ }|| }|r<| jj | j||¡}y|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)r7   Ú	monotonicr   ÚopsZlast_executed_queryr   ÚlenÚ	TypeErrorZqueries_logÚappendÚloggerÚdebug)	r   r    r   r1   r   ÚstartÚstopr8   Útimesr   r   r	   r2   h   s(    

zCursorDebugWrapper.debug_sql)N)NNFF)r,   r-   r.   r!   r$   r   r2   Ú__classcell__r   r   )r4   r	   r0   \   s   r0   c             C   s   | rt jtt|  d¡ƒŽ S d S )Nú-)ÚdatetimeÚdateÚmapÚintÚsplit)Úsr   r   r	   Útypecast_dateˆ   s    rL   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é   )rJ   rF   r7   rI   )rK   ÚhourÚminutesÚsecondsÚmicrosecondsr   r   r	   Útypecast_timeŒ   s    rV   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ú rE   é   ú+rM   é   rN   rO   r   rP   rQ   )rL   rJ   rF   rI   )rK   ÚdÚtÚ_ÚdatesrC   rT   rU   r   r   r	   Útypecast_timestamp—   s&    

r_   c             C   sF   y|   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"."r5   ú")rJ   Ú
ValueErrorÚstrip)Ú
identifierÚ	namespaceÚnamer   r   r	   Úsplit_identifier¶   s
    rf   é   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"."r5   )rf   r<   Únames_digest)rc   rh   Zhash_lenrd   re   Údigestr   r   r	   Útruncate_nameÄ   s
    rk   c             G   s4   t  ¡ }x|D ]}| | ¡ ¡ qW | ¡ 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)rh   ÚargsÚhÚargr   r   r	   ri   Õ   s    
ri   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.
    NrX   )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'.
    r`   rX   éÿÿÿÿ)Ú
startswithÚendswith)Z
table_nameZ
has_quotesr   r   r	   Ústrip_quotesò   s    r‚   )Nrg   )rF   rt   r'   rl   Úloggingr7   Ú
contextlibr   Z	django.dbr   Ú	getLoggerr?   r   r0   rL   rV   r_   rf   rk   ri   r~   r‚   r   r   r   r	   Ú<module>   s$   
N,
