3
v^r!                 @   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	 d dl
mZ d dlmZ ej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)settings)NotSupportedError)utcz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
   </usr/lib/python3.6/site-packages/django/db/backends/utils.py__init__   s    zCursorWrapper.__init__ZfetchoneZ	fetchmanyZfetchallZnextsetc             C   s*   t | j|}|tjkr"| j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| j   W n | jjjk
r&   Y nX d S )N)closer   DatabaseError)r	   typevalue	tracebackr
   r
   r   __exit__%   s    zCursorWrapper.__exit__Nc             C   s   |d k	r| j jj rtd| j j  | j jP |d krL|d krL| jj|S |d krb| jj||S |phf }| jj|||S W d Q R X d S )NzKKeyword parameters for callproc are not supported on this database backend.)r   featuresZsupports_callproc_kwargsr   validate_no_broken_transactionr   r   callproc)r	   ZprocnameparamsZkparamsr
   r
   r   r   1   s    

zCursorWrapper.callprocc             C   s   | j ||d| jdS )NF)manyexecutor)_execute_with_wrappers_execute)r	   sqlr   r
   r
   r   executeC   s    zCursorWrapper.executec             C   s   | j ||d| jdS )NT)r   r    )r!   _executemany)r	   r#   
param_listr
   r
   r   executemanyF   s    zCursorWrapper.executemanyc             C   s<   | j | d}x t| j jD ]}tj||}qW |||||S )N)
connectionr   )r   reversedZexecute_wrappers	functoolspartial)r	   r#   r   r   r    contextwrapperr
   r
   r   r!   I   s    z$CursorWrapper._execute_with_wrappersc          
   G   sD   | j j  | j j( |d kr(| jj|S | jj||S W d Q R X d S )N)r   r   r   r   r$   )r	   r#   r   ignored_wrapper_argsr
   r
   r   r"   O   s
    

zCursorWrapper._executec          
   G   s,   | j j  | j j | jj||S Q R X d S )N)r   r   r   r   r'   )r	   r#   r&   r.   r
   r
   r   r%   X   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 j||S Q R X d S )NT)use_last_executed_query)	debug_sqlsuperr$   )r	   r#   r   )	__class__r
   r   r$   b   s    zCursorDebugWrapper.executec          
      s*   | j ||dd t j||S Q R X d S )NT)r   )r5   r6   r'   )r	   r#   r&   )r7   r
   r   r'   f   s    zCursorDebugWrapper.executemanyFc       	      c   s   t j }z
d V  W d t j }|| }|r<| jjj| j||}y|rJt|nd}W n tk
rh   d}Y nX | jjj	|rd||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	TypeErrorqueries_logappendloggerdebug)	r	   r#   r   r4   r   startstopr;   timesr
   r
   r   r5   j   s(    

zCursorDebugWrapper.debug_sql)N)NNFF)r/   r0   r1   r$   r'   r   r5   __classcell__r
   r
   )r7   r   r3   ^   s   r3   c             C   s   | rt jtt| jd S d S )N-)datetimedatemapintsplit)sr
   r
   r   typecast_date   s    rP   c             C   s`   | sd S | j d\}}}d|kr0|j d\}}nd}tjt|t|t|t|d d d S )N:.0000000   )rN   rJ   r:   rM   )rO   hourminutessecondsmicrosecondsr
   r
   r   typecast_time   s    rZ   c       	      C   s   | sd S d| krt | S | j \}}d|kr>|jdd\}}nd|krV|jdd\}}|jd}|jd}|d }d|kr|jd\}}nd}tjrtnd }tjt|d	 t|d t|d t|d	 t|d t|t|d
 d d |S )N rI      +rQ      rR   rS   r   rT   rU   )rP   rN   r   USE_TZr   rJ   rM   )	rO   dt_datesrG   rX   rY   tzinfor
   r
   r   typecast_timestamp   s(    

re   c             C   sF   y| j d\}}W n tk
r0   d|  }}Y nX |jd|jdfS )z
    Split a 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"."r8   ")rN   
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 a 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"."r8   )rl   r?   names_digest)ri   rn   Zhash_lenrj   rk   digestr
   r
   r   truncate_name   s
    rq   c             G   s4   t j }x|D ]}|j|j  qW |j 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 j j }|dk	r&||_|dk	rL| jt jdj| |d} nd|jt j< |j	| } dj
| 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   
max_digitsdecimal_placesr,   r
   r
   r   format_number   s    
r   c             C   s(   | j do| j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)
table_nameZ
has_quotesr
   r
   r   strip_quotes   s    r   )Nrm   )rJ   rz   r*   rr   loggingr:   
contextlibr   django.confr   django.db.utilsr   Zdjango.utils.timezoner   	getLoggerrC   r   r3   rP   rZ   re   rl   rq   ro   r   r   r
   r
   r
   r   <module>   s(   
N, 
