o
    {,h+                     @   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 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)md5)apps)NotSupportedError)
parse_timezdjango.db.backendsc                   @   sx   e Zd Zdd Zeg dZd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   N/var/www/html/rh/venv/lib/python3.10/site-packages/django/db/backends/utils.py__init__   s   
zCursorWrapper.__init__)fetchone	fetchmanyfetchallnextsetzAccessing the database during app initialization is discouraged. To fix this warning, avoid executing queries in AppConfig.ready() or when your app modules are imported.c                 C   s&   t | j|}|tjv r| j|S |S r   )getattrr	   r   WRAP_ERROR_ATTRSr
   wrap_database_errors)r   attrcursor_attrr   r   r   __getattr__   s   
zCursorWrapper.__getattr__c                 c   s<    | j j | jE d H  W d    d S 1 sw   Y  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 d S  | jjjy   Y d S w r   )closer
   DatabaseError)r   typevalue	tracebackr   r   r   __exit__,   s
   zCursorWrapper.__exit__Nc                 C   s   |d ur| j jjstdtjstjstj| j	t
d | j   | j j; |d u r:|d u r:| j|W  d    S |d u rL| j||W  d    S |pOd}| j|||W  d    S 1 sbw   Y  d S )NzKKeyword parameters for callproc are not supported on this database backend.categoryr   )r
   featuressupports_callproc_kwargsr   r   readystored_app_configswarningswarnAPPS_NOT_READY_WARNING_MSGRuntimeWarningvalidate_no_broken_transactionr   r	   callproc)r   procnameparamskparamsr   r   r   r.   8   s"   


$zCursorWrapper.callprocc                 C      | j ||d| jdS )NFmanyexecutor)_execute_with_wrappers_executer   sqlr0   r   r   r   executeN      
zCursorWrapper.executec                 C   r2   )NTr3   )r6   _executemanyr   r9   
param_listr   r   r   executemanyS   r;   zCursorWrapper.executemanyc                 C   s8   | j | d}t| j jD ]}t||}q|||||S )N)
connectionr	   )r
   reversedexecute_wrappers	functoolspartial)r   r9   r0   r4   r5   contextwrapperr   r   r   r6   X   s   z$CursorWrapper._execute_with_wrappersc                 G   s   t jst jstj| jtd | j  | jj	  |d u r)| j
|W  d    S | j
||W  d    S 1 s:w   Y  d S Nr#   )r   r'   r(   r)   r*   r+   r,   r
   r-   r   r	   r:   )r   r9   r0   ignored_wrapper_argsr   r   r   r7   ^   s   


$zCursorWrapper._executec                 G   s`   t jst jstj| jtd | j  | jj	 | j
||W  d    S 1 s)w   Y  d S rG   )r   r'   r(   r)   r*   r+   r,   r
   r-   r   r	   r?   )r   r9   r>   rH   r   r   r   r<   k   s   

$zCursorWrapper._executemany)NNr   )__name__
__module____qualname__r   	frozensetr   r+   r   r   r   r"   r.   r:   r?   r6   r7   r<   r   r   r   r   r      s    

r   c                       s:   e Zd Zd	 fdd	Z fddZe	d
ddZ  ZS )CursorDebugWrapperNc                    B   | j ||dd t ||W  d    S 1 sw   Y  d S )NT)use_last_executed_query)	debug_sqlsuperr:   r8   	__class__r   r   r:   x      $zCursorDebugWrapper.executec                    rN   )NT)r4   )rP   rQ   r?   r=   rR   r   r   r?   |   rT   zCursorDebugWrapper.executemanyFc           	      c   sb   t  }zXd V  W t  }|| }|r| jj| j||}z
|r%t|nd}W n ty3   d}Y nw | jj	|r@d||f n|d| d t
jd|||| jj|||| jjdd d S t  }|| }|rr| jj| j||}z
|ryt|nd}W n ty   d}Y nw | jj	|rd||f n|d| d t
jd|||| jj|||| jjdd w )	N ?z%s times: %s%.3fr9   time(%.3f) %s; args=%s; alias=%s)durationr9   r0   aliasextra)rY   	monotonicr
   opslast_executed_queryr	   len	TypeErrorqueries_logappendloggerdebugr\   )	r   r9   r0   rO   r4   startstopr[   timesr   r   r   rP      sp   
zCursorDebugWrapper.debug_sqlr   )NNFF)rI   rJ   rK   r:   r?   r   rP   __classcell__r   r   rR   r   rM   u   s    rM   c                 c   s    t  }z1d V  W | jr5t  }|| }| jd| d| d tjd||d | j||| jdd d S d S | jrat  }|| }| jd| d| d tjd||d | j||| jdd w w )Nz%srW   rX   rZ   )r[   r9   r\   r]   )rY   r_   queries_loggedrd   re   rf   rg   r\   )r@   r9   rh   ri   r[   r   r   r   debug_transaction   sV   

rm   c                 C   sX   dD ]$}|| v r&|  |d\}}|r&t|r&d|vr| d}|||f  S q| ddfS )zH
    Split a time zone name into a 3-tuple of (name, sign, offset).
    )+-   :z:00N)rsplitr   )tznamesignnameoffsetr   r   r   split_tzname_delta   s   

rw   c                 C   s   | rt jtt| d S d S )Nro   )datetimedatemapintsplit)sr   r   r   typecast_date   s   r~   c              	   C   s`   | sd S |  d\}}}d|v r| d\}}nd}tt|t|t|t|d d d S )Nrq   .0000000   )r|   rx   rY   r{   )r}   hourminutessecondsmicrosecondsr   r   r   typecast_time   s   $r   c                 C   s   | sd S d| vrt | S |  \}}d|v r|dd\}}nd|v r+|dd\}}|d}|d}|d }d|v rE|d\}}nd}tt|d	 t|d t|d t|d	 t|d t|t|d
 d d S )N ro   rp   rn   rq      r   r   r   r   r   )r~   r|   rx   r{   )r}   dt_datesrj   r   r   r   r   r   typecast_timestamp   s0   






r   c                 C   sD   z	|  d\}}W n ty   d| }}Y nw |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"."rU   ")r|   
ValueErrorstrip)
identifier	namespaceru   r   r   r   split_identifier  s   r      c                 C   sV   t | \}}|du 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"."rU   )r   rb   names_digest)r   r   hash_lenr   ru   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)usedforsecurityN)r   updateencode	hexdigest)r   argshargr   r   r   r   0  s   
r   c                 C   sl   | du rdS t   }|dur||_|dur&| 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.
    Nrp   )rE   z{:f})decimal
getcontextcopyprecquantizeDecimalscalebtrapsRoundedcreate_decimalformat)r    
max_digitsdecimal_placesrE   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   rp   )
startswithendswith)
table_name
has_quotesr   r   r   strip_quotesO  s   r   )Nr   )rx   r   rC   loggingrY   r)   
contextlibr   hashlibr   django.appsr   	django.dbr   django.utils.dateparser   	getLoggerrf   r   rM   rm   rw   r~   r   r   r   r   r   r   r   r   r   r   r   <module>   s2    
d1
$
