ó
6]c           @   s¿   d  d l  Z  d  d l Z d  d l Z d  d l 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 d
 e f d „  ƒ  YZ d „  Z d S(   iÿÿÿÿNi   i   t   it   dc         C   s   t  | ƒ |  | | d +d  S(   Ni   (   t   _pack_double_func(   t   datat   post   value(    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyt   _pack_double   s    c         C   s   t  | ƒ |  | | d +d  S(   Ni   (   t   _pack_integer_func(   R   R   R   (    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyt   _pack_integer   s    i    c         c   sà   | d k r" t  |  d ƒ d } n  d } x± | | k  rÛ t  |  | ƒ d } | | | k ri t d ƒ ‚ n  | d 7} |  | | | !} | d | d d } | | 7} t |  | ƒ d } | j d ƒ | | f V| d 7} q+ Wd S(   s1   Yield (key, value, pos). No locking is performed.i    i   s2   Read beyond file size detected, file is corrupted.i   s   utf-8N(   t   _unpack_integert   RuntimeErrort   _unpack_doublet   decode(   R   t   usedR   t   encoded_lent   encoded_keyt
   padded_lenR   (    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyt   _read_all_values   s    

t
   MmapedDictc           B   s_   e  Z d  Z e d „ Z e d „  ƒ Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z RS(	   s…  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.

    Not thread safe.
    c         C   s6  t  | | r d n d ƒ |  _ | |  _ t j |  j j ƒ  ƒ j } | d k rg |  j j t ƒ t } n  | |  _	 t
 j
 |  j j ƒ  |  j	 d | rš t
 j n t
 j ƒ|  _ i  |  _ t |  j d ƒ d |  _ |  j d k rü d |  _ t |  j d |  j ƒ n6 | s2x- |  j ƒ  D] \ } } } | |  j | <qWn  d  S(   Nt   rbs   a+bi    t   accessi   (   t   opent   _ft   _fnamet   ost   fstatt   filenot   st_sizet   truncatet   _INITIAL_MMAP_SIZEt	   _capacityt   mmapt   ACCESS_READt   ACCESS_WRITEt   _mt
   _positionsR	   t   _usedR   R   (   t   selft   filenamet	   read_modet   capacityt   keyt   _R   (    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyt   __init__<   s"    					c      	   C   sy   t  |  d ƒ [ } | j d ƒ } t | d ƒ d } | t | ƒ k rf | | j | t | ƒ ƒ 7} n  Wd  QXt | | ƒ S(   NR   iÿÿ  i    (   R   t   readR	   t   lenR   (   R&   t   infpR   R   (    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyt   read_all_values_from_fileQ   s    &c         C   s+  | j  d ƒ } | d d t | ƒ d d } t j d j t | ƒ ƒ j  ƒ  t | ƒ | d ƒ } xc |  j t | ƒ |  j k rÇ |  j d 9_ |  j j |  j ƒ t	 j	 |  j j
 ƒ  |  j ƒ |  _ qe W| |  j |  j |  j t | ƒ +|  j t | ƒ 7_ t |  j d |  j ƒ |  j d |  j | <d	 S(
   s0   Initialize a value. Lock must be held by caller.s   utf-8t    i   i   s   i{0}sdg        i   i    N(   t   encodeR-   t   structt   packt   formatR$   R   R   R   R   R   R"   R   R#   (   R%   R)   t   encodedt   paddedR   (    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyt   _init_value\   s     3% c         C   s   t  d |  j d |  j ƒ S(   s1   Yield (key, value, pos). No locking is performed.R   R   (   R   R"   R$   (   R%   (    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyR   m   s    c         c   s/   x( |  j  ƒ  D] \ } } } | | f Vq Wd S(   s,   Yield (key, value). No locking is performed.N(   R   (   R%   t   kt   vR*   (    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyt   read_all_valuesq   s    c         C   s@   | |  j  k r |  j | ƒ n  |  j  | } t |  j | ƒ d S(   Ni    (   R#   R7   R   R"   (   R%   R)   R   (    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyt
   read_valuev   s    c         C   sC   | |  j  k r |  j | ƒ n  |  j  | } t |  j | | ƒ d  S(   N(   R#   R7   R   R"   (   R%   R)   R   R   (    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyt   write_value}   s    c         C   s<   |  j  r8 |  j j ƒ  d  |  _ |  j  j ƒ  d  |  _  n  d  S(   N(   R   R"   t   closet   None(   R%   (    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyR=   „   s
    		(   t   __name__t
   __module__t   __doc__t   FalseR+   t   staticmethodR/   R7   R   R:   R;   R<   R=   (    (    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyR   0   s   
					c         C   s1   t  t | | ƒ ƒ } t j |  | | g d t ƒS(   s&   Format a key for use in the mmap file.t	   sort_keys(   t   dictt   zipt   jsont   dumpst   True(   t   metric_namet   namet
   labelnamest   labelvaluest   labels(    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyt   mmap_keyŒ   s    i   (   RG   R   R   R2   R   t   StructR3   R   R   t   unpack_fromR	   R   R   R   R   t   objectR   RO   (    (    (    s:   lib/python2.7/site-packages/prometheus_client/mmap_dict.pyt   <module>   s   		\