o
    ˜¨ÊhÈ7  ã                
   @   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ddlZddlZddlZW n eyp Z  ze	de  ƒ‚dZ [ ww 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/ ej0 1eej0j2¡ ej3 4¡  dZ5ej0 6e5fdej0j7¡Z8ej0 9e8¡ G dd„ deƒZ:G dd„ deƒZdS ) zW
PostgreSQL database backend for Django.

Requires psycopg 2: https://www.psycopg.org/
é    N)Úcontextmanager)Úsettings)ÚImproperlyConfigured)ÚDatabaseError)Úconnections)ÚBaseDatabaseWrapper©ÚCursorDebugWrapper)Úasync_unsafe)Úcached_property)Ú
SafeString)Úget_version_tuplez!Error loading psycopg2 module: %sc                  C   s   t j dd¡d } t| ƒS )Nú é   r   )Úpsycopg2Ú__version__Úsplitr   )Úversion© r   úT/var/www/html/env/lib/python3.10/site-packages/django/db/backends/postgresql/base.pyÚpsycopg2_version   s   r   )é   é   é   z8psycopg2 version 2.8.4 or newer is required; you have %sr   )ÚDatabaseClient)ÚDatabaseCreation)ÚDatabaseFeatures)ÚDatabaseIntrospection)ÚDatabaseOperations)ÚDatabaseSchemaEditori  Ú	INETARRAYc                       sœ  e Zd ZdZdZi 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$œ
¥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‡ fdEdF„ZedZdHdI„ƒZdJdK„ Z edLdM„ ƒZ!dNdO„ Z"dZdPdQ„Z#dRdS„ Z$e%‡ fdTdU„ƒZ&e'dVdW„ ƒZ(dXdY„ Z)‡  Z*S )[ÚDatabaseWrapperÚ
postgresqlÚ
PostgreSQLÚ	AutoFieldÚintegerÚBigAutoFieldÚbigintÚBinaryFieldÚbyteaÚBooleanFieldÚbooleanÚ	CharFieldzvarchar(%(max_length)s)Ú	DateFieldÚdateÚDateTimeFieldztimestamp with time zoneÚDecimalFieldz+numeric(%(max_digits)s, %(decimal_places)s)ÚDurationFieldÚintervalÚ	FileFieldÚ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)rB   rC   rD   z GENERATED BY DEFAULT AS IDENTITY)r$   r&   rF   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({}))rM   rN   rU   rW   rV   rX   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 ƒ‚i }|d rFd|d i|d ¥}n|d d u r_| di ¡ dd ¡ ddi|d ¥}ni |d ¥}| d	d ¡ |d
 ru|d
 |d< |d r|d |d< |d r‰|d |d< |d r“|d |d< |S )NÚNAMEÚ ÚOPTIONSÚservicez`settings.DATABASES is improperly configured. Please supply the NAME or OPTIONS['service'] value.z‡The database name '%s' (%d characters) is longer than PostgreSQL's limit of %d characters. Supply a shorter NAME in settings.DATABASES.ÚdatabaseÚpostgresÚisolation_levelÚUSERÚuserÚPASSWORDÚpasswordÚHOSTÚhostÚPORTÚport)Úsettings_dictÚgetr   ÚlenÚopsÚmax_name_lengthÚpop)r\   rm   Úconn_paramsr   r   r   Úget_connection_params¨   sH   ÿÿ
ýýÿ
ÿþz%DatabaseWrapper.get_connection_paramsc                 C   sv   t jdi |¤Ž}| jd }z|d | _W n ty!   |j| _Y nw | j|jkr/|j| jd� tjj|dd„ d� |S )Nr`   rd   )rd   c                 S   s   | S ©Nr   )Úxr   r   r   Ú<lambda>ë   s    z4DatabaseWrapper.get_new_connection.<locals>.<lambda>)Úconn_or_cursÚloadsr   )	ÚDatabaseÚconnectrm   rd   ÚKeyErrorÚset_sessionr   ÚextrasÚregister_default_jsonb)r\   rs   Ú
connectionÚoptionsr   r   r   Úget_new_connectionÕ   s   
ÿÿz"DatabaseWrapper.get_new_connectionc                 C   st   | j d u rdS | j  d¡}| j}|r8||kr8| j  ¡ �}| | j ¡ |g¡ W d   ƒ dS 1 s1w   Y  dS dS )NFÚTimeZoneT)r€   Úget_parameter_statusÚtimezone_nameÚcursorÚexecuterp   Úset_time_zone_sql)r\   Úconn_timezone_namer…   r†   r   r   r   Úensure_timezoneï   s   

ÿþzDatabaseWrapper.ensure_timezonec                    s@   t ƒ  ¡  | j d¡ |  ¡ }|r|  ¡ s| j ¡  d S d S d S )NÚUTF8)ÚsuperÚinit_connection_stater€   Úset_client_encodingrŠ   Úget_autocommitÚcommit)r\   Útimezone_changed©Ú	__class__r   r   r�   ú   s   
ýz%DatabaseWrapper.init_connection_stateNc                 C   sB   |r| j j|d| j jd�}n| j  ¡ }tjr| j|_|S d |_|S )NF)Ú
scrollableÚwithhold)r€   r†   Ú
autocommitr   ÚUSE_TZÚtzinfo_factory)r\   Únamer†   r   r   r   Úcreate_cursor  s   
ÿ
ÿzDatabaseWrapper.create_cursorc                 C   s   | j S ru   )Útimezone)r\   Úoffsetr   r   r   r˜     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)r\   r    Ú
task_identr   r   r   Úchunked_cursor  s"   ÿüÿÿzDatabaseWrapper.chunked_cursorc                 C   s4   | j � || j_W d   ƒ d S 1 sw   Y  d S ru   )Úwrap_database_errorsr€   r–   )r\   r–   r   r   r   Ú_set_autocommit0  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‡   )r\   Útable_namesr†   r   r   r   Úcheck_constraints4  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‡   rz   ÚError©r\   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.r"   r^   rc   )Úalias)rŒ   Ú_nodb_cursorrz   r   ÚWrappedDatabaseErrorÚwarningsÚwarnÚRuntimeWarningr   ÚallÚvendorrm   r“   r±   r†   Úclose)r\   r†   r€   Úconnr’   r   r   r²   G  sD   €&ÿú
ÿ
þû
ÿ€€âzDatabaseWrapper._nodb_cursorc                 C   s4   |   ¡ � | jjW  d   ƒ S 1 sw   Y  d S ru   )Útemporary_connectionr€   Úserver_versionr[   r   r   r   rZ   m  s   
$ÿzDatabaseWrapper.pg_versionc                 C   s
   t || ƒS ru   r   r¯   r   r   r   Úmake_debug_cursorr  s   
z!DatabaseWrapper.make_debug_cursorru   )+Ú__name__Ú
__module__Ú__qualname__r¸   Údisplay_nameÚ
data_typesÚdata_type_check_constraintsÚdata_types_suffixÚ	operatorsÚpattern_escÚpattern_opsrz   r   ÚSchemaEditorClassr   Úclient_classr   Úcreation_classr   Úfeatures_classr   Úintrospection_classr   Ú	ops_classrž   r]   rt   r
   r‚   rŠ   r�   rš   r˜   r©   r«   r­   r°   r   r²   r   rZ   r½   Ú__classcell__r   r   r’   r   r!   C   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 ru   )Ú	debug_sqlr†   Úcopy_expert)r\   ÚsqlÚfileÚargsr   r   r   rÐ   w  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)r\   rÒ   ÚtablerÓ   Úkwargsr   r   r   rÔ   {  s   $ÿzCursorDebugWrapper.copy_toN)r¾   r¿   rÀ   rÐ   rÔ   r   r   r   r   r	   v  s    r	   );Ú__doc__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   r   rz   Úpsycopg2.extensionsÚpsycopg2.extrasÚImportErrorÚer   ÚPSYCOPG2_VERSIONr   Úclientr   Úcreationr   Úfeaturesr   Úintrospectionr   Ú
operationsr   Úschemar   Ú
extensionsÚregister_adapterÚQuotedStringr~   Úregister_uuidÚINETARRAY_OIDÚnew_array_typeÚUNICODEr    Úregister_typer!   r   r   r   r   Ú<module>   sd    €ÿÿÿ
ý  5