a
    ‘ÐOcÈ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 n0 eyì Z  ze	de  ƒ‚W Y dZ [ n
dZ [ 0 0 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   úY/var/www/html/gsl.tools/lib/python3.9/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                       sT  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ddœZddddœZd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ed0d1„ ƒZd2d3„ Z‡ fd4d5„ZedId7d8„ƒZd9d:„ Z ed;d<„ ƒZ!d=d>„ Z"dJd?d@„Z#dAdB„ Z$e%‡ fdCdD„ƒZ&e'dEdF„ ƒZ(dGdH„ Z)‡  Z*S )KÚDatabaseWrapperÚ
postgresqlZ
PostgreSQLÚintegerZbigintZbyteaÚbooleanzvarchar(%(max_length)s)Údateztimestamp with time zonez+numeric(%(max_digits)s, %(decimal_places)s)Úintervalzdouble precisionZinetZjsonbZsmallintÚtextÚtimeÚuuid)Ú	AutoFieldÚBigAutoFieldZBinaryFieldZBooleanFieldZ	CharFieldZ	DateFieldZDateTimeFieldZDecimalFieldZDurationFieldZ	FileFieldZFilePathFieldZ
FloatFieldZIntegerFieldZBigIntegerFieldZIPAddressFieldZGenericIPAddressFieldZ	JSONFieldZOneToOneFieldÚPositiveBigIntegerFieldÚPositiveIntegerFieldÚPositiveSmallIntegerFieldZ	SlugFieldÚSmallAutoFieldZSmallIntegerFieldZ	TextFieldZ	TimeFieldZ	UUIDFieldz"%(column)s" >= 0)r,   r-   r.   z GENERATED BY DEFAULT AS IDENTITY)r*   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Ú	iendswithzKREPLACE(REPLACE(REPLACE({}, E'\\', E'\\\\'), E'%%', E'\\%%'), E'_', E'\\_')zLIKE '%%' || {} || '%%'zLIKE '%%' || UPPER({}) || '%%'zLIKE {} || '%%'zLIKE UPPER({}) || '%%'zLIKE '%%' || {}zLIKE '%%' || UPPER({}))r1   r2   r6   r8   r7   r9   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 p8dƒ| j ¡ krjtd|d t|d ƒ| j ¡ f ƒ‚i }|d rŒd|d i|d ¥}n>|d d u r¾| di ¡ dd ¡ ddi|d ¥}ni |d ¥}| d	d ¡ |d
 rê|d
 |d< |d rþ|d |d< |d �r|d |d< |d �r*|d |d< |S )NÚNAMEÚ ÚOPTIONSZ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.ZdatabaseÚpostgresÚisolation_levelÚUSERÚuserZPASSWORDÚpasswordZHOSTÚhostZPORTÚport)Úsettings_dictÚgetr   ÚlenÚopsZmax_name_lengthÚpop)r=   rI   Úconn_paramsr   r   r   Úget_connection_params¨   sH    ÿÿ
ýýÿ
ÿþ

z%DatabaseWrapper.get_connection_paramsc                 C   sv   t jf i |¤Ž}| jd }z|d | _W n tyB   |j| _Y n0 | j|jkr^|j| jd� tjj|dd„ d� |S )NrA   rC   )rC   c                 S   s   | S ©Nr   )Úxr   r   r   Ú<lambda>ë   ó    z4DatabaseWrapper.get_new_connection.<locals>.<lambda>)Zconn_or_cursÚloads)	ÚDatabaseÚconnectrI   rC   ÚKeyErrorZset_sessionr   ÚextrasZregister_default_jsonb)r=   rN   Ú
connectionÚoptionsr   r   r   Úget_new_connectionÕ   s    
ÿz"DatabaseWrapper.get_new_connectionc                 C   sr   | j d u rdS | j  d¡}| j}|rn||krn| j  ¡ �$}| | j ¡ |g¡ W d   ƒ n1 s`0    Y  dS dS )NFZTimeZoneT)rY   Zget_parameter_statusÚtimezone_nameÚcursorÚexecuterL   Zset_time_zone_sql)r=   Zconn_timezone_namer\   r]   r   r   r   Úensure_timezoneï   s    
2zDatabaseWrapper.ensure_timezonec                    s8   t ƒ  ¡  | j d¡ |  ¡ }|r4|  ¡ s4| j ¡  d S )NÚUTF8)ÚsuperÚinit_connection_staterY   Zset_client_encodingr_   Zget_autocommitÚcommit)r=   Ztimezone_changed©Ú	__class__r   r   rb   ú   s    
z%DatabaseWrapper.init_connection_stateNc                 C   s<   |r| j j|d| j jd�}n
| j  ¡ }tjr2| jnd |_|S )NF)Z
scrollableZwithhold)rY   r]   Ú
autocommitr   ZUSE_TZÚtzinfo_factory)r=   Únamer]   r   r   r   Úcreate_cursor  s    
ÿ
zDatabaseWrapper.create_cursorc                 C   s   | j S rP   )Útimezone)r=   Úoffsetr   r   r   rg     s    zDatabaseWrapper.tzinfo_factoryc                 C   sf   |  j d7  _ zt ¡ }W n ty0   d }Y n0 |rDtt|ƒƒ}nd}| jdt ¡ j	|| j f d�S )Nr   Úsyncz_django_curs_%d_%s_%d)rh   )
Ú_named_cursor_idxÚasyncioÚcurrent_taskÚRuntimeErrorÚstrÚidZ_cursorÚ	threadingÚcurrent_threadÚident)r=   ro   Z
task_identr   r   r   Úchunked_cursor  s     
üÿÿzDatabaseWrapper.chunked_cursorc                 C   s2   | j � || j_W d   ƒ n1 s$0    Y  d S rP   )Zwrap_database_errorsrY   rf   )r=   rf   r   r   r   Ú_set_autocommit0  s    zDatabaseWrapper._set_autocommitc                 C   s@   |   ¡ �$}| d¡ | d¡ W d  ƒ n1 s20    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=   Ztable_namesr]   r   r   r   Úcheck_constraints4  s    

z!DatabaseWrapper.check_constraintsc                 C   sX   z8| j  ¡ �}| d¡ W d   ƒ n1 s,0    Y  W n tjyN   Y dS 0 dS d S )NzSELECT 1FT)rY   r]   r^   rU   ÚError©r=   r]   r   r   r   Ú	is_usable=  s    ,zDatabaseWrapper.is_usablec                 #   s  d }z4t ƒ  ¡ �}|V  W d   ƒ n1 s,0    Y  W nÄ tjtfyü   |d urV‚ t dt¡ t 	¡ D ]Š}|j
dkrj|jd dkrj| ji | j¥d|jd i¥| jd�}z:| ¡ �}|V  W d   ƒ n1 sÐ0    Y  W | ¡  n
| ¡  0  qøqj‚ Y n0 d S )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?   rB   )Úalias)ra   Ú_nodb_cursorrU   r   ÚWrappedDatabaseErrorÚwarningsÚwarnÚRuntimeWarningr   ÚallÚvendorrI   re   r|   r]   Úclose)r=   r]   rY   Úconnrd   r   r   r}   G  s<    (úÿþÿ
þû
&zDatabaseWrapper._nodb_cursorc                 C   s4   |   ¡ � | jjW  d   ƒ S 1 s&0    Y  d S rP   )Ztemporary_connectionrY   Zserver_versionr<   r   r   r   r;   m  s    
zDatabaseWrapper.pg_versionc                 C   s
   t || ƒS rP   r   rz   r   r   r   Úmake_debug_cursorr  s    z!DatabaseWrapper.make_debug_cursor)N)N)+Ú__name__Ú
__module__Ú__qualname__rƒ   Zdisplay_nameÚ
data_typesZdata_type_check_constraintsZdata_types_suffixÚ	operatorsZpattern_escZpattern_opsrU   r   ZSchemaEditorClassr   Zclient_classr   Zcreation_classr   Zfeatures_classr   Zintrospection_classr   Z	ops_classrm   r>   rO   r
   r[   r_   rb   ri   rg   rv   rw   rx   r{   r   r}   r   r;   r†   Ú__classcell__r   r   rd   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 s60    Y  d S rP   )Ú	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 sB0    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__rn   rs   r   Ú
contextlibr   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   r~   r   Zdjango.db.backends.base.baser   Zdjango.db.backends.utilsr	   ZBaseCursorDebugWrapperZdjango.utils.asyncior
   Zdjango.utils.functionalr   Zdjango.utils.safestringr   Zdjango.utils.versionr   r   rU   Zpsycopg2.extensionsZpsycopg2.extrasÚImportErrorÚer   ZPSYCOPG2_VERSIONr   Úclientr   Zcreationr   Úfeaturesr   Zintrospectionr   Ú
operationsr   Zschemar   Ú
extensionsZregister_adapterÚQuotedStringrX   Zregister_uuidZINETARRAY_OIDZnew_array_typeÚUNICODEr    Zregister_typer!   r   r   r   r   Ú<module>   s^   "
ÿÿ
ý  5