o
    lfG                     @   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 ddlmZ zzddlZW n eyd   ddlZY nw W n eyq   e	dw dd Ze dk re	dej  de   krdk rn ne	dej  ddl!m"Z"m#Z# e#rddlm$Z$m%Z% ddl&m'Z' ddl!m(Z(m)Z) e$j*d j+Z,n)ddl-Zddl.Zej/0eej/j1 ej23  dZ4ej/5e4fdej/j6Z7ej/8e7 ddl9m:Z: ddl;m<Z< dd l=m>Z> dd!l?m@Z@ dd"lAmBZB dd#lCmDZD d$d% ZEG d&d' d'eZFe#r@G d(d) d)ZGG d*d+ d+eGejHZIG d,d- d-eGejJZHG d.d/ d/eZdS ej/jKZHG d0d/ d/eZdS )1zY
PostgreSQL database backend for Django.

Requires psycopg2 >= 2.8.4 or psycopg >= 3.1.8
    N)contextmanager)settings)ImproperlyConfigured)DatabaseError)connections)BaseDatabaseWrapperCursorDebugWrapper)async_unsafe)cached_property)
SafeString)get_version_tuplez(Error loading psycopg2 or psycopg modulec                  C   s   t jddd } t| S )N    r   )Database__version__splitr   )version r   f/var/www/ticemtrilhas/avaliacao_env/lib/python3.10/site-packages/django/db/backends/postgresql/base.pypsycopg_version    s   r   )         z6psycopg2 version 2.8.4 or newer is required; you have )   )r   r   r   z5psycopg version 3.1.8 or newer is required; you have r   )IsolationLevelis_psycopg3)adapterssql)Format)get_adapters_templateregister_tzloadertimestamptzi  	INETARRAY)DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditorc                 C   s   | d d u rdS d|  S )N
max_lengthvarcharvarchar(%(max_length)s)r   )datar   r   r   _get_varchar_columnS   s   r.   c                       s  e Zd ZdZdZi ddddddd	d
de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$
Zd%d%d%d&Zd'd'd'd(Zd)d*d+d,d-d.d/d0d1d2d+d+d,d,d3Z	d4Z
d5d6d7d8d9d:d;ZeZeZeZeZeZeZeZd<Zd=d> Zd?d@ ZedAdB ZdCdD ZdEdF Z fdGdHZ ed\dJdKZ!dLdM Z"edNdO Z#dPdQ Z$d\dRdSZ%dTdU Z&e' fdVdWZ(e)dXdY Z*dZd[ Z+  Z,S )]DatabaseWrapper
postgresql
PostgreSQL	AutoFieldintegerBigAutoFieldbigintBinaryFieldbyteaBooleanFieldboolean	CharField	DateFielddateDateTimeFieldztimestamp with time zoneDecimalFieldz+numeric(%(max_digits)s, %(decimal_places)s)DurationFieldinterval	FileFieldr,   FilePathField
FloatFieldzdouble precisionIntegerFieldBigIntegerFieldIPAddressFieldinetGenericIPAddressField	JSONFieldjsonbsmallinttexttimeuuid)
OneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField	SlugFieldSmallAutoFieldSmallIntegerField	TextField	TimeField	UUIDFieldz"%(column)s" >= 0)rP   rQ   rR   z GENERATED BY DEFAULT AS IDENTITY)r2   r4   rT   z= %sz= UPPER(%s)zLIKE %szLIKE UPPER(%s)z~ %sz~* %sz> %sz>= %sz< %sz<= %s)exactiexactcontains	icontainsregexiregexgtgtelt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\   rc   re   rd   rf   r   c                 C   s   t | jdS )zo
        Return a tuple of the database's version.
        E.g. for pg_version 120004, return (12, 4).
        i'  )divmod
pg_versionselfr   r   r   get_database_version   s   z$DatabaseWrapper.get_database_versionc                 C   s  | j }|d dkr|di dstdt|d pd| j kr5td|d t|d | j f |d rDd|d i|d }n|d d u r]|di dd  ddi|d }ni |d }d	|d
< |dd  |dd  |dd }|dtr|du rt	nt
 |d r|d |d< |d r|d |d< |d r|d |d< |d r|d |d< trttj| j|d< |dd |d< |S )NNAME OPTIONSservicez`settings.DATABASES is improperly configured. Please supply the NAME or OPTIONS['service'] value.zThe database name '%s' (%d characters) is longer than PostgreSQL's limit of %d characters. Supply a shorter NAME in settings.DATABASES.dbnamepostgresUTF8client_encodingassume_roleisolation_levelserver_side_bindingcursor_factoryTUSERuserPASSWORDpasswordHOSThostPORTportcontextprepare_threshold)settings_dictgetr   lenopsmax_name_lengthpop
setdefaultr   ServerBindingCursorCursorr    r   USE_TZtimezone)rj   r   conn_paramsrv   r   r   r   get_connection_params   sj   

z%DatabaseWrapper.get_connection_paramsc                 C   s   | j d }d}z|d }W n ty   tj| _Y nw z	t|| _d}W n ty3   td| dw | jjd
i |}|rC| j|_t	sOt
jj|dd d	 |S )Nrn   Fru   Tz$Invalid transaction isolation level z9 specified. Use one of the psycopg.IsolationLevel values.c                 S   s   | S Nr   )xr   r   r   <lambda>  s    z4DatabaseWrapper.get_new_connection.<locals>.<lambda>)conn_or_cursloadsr   )r   KeyErrorr   READ_COMMITTEDru   
ValueErrorr   r   connectr   psycopg2extrasregister_default_jsonb)rj   r   optionsset_isolation_levelisolation_level_value
connectionr   r   r   get_new_connection   s.   


z"DatabaseWrapper.get_new_connectionc                 C   sv   | j d u rdS | j jd}| j}|r9||kr9| j  }|| j |g W d    dS 1 s2w   Y  dS dS )NFTimeZoneT)r   infoparameter_statustimezone_namecursorexecuter   set_time_zone_sql)rj   conn_timezone_namer   r   r   r   r   ensure_timezone  s   

zDatabaseWrapper.ensure_timezonec                 C   st   | j d u rdS | jdi d }r8| j  }| jd|g}|| W d    dS 1 s1w   Y  dS dS )NFrn   rt   zSET ROLE %sT)r   r   r   r   r   compose_sqlr   )rj   new_roler   r   r   r   r   ensure_role*  s   

zDatabaseWrapper.ensure_rolec                    s@   t    |  }|  }|s|r|  s| j  d S d S d S r   )superinit_connection_stater   r   get_autocommitr   commit)rj   	commit_tzcommit_role	__class__r   r   r   4  s   
z%DatabaseWrapper.init_connection_stateNc                 C   sn   |r| j j|d| j jd}n| j  }tr,| j jttj}| j	|j	kr*t
| j	| |S tjr2| jnd |_|S )NF)
scrollablewithhold)r   r   
autocommitr   r   
get_loaderTIMESTAMPTZ_OIDr   TEXTr   r!   r   r   tzinfo_factory)rj   namer   tzloaderr   r   r   create_cursorA  s   

zDatabaseWrapper.create_cursorc                 C   s   | j S r   )r   )rj   offsetr   r   r   r   V  s   zDatabaseWrapper.tzinfo_factoryc                 C   sf   |  j d7  _ zt }W n ty   d }Y nw |r"tt|}nd}| jdt j	|| j f dS )Nr   syncz_django_curs_%d_%s_%d)r   )
_named_cursor_idxasynciocurrent_taskRuntimeErrorstrid_cursor	threadingcurrent_threadident)rj   r   
task_identr   r   r   chunked_cursorY  s"   zDatabaseWrapper.chunked_cursorc                 C   s4   | j  || j_W d    d S 1 sw   Y  d S r   )wrap_database_errorsr   r   )rj   r   r   r   r   _set_autocommitu  s   
"zDatabaseWrapper._set_autocommitc                 C   sB   |   }|d |d W d   dS 1 sw   Y  dS )zl
        Check constraints by setting them to immediate. Return them to deferred
        afterward.
        zSET CONSTRAINTS ALL IMMEDIATEzSET CONSTRAINTS ALL DEFERREDN)r   r   )rj   table_namesr   r   r   r   check_constraintsy  s   

"z!DatabaseWrapper.check_constraintsc                 C   sV   z| j  }|d W d    W dS 1 sw   Y  W dS  tjy*   Y dS w )NzSELECT 1FT)r   r   r   r   Errorrj   r   r   r   r   	is_usable  s   zDatabaseWrapper.is_usablec                 #   s   d }zt   }|V  W d    W d S 1 sw   Y  W d S  tjtfy   |d ur/ tdt t	 D ]G}|j
dkr|jd dkr| ji | jd|jd i| jd}z| }|V  W d    n1 slw   Y  W |  n|  w  Y d S q9 w )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.r0   rl   rq   )alias)r   _nodb_cursorr   r   WrappedDatabaseErrorwarningswarnRuntimeWarningr   allvendorr   r   r   r   close)rj   r   r   connr   r   r   r     sD   &


zDatabaseWrapper._nodb_cursorc                 C   s6   |    | jjjW  d    S 1 sw   Y  d S r   )temporary_connectionr   r   server_versionri   r   r   r   rh     s   
$zDatabaseWrapper.pg_versionc                 C   s
   t || S r   r   r   r   r   r   make_debug_cursor  s   
z!DatabaseWrapper.make_debug_cursorr   )-__name__
__module____qualname__r   display_namer.   
data_typesdata_type_check_constraintsdata_types_suffix	operatorspattern_escpattern_opsr   r)   SchemaEditorClassr$   client_classr%   creation_classr&   features_classr'   introspection_classr(   	ops_classr   rk   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   rh   r   __classcell__r   r   r   r   r/   Y   s    	
	>
"


	
%
r/   c                   @   s   e Zd ZdZdddZdS )CursorMixinzE
        A subclass of psycopg cursor implementing callproc.
        Nc                 C   s   t |tjst|}td|tdg}|r0|D ]}|t| |td q|d= |td t|}| | |S )NzSELECT * FROM (,))
isinstancer   
IdentifierSQLappendLiteralComposedr   )rj   r   argsqpartsitemstmtr   r   r   callproc  s   


zCursorMixin.callprocr   )r   r   r   __doc__r   r   r   r   r   r     s    r   c                   @      e Zd ZdS )r   Nr   r   r   r   r   r   r   r         r   c                   @   r  )r   Nr  r   r   r   r   r     r  r   c                   @   s   e Zd Zdd ZdS )r	   c                 C   s:   |  | | j|W  d    S 1 sw   Y  d S r   )	debug_sqlr   copy)rj   	statementr   r   r   r    s   
$zCursorDebugWrapper.copyN)r   r   r   r  r   r   r   r   r	     s    r	   c                   @   s   e Zd Zdd Zdd ZdS )r	   c                 G   sD   |  | | jj||g|R  W  d    S 1 sw   Y  d S r   )r  r   copy_expert)rj   r   filer   r   r   r   r    s   $zCursorDebugWrapper.copy_expertc                 O   sP   | j d| d | jj||g|R i |W  d    S 1 s!w   Y  d S )NzCOPY %s TO STDOUT)r   )r  r   copy_to)rj   r	  tabler   kwargsr   r   r   r
    s   $zCursorDebugWrapper.copy_toN)r   r   r   r  r
  r   r   r   r   r	     s    )Lr  r   r   r   
contextlibr   django.confr   django.core.exceptionsr   	django.dbr   r   r   django.db.backends.base.baser   django.db.backends.utilsr	   BaseCursorDebugWrapperdjango.utils.asyncior
   django.utils.functionalr   django.utils.safestringr   django.utils.versionr   psycopgr   ImportErrorr   r   r   psycopg_anyr   r   r   r   
psycopg.pqr   r    r!   typesoidr   psycopg2.extensionspsycopg2.extras
extensionsregister_adapterQuotedStringr   register_uuidINETARRAY_OIDnew_array_typeUNICODEr#   register_typeclientr$   creationr%   featuresr&   introspectionr'   
operationsr(   schemar)   r.   r/   r   r   r   ClientCursorr   r   r   r   r   <module>   s    



  d