a
    Kcòfw  ã                   @   s  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 erúd dlmZ d dlmZ d dlmZ d dlmZmZ G dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZ edd„ ƒZ!G dd„ deƒZdS )é    )Ú	lru_cache)ÚNO_DB_ALIAS)ÚDatabaseWrapper)Úis_psycopg3é   )ÚPostGISAdapter)ÚDatabaseFeatures)ÚPostGISIntrospection)ÚPostGISOperations)ÚPostGISSchemaEditor)ÚDumper)ÚFormat)ÚTypeInfo)ÚTextBinaryLoaderÚ
TextLoaderc                   @   s   e Zd ZdS )ÚGeometryTypeN©Ú__name__Ú
__module__Ú__qualname__© r   r   úh/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/contrib/gis/db/backends/postgis/base.pyr      s   r   c                   @   s   e Zd ZdS )ÚGeographyTypeNr   r   r   r   r   r      s   r   c                   @   s   e Zd ZdS )Ú
RasterTypeNr   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd„ ZdS )ÚBaseTextDumperc                 C   s   |j  ¡  ¡ S ©N)ÚewkbÚhexÚencode©ÚselfÚobjr   r   r   Údump   s    zBaseTextDumper.dumpN)r   r   r   r"   r   r   r   r   r      s   r   c                   @   s   e Zd ZejZdd„ ZdS )ÚBaseBinaryDumperc                 C   s   |j S r   )r   r   r   r   r   r"   $   s    zBaseBinaryDumper.dumpN)r   r   r   r   ÚBINARYÚformatr"   r   r   r   r   r#   !   s   r#   c                    sH   G ‡ ‡‡fdd„dt ƒ}G dd„ d|td�}G dd„ d|td�}||fS )Nc                       s:   e Zd Z‡ ‡‡‡fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	z$postgis_adapters.<locals>.BaseDumperc                    sJ   t ƒ  ¡  td|fdˆiƒ| _td|fdˆiƒ| _tdtfdˆiƒ| _d S )NÚGeometryDumperÚoidÚGeographyDumperÚRasterDumper)ÚsuperÚ__init_subclass__Útyper&   r(   r   r)   )ÚclsÚbase_dumper)Ú	__class__Úgeo_oidÚgeog_oidÚ
raster_oidr   r   r+   *   s    
ÿÿÿz6postgis_adapters.<locals>.BaseDumper.__init_subclass__c                 S   s   |j r|jrtS tS tS d S r   )Úis_geometryÚ	geographyr   r   r   ©r    r!   r%   r   r   r   Úget_key7   s    z,postgis_adapters.<locals>.BaseDumper.get_keyc                 S   s0   |j r"|jr|  t¡S |  t¡S n
|  t¡S d S r   )r3   r4   r(   r   r&   r   r)   r   r5   r   r   r   Úupgrade=   s
    
z,postgis_adapters.<locals>.BaseDumper.upgradec                 S   s   t ‚d S r   )ÚNotImplementedErrorr   r   r   r   r"   F   s    z)postgis_adapters.<locals>.BaseDumper.dump)r   r   r   r+   r6   r7   r"   Ú__classcell__r   ©r0   r1   r2   ©r/   r   Ú
BaseDumper)   s   	r<   c                   @   s   e Zd ZdS )z+postgis_adapters.<locals>.PostGISTextDumperNr   r   r   r   r   ÚPostGISTextDumperI   s   r=   )r.   c                   @   s   e Zd ZejZdS )z-postgis_adapters.<locals>.PostGISBinaryDumperN)r   r   r   r   r$   r%   r   r   r   r   ÚPostGISBinaryDumperL   s   r>   )r   r   r#   )r0   r1   r2   r<   r=   r>   r   r:   r   Úpostgis_adapters'   s     r?   c                       sZ   e Zd ZeZi i i dœZ‡ fdd„Z‡ fdd„Z‡ fdd„Ze	rRdd	„ Z
ddd„Z‡  ZS )r   )Úgeometryr4   Úrasterc                    sD   t ƒ j|i |¤Ž | dd¡tkr@t| ƒ| _t| ƒ| _t| ƒ| _	d S )NÚaliasÚ )
r*   Ú__init__Úgetr   r   Úfeaturesr
   Úopsr	   Úintrospection)r    ÚargsÚkwargsr;   r   r   rD   [   s
    

zDatabaseWrapper.__init__c                    s|   t ƒ  ¡  |  ¡ �V}| ddg¡ t| ¡ ƒr>W d   ƒ d S | d¡ trZ|  | jd¡ W d   ƒ n1 sn0    Y  d S )Nz-SELECT 1 FROM pg_extension WHERE extname = %sZpostgisz&CREATE EXTENSION IF NOT EXISTS postgisT)	r*   Úprepare_databaseÚcursorÚexecuteÚboolZfetchoner   Úregister_geometry_adaptersÚ
connection)r    rL   r;   r   r   rK   b   s    


z DatabaseWrapper.prepare_databasec                    s   t ƒ  |¡}tr|  |¡ |S r   )r*   Úget_new_connectionr   rO   )r    Zconn_paramsrP   r;   r   r   rQ   o   s    
z"DatabaseWrapper.get_new_connectionc                 C   s~   | j | }z|| j }W n( ty@   t ||¡}||| j< Y n0 |rp| |¡ |j |jt	¡ |j |jt
¡ |rz|jS d S r   )Ú_type_infosrB   ÚKeyErrorr   ÚfetchÚregisterÚadaptersZregister_loaderr'   r   r   )r    Úpg_connectionÚtypenameÚregistryÚinfor   r   r   Ú_register_typew   s    

zDatabaseWrapper._register_typeFc           	      C   sx   |r$| j D ]}| j |  | jd ¡ q
|  |d¡}|  |d¡}|  |d¡}t|||ƒ\}}|j t|¡ |j t|¡ d S )Nr@   r4   rA   )rR   ÚpoprB   r[   r?   rV   Zregister_dumperr   )	r    rW   Zclear_cachesrX   r0   r1   r2   r=   r>   r   r   r   rO   †   s    
ÿz*DatabaseWrapper.register_geometry_adapters)F)r   r   r   r   ZSchemaEditorClassrR   rD   rK   rQ   r   r[   rO   r9   r   r   r;   r   r   R   s   ýr   N)"Ú	functoolsr   Zdjango.db.backends.base.baser   Z"django.db.backends.postgresql.baser   ZPsycopgDatabaseWrapperZ)django.db.backends.postgresql.psycopg_anyr   Úadapterr   rF   r   rH   r	   Ú
operationsr
   Zschemar   Zpsycopg.adaptr   Z
psycopg.pqr   Zpsycopg.typesr   Zpsycopg.types.stringr   r   r   r   r   r   r#   r?   r   r   r   r   Ú<module>   s*   
*