3
u|e3                 @   s  d 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m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 ddlmZ yddlZddlZddlZW n. ek
r Z  ze	de  W Y ddZ [ X nX dd Z!e! Z"e"d!k r
e	dej# 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- ddl.m/Z/ ej0j1eej0j2 ej3j4  dZ5ej0j6e5fdej0j7Z8ej0j9e8 G dd deZ:G dd  d eZdS )"zW
PostgreSQL database backend for Django.

Requires psycopg 2: https://www.psycopg.org/
    N)contextmanager)settings)ImproperlyConfigured)DatabaseErrorconnections)BaseDatabaseWrapper)CursorDebugWrapper)async_unsafe)cached_property)
SafeString)get_version_tuplez!Error loading psycopg2 module: %sc              C   s   t jjddd } t| S )N    r   )psycopg2__version__splitr   )version r   f/var/www/html/StaffProfile/staffvenv/lib/python3.6/site-packages/django/db/backends/postgresql/base.pypsycopg2_version    s    r            z8psycopg2_version 2.5.4 or newer is required; you have %sr   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditori  	INETARRAYc                   s>  e Zd ZdZdZddddddd	d
dddddddddddddddddddddZddddZdddddddd d!d"ddddd#Zd$Zd%d&d'd(d)d*d+Z	e
Z
eZeZeZeZeZeZd,Zd-d. Zed/d0 Zd1d2 Zd3d4 ZedHd6d7Zd8d9 Zed:d; Zd<d= Z dId>d?Z!d@dA Z"e# fdBdCZ$e%dDdE Z&dFdG Z'  Z(S )JDatabaseWrapper
postgresqlZ
PostgreSQLserialZ	bigserialZbyteabooleanzvarchar(%(max_length)s)dateztimestamp with time zonez+numeric(%(max_digits)s, %(decimal_places)s)intervalzdouble precisionintegerZbigintZinetZjsonbZsmallintZsmallserialtexttimeuuid)Z	AutoFieldZBigAutoFieldZBinaryFieldZBooleanFieldZ	CharFieldZ	DateFieldZDateTimeFieldZDecimalFieldZDurationFieldZ	FileFieldZFilePathFieldZ
FloatFieldZIntegerFieldZBigIntegerFieldZIPAddressFieldZGenericIPAddressFieldZ	JSONFieldZNullBooleanFieldZOneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerFieldZ	SlugFieldZSmallAutoFieldZSmallIntegerFieldZ	TextFieldZ	TimeFieldZ	UUIDFieldz"%(column)s" >= 0)r*   r+   r,   z= %sz= UPPER(%s)zLIKE %szLIKE UPPER(%s)z~ %sz~* %sz> %sz>= %sz< %sz<= %s)exactZiexactcontains	icontainsregexZiregexgtZgteltZlte
startswithendswithistartswith	iendswithzKREPLACE(REPLACE(REPLACE({}, E'\\', E'\\\\'), E'%%', E'\\%%'), E'_', E'\\_')zLIKE '%%' || {} || '%%'zLIKE '%%' || UPPER({}) || '%%'zLIKE {} || '%%'zLIKE UPPER({}) || '%%'zLIKE '%%' || {}zLIKE '%%' || UPPER({}))r.   r/   r3   r5   r4   r6   r   c             C   s   | j }|d dkrtdt|d p&d| jj krXtd|d t|d | jj f d|d pddi|d }|jdd  |d	 r|d	 |d
< |d r|d |d< |d r|d |d< |d r|d |d< |S )NNAME zJsettings.DATABASES is improperly configured. Please supply the NAME value.zThe database name '%s' (%d characters) is longer than PostgreSQL's limit of %d characters. Supply a shorter NAME in settings.DATABASES.ZdatabasepostgresOPTIONSisolation_levelUSERuserZPASSWORDpasswordZHOSThostZPORTport)settings_dictr   lenopsZmax_name_lengthpop)selfrA   conn_paramsr   r   r   get_connection_params   s,    

z%DatabaseWrapper.get_connection_paramsc             C   st   t jf |}| jd }y|d | _W n tk
r@   |j| _Y nX | j|jkr\|j| jd tjj|dd d |S )Nr:   r;   )r;   c             S   s   | S )Nr   )xr   r   r   <lambda>   s    z4DatabaseWrapper.get_new_connection.<locals>.<lambda>)Zconn_or_cursloads)	DatabaseconnectrA   r;   KeyErrorZset_sessionr   extrasZregister_default_jsonb)rE   rF   
connectionoptionsr   r   r   get_new_connection   s    
z"DatabaseWrapper.get_new_connectionc          
   C   s^   | j d krdS | j jd}| j}|rZ||krZ| j j }|j| jj |g W d Q R X dS dS )NFZTimeZoneT)rO   Zget_parameter_statustimezone_namecursorexecuterC   Zset_time_zone_sql)rE   Zconn_timezone_namerR   rS   r   r   r   ensure_timezone   s    
zDatabaseWrapper.ensure_timezonec             C   s.   | j jd | j }|r*| j s*| j j  d S )NUTF8)rO   Zset_client_encodingrU   Zget_autocommitcommit)rE   Ztimezone_changedr   r   r   init_connection_state   s
    z%DatabaseWrapper.init_connection_stateNc             C   s<   |r| j j|d| j jd}n
| j j }tjr2| jnd |_|S )NF)Z
scrollableZwithhold)rO   rS   
autocommitr   ZUSE_TZtzinfo_factory)rE   namerS   r   r   r   create_cursor   s
    
zDatabaseWrapper.create_cursorc             C   s   | j S )N)timezone)rE   offsetr   r   r   rZ      s    zDatabaseWrapper.tzinfo_factoryc             C   s~   |  j d7  _ y"ttdr$tj }n
tjj }W n tk
rH   d }Y nX |r\tt|}nd}| jdt	j
 j|| j f dS )Nr   current_tasksyncz_django_curs_%d_%s_%d)r[   )_named_cursor_idxhasattrasyncior_   TaskRuntimeErrorstridZ_cursor	threadingcurrent_threadident)rE   r_   Z
task_identr   r   r   chunked_cursor   s    


zDatabaseWrapper.chunked_cursorc          	   C   s   | j  || j_W d Q R X d S )N)Zwrap_database_errorsrO   rY   )rE   rY   r   r   r   _set_autocommit  s    zDatabaseWrapper._set_autocommitc          	   C   s,   | j  }|jd |jd W dQ R X dS )zl
        Check constraints by setting them to immediate. Return them to deferred
        afterward.
        zSET CONSTRAINTS ALL IMMEDIATEzSET CONSTRAINTS ALL DEFERREDN)rS   rT   )rE   Ztable_namesrS   r   r   r   check_constraints  s    

z!DatabaseWrapper.check_constraintsc             C   sD   y$| j j }|jd W d Q R X W n tjk
r:   dS X dS d S )NzSELECT 1FT)rO   rS   rT   rK   Error)rE   rS   r   r   r   	is_usable   s    zDatabaseWrapper.is_usablec             #   s   y t  j }|V  W d Q R X W n tjtfk
r   tjdt xvtj	 D ]h}|j
dkrL|jd dkrL| j| jd|jd i| jd}z|j }|V  W d Q R X W d |j  X P qLW  Y nX d S )Na8  Normally Django will use a connection to the 'postgres' database to avoid running initialization queries against the production database when it's not needed (for example, when running tests). Django was unable to create a connection to the 'postgres' database and will use the first PostgreSQL database instead.r!   r7   r9   )alias)super_nodb_cursorrK   r   WrappedDatabaseErrorwarningswarnRuntimeWarningr   allvendorrA   	__class__rp   rS   close)rE   rS   rO   conn)ry   r   r   rr   *  s$    


zDatabaseWrapper._nodb_cursorc          	   C   s   | j  
 | jjS Q R X d S )N)Ztemporary_connectionrO   Zserver_version)rE   r   r   r   
pg_versionG  s    
zDatabaseWrapper.pg_versionc             C   s
   t || S )N)r   )rE   rS   r   r   r   make_debug_cursorL  s    z!DatabaseWrapper.make_debug_cursor)N)N))__name__
__module____qualname__rx   Zdisplay_nameZ
data_typesZdata_type_check_constraints	operatorsZpattern_escZpattern_opsrK   r   ZSchemaEditorClassr   Zclient_classr   Zcreation_classr   Zfeatures_classr   Zintrospection_classr   Z	ops_classra   rG   r	   rQ   rU   rX   r\   rZ   rk   rl   rm   ro   r   rr   r
   r|   r}   __classcell__r   r   )ry   r   r    A   s    	
 
	
r    c               @   s   e Zd Zdd Zdd ZdS )r   c          
   G   s*   | j | | jj||f| S Q R X d S )N)	debug_sqlrS   copy_expert)rE   sqlfileargsr   r   r   r   Q  s    zCursorDebugWrapper.copy_expertc          
   O   s2   | j d| d | jj||f||S Q R X d S )NzCOPY %s TO STDOUT)r   )r   rS   copy_to)rE   r   tabler   kwargsr   r   r   r   U  s    zCursorDebugWrapper.copy_toN)r~   r   r   r   r   r   r   r   r   r   P  s   r   )r   r   r   );__doc__rc   rh   rt   
contextlibr   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   rs   r   Zdjango.db.backends.base.baser   Zdjango.db.backends.utilsr   ZBaseCursorDebugWrapperZdjango.utils.asyncior	   Zdjango.utils.functionalr
   Zdjango.utils.safestringr   Zdjango.utils.versionr   r   rK   Zpsycopg2.extensionsZpsycopg2.extrasImportErrorer   ZPSYCOPG2_VERSIONr   clientr   Zcreationr   featuresr   Zintrospectionr   
operationsr   Zschemar   
extensionsZregister_adapterQuotedStringrN   Zregister_uuidZINETARRAY_OIDZnew_array_typeUNICODEr   Zregister_typer    r   r   r   r   <module>   sR   


  