
    Tdj                        d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
mZ ddZddZ ed           G d d                      ZdZddddZdS ) zImport-safe helpers for inspecting a Python interpreter's linked SQLite.

This module intentionally depends only on the standard library.  Installer and
update code must be able to use it before Hermes' third-party dependencies are
healthy.
    )annotationsN)	dataclass)Path)IterablepartsIterable[object]returntuple[int, int, int]c                    d | D             }|                     dgdt          |          z
  z             t          |d d                   S )Nc                ,    g | ]}t          |          S  )int).0parts     ?/home/thesage/.hermes/hermes-agent/hermes_cli/sqlite_runtime.py
<listcomp>z"_version_tuple.<locals>.<listcomp>   s    ***Dc$ii***    r      )extendlentuple)r   valuess     r   _version_tupler      sN    **E***F
MM1#S[[)***r   version_infotuple[int, ...]boolc                    t          |           }|dk     rdS |dk    rdS d|cxk    rdk     rn ndS d|cxk    rdk     rn ndS dS )	z>Return whether *version_info* contains SQLite's WAL-reset bug.)r      r   F)r   3   r   )r   2   r   )r   r   r   )r   ,      )r   -   r   T)r   )r   infos     r   is_sqlite_wal_reset_vulnerabler%      s     ,''DiuzuT&&&&J&&&&&uT&&&&J&&&&&u4r   T)frozenc                  h    e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   edd            ZdS )SQLiteRuntimeInfoz7SQLite details reported by one exact Python executable.r   
executablebase_prefixr
   python_versionsqlite_versionstrsqlite_version_stringsqlite_source_idr	   r   c                *    t          | j                  S )N)r%   r,   )selfs    r   wal_reset_vulnerablez&SQLiteRuntimeInfo.wal_reset_vulnerable3   s    -d.ABBBr   N)r	   r   )__name__
__module____qualname____doc____annotations__propertyr2   r   r   r   r(   r(   (   s         AA((((((((C C C XC C Cr   r(   a  
import json
import sqlite3
import sys

conn = sqlite3.connect(":memory:")
try:
    row = conn.execute("SELECT sqlite_source_id()").fetchone()
finally:
    conn.close()

print(json.dumps({
    "base_prefix": sys.base_prefix,
    "executable": sys.executable,
    "python_version": list(sys.version_info[:3]),
    "sqlite_version": list(sqlite3.sqlite_version_info),
    "sqlite_version_string": sqlite3.sqlite_version,
    "sqlite_source_id": str(row[0]) if row and row[0] is not None else "",
}))
g      >@)timeoutpython
str | Pathr9   floatSQLiteRuntimeInfo | Nonec               $   t          |           }t          t          j                  }dD ]}|                    |d           	 t          j        t          |          ddt          gdd|d|          }n# t          t
          j
        f$ r Y dS w xY w|j        dk    rdS 	 t          j        |j                  }t          t          t          |d	                             t          t          |d
                             t!          |d                   t!          |d                   t          |d                   t          |                    dd                              S # t$          t&          t(          t          j        f$ r Y dS w xY w)zProbe SQLite in *python*, never the caller's linked SQLite.

    ``None`` means the interpreter could not be executed or returned malformed
    data.  The child runs isolated from inherited Python path overrides.
    )CONDA_DEFAULT_ENVCONDA_PREFIX
PYTHONHOME
PYTHONPATHUV_PROJECT_ENVIRONMENT	UV_PYTHONVIRTUAL_ENVNz-Iz-cTF)capture_outputtextr9   checkenvr   r)   r*   r+   r,   r.   r/    )r)   r*   r+   r,   r.   r/   )r   dictosenvironpop
subprocessrunr-   _PROBE_SCRIPTOSErrorTimeoutExpired
returncodejsonloadsstdoutr(   r   getKeyError	TypeError
ValueErrorJSONDecodeError)r:   r9   r)   rI   keyresultpayloads          r   probe_sqlite_runtimer`   N   s    fJ
rz

C 	 	 	T
__dD-8
 
 
 Z./   ttAt*V]++ C 56677S!78899)'2B*CDD)'2B*CDD"%g.E&F"G"G -?!D!DEE
 
 
 	
 iT-AB   tts%   0A6 6BB!CE) )"FF)r   r   r	   r
   )r   r   r	   r   )r:   r;   r9   r<   r	   r=   )r6   
__future__r   rU   rL   rO   dataclassesr   pathlibr   typingr   r   r%   r(   rQ   r`   r   r   r   <module>re      s    # " " " " "  				     ! ! ! ! ! !                    $C C C C C C C C2 . . . . . . . .r   