
    +'&h5              	          d 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 ddlmZ ddlmZ ddlmZ d Zg dZ ee          dddddedee         dee         fd            Zd Zd Zd Zd Z d Z!d Z"d  Z#d! Z$d" Z%d# Z&d$ Z'd% Z(d& Z)d'd(d)d*d+d,Z*d- Z+d. Z, e,e*           dS )/z:This module defines specific functions for SQLite dialect.    N)Optional)text)compiles)func)select)	functions)_check_spatial_type)_format_select_args)_spatial_idx_name)setup_create_drop)	Geography)Geometry)_DummyGeometry)authorized_values_in_docstringc                     dt           j        vrt          d          |                     d           |                     t           j        d                    |                     d           dS )zLoad SpatiaLite extension in SQLite connection.

    .. Warning::
        The path to the SpatiaLite module should be set in the `SPATIALITE_LIBRARY_PATH`
        environment variable.

    Args:
        dbapi_conn: The DBAPI connection.
    SPATIALITE_LIBRARY_PATHz<The SPATIALITE_LIBRARY_PATH environment variable is not set.TFN)osenvironRuntimeErrorenable_load_extensionload_extension)
dbapi_connargss     \/var/www/html/reinick/venv/lib/python3.11/site-packages/geoalchemy2/admin/dialects/sqlite.pyload_spatialite_driverr      sj     !
22YZZZ$$T***bj)BCDDD$$U+++++    )DELETETRUNCATEPERSISTMEMORYWALOFF)JOURNAL_MODE_VALUESF)transaction	init_modejournal_moder$   r%   r&   c                   g }t          |t          t          f          st          d          |                    t          |                     ddg}t          |t
                    r|                                }|?||vr"t          d                    |                    |                    d| d           t          |t
                    r|                                }|0|t          vr't          d                    t                              | 	                    d          
                                d	         d
k     r|U| 	                    d          
                                d	         }| 	                    d                    |                     | 	                    d                    d                    |                               |,| 	                    d                    |                     dS dS dS )aq  Initialize internal SpatiaLite tables.

    Args:
        dbapi_conn: The DBAPI connection.
        transaction: If set to `True` the whole operation will be handled as a single Transaction
            (faster). The default value is `False` (slower, but safer).
        init_mode: Can be `None` to load all EPSG SRIDs, `'WGS84'` to load only the ones related
            to WGS84 or `'EMPTY'` to not load any EPSG SRID.

            .. Note::

                It is possible to load other EPSG SRIDs afterwards using `InsertEpsgSrid(srid)`.

        journal_mode: Change the journal mode to the given value. This can make the table creation
            much faster. The possible values are the following: <JOURNAL_MODE_VALUES>. See
            https://www.sqlite.org/pragma.html#pragma_journal_mode for more details.

            .. Warning::
                Some values, like 'MEMORY' or 'OFF', can lead to corrupted databases if the process
                is interrupted during initialization.

            .. Note::
                The original value is restored after the initialization.

    .. Note::
        When using this function as a listener it is not possible to pass the `transaction`,
        `init_mode` or `journal_mode` arguments directly. To do this you can either create another
        function that calls `init_spatialite` (or
        :func:`geoalchemy2.admin.dialects.sqlite.load_spatialite` if you also want to load the
        SpatiaLite drivers) with an hard-coded `init_mode` or just use a lambda::

            >>> sqlalchemy.event.listen(
            ...     engine,
            ...     "connect",
            ...     lambda x, y: init_spatialite(
            ...         x,
            ...         y,
            ...         transaction=True,
            ...         init_mode="EMPTY",
            ...         journal_mode="OFF",
            ...     )
            ... )
    z1The 'transaction' argument must be True or False.WGS84EMPTYNz+The 'init_mode' argument must be one of {}.'z.The 'journal_mode' argument must be one of {}.zSELECT CheckSpatialMetaData();r      zPRAGMA journal_modezPRAGMA journal_mode = {}zSELECT InitSpatialMetaData({});z, )
isinstanceboolint
ValueErrorappendstrupperformat_JOURNAL_MODE_VALUESexecutefetchonejoin)r   r$   r%   r&   r   	func_argsinit_mode_valuescurrent_journal_modes           r   init_spatialiter;   *   s   f I kD#;// +LMMM[))***  ))S!! &OO%%	,,,JQQRbccddd)Y)))*** ,$$ ,#))++333@GGH\]]   :;;DDFFqIAMM##-#5#56K#L#L#U#U#W#WXY#Z 9@@NNOOO<CCDIIiDXDXYYZZZ#9@@AUVVWWWWW NM $#r   c                 >    t          |            t          | fi | dS )a  Load SpatiaLite extension in SQLite DB and initialize internal tables.

    See :func:`geoalchemy2.admin.dialects.sqlite.load_spatialite_driver` and
    :func:`geoalchemy2.admin.dialects.sqlite.init_spatialite` functions for details about
    arguments.
    N)r   r;   r   r   kwargss      r   load_spatialiter?      s.     :&&&J))&)))))r   c                     |                      t          d                              ||                                                    }|d S |dd          S )NzSELECT * FROM "geometry_columns"
            WHERE LOWER(f_table_name) = LOWER(:table_name)
                AND LOWER(f_geometry_column) = LOWER(:column_name)
        )
table_namecolumn_name   )r5   r   
bindparamsr6   )bindrA   col_nameattrss       r   _get_spatialite_attrsrH      sb    LL	
 	

 *
*
A
A  hjj 
 }t9r   c                 v    |                      t          d                                                    d         S )z=Get the version of the currently loaded Spatialite extension.zSELECT spatialite_version();r   )r5   r   r6   rE   s    r   get_spatialite_versionrK      s.    <<;<<==FFHHKKr   c                 r    |D ]!}|j         |_        t                      |_         "| j        d         | _        dS )zGSetup dummy type for new Geometry columns so they can be updated later._saved_columnsN)type_actual_typer   infocolumns)tablegis_colscols      r   _setup_dummy_typerU      s=     $ $8!##J/0EMMMr   c                     | j         j        dk    rd}n7| j         j        dk    rd}n$| j         j                            d          rd}nd}|S )z!Get dimension of the column type.   XYZMrC   XYMXYMXYZ)rN   	dimensiongeometry_typeendswith)rT   r]   s     r   get_col_dimr`      s]    
xQ				q	 	 		8!**3// 	IIIr   c                     t          t          t          j        |j        |j                             }|                    d          }|                     |           dS )z)Create spatial index on the given column.T
autocommitN)r   r
   r   CreateSpatialIndexnameexecution_optionsr5   rE   rR   rT   stmts       r   create_spatial_indexri      sT    &t'>uz38'T'TUUVD!!T!22DLLr   c           
          t          t          t          j        |j        |j                             }|                     |                                          d         t          t          t          j        |j        |j                             }|                    d          }|                     |           |                     t          d
                    t          |j        |j                                                 dS dS )z#Disable spatial indexes if present.r   NTrb   zDROP TABLE IF EXISTS {};)r   r
   r   CheckSpatialIndexre   r5   r6   DisableSpatialIndexrf   r   r3   r   rg   s       r   disable_spatial_indexrm      s    &t'=ej#('S'STTUD||D""$$Q'3*4+CEJPSPX+Y+YZZ[%%%66T*11%
   		
 		
 		
 		
 		
	 43r   c           	         t          |                    d          t                    sdS t          | j        |j        |d                   }||\  }}}}t          |t                    rPt          |          }|dk    r|d         }	|	dv }
|	dv }ndx}
}d	d
ddddddd|d                  }|
r|dz  }|r|dz  }nEd|v rd|dd         vr|dz  }d|v rd|dd         vr|dz  }ddddd                    ||          }||d         _        ||d         _	        ||d         _
        t          |          |d         _        d|d         _        dS dS )z6Reflect a column of type Geometry with SQLite dialect.rN   Nre   i  r   )13)2rp   FGEOMETRYPOINT
LINESTRINGPOLYGON
MULTIPOINTMULTILINESTRINGMULTIPOLYGONGEOMETRYCOLLECTION)0ro   rq   rp   4567ZrZ   rC      rW   )rY   r\   r[   rX   )r,   getr   rH   rE   re   r.   r1   r^   r]   sridr-   spatial_index_spatial_index_reflected)	inspectorrR   column_infocol_attributesr^   coord_dimensionr   r   geometry_type_strfirst_digithas_zhas_ms               r   reflect_geometry_columnr      s    koof--x88 *9>5:{SYGZ[[N!>L;mmS))  	4 #M 2 2$$/2#z1#z1 %%!!&#)	 	  #	%M  %$ %$o%%#]2335G*G*G$o%%#]2335G*G*G$	 
 c/?33  -:F)(7F%#'F ,0,?,?F) 8=F444Y "!r   c                 "    t          | g|R i |S )zHEven handler to load spatial extension when a new connection is created.)r?   r=   s      r   connectr     s     :7777777r   c                    t          | |          \  }}}g | j        d<   t          | j                  }|D ]}| j        d         D ]}t	          |j        t          |          r||j                                        v rs| j        	                    |           |j
        t          | j
        |j
                  k    st          |j        dd          s | j        d                             |           t          | |           dS )z6Handle spatial indexes during the before_create event._after_create_indexesrM   r   FN)r   rP   setindexesr	   rN   r   rQ   valuesremovere   r   getattrr0   rU   )	rR   rE   kwdialectrS   regular_colscurrent_indexesidxrT   s	            r   before_creater     s   &7t&D&D#GX|
 +-EJ&'%-((O D D:./ 	D 	DC#CHh@@ DcS[M_M_MaMaFaFa$$S)))80SXFFFFgHouO OF J67>>sCCC	D eX&&&&&r   c                    |j         }| j                            d          | _        | j        D ]}t	          |j        t          |          r|j        |_        |`t          |          }| j	        |j	        |j        j
        |j        j        |g}t          t          t          j        |            }|                    d          }|                    |           | j        D ]C}t	          |j        t          t$          f|          r|j        j        du rt)          || |           D| j                            d          D ]2}| j                            |           |                    |           3dS )z5Handle spatial indexes during the after_create event.rM   Trb   r   rJ   N)r   rP   poprQ   r	   rN   r   rO   r`   re   r   r^   r   r
   r   RecoverGeometryColumnrf   r5   r   r   ri   r   addcreate)	rR   rE   r   r   rT   r]   r   rh   r   s	            r   after_creater   !  sk   lGJNN#344EM} 
 
sx7;; 	'CH #C((IJ#(-9OQZ[D.t/I4/PQQRD))T)::DLL} 3 3  8Y*?II	3&$.. uc222z~~566  #


 r   c                    t          | |          \  }}}|D ]n}t          || |           | j        |j        g}t          t	          t          j        |            }|                    d          }|                    |           odS )z4Handle spatial indexes during the before_drop event.Trb   N)	r   rm   re   r   r
   r   DiscardGeometryColumnrf   r5   )	rR   rE   r   r   rS   r   rT   r   rh   s	            r   before_dropr   @  s    &7t&D&D#GX|  dE3///
CH%*4+Et+LMMN%%%66T r   c                 D    | j                             d          | _        dS )z3Handle spatial indexes during the after_drop event.rM   N)rP   r   rQ   )rR   rE   r   s      r   
after_dropr   O  s    JNN#344EMMMr   GeomFromEWKTGeomFromEWKBAsBinaryAsEWKB	AsGeoJSON)ST_GeomFromEWKTST_GeomFromEWKBST_AsBinary	ST_AsEWKBST_AsGeoJSONc                 j    fd} t          t          t          |           d          |           d S )Nc                 R    d                      |j        | j        fi |          S )Nz{}({}))r3   processclauses)elementcompilerr   fns      r   _compile_sqlitez)_compiles_sqlite.<locals>._compile_sqlite`  s/    r#38#3GO#J#Jr#J#JKKKr   sqlite)r   r   r   )clsr   r   s    ` r   _compiles_sqliter   _  sM    L L L L L 0HWY$$h//@@@@@r   c                 Z    |                                  D ]\  }}t          ||           dS )a7  Register compilation mappings for the given functions.

    Args:
        mapping: Should have the following form::

                {
                    "function_name_1": "sqlite_function_name_1",
                    "function_name_2": "sqlite_function_name_2",
                    ...
                }
    N)itemsr   )mappingr   r   s      r   register_sqlite_mappingr   f  s<     ==?? " "Rb!!!!" "r   )-__doc__r   typingr   
sqlalchemyr   sqlalchemy.ext.compilerr   sqlalchemy.sqlr   r   geoalchemy2r   !geoalchemy2.admin.dialects.commonr	   r
   r   r   geoalchemy2.typesr   r   r   geoalchemy2.utilsr   r   r4   r-   r1   r;   r?   rH   rK   rU   r`   ri   rm   r   r   r   r   r   r   _SQLITE_FUNCTIONSr   r    r   r   <module>r      s   @ @ 				             , , , , , ,       ! ! ! ! ! ! ! ! ! ! ! ! A A A A A A A A A A A A ? ? ? ? ? ? ? ? ? ? ? ? ' ' ' ' ' ' & & & & & & , , , , , , < < < < < <, , ," QPP   4HIII #"&TX TX TX TX }	TX
 3-TX TX TX JITXn* * *  L L L
1 1 1    
 
 
&2= 2= 2=j8 8 8
' ' '*  >  5 5 5 &%  A A A" " "   ) * * * * *r   