
    njϺ                    2   S SK r S SKrS SKrS SKrS SKrS SKr S SKJrJr  Sr	S rS rS r " S S	\5      r " S
 S\5      r      SS jrS r\R(                  4S jr\S:X  a#  \R.                  " \" \R(                  5      5        gg! \
 a    Sr	 Nqf = f)    N)gdalogrTFc                 &    U R                  SS5      $ )N'''replace)literals    ]/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/osgeo_utils/samples/validate_gpkg.py_esc_literalr   1   s    ??3%%    c                 2    SU R                  SS5      -   S-   $ )N"z""r   )
identifiers    r   _esc_idr   5   s    ##C..44r   c                 l    U S;   =(       d)    U R                  S5      =(       d    U R                  S5      $ )N)BOOLEANTINYINTSMALLINT	MEDIUMINTINTINTEGERFLOATDOUBLEREALTEXTBLOBDATEDATETIMETEXT(BLOB()
startswith)typs    r   _is_valid_data_typer$   9   s:    
	
 	#  >>'"!	#" >>'"%r   c                       \ rS rSrSrg)GPKGCheckExceptionP    N)__name__
__module____qualname____firstlineno____static_attributes__r(   r   r   r&   r&   P   s    r   r&   c                       \ rS rSrSrSr     SS jrS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)GPKGCheckerT   )GEOMETRYPOINT
LINESTRINGPOLYGON
MULTIPOINTMULTILINESTRINGMULTIPOLYGONGEOMETRYCOLLECTION)CIRCULARSTRINGCOMPOUNDCURVECURVEPOLYGON
MULTICURVEMULTISURFACECURVESURFACEc                     Xl         S U l        SU l        SU l        X l        X0l        X@l        XPl        X`l        / U l	        / U l
        g NF)filenameconnhas_tried_spatialiteextended_pragma_infoabort_at_first_errorextra_checkslog_msgwarning_msgwarning_as_errorerrorswarnings)selfrB   rF   rG   rH   rI   rJ   s          r   __init__GPKGChecker.__init__j   sK     !	$)!$)!$8!(& 0r   c                 >    U R                   (       a  [        U5        g g )N)rH   printrM   msgs     r   _logGPKGChecker._log   s    <<#J r   c                     U(       dV  U =R                   X#4/-  sl         U R                  (       a.  U(       a  [        S[        U5      < SU< 35      e[        U5      eU$ )NReq : )rK   rF   r&   str)rM   condreqrS   s       r   _assertGPKGChecker._assert   sG    KKSJ<'K((,SXs-KLL,S11r   c                     U R                   (       a  U R                  SS U5        g U =R                  U/-  sl        U R                  (       a  [	        U5        g g rA   )rJ   r\   rL   rI   rQ   rR   s     r   _warnGPKGChecker._warn   s@      LLc*MMcU"Mc
  r   c                    U R                  [        U5      [        U5      :H  USU[        U5      [        U5      4-  5        U GH  u  nnnnn	n
SnU H  u  p\pnnX:w  a  M  SU;   a	  U
(       a  SnUS:X  a	  U(       a  SnU R                  (       d  U
S:  a  Sn
U R                  X;   USU< SU< S[        U5      < SU< 35        U R                  X:H  US	U< SU< SU< SU< 35        U R                  X:H  US
U< SU< SU	< SU< 35        U R                  UU
:H  USU< SU< SU
< SU< 35        Sn  O   U R                  XSU< SU< S35        GM     g )Nz0Table %s has %d columns, whereas %d are expectedFr      zWrong type for  of z. Expected z, got zWrong notnull for zWrong default for zWrong pk for TColumn z not found!)r\   lenrE   rY   )rM   columnsexpected_columnsr[   
table_name_expected_nameexpected_typeexpected_notnullexpected_defaultexpected_pkfoundnamer#   notnulldefaultpks                    r   _check_structureGPKGChecker._check_structure   s{   LC 011>3w<-=)>?@	
 
E8?4#(-+'($)#G00[1_"#K(Z]);SB /Z)97D /Z)97D +%Zb: I 9@L LLsM:VQ r   c                 	   U R                  S5        UR                  S5        U R                  UR                  5       S LSS5      (       d  g UR                  S5        UR	                  5       nSnSnU H  u  pV      nUS:X  a  SnUS	:X  d  M  SnM     UR                  S
5        S nUR                  5       b!  UR                  S5        UR                  5       nU(       aS  Uu  pU R                  US:H  SSU	 S35        U R                  USSU	 S35        U(       a  U R                  U	S:H  SS5        O0U R                  U(       + SS5        U R                  U(       + SS5        U(       aY  / SQn
U(       a  U
S/-  n
U VVs/ s H  o Vs/ s H  oPM     snPM     nnnU H  nUS   S;   d  M  US   S:X  d  M  S US'   M      O/ SQn
U R                  X*SS5        U(       a  UR                  S5        OUR                  S5        UR	                  5       nU R                  [        U5      S:H  S S!5        [        U5      S:w  a  g U R                  US"   S   S#:H  S S$US"   S   -  5        U R                  US"   S%   S&:H  S S'US"   S%   -  5        U R                  US"   S   S(:H  S S)US"   S   -  5        U(       a(  U R                  US"   S   S(:H  S*S+S,US"   S   -  -   5        U R                  US   S   S#:H  S S-US   S   -  5        U R                  US   S%   S":H  S S.US   S%   -  5        U R                  US   S   S(:H  S S/US   S   -  5        U(       a(  U R                  US   S   S(:H  S*S+S0US   S   -  -   5        U R                  US%   S   R                  5       S1:H  S S2US%   S   -  5        U R                  US%   S%   S3:H  S S4US%   S%   -  5        U R                  US%   S   S(:g  S S5US%   S   -  5        U(       a(  U R                  US%   S   S(:g  S*S+S6US%   S   -  -   5        U(       aF  UR                  S75        UR	                  5       nU H  u  nU R                  SS8S9U-  S:-   5        M      g g s  snf s  snnf );NzChecking gpkg_spatial_ref_sysz?SELECT 1 FROM sqlite_master WHERE name = 'gpkg_spatial_ref_sys'
   z"gpkg_spatial_ref_sys table missingz'PRAGMA table_info(gpkg_spatial_ref_sys)Fdefinition_12_063Tepoch:SELECT 1 FROM sqlite_master WHERE name = 'gpkg_extensions'znSELECT scope, extension_name FROM gpkg_extensions WHERE extension_name IN ('gpkg_crs_wkt', 'gpkg_crs_wkt_1_1')
read-write   z	scope of z extension should be read-writez@gpkg_spatial_ref_sys should have a definition_12_063 column, as z extension is declaredgpkg_crs_wkt_1_1zdgpkg_extensions should declare gpkg_crs_wkt_1_1 extension as gpkg_spatial_ref_sys has a epoch columnzlgpkg_extensions should declare gpkg_crs_wkt extension as gpkg_spatial_ref_sys has a definition_12_063 column)r   srs_namer   rb   Nr   rb   srs_idr   rb   Nrb      organizationr   rb   Nr      organization_coordsys_idr   rb   Nr      
definitionr   rb   Nr      descriptionr   r   Nr   )   rx   r   rb   Nr   )   ry   r   r   Nr   rb   )r   rx   r   r   )r~   r   r   r   r   r   gpkg_spatial_ref_syszSELECT srs_id, organization, organization_coordsys_id, definition, definition_12_063 FROM gpkg_spatial_ref_sys WHERE srs_id IN (-1, 0, 4326) ORDER BY srs_idzSELECT srs_id, organization, organization_coordsys_id, definition FROM gpkg_spatial_ref_sys WHERE srs_id IN (-1, 0, 4326) ORDER BY srs_idr      z:There should be at least 3 records in gpkg_spatial_ref_sysr   NONEz0wrong value for organization for srs_id = -1: %sr   z<wrong value for organization_coordsys_id for srs_id = -1: %s	undefinedz.wrong value for definition for srs_id = -1: %st   z&wrong value for definition_12_063 for zsrs_id = -1: %sz/wrong value for organization for srs_id = 0: %sz;wrong value for organization_coordsys_id for srs_id = 0: %sz-wrong value for definition for srs_id = 0: %szsrs_id = 0: %sepsgz2wrong value for organization for srs_id = 4326: %si  z>wrong value for organization_coordsys_id for srs_id = 4326: %sz0wrong value for definition for srs_id = 4326: %szsrs_id = 4326: %szSELECT srs_id FROM gpkg_spatial_ref_sys WHERE srs_id NOT IN (0, -1) AND definition = 'undefined' AND definition_12_063 = 'undefined'u   z$srs_id = %d has both definition and zdefinition_12_063 undefined)rT   executer\   fetchonefetchallrt   re   lower)rM   crf   has_definition_12_063	has_epochri   rp   rowscopeextension_namerg   columnvretrowsr   s                   r   _check_gpkg_spatial_ref_sys'GPKGChecker._check_gpkg_spatial_ref_sys   s[   		12			VW||JJL$b*N
 
 			;<**, %	%,!QaAq**(,%w 		 &- 	
		NO::<#III **,C$'!ELL%N++JK
 LL%$%%;= "&88A LL))I LL= !   %G$HH  :AAv6*6a6*GA!1I!DDq	T) $F1I "  	g=ST II@ II@
 jjlHMK	

 s8q=F1I>QJ	

 	F1IO #Aq	*	
 	F1I$<s1vayH	

 !LLAq	[(8#c!fQi/0 	F1I=Aq	I	

 	F1IN"1vay)	
 	F1I$;c!fQiG	

 !LLAq	[(8;KcRSfUVi;WW 	F1IOO'@3q6!9L	

 	F1I "%a&),	
 	F1I$>QJ	

 !LLAq	[(8%Aq	12 !II2 ::<D!	:VC34 " !] +As   >	Q<Q7Q<7Q<c                 z   U R                  S5        UR                  S5        U R                  UR                  5       S LSS5        UR                  S5        UR	                  5       n/ SQnU R                  X#SS5        UR                  S5        UR	                  5       nU R                  [        U5      S	:H  S
S[        U5      -  5        UR                  S5        UR	                  5       nU H  u  pgnUR                  SU45        U R                  UR                  5       S LSSU-  5         [        R                  R                  US5        Uc  Me  UR                  SU45        U R                  UR                  5       S LSSXh4-  5        M     g ! [         a    U R                  SSSU< SU< S35         Nlf = f)NzChecking gpkg_contentsz8SELECT 1 FROM sqlite_master WHERE name = 'gpkg_contents'   zgpkg_contents table missingz PRAGMA table_info(gpkg_contents))
r   rh   r   rb   Nrb   )rb   	data_typer   rb   Nr   )r   r   r   r   Nr   )r   r   r   r   r   r   )r   last_changer   rb   $strftime('%Y-%m-%dT%H:%M:%fZ','now')r   )r   min_xr   r   Nr   )r   min_yr   r   Nr   )r   max_xr   r   Nr   )   max_yr   r   Nr   )	   r   r   r   Nr   gpkg_contentszSELECT table_name, data_type FROM gpkg_contents WHERE data_type NOT IN ('features', 'tiles', 'attributes', '2d-gridded-coverage')r      z*Unexpected data types in gpkg_contents: %sz9SELECT table_name, last_change, srs_id FROM gpkg_contentszVSELECT 1 FROM sqlite_master WHERE lower(name) = lower(?) AND type IN ('table', 'view')   z5table_name=%s in gpkg_contents is not a table or view%Y-%m-%dT%H:%M:%S.%fZF   zlast_change = z for table_name = z is invalid datetime3SELECT 1 FROM gpkg_spatial_ref_sys WHERE srs_id = ?zVtable_name=%s has srs_id=%d in gpkg_contents which isn't found in gpkg_spatial_ref_sys)rT   r   r\   r   r   rt   re   rY   datetimestrptime
ValueError)	rM   r   rf   rg   r   r   rh   r   r   s	            r   _check_gpkg_contents GPKGChecker._check_gpkg_contents  s   		*+			LMQZZ\-r3PQ			45**,
& 	g_M			I	

 jjlHM83s8C	
 	
		MNzz|15-ZfIIG
 LL

D(M!!**;8OP !		Lvi JJL,F "*	+7 26  "J0s   - F&F:9F:c                    U R                   (       d  U R                  S5        g U R                  S5        U Vs/ s H  nSPM     nnUR                  SSR                  S U 5       5      < S[	        U5      < 35        [
        R                  [
        R                  -   nSn[        R                  " U5      n[        R                  " US	-   5      n	[        R                  " US
-   5      n
[        R                  " US-   5      nUR                  5        GHF  n[        [        U5      5       GH)  nX]   (       a  M  USU-  S-      nUSU-  S-      R                  5       nUSU-  S-      nUc  MC  X=   S   nX=   S   nUS:X  a*  US:X  a$  US;  a  SX]'   U R                  SUU4-  5        M  M  US:X  a0  US:X  a*  US:  d  US:  a  SX]'   U R                  SUU4-  5        M  M  US:X  a0  US:X  a*  US:  d  US:  a  SX]'   U R                  SUU4-  5        M  M  US:X  a2  US:X  a,  US:  d  US:  a  SX]'   U R                  S UU4-  5        GM"  GM%  US!;   a	  US:X  a  GM4  US";   a	  US#:X  a  GMC  UR                  S$5      (       ai  US%:w  a%  SX]'   U R                  S&U< S'U< S(U< S)35        GM  [!        U[        S$5      S* 5      nUU:  a  SX]'   U R                  S+UUU4-  5        GM  GM  UR                  S,5      (       ai  US-:w  a%  SX]'   U R                  S&U< S'U< S(U< S)35        GM  [!        U[        S,5      S* 5      nUU:  a  SX]'   U R                  S.UUU4-  5        GM>  GMA  US-:X  a	  UU;   a  GMP  US/:X  a<  US%:X  a6  UR#                  U5      c!  SX]'   U R                  S&U< S0U< S135        GM  GM  US2:X  af  US%:X  a`  UR#                  U5      cK  U
R#                  U5      c6  U	R#                  U5      c!  SX]'   U R                  S&U< S0U< S335        GM  GM  GM  GM  UU:w  d  GM  SX]'   U R                  S&U< S'U< S(U< S)35        GM,     GMI     g s  snf )4Nz'Skipping checks on actual table contentzChecking actual table contentFSELECT ,c           	   3      #    U  H7  n[        US    5      < S[        US    5      < S[        US    5      < S3v   M9     g7f)rb   z,typeof(z	),length()N)r   ).0cols     r   	<genexpr>8GPKGChecker._check_user_table_content.<locals>.<genexpr>  s=      
  $ #3q6?GCFOWSV_N  $s   ?A FROM z[0-9]{4}-[0-1][0-9]-[0-3][0-9]zT[0-2][0-9]:[0-5][0-9]Zz"T[0-2][0-9]:[0-5][0-9]:[0-5][0-9]Zz+T[0-2][0-9]:[0-5][0-9]:[0-5][0-9].[0-9]{3}Zr   r   rb   r   r   r   )r   rb   Tz8In column %s, value %d found whereas 0 or 1 was expectedr   i   zHIn column %s, value %d found whereas it was expected to be in [-128,127]r   i i  zLIn column %s, value %d found whereas it was expected to be in [-32768,32767]r   i   izVIn column %s, value %d found whereas it was expected to be in [-2147483648,2147483647])r   r   )r   r   r   r   r    r   z
In column z, content of type z found whereas  was expectedr   zCIn column %s, string of length %d found whereas %d max was expectedr!   r   zAIn column %s, blob of length %d found whereas %d max was expectedr   z, text z  found which is not a valid DATEr   z$ found which is not a valid DATETIME)rG   rT   r   joinr   r/   BASE_GEOM_TYPESEXT_GEOM_TYPESrecompiler   rangere   upperr_   r"   intmatch)rM   r   rh   colsr   
warned_col
geom_typesdate_pattern_strdate_patterndatetime_pattern_no_seconds#datetime_pattern_with_seconds_no_ms"datetime_pattern_with_millisecondsr   ivalgot_col_typelength_valueexpected_col_typecol_nameexpected_max_lengths                       r   _check_user_table_content%GPKGChecker._check_user_table_content  s     II?@		12'+,tet
,			  
  $  
#
	
 !00;3M3MM
;zz"23&(jj88'
# /1jjCC/
+ .0ZZLL.
* ::<C3t9%=!a%!)n"1q519~335"1q519~;$(GAJ!71:$	1li6O&((,


V'o. !&)3	8QTzS3Y(,


f'o. !&*49RV|sU{(,


j'o. !&+5,):S[(C*,<(,


t'o. ! &);;$	1 &)DD$.&11'::#v-(,


'7HJ !*-.?Gr.R*S'#&99(,


a'7JKL ! : '11'::#v-(,


'7HJ !*-.?Gr.R*S'#&99(,


_'7JKL ! : "V+0AZ0O&&0\V5K#))#.6(,


'. ! 7 '*49O:@@EM?EEcJR7==cBJ(,


'. ! K S N ',6$(JMJJ#\3DF G &  5 -s   Qc                 <   U R                  SU-   5        UR                  SU45        UR                  5       nU R                  [	        U5      S:H  SSU-  5        US   S   nUS   S   nUS   S   nUS   S   nUS   S	   nUR                  S
U45        UR                  5       S Ln	Sn
U	(       aH  UR                  S5        UR                  5       b&  UR                  SX$45        UR                  5       b  Sn
 UR                  S[        U5      -  5        UR                  5       nSnSnS nU H  u  nnnnnnUR                  5       UR                  5       :X  av  SnU
(       dk  U R                  U[         R"                  ;   =(       d    U[         R$                  ;   SSU< SU< 35        U R                  UU:H  SSU< SU< SU< S35        M  M  US:X  a+  Uc  UnUS-  nU R                  US:H  SSU< S U< S!35        M  U R                  ['        U5      S"SU< S#U< S$U< 35        M     U R                  US%SU< S&U< S'35        UR                  S(U45        UR                  5       (       a,  U R                  US:H  SS)U-  5        U R)                  XU5        OU R                  [	        U5      S:  =(       a    US   S   S:H  S*S+U-  5        UR                  S,[        US   S   5      < S-[        U5      < 35        U R                  UR                  5       S   S:H  S*S.U-  5        U R                  US/;   S0S1X%4-  5        U R                  US/;   S0S2X&4-  5        U[         R$                  ;   aA  UR                  S3U-  X$45        U R                  UR                  5       S LS4S5U< S6U< 35        [         R"                  [         R$                  -   nUR                  S7U(       a  [        U5      OS8< S9[        U5      < S:[        U5      < S;35        [+        5       n[+        5       nUR                  5        GH  u  nnUc  M  U R                  [	        U5      S<:  S=S>5        [-        [	        U5      S?5      n[.        R0                  " S@U-  USU 5      nU R                  US   [3        SA5      :H  S=S>5        U R                  US   [3        SB5      :H  S=S>5        U R                  US   S:H  S=S>5        US   n U S-	  S-  S:H  n!U S-  S:H  n"U S-	  SC-  n#U R                  U S"-	  S-  S:H  S=SD5        U R                  U#S	:*  S=SE5        U"(       a  SFOSGn$[.        R0                  " U$SH-   S-  US	S< 5      S   n%UU%:w  a2  SIUU%U4-  n&U&U;  a$  UR5                  U&5        U R                  SSJU&5        U R                  U!=(       a    U#S:g  (       + SKSL5        U#S:X  a  Sn'OU#S:X  a  Sn'OU#S:X  d  U#S:X  a  Sn'OS	n'S<U'S-  S<-  -   n(U R                  [	        U5      U(:  S=S>5        UU(   n)U)S:H  n*U*(       a  SFOSGn+[.        R0                  " U+SM-   S-  UU(S-   U(S"-    5      S   n,U R                  U,S:  =(       a    U,SN-  [	        U5      :  S=SO5        [7        U,SN-  5      n-US:X  a"  U R                  U-S:H  =(       d    U-S:H  S=SP5        US:X  a"  U R                  U-S:H  =(       d    U-S:H  S=SQ5        U-S:X  d  U-S:X  a  U R                  US:  S=SR5        U-S:X  d  U-S:X  a  U R                  US:  S=SS5        UR5                  UU,SN-     5        [8        (       d  GM  [:        R<                  " UU(S  5      n.U R                  U.S LS=STU SUU 35        U.c  GMP  U R                  U.R?                  5       =(       a    U!=(       d#    U.R?                  5       (       + =(       a    U!(       + SKSV5        GM     USW;   aF  U R                  U(       + =(       d    U[+        U/5      :H  SXSYU< SZ[A        U5      < S[U< S\35        GOUS]:X  aS  U R                  U(       + =(       d!    URC                  [+        / S^Q5      5      (       + SXSYU< SZ[A        U5      < 35        GO`US_;   aS  U R                  U(       + =(       d!    URC                  [+        S`Sa/5      5      (       + SXSYU< SZ[A        U5      < 35        GOUSb:X  aR  U R                  U(       + =(       d!    URC                  [+        ScSb/5      5      (       + SXSYU< SZ[A        U5      < 35        OUSd:X  aR  U R                  U(       + =(       d!    URC                  [+        SeSd/5      5      (       + SXSYU< SZ[A        U5      < 35        OWUSf:X  aQ  U R                  U(       + =(       d!    URC                  [+        / SgQ5      5      (       + SXSYU< SZ[A        U5      < 35        U HZ  n/U/[         R$                  ;   d  M  UR                  S3U/-  X$45        U R                  UR                  5       S LS4S5U/< S6U< 35        M\     ShU< SiU< 3n0UR                  SjU045        UR                  5       S Ln1U1(       Ga  UR                  SkX$45        U R                  UR                  5       S LSlSmU-  5        UR                  S[        U05      -  5        UR                  5       n2SSnSoSp/SS S4SSq/ SrQSS S4SSs/ SrQSS S4SSt/ SrQSS S4S	Su/ SrQSS S4/n3U RE                  U2U3S?U05        UR                  SvSw[G        U05      -  -   5        U R                  UR                  5       S LSxSyU0-  5        U RH                  Sz:  a  S{n4OS|n4UR                  S}S~[G        U05      -  -   5        UR                  5       n5[+        5       n6U5 H^  u  n[7        U[	        [G        U05      5      [	        S5      -   S  5      n7U7U4;  a  U R                  SSxU S35        U6R5                  U75        M`     U4 H  n8U R                  U8U6;   SxSU0U84-  5        M      UR                  SvS[G        U05      -  -   5        U R                  UR                  5       S LSxSU0-  5        g g ! [        R                   Gaw  nU R                  (       GdZ  SU l	        Sn U R                  R                  S5        U R                  R                  S5        SnO! [         a     Of = fU(       d  UeUR                  S5        UR                  5       S   S:X  a  [        R                  " S5      nUR                  S5        UR                  S5        UR                  5       nUR                  S5         UR                  S5        OM! [        R                   a6    UR                  S5        UR                  S5        UR                  S5         Of = fUR                  S[        U5      -  5         S nAGN S nAff = f)NzChecking vector user table zdSELECT column_name, z, m, geometry_type_name, srs_id FROM gpkg_geometry_columns WHERE table_name = ?rb      z:table_name = %s is not registered in gpkg_geometry_columnsr   r   r   r   z<SELECT 1 FROM sqlite_master WHERE name = ? and type = 'view'Frz   zSELECT 1 FROM gpkg_extensions WHERE table_name = ? AND column_name = ? AND extension_name = 'gdal_spatialite_computed_geom_column'TPRAGMA table_info(%s)z'SELECT load_extension("mod_spatialite")zSELECT CountUnsafeTriggers():memory:z&CREATE VIEW v AS SELECT ST_Multi(NULL)zSELECT * FROM vzPRAGMA trusted_schema = ON   zinvalid type (z) for geometry column of table    table z has geometry column of type z in SQL and z/ in geometry_type_name of gpkg_geometry_columnsr       has a PRIMARY KEY of type  instead of INTEGERr    has column  of unexpected type    z has no  column=SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?#table %s has no INTEGER PRIMARY KEY   #view %s has no INTEGER first column!SELECT COUNT(*) - COUNT(DISTINCT ) FROM 4First column of view %s should contain unique values)r   rb   r      z'z value of %s is %d. Expected 0, 1 or 2z'm value of %s is %d. Expected 0, 1 or 2zSELECT 1 FROM gpkg_extensions WHERE extension_name = 'gpkg_geom_%s' AND table_name = ? AND column_name = ? AND scope = 'read-write'D   
gpkg_geom_z( extension should be declared for table r   r   z, r    r      zInvalid geometryM   BGPr   z6Invalid geometry: ExtendedGeoPackageBinary not allowedz1Invalid geometry: invalid envelope indicator code><r   zAtable %s has geometries with SRID %d, whereas only %d is expected!      zInvalid empty geometryIi  zInvalid WKB geometry typezgeometry without Z foundzgeometry without M foundz5z found in geometry, but not in gpkg_geometry_columnsz5m found in geometry, but not in gpkg_geometry_columnszInvalid geometry for fid 
 of table z+Inconsistent empty_flag vs geometry content)r2   r3   r4   r5   r6   r7       z	in table z, found geometry types z	 whereas r   r8   )r8   r5   r6   r7   r<   r=   )r;   r?   r4   r;   r<   r6   r=   r7   r>   )r3   r9   r:   rtree_ri   *SELECT 1 FROM sqlite_master WHERE name = ?zSELECT 1 FROM gpkg_extensions WHERE extension_name = 'gpkg_rtree_index' AND table_name=? AND column_name=? AND scope='write-only'N   z9Table %s has a RTree, but not declared in gpkg_extensionsid r   minx)r  NUMr   maxxminymaxyz3SELECT 1 FROM sqlite_master WHERE type = 'trigger' zAND name = '%s_insert'K   z%s_insert trigger missing)rb   r   )rb   r   r   r   )r   r   r   r   r   z6SELECT name FROM sqlite_master WHERE type = 'trigger' zAND name LIKE '%s_update%%'_updatez trigger unexpectedz%s_update%d trigger missingzAND name = '%s_delete'z%s_delete trigger missing)%rT   r   r   r\   re   r   r   sqlite3OperationalErrorrD   rC   enable_load_extension	Exceptionconnectcursorr   r/   r   r   r$   r   setminstructunpackordaddr   has_gdalr   CreateGeometryFromWkbIsEmptyrY   
differencert   r   version)9rM   r   rh   rows_gpkg_geometry_columnsgeom_column_namezmgeometry_type_namer   is_viewis_spatialite_computed_columnespatialite_loaded	temp_conntemp_cr   
found_geom
count_pkidpkid_column_nameri   rp   r#   rq   rr   rs   wkb_geometriesfound_geom_typeswarning_messagesrowidblobmax_size_neededblob_arflags
empty_flag
big_endianenv_indendian_prefixgeom_srs_idrI   	coord_dim
header_lenwkb_endiannesswkb_big_endianwkb_endian_prefixwkb_geom_typewkb_dimgeom	geom_type
rtree_name	has_rtreerf   rg    expected_update_triggers_numberstrigger_namesfound_numbersnumberexpected_numbers9                                                            r   _check_vector_user_table$GPKGChecker._check_vector_user_table  s   		/*<=			>M	

 &'ZZ\"*+q0N	
 6a8;&q)!,&q)!,7:1=+A.q1			JM	
 **,d*(-%IIRSzz|'		 Y2 ::<+481	III-
0CCD@ zz|

480Qc7GRzz|/5577!
4LL{::: =+"<"<<
,	 LL11 &s,>@	 5& q#+'+$a
9$!3( ', &tS2	E 59T 	:GWX	
 	
		NM	
 ::<<LLa%JZ%W **1$? LLD	A9$q'!*	"95
B II471:&
(;= LL

Q1$IJV 	N;
N	
 	N;
N	
 !;!;;II' *<< . LL

D(0*> %44{7Q7QQ			 .>()2E()
#		
 55ZZ\MUD|LLTa-?@!#d)->?OmmC/$94/;RSGLLs3x/5GHLLs3x/5GHLLq".@AAJE A:*q0J!))JzQ&GLL1*!a'K
 LL1b"U $.C3M --)<(A4!9MaPK$4f56 &66$((5LLK8LL0GqL138P !|	A	AA		 Y]Q..JLLTj0"6HI$Z0N+q0N'53"MM"S(A-tJNZRS^/TM LL"S(<N@S'S+ -$./GAvqL0GqL"6P AvqL0GqL"6P !|w!|EN
 !|w!|EN   0D!EFx00jk1BC$/wnZLQ #LL6J C $.Az>E	I *V  "
 
 LL$$U(8CAS@T<U(Us#346HJ  #77LL$$ '22	  s#346$  #>>LL$$ U'223	>7R3STTs#346	  </LL$$ '22*L9:  s#346  >1LL$$ '2289  s#346  7*LL$$ '22IJ  s#346 *IK666		+ .77  2 JJL,"+Z9 *  '12BC
			>NJJL,	II% . LL

D(Q II-
0CCDjjlGD2u+q$2F/D!<F/D!<F/D!<F/D!<  !!'+;RLIIE*\*-EEF LL

D(".IJ.V ||f$3?03B0II&/<
3KLM
 JJLMEM(T#l:&>"?#i."P"RST!AALLtf4G,HI!!&)	 )
 $D#}41Z4QQ $D IIE*\*-EEF LL

D(".IJ.V} u
 '' 	I,,,,0)$)!II33D9II%%&OP(,%  (G 		89::<?a' '
 ;I33D9%%&OP&--/FNN#KL@'89"33 @'CD'89		">?	@ 		1GJ4GGH;	Isb   9r x$x 8s98x9
txtBxv&%x&Aw0-x/w00 xxc           	         U R                  S5        UR                  S5        UR                  5       c  U R                  S5        g U R                  S5        UR                  S5        U R                  UR                  5       S LSS5        UR                  S5        UR	                  5       n/ S	QnU R                  X#SS
5        UR                  S5        UR	                  5       nU H  u  nU R                  X5        M     UR                  S5        UR	                  5       nU H  u  pVUR                  SU45        UR	                  5       nU R                  [        U5      S:H  SSU-  5        UR                  SU45        U R                  UR                  5       S LSSXV4-  5        M     UR                  S5        UR	                  5       nU H  u  pXn	U R                  SSSXXU	4-  5        M      g )NzChecking featuresz8SELECT 1 FROM gpkg_contents WHERE data_type = 'features'z... No features tablezChecking gpkg_geometry_columnsz@SELECT 1 FROM sqlite_master WHERE name = 'gpkg_geometry_columns'   z#gpkg_geometry_columns table missingz(PRAGMA table_info(gpkg_geometry_columns))r   rb   column_namer   rb   Nr   )r   r+  r   rb   Nr   )r   r   r   rb   Nr   )r   r)  r   rb   Nr   )r   r*  r   rb   Nr   gpkg_geometry_columnszASELECT table_name FROM gpkg_contents WHERE data_type = 'features'z4SELECT table_name, srs_id FROM gpkg_geometry_columnszISELECT 1 FROM gpkg_contents WHERE table_name = ? AND data_type='features'rb      zPtable_name = %s is registered in gpkg_geometry_columns, but not in gpkg_contentsr   r   z^table_name=%s has srs_id=%d in gpkg_geometry_columns which isn't found in gpkg_spatial_ref_syszSELECT a.table_name, a.srs_id, b.srs_id FROM gpkg_geometry_columns a, gpkg_contents b WHERE a.table_name = b.table_name AND a.srs_id != b.srs_idF   zTTable %s is declared with srs_id %d in gpkg_geometry_columns and %d in gpkg_contents)rT   r   r   r\   r   rt   rR  re   )
rM   r   rf   rg   r   rh   r   r   a_srs_idb_srs_ids
             r   _check_featuresGPKGChecker._check_featuresZ  s   		%&			LM::<II-.		23			WXJJL$b*O	
 	
		<=**,
 	g=TU			R	
 zz|!MZ))!8 " 	
		HIzz|$( ZII-
 **,CLLCAH 	 IIJVI LL

D(- &'	) %)> 	
		K	

 zz|04,Z8LL@23 15r   c                    U R                  SU-   5        UR                  S[        U5      -  5        UR                  5       nSnU H\  u  pVn  pXUS:X  a&  US-  nU R	                  US:H  SSU< SU< S	35        M4  U R	                  [        U5      S
SU< SU< SU< 35        M^     UR                  SU45        UR                  5       (       a,  U R	                  US:H  SSU-  5        U R                  XU5        g U R	                  [        U5      S:  =(       a    US   S   S:H  SSU-  5        UR                  S[        US   S   5      < S[        U5      < 35        U R	                  UR                  5       S   S:H  SSU-  5        g )NzChecking attributes table r   r   rb   r   w   r   r   r   r   r   r   r   r   r      r   r   r   r   )	rT   r   r   r   r\   r$   r   r   re   )	rM   r   rh   r   r3  ri   rp   r#   rs   s	            r   _check_attribute_user_table'GPKGChecker._check_attribute_user_table  s   		.;<			)GJ,??@zz|
(,$Qc1aQwa
9$!3( ',!4. )-$ 	
		NM	
 ::<<LLa&Kj&X **1$? LLD	A9$q'!*	"95
B II471:&
(;= LL

Q1$IJVr   c                     U R                  S5        UR                  S5        UR                  5       nU(       d  U R                  S5        U H  u  nU R                  X5        M     g )NzChecking attributeszCSELECT table_name FROM gpkg_contents WHERE data_type = 'attributes'z... No attributes table)rT   r   r   rb  )rM   r   r   rh   s       r   _check_attributesGPKGChecker._check_attributes  sU    		'(			T	
 zz|II/0!MZ,,Q; "r   c           	         U R                  SU-   5        UR                  S[        U5      -  5        UR                  5       n/ SQnU R	                  XESS5        UR                  S[        U5      -  5        UR                  5       nU H?  u  nUR                  SX'45        U R                  UR                  5       S LSS	X'4-  5        MA     S
nUR                  S5        UR                  5       bB  UR                  SU45        UR                  5       n	U	b  U	u  n
U R                  U
S:H  SS5        SnUR                  SU45        UR                  5       nS nS nS nU H  u  p~nUb#  U R                  X:  =(       a    X:  SSU-  5        Ubm  X{S-   :X  ae  U(       d^  U R                  [        XS-  -
  U-  5      S:  SSUS-  X~4-  5        U R                  [        XS-  -
  U-  5      S:  SSUS-  X4-  5        UnUnUnM     UR                  SU45        UR                  5       nU(       a  US   u  nnnnnnU R                  [        UU-
  U-  5      S:  =(       aJ    [        UU-
  U-  5      S:  =(       a/    [        UU-
  U-  5      S:  =(       a    [        UU-
  U-  5      S:  SSU-  5        UR                  S[        U5      -  5        UR                  5       nU H  u  nUR                  S[        U5      U4-  5        UR                  5       u  nnnnUR                  S X'45        UR                  5       nU(       d  U R                  S
S!S"U-  5        M{  US   u  nnU R                  US:  =(       a    UU:  S#S$U-  5        U R                  US:  =(       a    UU:  S%S&U-  5        M     UR                  S'[        U5      -  5        S
nUR                  5        GHe  u  nU R                  US L=(       a    [        U5      S(:  S)S*5        S(n[        R                  " S+U-  USU 5      n U SS, S-:H  n!U SS. S/:H  n"U SS. [        S05      [        S15      [        S25      [        S25      4:H  =(       a0    U S3S( [        S45      [        S55      [        S+5      [        S65      4:H  n#U SS. S7:H  =(       d    U SS. S8:H  n$U R                  U!=(       d    U"=(       d    U#=(       d    U$S9S:5        US;:X  a&  U R                  U!=(       d    U"=(       d    U#S9S:5        O"US<:X  a  U R                  U"=(       d    U$S9S:5        U#(       d  GMc  SnGMh     U(       a:  UR                  S=U45        U R                  UR                  5       S LS>S?U-  5        g g )@Nz!Checking tile pyramid user table r   )r   r  r   r   Nrb   )rb   
zoom_levelr   rb   Nr   )r   tile_columnr   rb   Nr   )r   tile_rowr   rb   Nr   )r   	tile_datar   rb   Nr   6   gpkg_tile_matrix_setz"SELECT DISTINCT zoom_level FROM %szFSELECT 1 FROM gpkg_tile_matrix WHERE table_name = ? AND zoom_level = ?,   zSTable %s has data for zoom_level = %d, but no corresponding row in gpkg_tile_matrixFrz   zcSELECT column_name FROM gpkg_extensions WHERE table_name = ? AND extension_name = 'gpkg_zoom_other'rl  X   z8Wrong column_name in gpkg_extensions for gpkg_zoom_otherTzlSELECT zoom_level, pixel_x_size, pixel_y_size FROM gpkg_tile_matrix WHERE table_name = ? ORDER BY zoom_level5   z;For table %s, pixel size are not consistent with zoom_levelrb   r   gh㈵>#   z2Expected pixel_x_size=%f for zoom_level=%d. Got %fz2Expected pixel_y_size=%f for zoom_level=%d. Got %faw  SELECT max_x - min_x,        MIN(matrix_width * tile_width * pixel_x_size),        MAX(matrix_width * tile_width * pixel_x_size),        max_y - min_y,        MIN(matrix_height * tile_height * pixel_y_size),        MAX(matrix_height * tile_height * pixel_y_size) FROM gpkg_tile_matrix tm JOIN gpkg_tile_matrix_set tms ON tm.table_name = tms.table_name WHERE tm.table_name = ?r   gMbP?-   zMInconsistent values in gpkg_tile_matrix and gpkg_tile_matrix_set for table %szeSELECT MIN(tile_column), MAX(tile_column), MIN(tile_row), MAX(tile_row) FROM %s WHERE zoom_level = %dz`SELECT matrix_width, matrix_height FROM gpkg_tile_matrix WHERE table_name = ? AND zoom_level = ?7   zInvalid zoom_level in %s8   zInvalid tile_col in %s9   zInvalid tile_row in %szSELECT tile_data FROM %s   r   Invalid blobr   r   )      ry  r      r'   r  G   Rr  Fr   WEr  I   r  *   r   r   r   r   r  $   zUnrecognized image mime typetilesz2d-gridded-coveragezSELECT 1 FROM gpkg_extensions WHERE table_name = ? AND column_name = 'tile_data' AND extension_name = 'gpkg_webp' AND scope = 'read-write'[   z@Table %s has webp content, but not registered in gpkg_extensions)rT   r   r   r   rt   r\   r   absre   r  r  r   )%rM   r   rh   r   rf   rg   r   ri  zoom_other_levelsr   rW  prev_zoom_levelprev_pixel_x_sizeprev_pixel_y_sizepixel_x_sizepixel_y_sizedxmin_dxmax_dxdymin_dymax_dymin_colmax_colmin_rowmax_rowrows2matrix_widthmatrix_height
found_webpr9  r:  r;  is_jpegis_pngis_webpis_tiffs%                                        r   _check_tile_user_table"GPKGChecker._check_tile_user_table  s$   		5
BC			)GJ,??@**,
 	g=ST			69LLMzz|!MZII%(
 LL

D(> *	+ "  "			NO::<#II9 	 **,C!$;.Q
 %)!			7 M		
 zz|  8<4Z| , 4 9$8W !	  +A"55)A(==ARRSH(1,jGH	 A(==ARRSH(1,jGH	 !- ,(O? 9=B 	
		H M
	
 zz|7;Aw4RVVLLVb[B&'$. 3"*+d23"*+d23 "*+d2: 	 	
		69LLMzz|!MZII. :&
34 23.GWgwII: (	 JJLEUB(BZ(OP.3Ah+mqL;W|%;,z9
 qL<W}%<,z97 "B 	
		,wz/BBC
zz|GTLLT)=c$i2or>R OmmC/$94/;RSGal&88GQq\%==FalCCCC	'  L
 !B-CHc#hC#c(#KK  al&>> '!A, S CG LL767W7.
 G#0v0"6T 33V.w4RSw!
? $B II'  LL

D()+56	 r   c           	         U R                  S5        UR                  S5        UR                  5       c  U R                  S5        g U R                  S5        UR                  S5        U R                  UR                  5       S LSS5        UR                  S5        UR	                  5       n/ S	QnU R                  X#SS
5        UR                  S5        UR	                  5       nU H  u  pVUR                  SU45        UR	                  5       nU R                  [        U5      S:H  SSU-  5        UR                  SU45        U R                  UR                  5       S LSSXV4-  5        M     U R                  S5        UR                  S5        U R                  UR                  5       S LSS5        UR                  S5        UR	                  5       n/ SQnU R                  X#SS5        UR                  S5        UR	                  5       nU GH  u  nnn	n
nnnnUR                  SU45        UR	                  5       nU R                  [        U5      S:H  SSU-  5        U R                  US:  SSX4-  5        U R                  U	S:  S S!X4-  5        U R                  U
S:  S"S#X4-  5        U R                  US:  S$S%X4-  5        U R                  US:  S&S'X4-  5        U R                  US:  S(S)X4-  5        U R                  US:  S*S+X4-  5        GM     UR                  S,5        UR	                  5       nU H  u  p_U R                  XU5        M     g )-NzChecking tileszOSELECT 1 FROM gpkg_contents WHERE data_type IN ('tiles', '2d-gridded-coverage')z... No tiles tablezChecking gpkg_tile_matrix_set z?SELECT 1 FROM sqlite_master WHERE name = 'gpkg_tile_matrix_set'&   z"gpkg_tile_matrix_set table missingz'PRAGMA table_info(gpkg_tile_matrix_set))r   )rb   r   r   rb   Nr   )r   r   r   rb   Nr   )r   r   r   rb   Nr   )r   r   r   rb   Nr   )r   r   r   rb   Nr   rn  z3SELECT table_name, srs_id FROM gpkg_tile_matrix_setzbSELECT 1 FROM gpkg_contents WHERE table_name = ? AND data_type IN ('tiles', '2d-gridded-coverage')rb   '   zOtable_name = %s is registered in gpkg_tile_matrix_set, but not in gpkg_contentsr   )   z]table_name=%s has srs_id=%d in gpkg_tile_matrix_set which isn't found in gpkg_spatial_ref_syszChecking gpkg_tile_matrixz;SELECT 1 FROM sqlite_master WHERE name = 'gpkg_tile_matrix'r  zgpkg_tile_matrix table missingz#PRAGMA table_info(gpkg_tile_matrix))r   )rb   ri  r   rb   Nr   )r   r  r   rb   Nr   )r   r  r   rb   Nr   )r   
tile_widthr   rb   Nr   )r   tile_heightr   rb   Nr   )r   r  r   rb   Nr   )r   r  r   rb   Nr   gpkg_tile_matrixzSELECT table_name, zoom_level, matrix_width, matrix_height, tile_width, tile_height, pixel_x_size, pixel_y_size FROM gpkg_tile_matrix+   zKtable_name = %s is registered in gpkg_tile_matrix, but not in gpkg_contentsr   .   z$Invalid zoom_level = %d for table %s/   z&Invalid matrix_width = %d for table %s0   z'Invalid matrix_height = %d for table %s1   z$Invalid tile_width = %d for table %s2   z%Invalid tile_height = %d for table %s3   z&Invalid pixel_x_size = %f for table %s4   z&Invalid pixel_y_size = %f for table %szcSELECT table_name, data_type FROM gpkg_contents WHERE data_type IN ('tiles', '2d-gridded-coverage'))rT   r   r   r\   r   rt   re   r  )rM   r   rf   rg   r   rh   r   r   ri  r  r  r  r  r  r  r   s                   r   _check_tilesGPKGChecker._check_tiles  s   		"#			/	
 ::<II*+		23			VWQZZ\-r3WX			;<**,
 	g=ST			GHzz|$( ZIIF
 **,CLLCAG 	 IIKfYWLL

D(- &'	% %): 			-.			RSQZZ\-r3ST			78**,	
 	g=OP			1	

 zz| 	
IID
 **,CLLCAC 	 LLa6*9QQ
 LLq 8L;UU
 LL!9]<WW
 LLQ6*9QQ
 LLa7;:SS
 LLq 8L;UU
 LLq 8L;UU] h 	
		<	
 zz|'+#Z''yA (,r   c           	      "   U R                  S5        UR                  S5        UR                  5       nU(       d  U R                  S5        g [        [	        U5      5       Vs/ s H
  o2U   S   PM     nnUR                  S5        U R                  UR                  5       S LSS5        UR                  S5        UR                  5       n/ S	QnU R                  UUSS
5        UR                  S5        U R                  UR                  5       S LSS5        UR                  S5        UR                  5       n/ SQnU R                  UUSS5        UR                  S5        UR                  5       nU R                  [	        U5      S:H  SS5        [	        U5      S:X  aX  U R                  US   S   R                  5       S:H  SSUS   S   -  5        U R                  US   S   S:H  SSUS   S   -  5        UR                  S5        U R                  UR                  5       S LSS5        UR                  S5        UR                  5       nU R                  [	        U5      S[	        U5      -   :H  SS5        SnSn	S n
U GH	  u  ppUS
:X  aD  S!nU R                  US L SS"5        U R                  X:H  SS#5        U R                  US$:H  SS"5        MQ  US:X  aD  S!n	U R                  US L SS%5        U R                  X:H  SS&5        U R                  US$:H  SS%5        M  U R                  X;   SS'S(U-  -   5        U R                  US):H  SS*U-  S+-   5        U R                  X:H  SS,U-  S+-   5        U R                  US$:H  SS*U-  S+-   5        GM     U R                  USS-5        U R                  U	SS.5        UR                  S/5        UR                  5       nU R                  [	        U5      [	        U5      :H  S0S15        U Hv  u  nnU R                  X;   S0S2U-  S3-   5        UR                  S4U45        U R                  UR                  5       S LS5S6S7U-  -   5        U R                  US8;   S9S:U-  5        Mx     U Hl  nUR                  S;[        U5      -  5        UR                  5       nUR                  S<U45        UR                  5       nU R                  UU:H  S=S>U-  5        Mn     UR                  S?5        UR                  5       nU H  u  nU R                  UU;   S@SAU-  5        M      UR                  SB5        UR                  5       nU HN  u  nUR                  SCU45        U R                  [	        UR                  5       5      S:H  S9SDSEU-  -   SF-   5        MP     U HO  nUR                  SGSHU-  -   U45        U R                  [	        UR                  5       5      S:H  SISJSKU-  -   5        MQ     UR                  S/5        UR                  5       nSnU GH  u  nnUR                  SL[        U5      -  5        UR                  5        GHz  u  nnU R                  US L=(       a    [	        U5      SM:  SNSO5        SMn[        R                  " SPU-  USU 5      nUSSQ SR:H  nUSSQ SS:H  =(       d    USSQ ST:H  nUSU:X  Ga  U R                  USVSWU-  5        [        (       a  SXn[        R                  " U[        U5      5        [        R                   " U5      n U R                  US LSVSYUU4-  5        U R                  UR"                  S:H  SVSYUU4-  5        U R                  UR%                  S5      R&                  [        R(                  :H  SVSYUU4-  5        [        R*                  " U5        GMj  U(       d  S!nU R                  SZ5        GM  GM  US[:X  d  GM  U R                  US\S]U-  5        [        (       Ga  SXn[        R                  " U[        U5      5        [        R                   " U5      n U R                  US LS^SYUU4-  5        U R                  UR"                  S:H  S_SYUU4-  5        U R                  UR%                  S5      R&                  [        R,                  :H  S`SYUU4-  5        UR/                  SaSb5      nU R                  US L =(       d    USc:H  SdSYUU4-  5        UR%                  S5      R1                  5       nU R                  UR3                  5       (       + =(       a    US:H  SeSYUU4-  5        UR%                  S5      R5                  5       u  n n!U R                  U UR6                  :H  SfSYUU4-  5        [        R*                  " U5        GM]  U(       a  GMg  S!nU R                  Sg5        GM}     GM     g s  snf ! [        R*                  " U5        f = f! [        R*                  " U5        f = f)hNz%Checking tiled gridded elevation datazLSELECT table_name FROM gpkg_contents WHERE data_type = '2d-gridded-coverage'z#... No tiled gridded coverage tabler   zMSELECT 1 FROM sqlite_master WHERE name = 'gpkg_2d_gridded_coverage_ancillary'zgpkg_2d_gridded_coverage#1z3gpkg_2d_gridded_coverage_ancillary table is missingz5PRAGMA table_info(gpkg_2d_gridded_coverage_ancillary))r   r  r   rb   Nrb   )rb   tile_matrix_set_namer   rb   Nr   )r   datatyper   rb   z	'integer'r   r   scaler   rb   1.0r   r   offsetr   rb   z0.0r   )r   	precisionr   r   r  r   )r   	data_nullr   r   Nr   )r   grid_cell_encodingr   r   z'grid-value-is-center'r   )r   uomr   r   Nr   )r   
field_namer   r   'Height'r   )rw   quantity_definitionr   r   r  r   "gpkg_2d_gridded_coverage_ancillaryzISELECT 1 FROM sqlite_master WHERE name = 'gpkg_2d_gridded_tile_ancillary'zgpkg_2d_gridded_coverage#2z/gpkg_2d_gridded_tile_ancillary table is missingz1PRAGMA table_info(gpkg_2d_gridded_tile_ancillary))	rh  )rb   
tpudt_namer   rb   Nr   )r   tpudt_idr   rb   Nr   r  r  )r   r  r   r   NULLr   )r   maxr   r   r  r   )r   meanr   r   r  r   )r   std_devr   r   r  r   gpkg_2d_gridded_tile_ancillaryzoSELECT srs_id, organization, organization_coordsys_id, definition FROM gpkg_spatial_ref_sys WHERE srs_id = 4979rb   zgpkg_2d_gridded_coverage#3z5gpkg_spatial_ref_sys shall have a row for srs_id=4979r   z2wrong value for organization for srs_id = 4979: %sr   is  z>wrong value for organization_coordsys_id for srs_id = 4979: %srz   zgpkg_2d_gridded_coverage#6zgpkg_extensions does not existzxSELECT table_name, column_name, definition, scope FROM gpkg_extensions WHERE extension_name = 'gpkg_2d_gridded_coverage'zRWrong number of entries in gpkg_extensions with 2d_gridded_coverage extension nameFz8http://docs.opengeospatial.org/is/17-066r1/17-066r1.htmlTzEWrong entry for gpkg_2d_gridded_coverage_ancillary in gpkg_extensionszRWrong entry (definition) for gpkg_2d_gridded_coverage_ancillary in gpkg_extensionsr{   zAWrong entry for gpkg_2d_gridded_tile_ancillary in gpkg_extensionszNWrong entry (definition) for gpkg_2d_gridded_tile_ancillary in gpkg_extensionsz%Unexpected table_name registered for z2d_gridded_coverage: %srl  zWrong entry for %s zin gpkg_extensionsz Wrong entry (definition) for %s zIgpkg_2d_gridded_coverage_ancillary not registered for 2d_gridded_coveragezEgpkg_2d_gridded_tile_ancillary not registered for 2d_gridded_coveragezMSELECT tile_matrix_set_name, datatype FROM gpkg_2d_gridded_coverage_ancillaryzgpkg_2d_gridded_coverage#7z=Wrong number of entries in gpkg_2d_gridded_coverage_ancillaryzTable %s has a row in z<gpkg_2d_gridded_coverage_ancillary, but not in gpkg_contentsz7SELECT 1 FROM gpkg_tile_matrix_set WHERE table_name = ?zgpkg_2d_gridded_coverage#8z&missing entry in gpkg_tile_matrix_set zfor %s)integerfloatzgpkg_2d_gridded_coverage#9zUnexpected datatype = %szSELECT COUNT(*) FROM %szHSELECT COUNT(*) FROM gpkg_2d_gridded_tile_ancillary WHERE tpudt_name = ?zgpkg_2d_gridded_coverage#10zDInconsistent number of rows in gpkg_2d_gridded_tile_ancillary for %sz>SELECT DISTINCT tpudt_name FROM gpkg_2d_gridded_tile_ancillaryzgpkg_2d_gridded_coverage#11ztpudt_name = %s is invalidz\SELECT tile_matrix_set_name FROM gpkg_2d_gridded_coverage_ancillary WHERE datatype = 'float'zjSELECT 1 FROM gpkg_2d_gridded_tile_ancillary WHERE tpudt_name = ? AND NOT (offset == 0.0 AND scale == 1.0)zWrong scale and offset values zfor %s z%in gpkg_2d_gridded_coverage_ancillaryzfSELECT 1 FROM gpkg_2d_gridded_tile_ancillary WHERE tpudt_name = ? AND tpudt_id NOT IN (SELECT id FROM z%s)zgpkg_2d_gridded_coverage#12z/tpudt_id in gpkg_2d_gridded_coverage_ancillary znot referencing an id from %szSELECT id, tile_data FROM %srw  r   rx  r   r   r{  r  r  r  zgpkg_2d_gridded_coverage#13zTile for %s should be PNGz/vsimem/temp_validate_gpkg.tifzInvalid tile %d in %sz>GDAL not available. Req gpkg_2d_gridded_coverage#13 not testedr  zgpkg_2d_gridded_coverage#14zTile for %s should be TIFFzgpkg_2d_gridded_coverage#15zgpkg_2d_gridded_coverage#16zgpkg_2d_gridded_coverage#17COMPRESSIONIMAGE_STRUCTURELZWzgpkg_2d_gridded_coverage#18zgpkg_2d_gridded_coverage#19zgpkg_2d_gridded_coverage#20z]GDAL not available. Req gpkg_2d_gridded_coverage#15 to gpkg_2d_gridded_coverage#19 not tested)rT   r   r   r   re   r\   r   rt   r   r   r  r  r"  r   FileFromMemBufferbytesOpenRasterCountGetRasterBandDataType
GDT_UInt16UnlinkGDT_Float32GetMetadataItemGetOverviewCountGetSubDatasetsGetBlockSizeRasterXSize)"rM   r   tablesr   rf   rg   r   r   (found_gpkg_2d_gridded_coverage_ancillary$found_gpkg_2d_gridded_tile_ancillaryexpected_defrh   rW  r   r   r  r  tablecount_tpudtcount_tile_ancillaryr  warn_gdal_not_availableidentr9  r:  r;  r  r  tmp_filedscompression	ovr_count
blockxsizeri   s"                                     r   "_check_tiled_gridded_coverage_data.GPKGChecker._check_tiled_gridded_coverage_dataV  s
   		9:			0	
 II;<(-c&k(:;(:1)A,(:;			:	
 	JJL$(A	
 	
		IJ**,
 	(0		
 	
		6	
 	JJL$(=	
 	
		EF**,

 	(,		
 	
		"	

 jjlHM(C	

 s8q=LLAq	!V+,Ds1vayP
 LLAq	T!,Va&) 	
		NOJJL$(,	

 	
		:	

 zz|IS[((1	
 490/4,Q<@8ZjAA;?84'0) .0) \)0) ??7;44'0) .0) \)0) (0;/*<= ;.0)J69MM
 .06C*+ \)0)J69MMC =AN 	4(&	
 	0(V	
 	
		1	
 zz|IV$(N	

 15,!8LL$.,(+??   IIL%' LL

D(,8112 LL00,*X5% 150 EII/'%.@A**,KII'
 $%::< LL33-> 	 & 	
		UVzz|!MZLLf$-,z9 " 	
		!	

 zz|'+#!II7 &'	 LLAJJL!Q&,02239: (, EIIH%-  	 LLAJJL!Q&-A1E9:  	
		1	
 zz|"'&*"ZII4wz7JJK!"T-A#d)r/2~V"$ --o(=tAo?VW 1)AA!!A,*BB gaPQl W G y(LL53j@
  x#C..xtE!YYx02 LL "$ = 75*:M M
 !LL "! 3 = 75*:M M
 !LL " 0 0 3 < < O = 75*:M M !KK166:3 II `  7 (LL54zA
  x#C..xtE!YYx0%2 LL "$ = 75*:M M
 !LL "! 3 = 75*:M M
 !LL " 0 0 3 < <@P@P P = 75*:M M
 +-*<*< -/@+K !LL +t 3 K{e7K = 75*:M M
 )+(8(8(;(L(L(NI LL$&$5$5$7 7 JIN = 75*:M M
 /1.>.>q.A.N.N.POZ LL *bnn < = 75*:M M !KK1666:3 II!lC ". '+Q	 <`
 !KK1n !KK1s    "g!Bg?Eg6g36hc                      UR                  S[        U5      < S[        U5      < S35        g! [        R                   a     gf = f)NzSELECT 1 FROM z t ORDER BY t.z LIMIT 0TF)r   r   r  r  )rM   r   rh   r   s       r   _check_column_exists GPKGChecker._check_column_exists  sF    		 II:&(9; '' 		s   ,/ AAc           
         U R                  S5        UR                  S5        UR                  5       c  U R                  S5        g UR                  S5        UR                  5       n/ SQnU R	                  X#SS5        UR                  S5        UR                  5       nU H6  u  pVUc  M
  U R                  U R                  XU5      S	S
U< SU< S35        M8     UR                  S5        UR                  5       n/ SQn[        R                   H  nUSU-   /-  nM     U R                  S:  a  USS/-  nU GHA  u  n	U	R                  S5      (       a  U R                  X;   SSU	-  5        M6  U R                  SU	;   SSU	-  5        U	SU	R                  S5       n
XR                  S5      S-   S  nU
 HX  nU R                  US:  =(       a    US:*  =(       d)    US:  =(       a    US:*  =(       d    US:  =(       a    US:*  SSU	-  5        MZ     U Hd  nU R                  US:  =(       a    US:*  =(       d5    US:  =(       a    US:*  =(       d    US:  =(       a    US:*  =(       d    US:H  SSU	-  5        Mf     GMD     UR                  S5        UR                  5       nU H   u  pU R                  S S!S"U	< S#U< 35        M"     UR                  S$5        UR                  5       nU HW  u  p]UR                  S%U45        U R                  UR                  5       S LS&S'U-  5        U R                  US(:H  S&S)U-  5        MY     g )*NzChecking gpkg_extensionsrz   z... No extensionsz"PRAGMA table_info(gpkg_extensions)))r   rh   r   r   Nr   )rb   rW  r   r   Nr   )r   r   r   rb   Nr   )r   r   r   rb   Nr   )r   r   r   rb   Nr   :   gpkg_extensionszPSELECT table_name, column_name FROM gpkg_extensions WHERE table_name IS NOT NULL=   rd   r  z+ mentioned in gpkg_extensions doesn't existz*SELECT extension_name FROM gpkg_extensions)gpkg_rtree_indexgpkg_zoom_other	gpkg_webpgpkg_metadatagpkg_schemagpkg_crs_wktr}   gpkg_elevation_tilesgpkg_2d_gridded_coveragegpkg_related_tablesrelated_tablesr   )rb   r   gpkg_geometry_type_triggergpkg_srs_id_triggergpkg_>   zextension_name %s not validri   r   rb   ar)  AZ09zaSELECT extension_name, scope FROM gpkg_extensions WHERE scope NOT IN ('read-write', 'write-only')F@   zextension_name z has invalid scope zXSELECT table_name, scope FROM gpkg_extensions WHERE extension_name = 'gpkg_rtree_index' zYSELECT 1 FROM gpkg_contents WHERE lower(table_name) = lower(?) AND data_type = 'features'r  zRgpkg_extensions declares gpkg_rtree_index for %s, but this is not a features tablez
write-onlyz%Invalid scope %s for gpkg_rtree_index)rT   r   r   r   rt   r\   r  r/   r   r&  r"   find)rM   r   rf   rg   r   rh   rW  KNOWN_EXTENSIONS	geom_namer   authorext_namexr   s                 r   _check_gpkg_extensions"GPKGChecker._check_gpkg_extensions  s`   		,-			NO::<II)*			67**,
 	g=NO			%	
 zz|)-%Z &--a[I
 #J	0 *.* 	
		>?zz|
 %33I	!9 :: 4<<& !=?T UU!%^((11"61NB >)1NB
 (N,?,?,DE)*=*=c*BQ*F*HIALLc.a3h 3H1c3H1c5F   "ALLc.a3h $H1c$H1c$ 85F "1 "&Z 	
		>	
 zz|'+#^LL<JER (, 	
		9	
 zz|#'ZII-
 LL

D(: 	 LL%7%?! $(r   c           
         U R                  S5        SnUR                  S5        UR                  5       b@  UR                  S5        UR                  5       nUb  SnUu  nU R                  US:H  SS5        UR                  S	5        UR                  5       c-  U(       a  U R                  SSS
5        g U R                  S5        g UR                  S5        UR	                  5       n/ SQnU R                  XVSS5        UR                  S5        U R                  UR                  5       S LSS5        UR                  S5        UR	                  5       n/ SQnU R                  XVSS5        UR                  S5        UR	                  5       nU H  u  nU R                  SSSU-  5        M     UR                  S5        UR	                  5       nU H  u  nU R                  SSSU-  5        M     UR                  S5        UR	                  5       nU H!  u  n	U R                  SSSSU	-  -   S -   5        M#     UR                  S!5        UR	                  5       nU HY  u  n	U R                  U	S LSS"5        UR                  S#U	45        U R                  UR                  5       S LSSS$U	-  -   S%-   5        M[     UR                  S&5        UR	                  5       nU H!  u  n	U R                  SS'S(S)U	-  -   S*-   5        M#     UR                  S+5        UR	                  5       nU HF  u  pU R                  U
S LS'S,5        U R                  U R                  XU
5      S'S-U
< S.U	< S/35        MH     UR                  S05        UR	                  5       nU H!  u  n	U R                  SS1S2S)U	-  -   S3-   5        M#     UR                  S45        UR	                  5       nU Hn  u  pU R                  US LS1S55        UR                  S6[        U	5      -  U45        U R                  UR                  5       S LS1S7[        U5      < S.U	< S/35        Mp     UR                  S85        UR	                  5       nU H&  u  n [        R                  R                  US95        M(     UR                  S<5        UR	                  5       nU HJ  u  nUR                  S=U45        U R                  UR                  5       S LS>S?[        U5      -  S@-   5        ML     UR                  SA5        UR	                  5       nU HJ  u  nUR                  S=U45        U R                  UR                  5       S LSBSC[        U5      -  S@-   5        ML     UR                  SD5        UR	                  5       nU H$  u  nU R                  SSBSE[        U5      -  5        M&     g ! [         a    U R                  SS:S;U-  5         GM|  f = f)FNzChecking gpkg_metadataFrz   zHSELECT scope FROM gpkg_extensions WHERE extension_name = 'gpkg_metadata'Tr{      z0Wrong scope for gpkg_metadata in gpkg_extensionsz8SELECT 1 FROM sqlite_master WHERE name = 'gpkg_metadata'zgpkg_metadata table missingz... No metadataz PRAGMA table_info(gpkg_metadata))r  )rb   md_scoper   rb   z	'dataset'r   )r   md_standard_urir   rb   Nr   )r   	mime_typer   rb   z
'text/xml'r   )r   metadatar   rb   r   r   ]   r  zBSELECT 1 FROM sqlite_master WHERE name = 'gpkg_metadata_reference'_   z"gpkg_metadata_reference is missingz*PRAGMA table_info(gpkg_metadata_reference)))r   reference_scoper   rb   Nr   )rb   rh   r   r   Nr   )r   rW  r   r   Nr   )r   row_id_valuer   r   Nr   )r   	timestampr   rb   r   r   )r   
md_file_idr   rb   Nr   )r   md_parent_idr   r   Nr   gpkg_metadata_referenceaJ  SELECT DISTINCT md_scope FROM gpkg_metadata WHERE md_scope NOT IN ('undefined', 'fieldSession', 'collectionSession', 'series', 'dataset', 'featureType', 'feature', 'attributeType', 'attribute', 'tile', 'model', 'catalog', 'schema', 'taxonomy', 'software', 'service', 'collectionHardware', 'nonGeographicDataset', 'dimensionGroup')^   zInvalid md_scope %s foundzSELECT DISTINCT reference_scope FROM gpkg_metadata_reference WHERE reference_scope NOT IN ('geopackage', 'table', 'column', 'row', 'row/col')`   z Invalid reference_scope %s foundznSELECT table_name FROM gpkg_metadata_reference WHERE reference_scope = 'geopackage' AND table_name is NOT NULLa   z/row in gpkg_metadata_reference with table_name znot null (%s)z but reference_scope = geopackagezTSELECT table_name FROM gpkg_metadata_reference WHERE reference_scope != 'geopackage'z3row in gpkg_metadata_reference with null table_name0SELECT 1 FROM gpkg_contents WHERE table_name = ?z#not null (%s) with no reference in z/gpkg_contents but reference_scope != geopackagezSELECT table_name FROM gpkg_metadata_reference WHERE reference_scope IN ('geopackage', 'table', 'row') AND column_name is NOT NULLb   z0row in gpkg_metadata_reference with column_name znot null (table=%s)z.but reference_scope = geopackage, table or rowzwSELECT table_name, column_name FROM gpkg_metadata_reference WHERE reference_scope NOT IN ('geopackage', 'table', 'row')z4row in gpkg_metadata_reference with null column_namezcolumn rc   z does not existzSELECT table_name FROM gpkg_metadata_reference WHERE reference_scope IN ('geopackage', 'table', 'column') AND row_id_value is NOT NULLc   z1row in gpkg_metadata_reference with row_id_value z1but reference_scope = geopackage, table or columnz{SELECT table_name, row_id_value FROM gpkg_metadata_reference WHERE reference_scope NOT IN ('geopackage', 'table', 'column')z5row in gpkg_metadata_reference with null row_id_valuez SELECT 1 FROM %s WHERE ROWID = ?zrow z-SELECT timestamp FROM gpkg_metadata_referencer   d   z<timestamp = %s in gpkg_metadata_referenceis invalid datetimez.SELECT md_file_id FROM gpkg_metadata_referencez(SELECT 1 FROM gpkg_metadata WHERE id = ?e   zmd_file_id = %s z$does not have a row in gpkg_metadatazOSELECT md_parent_id FROM gpkg_metadata_reference WHERE md_parent_id IS NOT NULLf   zmd_parent_id = %s zkSELECT md_file_id FROM gpkg_metadata_reference WHERE md_parent_id IS NOT NULL AND md_file_id = md_parent_idz(Row with md_file_id = md_parent_id = %s )rT   r   r   r\   r   rt   r  r   rY   r   r   r   )rM   r   must_have_gpkg_metadatar   r   rf   rg   r   r  rh   rW  r  r  r  r  s                  r   _check_metadataGPKGChecker._check_metadata  s
   		*+"'			NO::<#II3 **,C*.'\)I 	
		LM::<&UC)FG  		+,			45**,
 	g_M			S	
 	QZZ\-r3WX			>?**,
 	g=VW			 	
 zz|KXLL$?($JK   	
		*	
 zz|KXLL$F$QR   	
		H	

 zz|!MZLLA!J./45 " 	
		.	

 zz|!MZLL$&E
 IIH:-XLL

D(A7*DECD " 	
		*	
 zz|!MZLLB'*45BC " 	
		D	

 zz|)-%ZLL4'I
 LL))!E4?L *. 	
		+	
 zz|!MZLLC'*45EF " 	
		G	

 zz|*.&ZLLD(J
 II2WZ5HH LL

D(14\1BJO +/  	
		ABzz| LY!!**96MN ! 	
		BCzz|!MZII@:-PLL

D("S_489 " 	
		-	
 zz|#O\II@</RLL

D($s<'8889  $ 	
		,	

 zz|!MZLLsFZX "U  	0 !	" 	s   0 W W'&W'c                 Z
   U R                  S5        SnUR                  S5        UR                  5       b  UR                  S5        UR                  5       nUb  SnUu  nU R                  US:H  SS5        U R                  S	:  aF  U R                  UR                  5       S LSS
5        U R                  UR                  5       S L SS
5        UR                  S5        UR                  5       nUb  U R                  SSS5        UR                  S5        UR                  5       c-  U(       a  U R                  SSS5        g U R                  S5        g UR                  S5        UR                  5       n/ SQnU R                  XVSS5        UR                  S5        UR                  5       nU H  u  pUR                  SU45        UR                  5       c=  UR                  SU45        U R                  UR                  5       SSU-  S-   S-   5        U R                  U R                  XU	5      SSU-  SU	-  -   S-   S-   5        M     UR                  S5        UR                  5       c  U R                  SSS 5        UR                  S!5        UR                  5       nU R                  S":  a  S#OS$n
U R                  S":  a  S%OS&nS'S(S)S*S+U
S,S-S S-4S.S/US,S-S S-4S0/nU R                  XVS1S25        UR                  S35        UR                  5       b  U R                  SS4S55        UR                  S65        UR                  5       b  U R                  SS7S85        UR                  S95        UR                  5       b  U R                  SS:S;5        UR                  S<5        UR                  5       b  U R                  SS=S>5        UR                  S?5        UR                  5       b  U R                  SS=S@5        UR                  SA5        UR                  5       b  U R                  SS=SB5        UR                  SCSDU
 SE3-   5        UR                  5       b  U R                  SSFSG5        UR                  SCSDU SE3-   5        UR                  5       b  U R                  SSFSH5        SIU
SJU4 HF  nUR                  SKU-   SL-   5        UR                  5       c  M-  U R                  SSMSNU-   SO-   5        MH     UR                  SP5        UR                  5       b  U R                  SSQSR5        g g )SNzChecking gpkg_schemaFrz   zFSELECT scope FROM gpkg_extensions WHERE extension_name = 'gpkg_schema'Tr{      z.Wrong scope for gpkg_schema in gpkg_extensions)rb   r   rb   zUThere should be exactly 2 rows with extension_name = 'gpkg_schema' in gpkg_extensionsz^SELECT 1 FROM gpkg_extensions WHERE extension_name = 'gpkg_schema' AND column_name IS NOT NULLzKgpkg_extensions contains row(s) with gpkg_schema and a not-NULL column_namez<SELECT 1 FROM sqlite_master WHERE name = 'gpkg_data_columns'z gpkg_data_columns table missing.z... No schemaz$PRAGMA table_info(gpkg_data_columns))r   rV  )r   rp   r   r   Nr   )r   titler   r   Nr   )r   r   r   r   Nr   )r   r  r   r   Nr   )r   constraint_namer   r   Nr   g   gpkg_data_columnsz5SELECT table_name, column_name FROM gpkg_data_columnsr$  z2SELECT 1 FROM gpkg_extensions WHERE table_name = ?h   ztable_name = %s z+in gpkg_data_columns refer to non-existing z.table/view in gpkg_contents or gpkg_extensionsi   ztable_name = %s, zcolumn_name = %s r   zGSELECT 1 FROM sqlite_master WHERE name = 'gpkg_data_column_constraints'z+gpkg_data_column_constraints table missing.z/PRAGMA table_info(gpkg_data_column_constraints)rb   rb   min_is_inclusiveminIsInclusivemax_is_inclusivemaxIsInclusive)r   r0  r   rb   Nr   )rb   constraint_typer   rb   Nr   )r   valuer   r   Nr   )r   r  NUMERICr   Nr   r   r   r   )r   r  r<  r   Nr   r   )r   r   r   r   Nr   k   gpkg_data_column_constraintszxSELECT DISTINCT constraint_type FROM gpkg_data_column_constraints WHERE constraint_type NOT IN ('range', 'enum', 'glob')l   zXgpkg_data_column_constraints.constraint_type contains value other than range, enum, globzSELECT 1 FROM (SELECT COUNT(constraint_name) AS c FROM gpkg_data_column_constraints WHERE constraint_type IN ('range', 'glob') GROUP BY constraint_name) u WHERE u.c != 1m   zcgpkg_data_column_constraints contains non unique constraint_name for constraints of type range/globz`SELECT 1 FROM gpkg_data_column_constraints WHERE constraint_type = 'range' AND value IS NOT NULLn   z_gpkg_data_column_constraints contains constraint of type range whose 'value' column is not nullzZSELECT 1 FROM gpkg_data_column_constraints WHERE constraint_type = 'range' AND min IS NULLo   zVgpkg_data_column_constraints contains constraint of type range whose min value is NULLzZSELECT 1 FROM gpkg_data_column_constraints WHERE constraint_type = 'range' AND max IS NULLzVgpkg_data_column_constraints contains constraint of type range whose max value is NULLzYSELECT 1 FROM gpkg_data_column_constraints WHERE constraint_type = 'range' AND min >= maxzcgpkg_data_column_constraints contains constraint of type range whose min value is not less than maxz1SELECT 1 FROM gpkg_data_column_constraints WHERE zconstraint_type = 'range' AND z NOT IN (0,1)p   zigpkg_data_column_constraints contains constraint of type range whose min_is_inclusive value is not 0 or 1zigpkg_data_column_constraints contains constraint of type range whose max_is_inclusive value is not 0 or 1r  r  zYSELECT 1 FROM gpkg_data_column_constraints WHERE constraint_type IN ('enum', 'glob') AND z IS NOT NULLq   zLgpkg_data_column_constraints contains constraint of type enum or glob whose z column is not NULLz[SELECT 1 FROM gpkg_data_column_constraints WHERE constraint_type = 'enum' AND value IS NULLr   zXgpkg_data_column_constraints contains constraint of type enum whose value column is NULL)rT   r   r   r\   r&  r   rt   r  )rM   r   must_have_gpkg_schemar   r   rf   rg   r   rh   rW  r6  r8  r   s                r   _check_schemaGPKGChecker._check_schema	  s   		() %			NO::<#II1 **,C(,%\)G <<9,LL

D0= LL

,= 		.
 jjl?LLC 	
		PQ::<$UC)KL  		/*			89**,
 	g>QR			IJzz|)-%ZIIH:-Xzz|#		H:- JJL*Z7GHJK	 LL))!E'*4)K78CD 		! *.6 	
		U	
 ::<LL%RS			CD**,
 #',,&"8>N 	 #',,&"8>N 	
 76,- )Qa8- )Qa82	
 	s,J	
 	
		1	

 ::<#LL@ 	
			
 ::<#LLG 	
		@	
 ::<#LLC 	
		:	
 ::<#LL: 	
		:	
 ::<#LL: 	
		9	
 ::<#LLG 	
		?./?.@NO	
 ::<#LL 	
		?./?.@NO	
 ::<#LL  0%9IJHII= !! zz|'4 ,, K" 	
		;	
 ::<#LL< $r   c           
      .   U R                  S5        SnUR                  S5        UR                  5       b  UR                  S5        UR                  5       nSnU(       a`  SnU H&  u  pVUS:X  a  SnU R	                  US:H  S SU-   5        M(     U R	                  US S	5        U R	                  [        U5      S
:  S S5        UR                  S5        UR                  5       c-  U(       a  U R	                  SS S5        g U R                  S5        g UR                  S5        UR                  5       n/ SQnU R                  XxS S5        UR                  S5        UR                  5        GH  u  ppnUR                  SU	45        UR                  5       S LnU R	                  US SU	-   5        U(       a&  U R	                  U R                  XU
5      S SU
-   5        UR                  SU45        UR                  5       S LnU R	                  US SU-   5        U(       a&  U R	                  U R                  XU5      S SU-   5        UR                  SU45        UR                  5       S LnU R	                  US SU-   5        UR                  SU45        UR                  5       S LnU R	                  US SU-   S-   5        U R	                  U R                  XS5      S SU< SS< S35        U R	                  U R                  XS5      S SU< SS< S35        GM     g ) NzChecking relationsFrz   zoSELECT table_name, scope FROM gpkg_extensions WHERE extension_name IN ('related_tables', 'gpkg_related_tables')Tgpkgext_relationsr{   z?Wrong scope for gpkgext_relations in gpkg_extensions for table zkgpkg_extensions should have an entry for extension_name = related_tables and table_name = gpkgext_relationsrb   zvgpkg_extensions should have at least one entry for extension_name = related_tables and table_name != gpkgext_relationsz<SELECT 1 FROM sqlite_master WHERE name = 'gpkgext_relations'zgpkgext_relations table missingz... No relationsz$PRAGMA table_info(gpkgext_relations))rh  )rb   base_table_namer   rb   Nr   )r   base_primary_columnr   rb   'id'r   )r   related_table_namer   rb   Nr   )r   related_primary_columnr   rb   rM  r   )r   relation_namer   rb   Nr   )r   mapping_table_namer   rb   Nr   zSELECT base_table_name, base_primary_column, related_table_name, related_primary_column, mapping_table_name FROM gpkgext_relationsr  z=gpkgext_relations refers to a non-existing base_table_name = zAgpkgext_relations refers to a non-existing base_primary_column = z@gpkgext_relations refers to a non-existing related_table_name = zDgpkgext_relations refers to a non-existing related_primary_column = z@gpkgext_relations refers to a non-existing mapping_table_name = zrSELECT 1 FROM gpkg_extensions WHERE table_name = ? AND extension_name IN ('related_tables', 'gpkg_related_tables')z:Missing entry in gpkg_extensions for mapping_table_name = z& and extension_name = 'related_tables'base_idzTable z should have a r   
related_id)rT   r   r   r   r\   re   rt   r  )rM   r   must_have_gpkgext_relationsr   gpkgext_relations_foundrh   r   rf   rg   btnbtcrtnrpcmtnoks                  r   _check_relationsGPKGChecker._check_relations
  sI   		&'&+#			NO::<#II)
 ::<D&+#.2+)-%J!%8826/LL-57AB *. +5 IM6 	
		PQ::<*UD*KL  		,-			89**,
 	g?RS			8	

 ()zz|#CcIIBSFKT)BLL%'*+ --ac:-/23 IIBSFKT)BLL(*-. --ac:0256 IIBSFKT)BLL(*-. II> 	 T)BLL(*-.144 LL))!)<699E
 LL))!,?69<H (4r   c           	      	   U R                  [        R                  R                  U R                  5      S SU R                  -  5        U R                  U R                  R                  5       R                  S5      SS5        [        U R                  S5       nUR                  SS5        [        R                  " SUR                  S	5      5      n[        R                  " SS
R                  S5      5      n[        R                  " SSR                  S5      5      n[        R                  " SSR                  S5      5      nU R                  X#XE4;   SS[        U5      -  5        X#:X  a  SU l        OX$:X  a  SU l        OX%:X  a  UR                  SS5        UR                  S	5      nSn[        R                  " SU5      S   nU R                  Xg:  SSXg4-  5        US-  US-  S-  US-  4U l        U R                  S:  a  U R                  SU R                   S35        OSU l        S S S 5        [         R"                  " S5      nUR%                  5       n	U	R'                  S5        U	R'                  S5        U	R)                  5       n
U
S   S    S:X  a  S!U l        U	R-                  5         UR-                  5         [         R"                  " U R                  5      nXl        UR%                  5       n	  U	R'                  S"5        U	R1                  5         U	R'                  S%5        U	R)                  5       nU R                  [5        U5      S:H  S&S'[        U5      -  5        U	R'                  S(5        U R                  U	R1                  5       S   S):H  S*S+5        U R7                  U	5        U R9                  U	5        U R;                  U	5        U R=                  U	5        U R?                  U	5        U RA                  U	5        U RC                  U	5        U RE                  U	5        U RG                  U	5        U RI                  U	5        U	R-                  5         UR-                  5         g ! , (       d  f       GNB= f! [2         a    U R                  S#SS$5         GNf = f! U	R-                  5         UR-                  5         f = f),Nz%s does not existz.gpkgr   zfilename extension isn't .gpkg'rbr   r   BBBBr   GP10ASCIIGP11GPKGr   z:Wrong application_id: %s. Expected one of GP10, GP11, GPKG)rb   r   r5  <   i'  z>Iz&Wrong user_version: %d. Expected >= %di'  r'  )rb   r   r   zVersion z not handled by this script)r&  r&  r   zJCREATE TABLE foo(one TEXT, two TEXT, CONSTRAINT pk PRIMARY KEY (one, two))zPRAGMA table_info(foo)rb   r   TzSELECT 1 FROM sqlite_masterFznot a sqlite3 databasezPRAGMA foreign_key_checkr   zforeign_key_check failed: %szPRAGMA integrity_checkr[  r   zintegrity_check failed)%r\   ospathexistsrB   r   endswithopenseekr  r  readencoderY   r&  r_   r  r  r  r   r   rE   closerC   r   r  re   r   r   r]  r  re  r  r  r+  rG  r\  )rM   fapplication_idgp10gp11gpkguser_versionexpected_versionrC   r   r   r   s               r   checkGPKGChecker.check  s   GGNN4==)41Dt}}1T	
 	MM!**73-	
 $--&!FF2qM#]]7AFF1I>N==&--*@AD==&--*@AD==&--*@ADLL"44Rn%& %%'%'r1 vvay#( %}}T<@C 4<#67 !E)!E)c1 3& 
 <<9,JJ$,,7RST'G 'J z*KKM			4	
 	
		*+zz|71:?(,D%		

t}}-	KKM$	A		78

 II01**,CLLSQ+ICPSH+TUII./LLaD0!5MN,,Q/%%a(  #a ""1%33A6''*  #q!!!!$ GGIJJLs '&r  AUA'?@A> GGIJJLs8   FQ%5!Q7 D.R %
Q47RR RR "R=)rF   rC   rK   rE   rG   rB   rD   rH   r&  rJ   rI   rL   N)TFFTF)r)   r*   r+   r,   r   r   rN   rT   r\   r_   rt   r   r   r   rR  r]  rb  re  r  r  r  r  r  r+  rG  r\  rv  r-   r(   r   r   r/   r/   T   s    	ON "*	8tKZObfPBHPd2h
<PdVBpZxSjobENENdr   r/   c           	      |    Ub  U(       a  SnSnOSnSn[        U UUUUUS9nUR                  5         UR                  $ )NTFrF   rG   rH   rI   rJ   )r/   rv  rK   )rB   rF   verboserG   rH   rI   rJ   checkers           r   rv  rv  z  sR     GKGK1!)G MMO>>r   c                      [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        g)	NzOUsage: validate_gpkg.py [[-v]|[-q]] [-k] [--extra] [--warning-as-error] my.gpkgr  z-v: verbose modez-q: quiet modez1-k: (try to) keep going when error is encounteredzX--extra: run extra checks, potentially going beyond strict requirements of specificationz+--warning-as-error: turn warnings as errorsr   )rQ   r(   r   r   Usager}    sJ    	Y 
"I	
	
	
=>	b 

78r   c           	         S nSnSnSnSnSn[        U 5      S:X  a
  [        5       $ U SS   HL  nUS:X  a  SnM  US:X  a  SnM  US:X  a  SnM!  US:X  a  SnM+  US:X  a  SnM5  US	   S
:X  a  [        5       s  $ UnMN     Uc
  [        5       $ [        UUUUUUS9nU(       dD  U(       d  g	U H5  u  pU	(       a  [        S[	        U	5      < SU
< 35        M*  [        U
5        M7     gg	)NFTrb   z-kz-qz-vz--extraz--warning-as-errorr   -ry  rW   rX   )re   r}  rv  rQ   rY   )argvrB   rH   rI   rF   rJ   rG   argr   r[   rS   s              r   mainr    s   HGKL
4yA~wABx$;#( D[KD[GIL((#Vs]7NH  w
1!)C  !
#c(C89#J	 "
 r   __main__)TNFFTF)r   rf  r   r  r  sysosgeor   r   r"  ImportErrorr   r   r$   r  r&   objectr/   rv  r}  r  r  r)   exitr(   r   r   <module>r     s   @  	 	   
H
&5.	 	c,& c,PY < hh ,^ zHHT#((^ S]  Hs   
B BB