B
    ©0H[>)  ã            
   @   sŽ  d 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 yddlZddlZddlZW n. ek
r¾ Z zede ƒ‚W ddZ[X Y 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( ddl)m*Z* ej+ ,eej+j-¡ ej. /¡  dZ0ej+ 1e0fdej+j2¡Z3ej+ 4e3¡ G dd„ de
ƒZ5dS )za
PostgreSQL database backend for Django.

Requires psycopg 2: http://initd.org/projects/psycopg2
é    N)Úsettings)ÚImproperlyConfigured)ÚDEFAULT_DB_ALIAS)ÚBaseDatabaseWrapper)ÚDatabaseError)Úcached_property)ÚSafeText)Úget_version_tuplez!Error loading psycopg2 module: %sc              C   s   t j dd¡d } t| ƒS )Nú é   r   )Úpsycopg2Ú__version__Úsplitr	   )Úversion© r   úfC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\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                   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œ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eZeZeZeZeZd*Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ ZdBd4d5„Zd6d7„ Zd8d9„ ZdCd:d;„Zd<d=„ Z e!‡ fd>d?„ƒZ"e#d@dA„ ƒZ$‡  Z%S )DÚDatabaseWrapperZ
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smallintÚtextÚtimeÚuuid)Z	AutoFieldZBigAutoFieldZBinaryFieldZBooleanFieldZ	CharFieldZ	DateFieldZDateTimeFieldZDecimalFieldZDurationFieldZ	FileFieldZFilePathFieldZ
FloatFieldZIntegerFieldZBigIntegerFieldZIPAddressFieldZGenericIPAddressFieldZNullBooleanFieldZOneToOneFieldÚPositiveIntegerFieldÚPositiveSmallIntegerFieldZ	SlugFieldZSmallIntegerFieldZ	TextFieldZ	TimeFieldZ	UUIDFieldz"%(column)s" >= 0)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Ú	iendswithz@REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')zLIKE '%%' || {} || '%%'zLIKE '%%' || UPPER({}) || '%%'zLIKE {} || '%%'zLIKE UPPER({}) || '%%'zLIKE '%%' || {}zLIKE '%%' || UPPER({}))r*   r+   r/   r1   r0   r2   r   c             C   s˜   | j }|d dkrtdƒ‚d|d p&di}| |d ¡ | dd ¡ |d rX|d |d	< |d
 rl|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Úpop)Úselfr<   Ú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 )Nr5   r6   )r6   )ÚDatabaseÚconnectr<   r6   ÚKeyErrorZset_session)r?   r@   Ú
connectionÚoptionsr   r   r   Úget_new_connection§   s    
z"DatabaseWrapper.get_new_connectionc          	   C   sX   |   ¡  | j d¡}| j}|rT||krT| j ¡ �}| | j ¡ |g¡ W d Q R X dS dS )NZTimeZoneTF)Úensure_connectionrE   Zget_parameter_statusÚtimezone_nameÚcursorÚexecuteÚopsZset_time_zone_sql)r?   Zconn_timezone_namerI   rJ   r   r   r   Úensure_timezone»   s    zDatabaseWrapper.ensure_timezonec             C   s.   | j  d¡ |  ¡ }|r*|  ¡ s*| j  ¡  d S )NÚUTF8)rE   Zset_client_encodingrM   Zget_autocommitÚcommit)r?   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  ¡ }tjr0tnd |_|S )NF)Z
scrollableZwithhold)rE   rJ   Ú
autocommitr   ZUSE_TZr   Ztzinfo_factory)r?   ÚnamerJ   r   r   r   Úcreate_cursorÎ   s
    
zDatabaseWrapper.create_cursorc             C   s*   |  j d7  _ | jdt ¡ j| j f d�S )Nr   z_django_curs_%d_%d)rR   )Ú_named_cursor_idxZ_cursorÚ	threadingÚcurrent_threadÚident)r?   r   r   r   Úchunked_cursorØ   s
    zDatabaseWrapper.chunked_cursorc          	   C   s   | j � || j_W d Q R X d S )N)Zwrap_database_errorsrE   rQ   )r?   rQ   r   r   r   Ú_set_autocommitâ   s    zDatabaseWrapper._set_autocommitc             C   s    |   ¡  d¡ |   ¡  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)rJ   rK   )r?   Ztable_namesr   r   r   Úcheck_constraintsæ   s    z!DatabaseWrapper.check_constraintsc             C   s4   y| j  ¡  d¡ W n tjk
r*   dS X dS d S )NzSELECT 1FT)rE   rJ   rK   rB   ÚError)r?   r   r   r   Ú	is_usableî   s
    zDatabaseWrapper.is_usablec          	      st   t ƒ j}y| ¡  W nZ tjtfk
rn   t dt¡ | j	 
¡ }tjt d |d< | 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.r3   F)ÚaliasZallow_thread_sharing)ÚsuperÚ_nodb_connectionrH   rB   r   ÚWrappedDatabaseErrorÚwarningsÚwarnÚRuntimeWarningr<   Úcopyr   Z	DATABASESr   Ú	__class__r]   )r?   Znodb_connectionr<   )re   r   r   r_   ÷   s    
z DatabaseWrapper._nodb_connectionc          	   C   s   |   ¡ �
 | jjS Q R X d S )N)Ztemporary_connectionrE   Zserver_version)r?   r   r   r   Ú
pg_version  s    
zDatabaseWrapper.pg_version)N)N)&Ú__name__Ú
__module__Ú__qualname__ÚvendorZdisplay_nameZ
data_typesZdata_type_check_constraintsÚ	operatorsZpattern_escZpattern_opsrB   r   ZSchemaEditorClassr   Zclient_classr   Zcreation_classr   Zfeatures_classr   Zintrospection_classr   Z	ops_classrT   rA   rG   rM   rP   rS   rX   rY   rZ   r\   Úpropertyr_   r   rf   Ú__classcell__r   r   )re   r   r   =   sŠ   
	



	r   )6Ú__doc__rU   ra   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.backends.base.baser   Zdjango.db.utilsr   r`   Zdjango.utils.functionalr   Zdjango.utils.safestringr   Zdjango.utils.versionr	   r   rB   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>   sH   

