
^Q\+                 @   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 d d l m Z 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  rKe d e j   n  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 j0 re j1 j2 e j1 j3  e j1 j2 e j1 j4  n  e j1 j5 e e j1 j6  e j1 j5 e e j1 j6  e j7 j8   d Z9 e j1 j: e9 f d e j1 j3  Z; e j1 j2 e;  Gd 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)DatabaseError)six)	force_str)cached_property)	SafeBytesSafeTextz!Error loading psycopg2 module: %sc              C   s9   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   H/var/www/dbchiro/venv/build/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.5.4 or newer is required; you have %sr   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditor)utc_tzinfo_factory)get_versioni  	INETARRAYc                   sn  e  Z d  Z d Z i d d 6d d 6d d 6d d	 6d
 d 6d
 d 6d d 6d d 6d d 6d d 6d
 d 6d
 d 6d d 6d d 6d d 6d d 6d d 6d d  6d d! 6d d" 6d# d$ 6d
 d% 6d# d& 6d' d( 6d) d* 6d+ d, 6Z i d- d" 6d- d$ 6Z i d. d/ 6d0 d1 6d2 d3 6d4 d5 6d6 d7 6d8 d9 6d: d; 6d< d= 6d> d? 6d@ dA 6d2 dB 6d2 dC 6d4 dD 6d4 dE 6Z dF Z i dG d3 6dH d5 6dI dB 6dJ dD 6dK dC 6dL dE 6Z e	 Z	 e
 Z e Z e Z e Z e Z e Z   f dM dN   Z dO dP   Z dQ dR   Z dS dT   Z dU dV   Z dW dX dY  Z dZ d[   Z d\ d]   Z dW d^ d_  Z d` da   Z e    f db dc    Z! e" dd de    Z# e" df dg    Z$   S)hDatabaseWrapperZ
postgresqlserialZ	AutoFieldZ	bigserialZBigAutoFieldZbyteaZBinaryFieldbooleanZBooleanFieldzvarchar(%(max_length)s)Z	CharFieldZCommaSeparatedIntegerFielddateZ	DateFieldztimestamp with time zoneZDateTimeFieldz+numeric(%(max_digits)s, %(decimal_places)s)ZDecimalFieldintervalZDurationFieldZ	FileFieldZFilePathFieldzdouble precisionZ
FloatFieldintegerZIntegerFieldZbigintZBigIntegerFieldZinetZIPAddressFieldZGenericIPAddressFieldZNullBooleanFieldZOneToOneFieldZPositiveIntegerFieldZsmallintZPositiveSmallIntegerFieldZ	SlugFieldZSmallIntegerFieldtextZ	TextFieldtimeZ	TimeFielduuidZ	UUIDFieldz"%(column)s" >= 0z= %sexactz= UPPER(%s)ZiexactzLIKE %scontainszLIKE UPPER(%s)Z	icontainsz~ %sregexz~* %sZiregexz> %sgtz>= %sZgtez< %sltz<= %sZlte
startswithendswithZistartswithZ	iendswithz@REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')zLIKE '%%' || {} || '%%'zLIKE '%%' || UPPER({}) || '%%'zLIKE {} || '%%'zLIKE UPPER({}) || '%%'zLIKE '%%' || {}zLIKE '%%' || UPPER({})c                s&   t  t |   j | |   d |  _ d  S)Nr   )superr(   __init___named_cursor_idx)selfargskwargs)	__class__r   r   r9      s    zDatabaseWrapper.__init__c             C   s   |  j  } | d d k r( t d   n  i | d p8 d d 6} | j | d  | j d d   | d r{ | d | d	 <n  | d
 r t | d
  | d <n  | d r | d | d <n  | d r | d | d <n  | S)NNAME zJsettings.DATABASES is improperly configured. Please supply the NAME value.ZpostgresZdatabaseOPTIONSisolation_levelUSERuserZPASSWORDpasswordZHOSThostZPORTport)settings_dictr   updatepopr   )r;   rH   conn_paramsr   r   r   get_connection_params   s"    	



z%DatabaseWrapper.get_connection_paramsc             C   sz   t  j |   } |  j d } y | d |  _ Wn t k
 rM | j |  _ Yn) X|  j | j k rv | j d |  j  n  | S)NrA   rB   )DatabaseconnectrH   rB   KeyErrorZset_session)r;   rK   
connectionoptionsr   r   r   get_new_connection   s    z"DatabaseWrapper.get_new_connectionc          
   C   ss   |  j    |  j j d  } |  j } | ro | | k ro |  j j   # } | j |  j j   | g  Wd  QXd Sd S)NZTimeZoneTF)ensure_connectionrP   Zget_parameter_statustimezone_namecursorexecuteopsZset_time_zone_sql)r;   Zconn_timezone_namerT   rU   r   r   r   ensure_timezone   s    
	"zDatabaseWrapper.ensure_timezonec             C   sE   |  j  j d  |  j   } | rA |  j   sA |  j  j   qA n  d  S)NUTF8)rP   Zset_client_encodingrX   Zget_autocommitcommit)r;   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)rP   rU   
autocommitr   ZUSE_TZr%   Ztzinfo_factory)r;   namerU   r   r   r   create_cursor   s
    'zDatabaseWrapper.create_cursorc             C   s5   |  j  d 7_  |  j d d t j   j |  j  f  S)Nr   r]   z_django_curs_%d_%d)r:   Z_cursor	threadingcurrent_threadident)r;   r   r   r   chunked_cursor   s
    	zDatabaseWrapper.chunked_cursorc          	   C   s    |  j   | |  j _ Wd  QXd  S)N)Zwrap_database_errorsrP   r\   )r;   r\   r   r   r   _set_autocommit   s    
zDatabaseWrapper._set_autocommitc             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)rU   rV   )r;   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)rP   rU   rV   rM   Error)r;   r   r   r   	is_usable   s
    	zDatabaseWrapper.is_usablec                s   t  t |   j } y | j   Wnv t j t f k
 r t j d t	  |  j
 j   } t j t d | d <|  j |  j
 j   d |  j d d } Yn 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.r?   aliasZallow_thread_sharingF)r8   r(   _nodb_connectionrS   rM   r   WrappedDatabaseErrorwarningswarnRuntimeWarningrH   copyr   Z	DATABASESr   r>   rg   )r;   Znodb_connectionrH   )r>   r   r   rh      s    	z DatabaseWrapper._nodb_connectionc             C   s   t  S)N)PSYCOPG2_VERSION)r;   r   r   r   r     s    z DatabaseWrapper.psycopg2_versionc          	   C   s$   |  j     t |  j  SWd  QXd  S)N)Ztemporary_connectionr&   rP   )r;   r   r   r   
pg_version  s    zDatabaseWrapper.pg_version)%__name__
__module____qualname__vendorZ
data_typesZdata_type_check_constraintsZ	operatorsZpattern_escZpattern_opsrM   r$   ZSchemaEditorClassr   Zclient_classr    Zcreation_classr!   Zfeatures_classr"   Zintrospection_classr#   Z	ops_classr9   rL   rR   rX   r[   r^   rb   rc   rd   rf   propertyrh   r	   r   ro   r   r   )r>   r   r(   C   s   




	

	r(   )r   r   r   )=__doc__r_   rj   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.backends.base.baser   Zdjango.db.utilsr   ri   Zdjango.utilsr   Zdjango.utils.encodingr   Zdjango.utils.functionalr	   Zdjango.utils.safestringr
   r   r   rM   Zpsycopg2.extensionsZpsycopg2.extrasImportErrorer   rn   r   clientr   Zcreationr    featuresr!   Zintrospectionr"   Z
operationsr#   Zschemar$   utilsr%   r   r&   PY2
extensionsZregister_typeUNICODEZUNICODEARRAYZregister_adapterZQuotedStringextrasZregister_uuidZINETARRAY_OIDZnew_array_typer'   r(   r   r   r   r   <module>   sT   #			