
    #wg                      T   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZ ee de	      Z
 ee de      Zej                  dk\  reZ	 d dlZdZ	 d dlZd dlZdZ	 ej                  dk\  r	d dlmZmZ nd dlmZmZ dZdZerej6                  j9                  d      Z ej<                  e      Zej@                  Z!ejD                  Z# ejH                         d    d	k(  rej@                  Z#	 ejJ                  Z&ejD                  e&_'        ejD                  e!e!ge&_(        erd
 Z+e+Z[[dZ,dZ-dZ.dZ/d Z0i Z1dZ2 ejf                  e2      Z4dZ5 ejf                  e5      Z6dZ7 ejf                  e7      Z8dZ9 ejf                  e9      Z:dZ; ejf                  e;      Z<dZ= ejf                  e=      Z> e?ddddddddd      Z@ e?e@j                         D  cg c]	  \  } }|| g c}}       ZBe@j                         ZDd xaExaFaGdddddd d!ZHd" ZId# ZJ G d$ d%eK      ZL G d& d'eL      ZM G d( d)eL      ZN G d* d+eL      ZO G d, d-eL      ZP G d. d/eL      ZQ G d0 d1eL      ZRd2 ZSd3 ZTd4 ZUd5 ZVdJd6ZWdKd7ZXd8 ZYd9 ZZ	 	 dLd:Z[dJd;Z\d< Z]dKd=Z^dJd>Z_dJd?Z`dJd@ZadA ZbdB ZcdMdCZddKdDZedE ZfdMdFZgdMdGZhdNdHZidNdIZjy# e$ r dZY kw xY w# e$ r dZY nw xY w# e$ r dZY Yw xY w# e)$ rD 	 ejT                  Z&ejD                  e&_'        ejD                  e#e#ge&_(        n# e)$ r dZY nw xY wY w xY wc c}} w )O    Nizipifilter)   r   TF)posix_fadvisePOSIX_FADV_RANDOMcFreeBSDc                 \    t        | j                         ||      }|dk7  rt        |d      y )Nr   	fallocate)
_fallocatefilenoIOError)fdoffsetlen_ress       L/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/whisper.py_py_fallocater   Z   s/    ryy{FD1c	c;'' 
    z!Lz!fz!dz!Ldz!2LfLz!3Laveragesumlastmaxminavg_zeroabsmaxabsmin)      r                  c                       y N )aks     r   <lambda>r*      s    r   r   <   i  iQ i:	 i3secondsminuteshoursdaysweeksyearsc                 V    dD ]  }|j                  |       s|c S  t        d| z        )Nr,   zInvalid unit '%s')
startswith
ValueError)svalues     r   getUnitStringr8      s7    H el 	&*++r   c                    	 | j                         j                  dd      \  }}|j                         rt	        |      t
        t        d         z  }nst        j                  d      }|j                  |      }|r=t	        |j                  d            t
        t        |j                  d               z  }nt        d|z        |j                         rt	        |      }||fS t        j                  d      }|j                  |      }|rCt	        |j                  d            t
        t        |j                  d               z  |z  }||fS t        d|z        # t        $ r t        d| z        w xY w)	N:r   z!Invalid retention definition '%s'r6   z^(\d+)([a-z]+)$r   z$Invalid precision specification '%s'z$Invalid retention specification '%s')stripsplitr5   isdigitintUnitMultipliersr8   recompilematchgroup)retentionDef	precisionpointsprecision_rerB   	points_res         r   parseRetentionDefrI      s`   I&,,.44S!<Y Is1C!DDI::01Ly)Eekk!n%ekkRSn8U(VVi=	IJJ^^[F V	 

-.IOOF#E5;;q>"_]5;;q>5R%SSW``f V	 =FGG+ 
 I
8<G
HHIs   #E E7c                       e Zd ZdZy)WhisperExceptionz"Base class for whisper exceptions.N__name__
__module____qualname____doc__r'   r   r   rK   rK      s    *r   rK   c                       e Zd ZdZy)InvalidConfigurationzInvalid configuration.NrL   r'   r   r   rR   rR          r   rR   c                       e Zd ZdZy)InvalidAggregationMethodzInvalid aggregation method.NrL   r'   r   r   rU   rU      s    #r   rU   c                       e Zd ZdZy)InvalidTimeIntervalzInvalid time interval.NrL   r'   r   r   rW   rW      rS   r   rW   c                       e Zd ZdZy)InvalidXFilesFactorzInvalid xFilesFactor.NrL   r'   r   r   rY   rY      s    r   rY   c                       e Zd ZdZy)TimestampNotCovered7Timestamp not covered by any archives in this database.NrL   r'   r   r   r[   r[      s    ?r   r[   c                       e Zd Zd Zd Zd Zy)CorruptWhisperFilec                 L    t         j                  | |       || _        || _        y r&   )	Exception__init__errorpath)selfrb   rc   s      r   ra   zCorruptWhisperFile.__init__   s     tU#DJDIr   c                 <    d| j                   d| j                  dS )Nz<CorruptWhisperFile[z] >)rc   rb   rd   s    r   __repr__zCorruptWhisperFile.__repr__   s    ,0IItzzBBr   c                 :    | j                   d| j                  dS )Nz ())rb   rc   rg   s    r   __str__zCorruptWhisperFile.__str__   s    

DII..r   N)rM   rN   rO   ra   rh   rk   r'   r   r   r^   r^      s    
C/r   r^   c                  0    	 t         ay# t        $ r Y yw xY w)z) Disable writing IO statistics to stdout N)_openopen	NameErrorr'   r   r   disableDebugrp      s    	D	 		s   	 	c                  N     t         a G d dt              a d ai   fda fday)z( Enable writing IO statistics to stdout c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)rn   c                 @    t        |i || _        d| _        d| _        y Nr   )rm   f
writeCount	readCount)rd   argskwargss      r   ra   zopen.__init__   s!    d%f%dfdodnr   c                     | S r&   r'   rg   s    r   	__enter__zopen.__enter__   s    kr   c                 8    | j                   j                          y r&   )ru   close)rd   rx   s     r   __exit__zopen.__exit__   s    
ffllnr   c                     | xj                   dz  c_         t        dt        |      | j                   fz         | j                  j	                  |      S )Nr   zWRITE %d bytes #%d)rv   debuglenru   write)rd   datas     r   r   z
open.write   s>    
ooo CIt#??@VV\\$r   c                     | xj                   dz  c_         t        d|| j                   fz         | j                  j                  |      S )Nr   zREAD %d bytes #%d)rw   r   ru   read)rd   sizes     r   r   z	open.read   s:    
nnn4"889VV[[r   c                 .    t        | j                  |      S r&   )getattrru   )rd   attrs     r   __getattr__zopen.__getattr__  s    TVVT""r   N)	rM   rN   rO   ra   r{   r~   r   r   r   r'   r   r   rn   rn      s     
 

#r   rn   c                      t        d| z         y )NzDEBUG :: %s)print)messages    r   r   r     s    	-'
!"r   c                 4    t        j                          | <   y r&   )timename__timingBlockss    r   
startBlockr     s    99;N4r   c                 n    t        d| t        j                         j                  |       z
  fz         y )Nz%s took %.5f seconds)r   r   popr   s    r   endBlockr     s,    	
 D$))+8J8J48P*P#Q
QRr   N)rn   rm   objectr   r   r   )r   s   @r   enableDebugr      s-     %#V #2# .'Sr   c                    t         r#t        j                  | j                        }|r|S | j	                         }| j                  d       | j                  t              }	 t        j                  t        |      \  }}}}	 t        |    d|cxk  rdk  sn t        d| j                        g }t#        |      D ]Y  }	| j                  t$              }
	 t        j                  t&        |
      \  }}}|||||z  |t(        z  d}|j+                  |       [ | j                  |       t        j                  |d      |||d}t         r|t        | j                  <   |S # t        j                  t        t        f$ r t        d| j                        w xY w# t         $ r t        d| j                        w xY w# t        j                  t        t        f$ r t        d|	z  | j                        w xY w)Nr   zUnable to read headerr   z!Unable to read archive%d metadata)r   secondsPerPointrF   	retentionr   r   )aggregationMethodmaxRetentionxFilesFactorarchives)CACHE_HEADERS__headerCachegetr   tellseekr   metadataSizestructunpackmetadataFormatrb   r5   	TypeErrorr^   aggregationTypeToMethodKeyErrorxrangearchiveInfoSizearchiveInfoFormat	pointSizeappend)fhinfooriginalOffsetpackedMetadataaggregationTyper   xffarchiveCountr   ipackedArchiveInfor   r   rF   archiveInfos                  r   __readHeaderr     s   RWW%Dk779.''!*77<(.?
--
7 7_lC
?O, 
cQ
4bgg
>>(, !a0Q*0--8IK\*]'v
 ("V+y K OOK !  ''.044_iP 	
$ !M"''	+O ,,
I	. ?
4bgg
>>?
 
 ?
4bgg
>>? LL*i0 QBQFPPQs$   !E 	F F85F F588G0c                 &    t        | |      \  }}|S )zSets the xFilesFactor for file in path

  path is a string pointing to a whisper file
  xFilesFactor is a float between 0 and 1

  returns the old xFilesFactor
  )r   __setAggregation)rc   r   _old_xffs       r   setXFilesFactorr   K  s     "$\B,1g	.r   c                 &    t        | ||      \  }}|S )a  Sets the aggregationMethod for file in path

  path is a string pointing to the whisper file
  aggregationMethod specifies the method to use when propagating data (see
  ``whisper.aggregationMethods``)
  xFilesFactor specifies the fraction of data points in a propagation interval
  that must have known values for a propagation to occur. If None, the
  existing xFilesFactor in path will not be changed

  returns the old aggregationMethod
  r   )rc   r   r   old_agmr   s        r   setAggregationMethodr   Y  s     "$(9<H,7A	.r   c                    t        | dt              5 }t        r2t        j                  |j                         t        j                         t        |      }||d   }||d   }t        |||d   |t        |d                t        r3|j                          t        j                  |j                                t        r#|j                  t         v rt         |j                  = ddd       d   |d   fS # 1 sw Y   xY w)z; Set aggregationMethod and or xFilesFactor for file in pathr+bNr   r   r   r   )rn   	BUFFERINGLOCKfcntlflockr   LOCK_EXr   __writeHeaderMetadatar   	AUTOFLUSHflushosfsyncr   r   r   )rc   r   r   r   r   s        r   r   r   k  s     D%# !rkk"))+u}}-D.)l 23"/n1E&D,<(=? hhjhhryy{M1

 )!, "
#T.%9	::-! !s   CC66C?c                    	 t         |   }	 t        |      }|dk  s|dkD  rt        d|z        t        j                  t        |      }t        j                  t        |      }t        j                  t        |      }t        j                  t        |      }||z   |z   |z   }| j                  d       | j                  |       y# t        $ r t        d|z        w xY w# t        $ r t        d|z        w xY w)z Writes header metadata to fh z#Unrecognized aggregation method: %sz$Invalid xFilesFactor %s, not a floatr   r   z,Invalid xFilesFactor %s, not between 0 and 1N)aggregationMethodToTyper   rU   floatr5   rY   r   pack
longFormatfloatFormatr   r   )r   r   r   r   r   r   r   s          r   r   r     s   6-.?@O
,&L
 A)
L*+ , , KK
O</Z6,[,7,Z6,"\1L@<O.''!*((>- 
 6
"#H#4$5 6 66 
 ,
D*+ , ,,s   	C C  C C8c           	         | st        d      | j                  d        t        |       D ]  \  }}|t        |       dz
  k(  r y
| |dz      }|d   |d   k  st        d|||dz   |fz        |d   |d   z  dk7  rt        d||d   |dz   |d   fz        |d   |d   z  }|d   |d   z  }||kD  st        d|||dz   |fz        |d   }|d   |d   z  }||k\  rt        d	|dz   |||fz         y
)a   Validates an archiveList.
  An ArchiveList must:
  1. Have at least one archive config. Example: (60, 86400)
  2. No archive may be a duplicate of another.
  3. Higher precision archives' precision must evenly divide all lower
     precision archives' precision.
  4. Lower precision archives must cover larger time intervals than higher
     precision archives.
  5. Each archive must have at least enough points to consolidate to the next
     archive

  Returns True or False
  z4You must specify at least one archive configuration!c                     | d   S rt   r'   )r(   s    r   r*   z%validateArchiveList.<locals>.<lambda>  s
    1 r   keyr   r   zsA Whisper database may not be configured having two archives with the same precision (archive%d: %s, archive%d: %s)z~Higher precision archives' precision must evenly divide all lower precision archives' precision (archive%d: %s, archive%d: %s)zLower precision archives must cover larger time intervals than higher precision archives (archive%d: %s seconds, archive%d: %s seconds)zEach archive must have at least enough points to consolidate to the next archive (archive%d consolidates %d of archive%d's points but it has only %d total points)N)rR   sort	enumerater   )archiveListr   archivenextArchiver   nextRetentionarchivePointspointsPerConsolidations           r   validateArchiveListr     s    

U
VV~&k* #;jaCq  a!e$K1:A& 	N	
GQUK(	)* *
 1~
"a' 	) 
GAJA{1~.	/0 0 
WQZ'IN[^3M9$ 	9 
Iq1um,	-. . AJM(^wqz922 	> 
Q&=9	:; ;?#;r   c           
         |d}|d}t        |       t        j                  j                  |       rt	        d| z        t        | dt              5 }	 t        r2t        j                  |j                         t        j                         t        r&t        r t        |j                         ddt               t!        |D cg c]
  \  }}||z   c}}      }	t#        |||	|t%        |             t&        t(        t%        |      z  z   }
|
}|D ]>  \  }}t+        j,                  t.        |||      }|j1                  |       ||t2        z  z  }@ t4        r|r||
z
  }t7        ||
|       ni|r&|j9                  |dz
         |j1                  d       nA||
z
  }d	}d|z  }||kD  r|j1                  |       ||z  }||kD  r|j1                  |d|        t:        r3|j=                          t        j>                  |j                                |jA                          	 ddd       yc c}}w # tB        $ r! t        jD                  |jF                          w xY w# 1 sw Y   yxY w)
a  create(path,archiveList,xFilesFactor=0.5,aggregationMethod='average')

  path               is a string
  archiveList        is a list of archives, each of which is of the form
                     (secondsPerPoint, numberOfPoints)
  xFilesFactor       specifies the fraction of data points in a propagation interval
                     that must have known values for a propagation to occur
  aggregationMethod  specifies the function to use when propagating data (see
                     ``whisper.aggregationMethods``)
  Ng      ?r   zFile %s already exists!wbr   r       i @  )$r   r   rc   existsrR   rn   r   r   r   r   r   r   CAN_FADVISEFADVISE_RANDOMr   r   r   r   r   r   r   r   r   r   r   r   CAN_FALLOCATEr   r   r   r   r   r}   r   unlinkr   )rc   r   r   r   sparseuseFallocater   r   rF   oldest
headerSizearchiveOffsetPointerr   	remaining	chunksizezeroess                   r   creater     s/    L! k" WW^^D
84?
@@D$	" .b-	BIIK/	biik1a):;KX1H&Of,XYfB 16<,.  ?S5E#EFj'%0 5
!/6kk"35I?\bc
)!345 
<(:5	"j),
$q()
(:5		9$)#
((6

y
 ) )# 	
#$	


hhjS. . YF   	ii	U. .s9   IA.H,H&C-H,?AH,&H,,*III"c                    | dk(  r)t        t        |            t        t        |            z  S | dk(  rt        t        |            S | dk(  r|d   S | dk(  rt        |      S | dk(  rt	        |      S | dk(  rI|st        d      |D cg c]  }|xs d	
 }}t        t        |            t        t        |            z  S | d
k(  rt        |t              S | dk(  rt	        |t              S t        d| z        c c}w )Nr   r   r   r   r   r   z%Using avg_zero without neighborValuesr   r   r   r   z"Unrecognized aggregation method %s)r   r   r   r   r   rU   abs)r   knownValuesneighborValuesxvaluess        r   	aggregater   )  s   )#[!"U3{+;%<<<E![!""F"r?E!{E!{J&$%LMM,-af1f-F-Vc&k 222H${$$H${$$
"*->>@ @ .s   C:c                    |d   }|d   }|||d   z  z
  }| j                  |d          | j                  t              }	 t        j                  t
        |      \  }	}
|	dk(  r|d   }n$||	z
  }||d   z  }|t        z  }|d   ||d   z  z   }|d   |d   z  }|t        z  }||d   z
  }||z   |d   z  }||d   z   }| j                  |       ||k  r| j                  ||z
        }nM|d   |d   z   }| j                  ||z
        }| j                  |d          || j                  ||d   z
        z  }t
        d   t
        dd  }}t        |      t        z  }|||z  z   }	 t        j                  ||      }d g|z  }|}|d   }t        dt        |      d
      D ]  }||   }||k(  r||dz      ||d
z  <   ||z  }! |D  cg c]  } | | 	 }!} |!syt        t        |!            t        t        |            z  }"|"|k\  rt        ||!|      }#t        j                  t
        ||#      }$| j                  |d          | j                  t              }	 t        j                  t
        |      \  }%}&|%dk(  r&| j                  |d          | j                  |$       y||%z
  }||d   z  }|t        z  }|d   ||d   z  z   }'| j                  |'       | j                  |$       yy# t        j                  $ r t        d| j                        w xY w# t        j                  $ r t        d	| j                        w xY wc c} w # t        j                  $ r t        d| j                        w xY w)Nr   r   r   r   Unable to read base datapointr   r   r   Unable to read datapointsr   FT)r   r   r   r   r   pointFormatrb   r^   r   r   r   r   r   r   r   )(r   header	timestamphigherlowerr   r   lowerIntervalStartpackedPointhigherBaseIntervalhigherBaseValuehigherFirstOffsettimeDistancepointDistancebyteDistancehigherPoints
higherSizerelativeFirstOffsetrelativeLastOffsethigherLastOffsetseriesString	higherEnd	byteOrder
pointTypesrF   seriesFormatunpackedSeriesr   currentIntervalstepr   	pointTimevr   knownPercentaggregateValuemyPackedPointlowerBaseIntervallowerBaseValuelowerOffsets(                                           r   __propagater"  B  s   01~# I6G0H$HI''&
	"+G,2MM+{,S) 1x(%(::L F+<$==M 9,Lx(L6&>,IJ()V4E-FF,i'*)F8,<<+j8F6NJ'&*::''
))77+.??@Lx 6&>1I779'889LGGF8BGG,vh/??@@L &a.+ab/Z)|	)&j612,C]]<>N
 6F?.&/	!	"$!S(!, aq!IO#-a!e4nQ!VtO	 +<qam<+<	s;'(5^1D+EE,S0+~NNKK-?PMGGE(O'')$KI,2MM+{,S). AggeHohh}  (*;;l"e,=&>>m"Y.l(O|eFm'CDkggkhh} Y 
 G
<bgg
FFG@ 
 C
8"''
BBC = << I>HHIs0    K   L ?L:L:L?  *L
*L7?*M)c                     t        |      }t        | dt              5 }t        r&t        r t        |j                         ddt               t        ||||      cddd       S # 1 sw Y   yxY w)zv
  update(path, value, timestamp=None)

  path is a string
  value is a float
  timestamp is either an int or float
  r   r   N)	r   rn   r   r   r   r   r   r   file_update)rc   r7   r  nowr   s        r   updater&    sX     ,%D%# 2r~BIIKA'89r5)S12 2 2s   :A!!A*c                 <   t         r2t        j                  | j                         t        j                         t        |       }|t        t        j                               }||}t        |      }||z
  }||d   k  r|dk\  st        d      t        |d         D ]  \  }}|d   |k  r|d   |dz   d  } n ||d   z  z
  }	t        j                  t        |	|      }
| j                  |d          | j                  t              }	 t        j                   t        |      \  }}|dk(  r(| j                  |d          | j)                  |
       |	}nF|	|z
  }||d   z  }|t        z  }|d   ||d
   z  z   }| j                  |       | j)                  |
       |}D ]  }t+        | ||	||      s n|} t,        r4| j/                          t1        j2                  | j                                y y # t        j"                  $ r t%        d	| j&                        w xY w)Nr   r   r\   r   r   r   r   r   r   r   )r   r   r   r   r   r   r>   r   r[   r   r   r   r   r   r   r   r   rb   r^   r   r   r"  r   r   r   r   )r   r7   r  r%  r  diffr   r   lowerArchives
myIntervalr  r  baseInterval	baseValuer
  r  r  myOffsetr  r  s                       r   r$  r$    s$   		KK		U]]+&[
diik
CI)n)	y$&((dai
?A A fZ01 
ja{d":&q1uv.M	
 I0A(BBC*++k:u=-'''(
	"+G &k; G\9 QGGGHHH]L,L G,=$>>M 9,Lx L76?$BCHGGHHH] & er6:vu=F
 HHJHHRYY[ - 
 G
<bgg
FFGs   
G1 1*Hc                 L   |sy|D cg c]  \  }}t        |      t        |      f }}}|j                  d d       t        | dt              5 }t
        r&t        r t        |j                         ddt               t        |||      cddd       S c c}}w # 1 sw Y   yxY w)zXupdate_many(path,points)

path is a string
points is a list of (timestamp,value) points
Nc                     | d   S rt   r'   )ps    r   r*   zupdate_many.<locals>.<lambda>  s
    AaD r   T)r   reverser   r   )r>   r   r   rn   r   r   r   r   r   r   file_update_many)rc   rF   r%  tr  r   s         r   update_manyr4    s     

-346AqSVU1X4&4++.$+/D%# -r~BIIKA'89B,- - 5- -s    B9BB#c                    t         r2t        j                  | j                         t        j                         t        |       }|t        t        j                               }t        |d         }t        |      }g }|D ]^  }||d   z
  }|d   |k  r7|r |j                          t        | |||       g }	 t        |      }|d   |k  r7|s n|j                  |       ` |r |r|j                          t        | |||       t        r4| j                          t!        j"                  | j                                y y # t        $ r d }Y w xY w)Nr   r   r   )r   r   r   r   r   r   r>   r   iternextr1  __archive_update_manyStopIterationr   r   r   r   r   )	r   rF   r%  r  r   currentArchivecurrentPointspointages	            r   r2  r2    s4   		KK		U]]+&[
diik
C&$%(>.-  e
a.C

%
+	b&.-Hh 
%
+ # ( "fnmDHHJHHRYY[   s   6D>>EEc           	        " |d   }|D cg c]  \  }}|||z  z
  |f }}}g }d }	d}
t        |      }t        d|      D ]  }|dz   |k  r||   d   ||dz      d   k(  r ||   \  }}|	r||	|z   k(  r!|
t        j                  t        ||      z  }
|}	St        |
      t
        z  }|	||dz
  z  z
  }|j                  ||
f       t        j                  t        ||      }
|}	 |
r0t        |
      t
        z  }|	||dz
  z  z
  }|j                  ||
f       | j                  |d          | j                  t
              }	 t        j                  t        |      \  }}|dk(  r|d   d   }|D ]  \  }}||z
  }||z  }|t
        z  }|d   ||d   z  z   }| j                  |       |d   |d   z   }|t        |      z   |z
  }|dkD  rw| j                  |d |         | j                         |k(  s%J d|| j                         |t        |      fz         | j                  |d          | j                  || d         | j                  |        |}|d	   D cg c]  }|d   |d   kD  r| }}|D ]K  ""fd
}|D cg c]  } ||d          }}t        |      } d}!| D ]  }t!        | |||"      sd}! |!s y "}M y c c}}w # t        j                  $ r t        d| j                        w xY wc c}w c c}w )Nr   r   r   r   r   r   r   z<archiveEnd=%d fh.tell=%d bytesBeyond=%d len(packedString)=%dr   c                     | | d   z  z
  S )Nr   r'   )r   r  s    r   fitz"__archive_update_many.<locals>.fit`  s    !e-..//r   FT)r   r   r   r   r   r   r   r   r   r   rb   r^   r   r   r   setr"  )#r   r  r   rF   r  r  r7   alignedPointspackedStringspreviousIntervalcurrentStringlenAlignedPointsr   intervalnumberOfPointsstartIntervalpackedBasePointr+  r,  packedStringr
  r  r  r-  
archiveEndbytesBeyondr  arcr)  r@  r0  lowerIntervalsuniqueLowerIntervalspropagateFurtherr  s#                                     @r   r8  r8    s   	"	#$-35)	5 T!12E: 5- 5 --'!%& "a1uM!$4Q$7=Q;OPQ;R$R%a(Xu(.>.E"Ev{{;%@@m!=)Y6n&$.12D*EFmM=9:kk+x?m!" '94N$0B(CDM-78 '''(
GGI&/G &k? K\9 Q #A&L #0 xl*L D(M 9,Lx L76?$BCHGGH"WV_4Jc,//:=KQhh|Mk\*+WWY*$ F	RWWYS->?	@$ 	gggh hh|[LM*+hh|', &"("4 K3+,w7H/II  K- K  e0)67Ac!A$i7N7~.(  	R65	9  FC5> 
 G
<bgg
FFG>K 8s   J=>K K0:K5*K-c                     	 t        | d      5 }t        |      cddd       S # 1 sw Y   yxY w# t        t        f$ r Y yw xY w)z$
  info(path)

  path is a string
  rbN)rn   r   r   OSError)rc   r   s     r   r   r   n  sP    		dD	 R"   
 7	 			s#   / #	/ ,/ / A Ac                 d    t        | d      5 }t        |||||      cddd       S # 1 sw Y   yxY w)ar  fetch(path,fromTime,untilTime=None,archiveToSelect=None)

path is a string
fromTime is an epoch time
untilTime is also an epoch time, but defaults to now.
archiveToSelect is the requested granularity, but defaults to None.

Returns a tuple of (timeInfo, valueList)
where timeInfo is itself a tuple of (fromTime, untilTime, step)

Returns None if no data can be returned
rS  N)rn   
file_fetch)rc   fromTime	untilTimer%  archiveToSelectr   s         r   fetchrZ  |  s9     D$ E2b(IsODE E Es   &/c                    t        |       }|t        t        j                               }||}t        |      }t        |      }||kD  rt        d|d|d      ||d   z
  }||kD  ry ||k  ry ||k  r|}||kD  r|}||z
  }|rt	        |      dz   }t        |      d   }|d   D ]  }	|r|	d   |k(  r nd }	|	d	   |k\  s n |r	st        d
|z        t        | 	||      S )Nz"Invalid time interval: from time 'z' is after until time ''r   z:1r   r   r   r   zInvalid granularity: %s)r   r>   r   rW   strrI   r5   __archive_fetch)
r   rW  rX  r%  rY  r  
oldestTimer(  retentionStrr   s
             r   rV  rV    s0   &[
diik
CI]()n)
 	
	9	  VN++*^
H_I	x$ '$.L'5a8O
# g	"	#	6g			% W
./B
CC	Wh		::r   c                 z   |d   }t        |||z  z
        |z   }t        |||z  z
        |z   }||k(  r||z  }| j                  |d          | j                  t              }	 t	        j
                  t        |      \  }}	|dk(  r||z
  |z  }
|||f}dg|
z  }||fS ||z
  }||z  }|t        z  }|d   ||d   z  z   }||z
  }||z  }|t        z  }|d   ||d   z  z   }| j                  |       ||k  r| j                  ||z
        }nM|d   |d   z   }| j                  ||z
        }| j                  |d          || j                  ||d   z
        z  }t        d   t        dd }}t        |      t        z  }
|||
z  z   }	 t	        j
                  ||      }dg|
z  }|}t        dt        |      d	      D ]!  }||   }||k(  r||dz      }|||d	z  <   ||z  }# |||f}||fS # t        j                  $ r t        d| j                        w xY w# t        j                  $ r t        d| j                        w xY w)
z
Fetch data from a single archive. Note that checks for validity of the time
period requested happen above this level so it's possible to wrap around the
archive on a read and request data older than the archive's retention
r   r   r   r   Nr   r   r   r   )r>   r   r   r   r   r   r   rb   r^   r   r   r   )r   r   rW  rX  r  fromIntervaluntilIntervalr  r+  r,  rF   timeInfo	valueListr
  r  r  
fromOffsetuntilOffsetr  rL  r  r  r  r  r  r   r  
pointValues                               r   r^  r^    s    
"	#$XD12T9,i9t#345<-]"TM'''(
	"+G &k; G\9 Ql*t3FmT2HIi   ,,$&-*,x L76?$BC* -,$&-*,!\GFO%CD+ ''*+77;34L"WV_4J77:
23LGGGHBGGK'(*;;<<L &a.+ab/Z)|	)&j612,C]]<>N
 fvo) /!S(!, aq!IO#!!a%(j$iQtO M40(
I	i 
 G
<bgg
FFGJ 
 C
8"''
BBCs   "G# H #*H*H:c           	          t        | d      5 }t        |d      5 }t        |||||      cddd       cddd       S # 1 sw Y   nxY w	 ddd       y# 1 sw Y   yxY w)z Merges the data from one whisper file into another. Each file must have
  the same archive configuration. time_from and time_to can optionally be
  specified for the merge.
rS  zrb+N)rn   
file_merge)	path_frompath_to	time_fromtime_tor%  fh_fromfh_tos          r   mergerq    sv     It A	gu	 A	7C@A AA AA A AA A A   A<	AA	AAc                 p   t        |       }t        |      }|d   |d   k7  r%t        | j                  d|j                  d      |t        t	        j                               }||}n|}||}nd}||k  rt        d      |d   }	|	j                  t        j                  d             |	D ]  }
|}|}|||
d   z
  k  r||
d   z
  }|||
d   z
  k  r&t        | |
||      \  }}|\  }}}t        t        d t        t        |||      |                  }t        |      dk(  rwt        |||
|        y )	Nr    and zD archive configurations are unalike. Resize the input before mergingr   ztime_to must be >= time_fromr   r   c                     | d   d uS )Nr   r'   )rF   s    r   r*   zfile_merge.<locals>.<lambda>B  s    VAYd* r   )r   NotImplementedErrorr   r>   r   r5   r   operator
itemgetterr^  listr   r   r   r   r8  )ro  rp  rm  rn  r%  
headerFromheaderTorX  rW  r   r   archiveFrom	archiveTord  r   startendarchive_steppointsToWrites                      r   rj  rj    ss   G$*% (
x
33
+2<<EF F 	[
diik
CIIHH 
3
44
#(
--H''4-5 CgKIS7;///'+..k3---(';	RXv!)UC*
6%l+V46 7M =Q%7MB!Cr   c           	          t        | d      5 }t        |d      5 }t        |||||      cddd       cddd       S # 1 sw Y   nxY w	 ddd       y# 1 sw Y   yxY w)zS Compare two whisper databases. Each file must have the same archive configuration rS  N)rn   	file_diff)rk  rl  ignore_empty
until_timer%  ro  rp  s          r   r(  r(  J  st    It F	gt	 Fw|ZEF FF FF F FF F Frr  c           	         t        |       }t        |      }|d   |d   k7  r%t        | j                  d|j                  d      |d   }|j                  t	        j
                  d             g }|t        t        j                               }|r|}	n|}	t        |      D ]  \  }
}g }||d   z
  }t        | |||	      \  }t        ||||	      \  }t        |d   |d         t        |d   |d         t        |d   |d         	 c}t        fd	t        d|z
  z              }|r|D cg c]  }|d   	|d   | }}n|D cg c]  }|d   |d   | }}|D cg c]  }|d   |d   k7  s| }}|j                  |
||j                         f       t        ||	      }	 |S c c}w c c}w c c}w )
Nr   rt  zD archive configurations are unalike. Resize the input before diffingr   r   r   r   r   c                 &    | z  z   |    |    fS r&   r'   )r6   r  
fromValuesr~  toValuess    r   r*   zfile_diff.<locals>.<lambda>r  s     A,u4jmXa[Q r   )r   rv  r   r   rw  rx  r>   r   r   r^  r   r   mapr   r   __len__)ro  rp  r  r  r%  rz  r{  r   archive_diffsrX  archive_numberr   diffs	startTimefromTimeInfo
toTimeInfor  rF   r0  r  r  r~  r  s                      @@@@r   r  r  Q  s   G$*% (
x
33
-4\\5::	GH H 
#(
--H''4-5-[
diik
CII!*8!4 *ngEgk**I)Y? \:,UGY	RZ	\!_jm	,	\!_jm	,	\!_jm	,	. UC
 QC%KL89;F!KaQqT%5!A$:JKfK!JaQqT%519IJfJ/1!A$!A$,Q/E/.%1ABCIy)I+*, 
 LJ/s*   ;
F;F;F;G 'G 1GGr&   )NN)NNFF)NNN)FNN)k	itertoolsrw  r   platformr@   r   sysr   r   zipr   filterr   version_inforanger   r   CAN_LOCKImportErrorctypesctypes.utilr   r   r   fadviser   r   utilfind_library	libc_nameCDLLlibcc_int64	c_off64_tc_intc_off_tunameposix_fallocate64r   restypeargtypesAttributeErrorposix_fallocater   r   r   r   r   r   r   r   calcsizelongSizer   	floatSizevalueFormat	valueSizer   r   r   r   r   r   dictr   itemsr   r   aggregationMethodsr   r   r   r?   r8   rI   r`   rK   rR   rU   rW   rY   r[   r^   rp   r   r   r   r   r   r   r   r   r   r"  r&  r$  r4  r2  r8  r   rZ  rV  r^  rq  rj  r(  r  )r)   r  s   00r   <module>r     s  8   	  	  
 y&#&
)Y
/v&(-338+ 	kk&&s+)	Y	$nn)LL'X^^aI%nnG
''JJ!<<I>J ( I
	 	
6??:&FOOK(	FOOK(	FOOK(	v~. !&//"34


	  	  3J3P3P3RS41aAST ,335  4 4 4
X 
,:+y +
+ 
$/ $
* 
* 
@* @
/) /	'ST4n$;8<7;t DH&+GT@2Vr27t- %POdE"2;jHVA,C^F,G!  (  -  +& 
 ''j!<<j#\\7G<j mb  Tsr   J. 
J< "K
 (1K L$
.J98J9<KK
KKL!1LL!LL!LL! L!