
    qj%0                       d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ dd	lmZm Z  dd
l!m"Z"m#Z# ddl$m%Z% ddl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-  e	d      Z. edd       G d d             Z/ edd       G d d             Z0ddZ1ddZ2ddZ3 G d d      Z4y)z;Private append-only persistence for weekly day-status rows.    )annotationsN)Callable)	dataclass)TypeVar)AppendResultCustomerIdentityDigestCustomerKeyDayStateRepairResultWEEKLY_OPERATIONS_SCHEMAZERO_DIGESTWeeklyOperationInputWeeklyOperationRowWeeklyOperationsConflictWeeklyOperationsCorruptionWeeklyOperationsInputErrorcanonical_weekly_rowcustomer_identity_digestcustomer_storage_digestoperation_logical_keyweekly_row_digest)WeeklyOperationsAuthorityRoot)validate_history_bytesvalidate_weekly_rows)validate_bound_repair_lockvalidate_bound_repair_payload)publish_repaired_prefix)FileIdentitySidecarDirectorylocked_repair_sidecarlocked_sidecaropen_existing_fileopen_or_create_fileverify_file_TT)frozenslotsc                  "    e Zd ZU ded<   ded<   y)_FileSnapshotbytesdataFileIdentity | NoneidentityN__name__
__module____qualname____annotations__     /home/cube/projects/richard/traning coach/task-12-independent-verification-r9/build/hermes-full/dualcoach/profile/checkin_cli/weekly_operations_store.pyr)   r)   /   s    
K!!r4   r)   c                  ,    e Zd ZU ded<   ded<   ded<   y)_LockedHistoryr   	directorytuple[WeeklyOperationRow, ...]rowsr,   r-   Nr.   r3   r4   r5   r7   r7   5   s    
((!!r4   r7   c                   	 t        | j                  | j                  t        j                        }	 g }t        j                  |j                  d      x}r4|j                  |       t        j                  |j                  d      x}r4| j                          t        | j                  | j                  t        j                  |j                              }t        dj                  |      |j                        t        j                  |j                         S # t
        $ r t        dd       cY S w xY w# t        j                  |j                         w xY w)Nr4      )r"   plans	data_nameosO_RDONLYFileNotFoundErrorr)   read
descriptorappendverifyr$   fstatjoinr-   close)r8   openedchunkschunk_s        r5   _read_privaterM   <   s   (#IOOY5H5H"++V$ wwv00%88e8MM%  wwv00%88e8	)<)<bhhvGXGX>YZSXXf-v?
""#  (S$''( 	""#s$   /D AD7 
A2D7 D43D47!Ec                :   | j                          t        | j                  | j                  t        j
                  t        j                  z        }	 ||j                  r||j                  |k7  rt        d      | j                          d}|t        |      k  r5|t	        j                  |j                  ||d        z  }|t        |      k  r5t        | j                  | j                  t	        j                  |j                              }t	        j                  |j                         |j                  rt	        j                  | j                         t	        j                   |j                         y # t	        j                   |j                         w xY w)Nz'sidecar data was replaced before appendr   )rE   r#   r=   r>   r?   O_WRONLYO_APPENDcreatedr-   r   lenwriterC   r$   rF   fsyncrH   )r8   payloadexpectedrI   offsetrL   s         r5   _append_privaterX   L   s)    )2E2Er{{UWU`U`G`aF$V^^9MRXRaRaemRm,-VWWs7|#bhhv00'&'2BCCF s7|#	)<)<bhhvGXGX>YZ
""#>>HHY__%
""#""#s   A>E9 BE9 9!Fc                    t        j                  | dt         j                        }g }t        j                  | d      x}r*|j	                  |       t        j                  | d      x}r*dj                  |      S )Nr   r<   r4   )r?   lseekSEEK_SETrB   rD   rG   )rC   rL   rJ   rK   s       r5   _read_open_filer\   ^   sf    
Q,AF77:u-
-%
-e 77:u-
-%
-88Fr4   c                      e Zd ZdZddZedd       Zedd       ZddZ	ddZ
	 	 	 	 ddZddZ	 	 	 	 	 	 dd	Zdd
ZddZddZddddZedd       Zd dZy)!WeeklyOperationsStorez@Own one customer's hash-chained weekly-operations JSONL sidecar.c                    t        |      }|j                          |j                  #|j                  t        |      k7  rt	        d      || _        || _         y )N"repair authority customer mismatch)r   rE   repair_target_digestr   r   	authority)selfrb   customer_keyr-   s       r5   __init__zWeeklyOperationsStore.__init__i   sS    +L9))5):X:X\st|\}:},-QRR8A@H%r4   c                v    | j                   j                          | j                   j                  j                  S )zAExpose the verified sidecar authority pin without its capability.)rb   rE   bindingbinding_digestrc   s    r5   authority_binding_digestz.WeeklyOperationsStore.authority_binding_digestq   s*     	~~%%444r4   c                     | ||      S Nr3   )clsrb   rd   s      r5   for_authorityz#WeeklyOperationsStore.for_authorityw   s    9l++r4   c                F    | j                   j                  t        d      y )Nzrepair-only authority)rb   ra   r   ri   s    r5   _require_normal_authorityz/WeeklyOperationsStore._require_normal_authority{   s#    >>..:,-DEE ;r4   c                   | j                          |j                  | j                  k7  rt        d      t        | j                  | j                  d      5 }| j                  || j                  |            cddd       S # 1 sw Y   yxY w)z?Append one valid transition or return its exact durable replay.wrong customer identityT	exclusiveN)rp   r   r   r!   rb   _append_locked_locked_history)rc   	operationr8   s      r5   rD   zWeeklyOperationsStore.append   sp    &&(--1N1NN,-FGGDNND,I,IUYZ^g&&y$2F2Fy2QR [ZZs   !BBc                l   | j                          t        | j                  | j                  d      5 }| j	                  |      } ||j
                        \  }}|d|fcddd       S |j                  | j                  k7  rt        d      | j                  ||      |fcddd       S # 1 sw Y   yxY w)zBDecide and append at most once under this customer's sidecar lock.Trs   Nrr   )rp   r!   rb   r   rv   r:   r   ru   )rc   decider8   historyrw   results         r5   transactzWeeklyOperationsStore.transact   s    
 	&&(DNND,I,IUYZ^g**95G &w|| 4Iv V|	 [Z
 11T5R5RR01JKK&&y':FB [ZZs   ,B*)7B**B3c                    | j                  |d      \  }}}}||k7  rt        d      | j                  |       t        |t	        |      |      S )NFallow_torn_tail1sidecar has a torn tail; explicit repair required)
_read_rowsr   _validate_rowsr7   tuple)rc   r8   r:   complete_endsizer-   s         r5   rv   z%WeeklyOperationsStore._locked_history   sS    -1__YX]_-^*lD(4,-`aaD!ith??r4   c                   
 t        |j                        }t         fd|D        d       }|t        |d      S t	        fd|D              } j                  |      
t        
fd|D              rt        d      j                  j                  }}t        t        j                  j                  j                  j                  j                   j                  j"                  |d n|j$                  |d n|j&                  |d n|j(                  |d n|j*                  |r|d   j,                  nt.        j0                  
t.              }|j3                  d	t5        |      i
      }	 j7                  g ||	d       t9        |j:                  t=        |	d      dz   |j>                         t        |	d      S )Nc              3  H   K   | ]  }j                  |      s|  y wrl   )_matches).0rowrw   rc   s     r5   	<genexpr>z7WeeklyOperationsStore._append_locked.<locals>.<genexpr>   s     LdsdmmC.Ksds   ""F)r   appendedc              3  V   K   | ]   }|j                   j                   k(  s| " y wrl   )kst_day)r   r   rw   s     r5   r   z7WeeklyOperationsStore._append_locked.<locals>.<genexpr>   s#     Qy?P?P0Ps   ))c              3  <   K   | ]  }|j                   k(    y wrl   )logical_key)r   r   r   s     r5   r   z7WeeklyOperationsStore._append_locked.<locals>.<genexpr>   s     >#s+-s   z-duplicate logical key has conflicting content)schema_versionr   r   statecanonical_sequencecanonical_digestsource_event_idsource_event_digestreminder_reservation_idreminder_audit_idpredecessor_row_digestoccurred_at_kstr   
row_digestr   )updateT	candidate)include_digest   
) listr:   nextr   r   _logical_keyanyr   sourcereminderr   r   r   r   r   	canonicalsequencedigestevent_idevent_digestreservation_idaudit_idr   r   occurred_at
model_copyr   r   rX   r8   r   r-   )rc   rw   rz   r:   replayday_rowsr   r   provisionalr   r   s   ``        @r5   ru   z$WeeklyOperationsStore._append_locked   s    GLL!LdLdSFU;;QQQ''	8<>>>*+Z[[$++Y-?-?(3%.%G%G%%//(22;;&0077$*ND(.F<O<O,4,<D(BYBY&.&6dH<M<M:>48#6#6K%11#"
  $$\;L[;Y,Z$[LdLCLD9 T:UB	

 d33r4   c                   | j                          t        | j                  | j                  d      5 }| j	                  |d      \  }}}}||k7  rt        d      | j                  |       t        |      cddd       S # 1 sw Y   yxY w)z8Read only a complete, valid sidecar under a shared lock.Frs   r~   r   N)rp   r!   rb   r   r   r   r   r   )rc   r8   r:   r   r   rL   s         r5   rB   zWeeklyOperationsStore.read   sz    &&(DNND,I,IUZ[_h*.//)UZ/*['D,at#01dee%; \[[s   ABB
c                   | j                   j                  }|t        d      |j                  | j                  k7  rt        d      t	        | j                   | j                  |      5 }t        |j                        }t        |t        j                  |j                        |      }t        |j                        }t        |t        j                  |j                        |       |d|j                   }t        |j                  j                  |j                  j                   ||j"                         | j                   j%                          t'        |j                        }t)        |j*                  |j,                  | j                        }|j.                  |j                  k7  rt1        d      t3        t5        |j6                        |j8                        cddd       S # 1 sw Y   yxY w)z6Remove only the strictly bound positive torn fragment.Nzrepair authority requiredr`   )expected_customerzrepair result size disagrees)rb   repair_bindingr   r   r    r\   data_descriptorr   r?   rF   lock_descriptorr   valid_prefix_offsetr   r8   r=   r>   data_identityverify_complete_lockedrM   r   r+   r   r   r   r   rR   r:   torn_tail_length)	rc   rg   lockedcurrentrL   
lock_bytesprefixrepaired_snapshot	validateds	            r5   repair_torn_tailz&WeeklyOperationsStore.repair_torn_tail   s   ..//?,-HII++t/L/LL,-QRR"4>>43P3PRYZ^d%f&<&<=G-grxx@V@V7WY`aA()?)?@J&w9O9O0PR\]:w::;F#F$4$4$:$:F<L<L<V<VX^`g`u`uvNN113 -f.>.> ?./@/E/EwGfGfz~  {X  {X  YI~~!<!<<01OPPINN 3W5M5MN [ZZs   )E5G((G1c                   t        |      }t        |j                  |j                  | j                  |      }t        |j                        |j                  |j                  |j                  fS )N)r   r   )
rM   r   r+   customer_digestr   r   r:   r   r   r-   )rc   r8   r   snapshotr   s        r5   r   z WeeklyOperationsStore._read_rows   s\     +*MM%%";;+	
	 INN#Y%;%;Y^^XM^M^^^r4   Fr   c               4    t        || j                  |       y )Nr   )r   r   )rc   r:   r   s      r5   r   z$WeeklyOperationsStore._validate_rows   s    T4#@#@IVr4   c                   |j                   |j                  }}| j                  |j                  k(  xr | j                  |j                  k(  xr | j                  |j                  u xr | j
                  |j                  j                  k(  xr | j                  |j                  j                  k(  xr | j                  |d n|j                  k(  xrv | j                  |d n|j                  k(  xrW | j                  |d n|j                  k(  xr8 | j                   |d n|j"                  k(  xr | j$                  |j&                  k(  S rl   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   rw   r   r   s       r5   r   zWeeklyOperationsStore._matches   sp   $++Y-?-?++y/Q/QQ  	VYVaVaenevevVv  	{~  |E  |E  IR  IX  IX  |X  	  ]`  ]s  ]s  w@  wJ  wJ  wS  wS  ]S  	  X[  Xl  Xl  py  pC  pC  pJ  pJ  XJ  	  OR  Ob  Ob  ou  o}  gk  CI  CR  CR  OS  	  X[  Xo  Xo  |B  |J  tx  PV  Pc  Pc  Xd  	  il  iD  iD  QY  Qa  IM  go  g~  g~  i  	  DG  DY  DY  fn  fv  ^b  |D	  |M	  |M	  DN	  	  S	V	  S	f	  S	f	  j	s	  j		  j		  S		  		r4   c                ,   |sd}no|d   j                   t        j                  u r|j                   t        j                  u rd}n1|j                  d|j                  j
                   }nt        d      t        | j                  |j                  |      S )Nterminalr   latezsource:z)same-state append requires source lineage)
r   r
   MISSEDLATE_SUBMITTEDr   r   r   r   r   r   )rc   rw   r   r-   s       r5   r   z"WeeklyOperationsStore._logical_key   s    !Hb\8??2y(JaJa7aH) !1!1!:!: ;<H*+VWW$T%B%BIDUDUW_``r4   N)rb   r   rd   r	   returnNone)r   str)rb   r   rd   r	   r   r^   )r   r   )rw   r   r   r   )ry   zRCallable[[tuple[WeeklyOperationRow, ...]], tuple[WeeklyOperationInput | None, _T]]r   ztuple[AppendResult | None, _T])r8   r   r   r7   )rw   r   rz   r7   r   r   )r   r9   )r   r   )r8   r   r   boolr   z>tuple[list[WeeklyOperationRow], int, int, FileIdentity | None])r:   zlist[WeeklyOperationRow]r   r   r   r   )r   r   rw   r   r   r   )rw   r   r   r9   r   r   )r/   r0   r1   __doc__re   propertyrj   classmethodrn   rp   rD   r|   rv   ru   rB   r   r   r   staticmethodr   r   r3   r4   r5   r^   r^   f   s    JI 5 5
 , ,FSCbC 
(C@#4-#48F#4	#4JO*_ SX W 	 		ar4   r^   )r8   r   r   r)   )r8   r   rU   r*   rV   r,   r   r   )rC   intr   r*   )5r   
__future__r   r?   collections.abcr   dataclassesr   typingr   checkin_cli.weekly_operationsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   'checkin_cli.weekly_operations_authorityr   %checkin_cli.weekly_operations_historyr   r   $checkin_cli.weekly_operations_repairr   r   ,checkin_cli.weekly_operations_repair_publishr    checkin_cli.weekly_operations_fsr   r   r    r!   r"   r#   r$   r%   r)   r7   rM   rX   r\   r^   r3   r4   r5   <module>r      s    A " 	 $ !     & R ^ j P   T] $d#" " $"
 $d#" " $"$ $$Va Var4   