U
    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rd 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   O/tmp/pip-unpacked-wheel-_jot26k8/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                    s@   t  j|| |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              	      sf   t    |  J}|ddg t| r<W 5 Q R  d S |d trX| | jd W 5 Q R X 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k
rB   t||}||| j< Y nX |rr|| |j|jt	 |j|jt
 |r||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*   
*