ó
    �ÿËjQ  ã                   óþ   • % S r SSKrSSKrSSKrSSKrSSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SSKJr  \R"                  " S	5      rS
rSrSrSq\S-  \S'   SrS\4S jrS\S-  4S jrS\4S jrSS jrSS jrg)u-  
backup_service.py â€” copies de sÃ©curitÃ© automatiques de la base MySQL.

Toutes les 24 h (et une fois au dÃ©marrage), Ã©crit BACKUPS_DIR/meeconic_YYYYMMDD_HHMM.sql.gz : un dump SQL
(structure + donnÃ©es) fait en Python, donc sans dÃ©pendre du binaire `mysqldump` sur le serveur. Il se
restaure avec `gunzip -c fichier.sql.gz | mysql meeconic`. Purge les copies de plus de BACKUP_RETENTION_DAYS
jours. Un Ã©chec dÃ©clenche une alerte e-mail. (Les photos ne sont volontairement pas sauvegardÃ©es : les
originaux restent sur le serveur FTP du photographe.)
é    N)ÚDecimal)ÚPath)ÚBACKUPS_DIR)Úget_db)Úutcnow)Úalert_servicezmeeconic.backupé€Q é   iô  Úlast_backup_at))Ú\z\\)Ú'ú'')Ú
z\n)Úz\r)Ú z\0)Úz\ZÚreturnc                 ó‚  • U c  g[        U [        5      (       a  U (       a  S$ S$ [        U [        [        [        45      (       a  [        U 5      $ [        U [        [        45      (       a%  U (       a  S[        U 5      R                  5       -   $ S$ [        U 5      n[         H  u  p#UR                  X#5      nM     SU S3$ )NÚNULLÚ1Ú0Ú0xr   r   )Ú
isinstanceÚboolÚintÚfloatr   ÚstrÚbytesÚ	bytearrayÚhexÚ_ESCAPESÚreplace)ÚvÚsÚrawÚescs       ÚZD:\Ingenieria\TRABAJOS ONLINE\Projects\11- Photo School\backend\services\backup_service.pyÚ_sql_literalr(   "   sŸ   € Ø�yØÜ�!”T×ÑÞˆsÐ ˜SÐ Ü�!”cœ5¤'Ð*×+Ñ+Ü�1‹vˆÜ�!”eœYÐ'×(Ñ(Þ()ˆt”e˜A“h—l‘l“nÑ$Ð3¨tÐ3ÜˆA‹€Aß‰ˆØ�I‰I�cÓŠñ àˆqˆc�ˆ8€Oó    c                  óv  • [         R                  " SSS9  [         S[        5       R                  S5       S3-  n U R	                  U R
                  S-   5      n[        5        n[        R                  " USSS	S
9 nUR                  S5        UR                  S5      R                  5        Vs/ s H  n[        UR                  5       5      S   PM!     nnU GH  nUR                  SU S35      R                  5       nUR                  SU S[        UR                  5       5      S    S35        UR                  SU S35      R                  5       n[        S[!        U5      ["        5       Hj  n	X‰U	["        -    n
SR%                  S U
S   R'                  5        5       5      nSR%                  S U
 5       5      nUR                  SU SU SU S35        Ml     GM     UR                  S5        S S S 5        S S S 5        UR)                  U 5        U $ s  snf ! , (       d  f       N.= f! , (       d  f       N7= f)NT)ÚparentsÚexist_okÚ	meeconic_z%Y%m%d_%H%Mz.sql.gzz.tmpÚwtzutf-8r   )ÚencodingÚnewlinez-SET FOREIGN_KEY_CHECKS=0;
SET NAMES utf8mb4;
zSHOW TABLESr   zSHOW CREATE TABLE `Ú`z
DROP TABLE IF EXISTS `z`;
é   z;
zSELECT * FROM `ú, c              3   ó.   #   • U  H  nS U S 3v •  M     g7f)r1   N© )Ú.0Úcs     r'   Ú	<genexpr>Ú_backup_once.<locals>.<genexpr>>   s   é € Ð C²?¨a 1 Q C q¥²?ùs   ‚z,
c              3   óz   #   • U  H1  nS SR                  S UR                  5        5       5      -   S-   v •  M3     g7f)Ú(r3   c              3   ó8   #   • U  H  n[        U5      v •  M     g 7f)N)r(   )r6   r#   s     r'   r8   Ú)_backup_once.<locals>.<genexpr>.<genexpr>?   s   é € Ð3XÊZÈ´LÀ·O°OÊZùs   ‚Ú)N)ÚjoinÚvalues)r6   Úrs     r'   r8   r9   ?   s3   é € Ð#nÒhmÐcd C¨$¯)©)Ñ3XÈQÏXÉXÌZÓ3XÓ*XÑ$XÐ[^Ö$^Òhmùs   ‚9;zINSERT INTO `z` (z	) VALUES
z
SET FOREIGN_KEY_CHECKS=1;
)r   Úmkdirr   ÚstrftimeÚ	with_nameÚnamer   ÚgzipÚopenÚwriteÚexecuteÚfetchallÚlistr@   ÚfetchoneÚrangeÚlenÚ_BATCHr?   Úkeysr"   )ÚdestÚtmpÚconnÚoutrA   ÚtablesÚtableÚcreateÚrowsÚkÚchunkÚcolsr@   s                r'   Ú_backup_oncer\   1   sÜ  € Ü×Ò˜d¨TÒ2Ü˜9¤V£X×%6Ñ%6°}Ó%EÐ$FÀgÐNÑN€DØ
�.‰.˜Ÿ™ VÑ+Ó
,€CÜ	Œ�Tœ4Ÿ9š9 S¨$¸È$ÒOÐSVØ�	‰	ÐCÔDØ/3¯|©|¸MÓ/J×/SÑ/SÔ/UÓVÒ/U¨!”$�q—x‘x“zÓ" 1Ô%Ñ/UˆÐVÜˆEØ—\‘\Ð$7¸°w¸aÐ"@ÓA×JÑJÓLˆFØ�I‰IÐ0°°°t¼DÀÇÁÃÓ<QÐRSÑ<TÐ;UÐUXÐYÔZØ—<‘< /°%°¸Ð :Ó;×DÑDÓFˆDÜ˜1œc $›i¬Ö0�Ø˜q¤6™zÐ*�Ø—y‘yÑ C°5¸±8·=±=´?Ó CÓC�ØŸ™Ñ#nÑhmÓ#nÓn�Ø—	‘	˜M¨%¨°°D°6¸ÀFÀ8È3ÐOÖPô	 1ñ	 ð 	�	‰	Ð1Ô2÷ P�ð ‡K�K�ÔØ€Kùò W÷ PÕOú��ús7   Á"H*Á:3HÂ-&HÃDHÇ1H*ÈHÈ
H'	È#H*È*
H8c                  ó€  • [         R                  " 5       (       d  g[        R                  " 5       [        S-  -
  n Sn[         R                  " S5       H9  n UR                  5       R                  U :  a  UR                  5         US-  nM9  M;     U$ ! [         a!  n[        R                  SX#5         S nAMe  S nAff = f)Nr   r	   zmeeconic_*.sql.gzr2   z$Suppression backup impossible %s: %s)r   Úis_dirÚtimeÚBACKUP_RETENTION_DAYSÚglobÚstatÚst_mtimeÚunlinkÚOSErrorÚlogÚwarning)ÚcutoffÚdeletedÚfÚes       r'   Ú
_purge_oldrl   F   s£   € Ü×Ò×ÑØÜ�YŠY‹[Ô0°5Ñ8Ñ8€FØ€GÜ×ÒÐ1Ö2ˆð	FØ�v‰v‹x× Ñ  6Ó)Ø—‘”
Ø˜1‘’ñ *ñ 3ð €Nøô ó 	FÜ�K‰KÐ>À×EÒEûð	Fús   Á3BÂ
B=ÂB8Â8B=c                  óð   • [        5       n U (       a8  [        5       R                  5       q[        R                  SU R                  5        [        5       nU(       a  [        R                  SU[        5        g g )NzDB backup created: %sz#%d old backup(s) purged (> %d days))	r\   r   Ú	isoformatr   rf   ÚinforE   rl   r`   )rQ   Úpurgeds     r'   Úrun_oncerq   U   sP   € ä‹>€DÞÜ›×+Ñ+Ó-ˆÜ�‰Ð(¨$¯)©)Ô4Ü‹\€FÞÜ�‰Ð6¸Ô@UÕVð r)   c               ƒ   ód  #   •   [         R                  " [        5      I S h  v•N   [         R                  " [        5      I S h  v•N   MG   N(! [         R                   a    e [         a@  n [
        R                  SU SS9  [        R                  " SS[        U 5      5         S n A NS n A ff = f Ni7f)NTzErreur backup DB: %s)Úexc_infozbackup-failedu   Le backup de la base a Ã©chouÃ©)ÚasyncioÚ	to_threadrq   ÚCancelledErrorÚ	Exceptionrf   Úerrorr   Únotifyr   ÚsleepÚ_BACKUP_INTERVAL)rk   s    r'   Úrun_backup_loopr|   `   s—   é € Ø
ð	]Ü×#Ò#¤HÓ-×-Ð-ô �mŠmÔ,Ó-×-Ð-ñ á-øÜ×%Ñ%ó 	ØÜó 	]Ü�I‰IÐ,¨a¸$ˆIÑ?Ü× Ò  Ð2SÔUXÐYZÓU[×\Ñ\ûð	]úñ 	.ùsI   ‚B0…A ¢A£A §B0ÁB.ÁB0ÁA ÁB+Á+6B&Â!B0Â&B+Â+B0)r   N) Ú__doc__rt   rF   Úloggingr_   Údecimalr   Úpathlibr   Úcore.configr   Úcore.dbr   Úcore.timeutilr   Úservicesr   Ú	getLoggerrf   r{   r`   rO   r   r   Ú__annotations__r!   r(   r\   r   rl   rq   r|   r5   r)   r'   Ú<module>r‡      s•   ðòó Û Û Û Ý Ý å #Ý Ý  Ý "à×ÒÐ)Ó*€àÐ ØÐ Ø	€à!€��d‘
Ó !ð i€ð�sô ð�d˜T‘kô ð*�Cô ôWõ	.r)   