3
(h7)                 @   s  d 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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 re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+m,Z, ddl-m.Z. ejZej/Z/ej0j1ej0j2 ej0j1ej0j3 ej0j4eej0j5 ej0j4eej0j5 ej6j7  dZ8ej0j9e8fdej0j2Z:ej0j1e: G dd de	Z;dS )!za
PostgreSQL database backend for Django.

Requires psycopg 2: http://initd.org/projects/psycopg2
    N)settings)ImproperlyConfigured)DEFAULT_DB_ALIAS)BaseDatabaseWrapper)BaseDatabaseValidation)DatabaseError)	force_str)cached_property)	SafeBytesSafeTextz!Error loading psycopg2 module: %sc              C   s*   t jjddd } tdd | jdD S )N    r   c             s   s   | ]}|j  rt|V  qd S )N)isdigitint).0v r   F/tmp/pip-install-q3hcpn_q/Django/django/db/backends/postgresql/base.py	<genexpr>   s    z#psycopg2_version.<locals>.<genexpr>.)psycopg2__version__splittuple)versionr   r   r   psycopg2_version   s    r            z8psycopg2_version 2.4.5 or newer is required; you have %sr   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditor)utc_tzinfo_factory)get_versioni  	INETARRAYc                   s  e 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Z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 fd)d*Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd@d6d7Zd8d9 Ze fd:d;Zed<d= Zed>d? Z  ZS )ADatabaseWrapperZ
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smallinttexttimeuuid)Z	AutoFieldZBigAutoFieldZBinaryFieldZBooleanFieldZ	CharFieldZCommaSeparatedIntegerFieldZ	DateFieldZDateTimeFieldZDecimalFieldZDurationFieldZ	FileFieldZFilePathFieldZ
FloatFieldZIntegerFieldZBigIntegerFieldZIPAddressFieldZGenericIPAddressFieldZNullBooleanFieldZOneToOneFieldPositiveIntegerFieldPositiveSmallIntegerFieldZ	SlugFieldZSmallIntegerFieldZ	TextFieldZ	TimeFieldZ	UUIDFieldz"%(column)s" >= 0)r1   r2   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	iendswithz@REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')zLIKE '%%' || {} || '%%'zLIKE '%%' || UPPER({}) || '%%'zLIKE {} || '%%'zLIKE UPPER({}) || '%%'zLIKE '%%' || {}zLIKE '%%' || UPPER({}))r4   r5   r9   r;   r:   r<   c                sR   t t| j|| t| | _t| | _t| | _t	| | _
t| | _t| | _d S )N)superr(   __init__r!   featuresr#   opsr   clientr    creationr"   introspectionr   Z
validation)selfargskwargs)	__class__r   r   r>      s    




zDatabaseWrapper.__init__c             C   s   | j }|d dkrtdd|d p&di}|j|d  |jdd  |d rX|d |d	< |d
 rpt|d
 |d< |d r|d |d< |d r|d |d< |S )NNAME zJsettings.DATABASES is improperly configured. Please supply the NAME value.ZdatabaseZpostgresOPTIONSisolation_levelUSERuserZPASSWORDpasswordZHOSThostZPORTport)settings_dictr   updatepopr   )rD   rQ   conn_paramsr   r   r   get_connection_params   s     z%DatabaseWrapper.get_connection_paramsc             C   s`   t jf |}| jd }y|d | _W n tk
r@   |j| _Y nX | j|jkr\|j| jd |S )NrJ   rK   )rK   )DatabaseconnectrQ   rK   KeyErrorZset_session)rD   rT   
connectionoptionsr   r   r   get_new_connection   s    
z"DatabaseWrapper.get_new_connectionc          
   C   sn   | j jd | j jd}| jrj|| jkrj| j j }z|j| jj | jg W d |j  X | j	 sj| j j
  d S )NUTF8ZTimeZone)rY   Zset_client_encodingZget_parameter_statusZtimezone_namecursorexecuter@   Zset_time_zone_sqlcloseZget_autocommitcommit)rD   Zconn_timezone_namer]   r   r   r   init_connection_state   s    

z%DatabaseWrapper.init_connection_statec             C   s   | j j }tjrtnd |_|S )N)rY   r]   r   ZUSE_TZr%   Ztzinfo_factory)rD   r]   r   r   r   create_cursor   s    
zDatabaseWrapper.create_cursorc          	   C   s   | j  || j_W d Q R X d S )N)Zwrap_database_errorsrY   
autocommit)rD   rc   r   r   r   _set_autocommit   s    zDatabaseWrapper._set_autocommitNc             C   s    | j  jd | j  jd dS )z
        To check constraints, we set constraints to immediate. Then, when, we're done we must ensure they
        are returned to deferred.
        zSET CONSTRAINTS ALL IMMEDIATEzSET CONSTRAINTS ALL DEFERREDN)r]   r^   )rD   Ztable_namesr   r   r   check_constraints   s    z!DatabaseWrapper.check_constraintsc             C   s4   y| j j jd W n tjk
r*   dS X dS d S )NzSELECT 1FT)rY   r]   r^   rV   Error)rD   r   r   r   	is_usable   s
    zDatabaseWrapper.is_usablec                sv   t t| j}y|j  W nX ttfk
rp   tjdt | j	j
 }tjt d |d< | j| j	j
 | jdd}Y nX |S )Na/  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 default database instead.rH   F)aliasZallow_thread_sharing)r=   r(   _nodb_connectionZensure_connectionr   WrappedDatabaseErrorwarningswarnRuntimeWarningrQ   copyr   Z	DATABASESr   rG   rh   )rD   Znodb_connectionrQ   )rG   r   r   ri      s    
z DatabaseWrapper._nodb_connectionc             C   s   t S )N)PSYCOPG2_VERSION)rD   r   r   r   r     s    z DatabaseWrapper.psycopg2_versionc          	   C   s   | j   t| jS Q R X d S )N)Ztemporary_connectionr&   rY   )rD   r   r   r   
pg_version  s    
zDatabaseWrapper.pg_version)N)__name__
__module____qualname__vendorZ
data_typesZdata_type_check_constraints	operatorsZpattern_escZpattern_opsrV   r$   ZSchemaEditorClassr>   rU   r[   ra   rb   rd   re   rg   propertyri   r	   r   rp   __classcell__r   r   )rG   r   r(   C   s~   

	r(   )r   r   r   )<__doc__rk   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.backends.base.baser   Z"django.db.backends.base.validationr   Zdjango.db.utilsr   rj   Zdjango.utils.encodingr   Zdjango.utils.functionalr	   Zdjango.utils.safestringr
   r   r   rV   Zpsycopg2.extensionsZpsycopg2.extrasImportErrorer   ro   r   rA   r   rB   r    r?   r!   rC   r"   
operationsr#   Zschemar$   utilsr%   r   r&   ZIntegrityError
extensionsZregister_typeUNICODEZUNICODEARRAYZregister_adapterQuotedStringextrasZregister_uuidZINETARRAY_OIDZnew_array_typer'   r(   r   r   r   r   <module>   sT   

