
    Xh                     h   d dl Z d dlZd dlZd dlZd dlmZ dZ ej                  d      j                  Z	 ej                  d      j                  Z
 ej                  d      j                  Z ej                  d      j                  Zd Zd ZddZ G d	 d
      Zdededee   dee   dedefdZy)    N)Listi      is   ddc                 (    t        ||      | ||dz    y )N   )_pack_two_doubles_func)dataposvalue	timestamps       O/var/www/html/myenv/lib/python3.12/site-packages/prometheus_client/mmap_dict.py_pack_two_doublesr      s    /yADS2X    c                 &    t        |      | ||dz    y )N   )_pack_integer_func)r   r	   r
   s      r   _pack_integerr      s    *51DS1Wr   c              #   *  K   |dk  rt        | d      d   }d}||k  rtt        | |      d   }||z   |kD  rt        d      |dz  }| |||z    }|d|dz   dz  z
  z   }||z  }t        | |      \  }}|j                  d      |||f |dz  }||k  rsyyw)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
*%dC03t#STTq3s[01 AqA(=$=>
z.tS9y  )5)S@@r	 *s   BBBc                   L    e Zd ZdZddZed        Zd Zd Zd Z	d Z
d Zd	 Zy
)
MmapedDicta  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                    t        ||rdnd      | _        || _        t        j                  | j                  j                               j                  }|dk(  r%| j                  j                  t               t        }|| _	        t        j                  | j                  j                         | j                  |rt        j                  nt        j                        | _        i | _        t        | j                  d      d   | _        | j                   dk(  r)d| _        t#        | j                  d| j                          y |s*| j%                         D ]  \  }}}}|| j                  |<    y y )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__zMmapedDict.__init__?   s   x>88DGGNN,-55q=GG/0)H!))DGGNN,dnn7@4#3#3dFWFWY $TWWa03
::?DJ$''1djj1&*&;&;&= /NCAs+.DOOC(/ r   c                    t        | d      5 }|j                  t        j                        }t	        |d      d   }|t        |      kD  r ||j                  |t        |      z
        z  }d d d        t              S # 1 sw Y   xY w)Nr"   r   )r$   readr.   PAGESIZEr   lenr   )r5   infpr   r   s       r   read_all_values_from_filez$MmapedDict.read_all_values_from_fileT   s    (D! 	4T 99T]]+D"4+A.Dc$i		$T"233	4  d++	4 	4s   AA>>Bc                 l   |j                  d      }|ddt        |      dz   dz  z
  z  z   }t        j                  dt        |       dj                         t        |      |dd      }| j                  t        |      z   | j
                  kD  r| xj
                  dz  c_        | j                  j                  | j
                         t        j                  | j                  j                         | j
                        | _
        | j                  t        |      z   | j
                  kD  r|| j                  | j                  | j                  t        |      z    | xj                  t        |      z  c_        t        | j                  d	| j                         | j                  d
z
  | j                  |<   y)z0Initialize a value. Lock must be held by caller.r       r   r   isddg           r   r   N)encoder>   structpackr3   r-   r%   r+   r.   r)   r1   r   r2   )r4   r8   encodedpaddedr
   s        r   _init_valuez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                 D    t        | j                  | j                        S )z1Yield (key, value, pos). No locking is performed.)r   r   )r   r1   r3   r4   s    r   r   zMmapedDict._read_all_valuesp   s    TWW4::>>r   c              #   N   K   | j                         D ]  \  }}}}|||f  yw)z7Yield (key, value, timestamp). No locking is performed.N)r   )r4   kvtsr9   s        r   read_all_valueszMmapedDict.read_all_valuest   s1     002 	KAq"aQ(N	s   #%c                     || j                   vr| j                  |       | j                   |   }t        | j                  |      S N)r2   rK   r   r1   )r4   r8   r	   s      r   
read_valuezMmapedDict.read_valuey   s;    doo%S!ooc""477C00r   c                     || j                   vr| j                  |       | j                   |   }t        | j                  |||       y rT   )r2   rK   r   r1   )r4   r8   r
   r   r	   s        r   write_valuezMmapedDict.write_value   s<    doo%S!ooc"$''3y9r   c                     | j                   rC| j                  j                          d | _        | j                   j                          d | _         y y rT   )r%   r1   closerM   s    r   rY   zMmapedDict.close   s6    77GGMMODGGGMMODG	 r   N)F)__name__
__module____qualname____doc__r:   staticmethodr@   rK   r   rR   rU   rW   rY    r   r   r    r    2   s>    
/* , ,/"?
1:r   r    metric_namename
labelnameslabelvalues	help_textreturnc                 b    t        t        ||            }t        j                  | |||gd      S )z&Format a key for use in the mmap file.T)	sort_keys)dictzipjsondumps)r`   ra   rb   rc   rd   labelss         r   mmap_keyrm      s/     #j+./F::{D&)<MMr   )r   )rj   r.   r'   rG   typingr   r,   StructrH   r   r   unpack_fromr   r   r   r   r   r    strrm   r_   r   r   <module>rr      s      	   "V]]4(-- &u-22 &--%11#fmmE*66 B2.X XvN# NS Nd3i NdSVi Ndg Nlo Nr   