
v^1                 @   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 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 Wn5 e k
 r)Z z e d e   WYd d Z [ Xn Xd 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. d d l/ m0 Z0 e j1 j2 e e j1 j3  e j4 j5   d Z6 e j1 j7 e6 f d e j1 j8  Z9 e j1 j: e9  Gd d   d e  Z; Gd  d!   d! e  Z d S)#zW
PostgreSQL database backend for Django.

Requires psycopg 2: https://www.psycopg.org/
    N)settings)ImproperlyConfigured)connections)BaseDatabaseWrapper)CursorDebugWrapper)DatabaseError)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   D/tmp/pip-build-8lau8j11/django/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)DatabaseSchemaEditor)utc_tzinfo_factoryi  	INETARRAYc            4       sD  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 d d d d  d
 d! d d" d d# d$ d% d d& d' d( d$ d) d* d+ d, d- d. i Z d" d/ d# d/ i Z d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD d5 dE d5 dF d7 dG d7 i Z dH Z d4 dI d6 dJ dD dK dF dL dE dM dG dN i Z	 e
 Z
 e Z e Z e Z e Z e Z e Z dO Z dP dQ   Z e dR dS    Z dT dU   Z dV dW   Z e dX dY dZ   Z e d[ d\    Z d] d^   Z dX d_ d`  Z  da db   Z! e"   f dc dd    Z# e$ de df    Z% dg dh   Z&   S)iDatabaseWrapper
postgresqlZ
PostgreSQLZ	AutoFieldserialZBigAutoFieldZ	bigserialZBinaryFieldZbyteaZBooleanFieldbooleanZ	CharFieldzvarchar(%(max_length)s)Z	DateFielddateZDateTimeFieldztimestamp with time zoneZDecimalFieldz+numeric(%(max_digits)s, %(decimal_places)s)ZDurationFieldintervalZ	FileFieldZFilePathFieldZ
FloatFieldzdouble precisionZIntegerFieldintegerZBigIntegerFieldZbigintZIPAddressFieldZinetZGenericIPAddressFieldZNullBooleanFieldZOneToOneFieldZPositiveIntegerFieldZPositiveSmallIntegerFieldZsmallintZ	SlugFieldZSmallAutoFieldZsmallserialZSmallIntegerFieldZ	TextFieldtextZ	TimeFieldtimeZ	UUIDFielduuidz"%(column)s" >= 0exactz= %sZiexactz= UPPER(%s)containszLIKE %sZ	icontainszLIKE UPPER(%s)regexz~ %sZiregexz~* %sgtz> %sgtez>= %sltz< %sltez<= %s
startswithendswithZistartswithZ	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   c             C   s  |  j  } | d d k r% t d   t | d p5 d  |  j j   k rz t d | d t | d  |  j j   f   d | d p d 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)selfr=   conn_paramsr   r   r   get_connection_params   s,    		%



z%DatabaseWrapper.get_connection_paramsc             C   sw   t  j |   } |  j d } y | d |  _ Wn t k
 rM | j |  _ Yn& X|  j | j k rs | j d |  j  | S)Nr6   r7   )Databaseconnectr=   r7   KeyErrorZset_session)rA   rB   
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 } | ry | | k ry |  j  j   # } | j |  j j   | g  Wd  QRXd Sd S)NFZTimeZoneT)rG   Zget_parameter_statustimezone_namecursorexecuter?   Zset_time_zone_sql)rA   Zconn_timezone_namerJ   rK   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)rG   Zset_client_encodingrM   Zget_autocommitcommit)rA   Ztimezone_changedr   r   r   init_connection_state   s
    z%DatabaseWrapper.init_connection_stateNc             C   sX   | r- |  j  j | d d d |  j  j } n |  j  j   } t j rK t n d  | _ | S)NZ
scrollableFZwithhold)rG   rK   
autocommitr   ZUSE_TZr   Ztzinfo_factory)rA   namerK   r   r   r   create_cursor   s
    'zDatabaseWrapper.create_cursorc             C   s   |  j  d 7_  y1 t t d  r0 t j   } n t j j   } Wn t k
 rZ d  } Yn X| rv t t |   } n d } |  j d d t	 j
   j | |  j  f  S)Nr   current_tasksyncrR   z_django_curs_%d_%s_%d)_named_cursor_idxhasattrasynciorT   ZTaskRuntimeErrorstridZ_cursor	threadingcurrent_threadident)rA   rT   Z
task_identr   r   r   chunked_cursor   s    	zDatabaseWrapper.chunked_cursorc          	   C   s!   |  j   | |  j _ Wd  QRXd  S)N)Zwrap_database_errorsrG   rQ   )rA   rQ   r   r   r   _set_autocommit  s    
zDatabaseWrapper._set_autocommitc             C   s*   |  j    j d  |  j    j d  d S)zl
        Check constraints by setting them to immediate. Return them to deferred
        afterward.
        zSET CONSTRAINTS ALL IMMEDIATEzSET CONSTRAINTS ALL DEFERREDN)rK   rL   )rA   Ztable_namesr   r   r   check_constraints  s    z!DatabaseWrapper.check_constraintsc             C   s>   y |  j  j   j d  Wn t j k
 r5 d SYn Xd Sd  S)NzSELECT 1FT)rG   rK   rL   rD   Error)rA   r   r   r   	is_usable  s
    	zDatabaseWrapper.is_usablec                s   t    j } y | j   Wn t j t f k
 r t j d t  xb t	 j
   D]T } | j d k rP | j d d k rP |  j |  j d | j d i  d |  j SqP WYn X| 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!   r3   r5   alias)super_nodb_connectionZensure_connectionrD   r   WrappedDatabaseErrorwarningswarnRuntimeWarningr   allvendorr=   	__class__rd   )rA   Znodb_connectionrG   )rm   r   r   rf      s    "z DatabaseWrapper._nodb_connectionc          	   C   s"   |  j     |  j j SWd  QRXd  S)N)Ztemporary_connectionrG   Zserver_version)rA   r   r   r   
pg_version6  s    zDatabaseWrapper.pg_versionc             C   s   t  | |   S)N)r   )rA   rK   r   r   r   make_debug_cursor;  s    z!DatabaseWrapper.make_debug_cursor)'__name__
__module____qualname__rl   Zdisplay_nameZ
data_typesZdata_type_check_constraints	operatorsZpattern_escZpattern_opsrD   r   ZSchemaEditorClassr   Zclient_classr   Zcreation_classr   Zfeatures_classr   Zintrospection_classr   Z	ops_classrV   rC   r   rI   rM   rP   rS   r_   r`   ra   rc   propertyrf   r	   rn   ro   r   r   )rm   r   r    B   s    	
 	r    c               @   s(   e  Z d  Z d d   Z d d   Z d S)r   c             G   s1   |  j  |   |  j j | | |  SWd  QRXd  S)N)	debug_sqlrK   copy_expert)rA   sqlfileargsr   r   r   rv   @  s    zCursorDebugWrapper.copy_expertc             O   s;   |  j  d d |   |  j j | | | |  SWd  QRXd  S)Nrw   zCOPY %s TO STDOUT)ru   rK   copy_to)rA   rx   tablery   kwargsr   r   r   rz   D  s    zCursorDebugWrapper.copy_toN)rp   rq   rr   rv   rz   r   r   r   r   r   ?  s   r   )r   r   r   )<__doc__rX   r\   rh   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.backends.base.baser   Zdjango.db.backends.utilsr   ZBaseCursorDebugWrapperZdjango.db.utilsr   rg   Zdjango.utils.asyncior   Zdjango.utils.functionalr	   Zdjango.utils.safestringr
   Zdjango.utils.versionr   r   rD   Zpsycopg2.extensionsZpsycopg2.extrasImportErrorer   ZPSYCOPG2_VERSIONr   clientr   Zcreationr   featuresr   Zintrospectionr   
operationsr   Zschemar   utilsr   
extensionsZregister_adapterQuotedStringextrasZregister_uuidZINETARRAY_OIDZnew_array_typeUNICODEr   Zregister_typer    r   r   r   r   <module>   sP   #		