
    ]Ci                     l   S SK r S SKrS SKrS SKrS SKJr  Sr\R                  " S5      R                  r	\R                  " S5      R                  r
\R                  " S5      R                  r\R                  " S5      R                  rS rS rSS jr " S	 S
5      rS\S\S\\   S\\   S\S\4S jrg)    N)Listi      is   ddc                 $    [        X#5      XUS-   & g )N   )_pack_two_doubles_func)dataposvalue	timestamps       U/home/james-whalen/.local/lib/python3.13/site-packages/prometheus_client/mmap_dict.py_pack_two_doublesr      s    /ADS2X    c                 $    [        U5      XUS-   & g )N   )_pack_integer_func)r   r	   r
   s      r   _pack_integerr      s    *51DS1Wr   c              #      #    US::  a  [        U S5      S   nSnX!:  an  [        X5      S   nX2-   U:  a  [        S5      eUS-  nXX#-    nUSUS-   S-  -
  -   nX%-  n[        X5      u  pgUR                  S5      XgU4v   US-  nX!:  a  Mm  gg7f)z<Yield (key, value, timestamp, pos). No locking is performed.r      z2Read beyond file size detected, file is corrupted.r   utf-8r   N)_unpack_integerRuntimeError_unpack_two_doublesdecode)r   usedr	   encoded_lenencoded_key
padded_lenr
   r   s           r   _read_all_valuesr      s      qytQ'*
C
*%d03t#STTqs01 AqA(=$=>
.t9  )5S@@r	 *s   BBBc                   V    \ rS rSrSrSS jr\S 5       rS rS r	S r
S rS	 rS
 rSrg)
MmapedDict2   a  A dict of doubles, backed by an mmapped file.

The file starts with a 4 byte int, indicating how much of it is used.
Then 4 bytes of padding.
There's then a number of entries, consisting of a 4 byte int which is the
size of the next field, a utf-8 encoded string key, padding to a 8 byte
alignment, and then a 8 byte float which is the value and a 8 byte float
which is a UNIX timestamp in seconds.

Not thread safe.
c                    [        X(       a  SOS5      U l        Xl        [        R                  " U R                  R                  5       5      R                  nUS:X  a%  U R                  R                  [        5        [        nX0l	        [        R                  " U R                  R                  5       U R                  U(       a  [        R                  O[        R                  S9U l        0 U l        [        U R                  S5      S   U l        U R                   S:X  a)  SU l        [#        U R                  SU R                   5        g U(       d*  U R%                  5        H  u  n  pVX`R                  U'   M     g g )Nrbza+br   )accessr   )open_f_fnameosfstatfilenost_sizetruncate_INITIAL_MMAP_SIZE	_capacitymmapACCESS_READACCESS_WRITE_m
_positionsr   _usedr   r   )selffilename	read_modecapacitykey_r	   s          r   __init__MmapedDict.__init__?   s   x>88DGGNN,-55q=GG/0)H!))DGGNN,dnn7@4#3#3dFWFWY $TWWa03
::?DJ$''1djj1&*&;&;&=NCA+.OOC( '> r   c                    [        U S5       nUR                  [        R                  5      n[	        US5      S   nU[        U5      :  a  X!R                  U[        U5      -
  5      -  nS S S 5        [        WW5      $ ! , (       d  f       N= f)Nr#   r   )r%   readr/   PAGESIZEr   lenr   )r6   infpr   r   s       r   read_all_values_from_file$MmapedDict.read_all_values_from_fileT   sv    (D!T 99T]]+D"4+A.Dc$i		$T"233 "  d++ "!s   AA>>
Bc                 t   UR                  S5      nUSS[        U5      S-   S-  -
  -  -   n[        R                  " S[        U5       S3R                  5       [        U5      USS5      nU R                  [        U5      -   U R
                  :  a  U =R
                  S-  sl        U R                  R                  U R
                  5        [        R                  " U R                  R                  5       U R
                  5      U l
        U R                  [        U5      -   U R
                  :  a  M  X@R                  U R                  U R                  [        U5      -   & U =R                  [        U5      -  sl        [        U R                  S	U R                  5        U R                  S
-
  U R                  U'   g)z0Initialize a value. Lock must be held by caller.r       r   r   isddg           r   r   N)encoder@   structpackr4   r.   r&   r,   r/   r*   r2   r   r3   )r5   r9   encodedpaddedr
   s        r   _init_valueMmapedDict._init_value_   s<   **W%DAW)9Q(>$>?@aF}C07793w<QTVYZjj3u:%6NNaNGGT^^,ii 0$..ADG jj3u:%6 7<

4::E
23 	

c%j 
dggq$**-#zzBr   c                 >    [        U R                  U R                  S9$ )z1Yield (key, value, pos). No locking is performed.)r   r   )r   r2   r4   r5   s    r   r   MmapedDict._read_all_valuesp   s    TWW4::>>r   c              #   L   #    U R                  5        H  u  pp4XU4v   M     g7f)z7Yield (key, value, timestamp). No locking is performed.N)r   )r5   kvtsr:   s        r   read_all_valuesMmapedDict.read_all_valuest   s%     002KA"(N 3s   "$c                     XR                   ;  a  U R                  U5        U R                   U   n[        U R                  U5      $ N)r3   rN   r   r2   )r5   r9   r	   s      r   
read_valueMmapedDict.read_valuey   s9    oo%S!ooc""477C00r   c                     XR                   ;  a  U R                  U5        U R                   U   n[        U R                  XBU5        g rZ   )r3   rN   r   r2   )r5   r9   r
   r   r	   s        r   write_valueMmapedDict.write_value   s8    oo%S!ooc"$''3y9r   c                     U R                   (       aC  U R                  R                  5         S U l        U R                   R                  5         S U l         g g rZ   )r&   r2   closerQ   s    r   ra   MmapedDict.close   s6    77GGMMODGGGMMODG	 r   )r.   r&   r'   r2   r3   r4   N)F)__name__
__module____qualname____firstlineno____doc__r;   staticmethodrB   rN   r   rW   r[   r^   ra   __static_attributes__ r   r   r    r    2   s>    
/* , ,/"?
1:r   r    metric_namename
labelnameslabelvalues	help_textreturnc                 X    [        [        X#5      5      n[        R                  " XXT/SS9$ )z&Format a key for use in the mmap file.T)	sort_keys)dictzipjsondumps)rk   rl   rm   rn   ro   labelss         r   mmap_keyrx      s)     #j./F::{&<MMr   )r   )ru   r/   r(   rJ   typingr   r-   StructrK   r   r   unpack_fromr   r   r   r   r   r    strrx   rj   r   r   <module>r}      s      	   ]]4(-- u-22 --%11mmE*66 B2.X XvN# NS Nd3i NdSVi Ndg Nlo Nr   