Ë
    V.jub  ã                   óX  — 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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mZ  ej                   «       j"                  Zedk(  rd„ Znd„ Zd„ Zdd„Zdd„Z G d	„ d
e«      Z G d„ d«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zy)é    N)ÚserverversionÚWindowsc                 ó2   — | j                  d«      r| S | dz   S )Nz.exe)Úendswith©Únames    úQC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\asyncpg/cluster.pyÚplatform_exer
      s   € Ø�=‰=˜Ô ØˆKØ�f‰}Ðó    c                 ó   — | S ©N© r   s    r	   r
   r
   #   s   € Øˆr   c                  ó8  — t        j                   t         j                  t         j                  «      } 	 | j                  d«       | j	                  «       d   | j                  «        S # t        $ r Y | j                  «        y w xY w# | j                  «        w xY w)N)ú	127.0.0.1r   é   )ÚsocketÚAF_INETÚSOCK_STREAMÚbindÚgetsocknameÚcloseÚ	Exception)Úsocks    r	   Úfind_available_portr   '   ss   € Ü�=‰=œŸ™¬×);Ñ);Ó<€DðØ�	‰	Ð"Ô#Ø×ÑÓ! !Ñ$ð 	�
‰
�øô ò Øà�
‰
�ðûð 	�
‰
�ús#   ´#A( Á(	BÁ1B ÂBÂB ÂBc                 óF  — dj                  t        j                  t        j                  d¬«      «      }|€t        j                  «       }|€t        j                  «       }| €d} t        j                  j                  |||z   | z   «      }t        j                  |d«       |S )NÚ é   )Úkií  )ÚjoinÚrandomÚchoicesÚstringÚascii_lowercaseÚtempfileÚ
gettempdirÚgettempprefixÚosÚpathÚmkdir)ÚsuffixÚprefixÚdirr   Úfns        r	   Ú_world_readable_mkdtempr.   2   s�   € Ø�7‰7”6—>‘>¤&×"8Ñ"8¸AÔ>Ó?€DØ
€{Ü×!Ñ!Ó#ˆØ€~Ü×'Ñ'Ó)ˆØ€~ØˆÜ	�‰�‰�c˜6 D™=¨6Ñ1Ó	2€BÜ‡H�HˆR�ÔØ€Ir   c                 óš   — t         dk(  r,t        j                  j                  d«      rt	        | ||«      S t        j                  | ||«      S )Nr   ÚGITHUB_ACTIONS)Ú_systemr'   ÚenvironÚgetr.   r$   Úmkdtemp©r*   r+   r,   s      r	   Ú_mkdtempr6   ?   s@   € Ü�)Ò¤§
¡
§¡Ð/?Ô @ô ' v¨v°sÓ;Ð;ä×Ñ ¨°Ó4Ð4r   c                   ó   — e Zd Zy)ÚClusterErrorN)Ú__name__Ú
__module__Ú__qualname__r   r   r	   r8   r8   I   s   „ Ør   r8   c                   óÎ   — e Zd Zddœd„Zd„ Zd„ Zd„ Zd„ Zd!d„Zd	„ Z	d"i d
œd„Z
d„ Zd"d„Zd„ Zd„ Zd„ Zd„ Zdddœd„Zd„ Zddddœd„Zd„ Zd„ Zd„ Zd„ Zd"d„Zd„ Zd„ Zd„ Zd „ Zy)#ÚClusterN©Úpg_config_pathc                óð   — || _         || _        t        j                  j	                  d«      xs t        j                  j	                  d«      | _        d | _        d | _        d | _        d | _	        d | _
        y )NÚPGINSTALLATIONÚPGBIN)Ú	_data_dirÚ_pg_config_pathr'   r2   r3   Ú_pg_bin_dirÚ_pg_ctlÚ_daemon_pidÚ_daemon_processÚ_connection_addrÚ_connection_spec_override)ÚselfÚdata_dirr?   s      r	   Ú__init__zCluster.__init__N   sh   € Ø!ˆŒØ-ˆÔä�J‰J�N‰NÐ+Ó,ò 'Ü�z‰z�~‰~˜gÓ&ð 	Ôð ˆŒØˆÔØ#ˆÔØ $ˆÔØ)-ˆÕ&r   c                 ó   — | j                   S r   )Ú_pg_version©rK   s    r	   Úget_pg_versionzCluster.get_pg_version[   s   € Ø×ÑÐr   c                  ó   — y)NTr   rP   s    r	   Ú
is_managedzCluster.is_managed^   s   € Ør   c                 ó   — | j                   S r   )rC   rP   s    r	   Úget_data_dirzCluster.get_data_dira   s   € Ø�~‰~Ðr   c                 ó8  — | j                   €| j                  «        t        j                  | j                   dd| j                  gt        j
                  t        j
                  ¬«      }|j                  |j                  }}|j                  dk(  sHt        j                  j                  | j                  «      rt        j                  | j                  «      sy|j                  dk(  ry|j                  dk(  rt        j                  d	|j                  «       «      }|s(t!        d
j#                  |j                  «       «      «      ‚t%        |j'                  d«      «      | _        | j+                  d¬«      S t!        dj#                  |j                  |«      «      ‚)NÚstatusú-D©ÚstdoutÚstderré   únot-initializedé   Ústoppedr   z.*PID\s?:\s+(\d+).*z(could not parse pg_ctl status output: {}r   ©Útimeoutz)pg_ctl status exited with status {:d}: {})rF   Ú	_init_envÚ
subprocessÚrunrC   ÚPIPErZ   r[   Ú
returncoder'   r(   ÚexistsÚlistdirÚreÚmatchÚdecoder8   ÚformatÚintÚgrouprG   Ú_test_connection)rK   ÚprocessrZ   r[   Úrs        r	   Ú
get_statuszCluster.get_statusd   s9  € Ø�<‰<ÐØ�N‰NÔä—.‘.Ø�\‰\˜8 T¨4¯>©>Ð:Ü—?‘?¬:¯?©?ô<ˆð !Ÿ™¨¯©�ˆà×Ñ !Ò#¬2¯7©7¯>©>¸$¿.¹.Ô+IÜ—J‘J˜tŸ~™~Ô.Ø$Ø×Ñ 1Ò$ØØ×Ñ 1Ò$Ü—‘Ð/°·±³ÓAˆAÙÜ"Ø>×EÑEØŸ™›ó)ó*ð *ô  # 1§7¡7¨1£:›ˆDÔØ×(Ñ(°Ð(Ó3Ð3äØ;×BÑBØ×&Ñ&¨ó0ó1ð 1r   c              ‹   óŽ   K  — | j                  «       }|j                  |«       t        j                  dd|i|¤Žƒ d {  –—† S 7 Œ­w)NÚloopr   )Úget_connection_specÚupdateÚasyncpgÚconnect)rK   rt   ÚkwargsÚ	conn_infos       r	   rx   zCluster.connect   s?   è ø€ Ø×,Ñ,Ó.ˆ	Ø×Ñ˜Ô Ü—_‘_Ñ<¨$Ð<°)Ñ<×<Ð<Ð<ús   ‚<A¾A¿Ac                 óð  — | j                  «       dk7  r$t        dj                  | j                  «      «      ‚t	        |«      }d|vrd|d<   |rI|j                  «       D ��cg c]  \  }}dj                  ||«      ‘Œ }}}dgdj                  |«      gz   }ng }t        j                  | j                  d¬	«       t        j                  | j                  d
d| j                  g|z   t        j                  t        j                  | j                  ¬«      }|j                  }|j                  dk7  r3t        dj                  |j                  |j!                  «       «      «      ‚|j!                  «       S c c}}w )úInitialize cluster.r]   ú,cluster in {!r} has already been initializedÚencodingzUTF-8ú--{}={}ú-oÚ T)Úexist_okÚinitrX   ©rZ   r[   Úcwdr   z'pg_ctl init exited with status {:d}:
{})rr   r8   rl   rC   ÚdictÚitemsr   r'   Úmakedirsrc   rd   rF   re   ÚSTDOUTrZ   rf   rk   )rK   Úsettingsr   ÚvÚsettings_argsÚ
extra_argsrp   Úoutputs           r	   rƒ   zCluster.init„   sQ  € à�?‰?ÓÐ 1Ò1ÜØ>×EÑEØ—N‘Nó$ó%ð %ô ˜“>ˆØ˜XÑ%Ø#*ˆH�ZÑ áà)1¯©Ô)9ô;Ù)9¡  Að '×-Ñ-¨a°Õ3Ø)9ð ñ ;à˜ 3§8¡8¨MÓ#:Ð";Ñ;‰JàˆJä
�‰�D—N‘N¨TÕ2Ü—.‘.Ø�\‰\˜6 4¨¯©Ð8¸:ÑEÜ—?‘?Ü×$Ñ$Ø—‘ô	
ˆð —‘ˆà×Ñ Ò"ÜØ:×AÑAØ×&Ñ&¨¯©«ó9ó:ð :ð �}‰}‹Ðùó+;s   Á!E2©Úserver_settingsc                óº  — | j                  «       }|dk(  ry|dk(  r$t        dj                  | j                  «      «      ‚|j	                  dd«      }|dk(  r
t        «       }|j                  «       D ��cg c]  \  }}dj                  ||«      ‘Œ }}}|j                  dj                  |«      «       |j                  d	«      }	|	€|j                  d
«      }	|	€t        dk7  rt        j                  «       }	|j                  d«      }
|
rkt        j                  j                  | j                  d«      }t        j                   |
|«       t        j"                  |d«       |j!                  «       }||d<   |	�| j$                  dk  rd
}nd	}|	||<   |j                  «       D ](  \  }}|j'                  ddj                  ||«      g«       Œ* t        dk(  �rPt        j(                  d«      ret*        j,                  }t/        ddj                  | j0                  dd| j                  ddj                  |«      g«      t*        j2                  ¬«       nt4        j6                  }t5        j8                  | j0                  dd| j                  ddj                  |«      g|t4        j:                  | j                  ¬«      }|j<                  dk7  rý|j2                  r*dj                  |j2                  j?                  «       «      }nd}t        dj                  |j<                  |«      «      ‚t        j(                  d«      rt*        j,                  }nt4        j6                  }t5        j@                  | jB                  d| j                  g|¢|t4        j:                  | j                  ¬«      | _"        | jD                  jF                  | _$        | jK                  |¬«       yc c}}w )zStart the cluster.ÚrunningNr]   z(cluster in {!r} has not been initializedÚportÚdynamicr   z	--port={}Úunix_socket_directoriesÚunix_socket_directoryr   Ússl_key_filez
srvkey.pemi€  )é	   r^   z-cú{}={}ÚASYNCPG_DEBUG_SERVERzasyncpg.cluster: Runningr�   ÚstartrX   r€   ©Úfiler„   r   z:
{}r   z&pg_ctl start exited with status {:d}{}r`   )&rr   r8   rl   rC   Úpopr   r‡   Úappendr3   r1   r$   r%   r'   r(   r   ÚshutilÚcopyÚchmodrO   ÚextendÚgetenvÚsysrZ   ÚprintrF   r[   rc   ÚDEVNULLrd   r‰   rf   rk   ÚPopenÚ	_postgresrH   ÚpidrG   ro   )rK   Úwaitr�   ÚoptsrW   r“   r   r‹   r�   ÚsockdirÚssl_keyÚkeyfileÚsockdir_optrZ   rp   r[   s                   r	   r›   zCluster.start§   sO  € à—‘Ó"ˆØ�YÒØØÐ(Ò(ÜØ:×AÑAØ—N‘Nó$ó%ð %ð �x‰x˜ Ó%ˆØ�9ÒÜ&Ó(ˆDà9=¿¹¼ÔF¹±°°A�i×&Ñ& q¨!Õ,¸ˆ
ÑFØ×Ñ˜+×,Ñ,¨TÓ2Ô3à!×%Ñ%Ð&?Ó@ˆØˆ?Ø%×)Ñ)Ð*AÓBˆGØˆ?œw¨)Ò3Ü×)Ñ)Ó+ˆGà!×%Ñ% nÓ5ˆÙä—g‘g—l‘l 4§>¡>°<Ó@ˆGÜ�K‰K˜ Ô)Ü�H‰H�W˜eÔ$Ø-×2Ñ2Ó4ˆOØ.5ˆO˜NÑ+àÐØ×Ñ &Ò(Ø5‘à7�à+2ˆO˜KÑ(à#×)Ñ)Ö+‰DˆAˆqØ×Ñ˜t W§^¡^°A°qÓ%9Ð:Õ;ð ,ô �iÓô
 �y‰yÐ/Ô0ÜŸ™�ÜØ.Ø—H‘HØŸ™ g¨t°T·^±^Ø˜cŸh™h zÓ2ðó ô Ÿ™öô $×+Ñ+�ä —n‘nØ—‘˜w¨¨d¯n©nØ�s—x‘x 
Ó+ð-àÜ!×(Ñ(Ø—N‘NôˆGð ×!Ñ! QÒ&Ø—>’>Ø$Ÿ^™^¨G¯N©N×,AÑ,AÓ,CÓD‘Fà�FÜ"Ø<×CÑCØ×*Ñ*¨Fó4ó5ð 5ô �y‰yÐ/Ô0ÜŸ™‘ä#×+Ñ+�ô × Ñ Ø—^‘^ T¨4¯>©>ÐG¸JÐGØ!Ü%×,Ñ,ØŸ™ô	ð Ô ð  $×3Ñ3×7Ñ7ˆDÔà×Ñ dÐÕ+ùó_ Gs   Á4Oc                 óŽ  — | j                  «       }|dk7  rt        d«      ‚t        j                  | j                  dd| j
                  gt        j                  t        j                  | j
                  ¬«      }|j                  }|j                  dk7  r3t        dj                  |j                  |j                  «       «      «      ‚y)	zReload server configuration.r’   z%cannot reload: cluster is not runningÚreloadrX   r„   r   ú'pg_ctl stop exited with status {:d}: {}N)rr   r8   rc   rd   rF   rC   re   r[   rf   rl   rk   )rK   rW   rp   r[   s       r	   r²   zCluster.reload  s£   € à—‘Ó"ˆØ�YÒÜÐFÓGÐGä—.‘.Ø�\‰\˜8 T¨4¯>©>Ð:Ü—?‘?Ü—?‘?Ø—‘ô	
ˆð —‘ˆà×Ñ Ò"ÜØ9×@Ñ@Ø×&Ñ&¨¯©«ó9ó:ð :ð #r   c           
      óä  — t        j                  | j                  dd| j                  dt	        |«      ddgt         j
                  t         j
                  | j                  ¬«      }|j                  }|j                  dk7  r3t        dj                  |j                  |j                  «       «      «      ‚| j                  �2| j                  j                  €| j                  j                  «        y y y )	NÚstoprX   z-tz-mÚfastr„   r   r³   )rc   rd   rF   rC   Ústrre   r[   rf   r8   rl   rk   rH   Úkill)rK   r«   rp   r[   s       r	   rµ   zCluster.stop  sÉ   € Ü—.‘.Ø�\‰\˜6 4¨¯©¸¼sÀ4»yØ�6ðä—?‘?Ü—?‘?Ø—‘ô
ˆð —‘ˆà×Ñ Ò"ÜØ9×@Ñ@Ø×&Ñ&¨¯©«ó9ó:ð :ð × Ñ Ð,Ø×$Ñ$×/Ñ/Ð7Ø× Ñ ×%Ñ%Õ'ð 8ð -r   c                 óª   — | j                  «       }|dk(  s|dk(  r t        j                  | j                  «       y t	        dj                  |«      «      ‚)Nr_   r]   zcannot destroy {} cluster)rr   r    ÚrmtreerC   r8   rl   ©rK   rW   s     r	   ÚdestroyzCluster.destroy.  sE   € Ø—‘Ó"ˆØ�YÒ &Ð,=Ò"=Ü�M‰M˜$Ÿ.™.Õ)äÐ:×AÑAÀ&ÓIÓJÐJr   c                 óü   — | j                   €| j                  «       | _         | j                   �O| j                  r7| j                   j                  «       }|j	                  | j                  «       |S | j                   S y r   )rI   Ú_connection_addr_from_pidfilerJ   r¡   rv   )rK   Úargss     r	   Ú_get_connection_speczCluster._get_connection_spec5  sp   € Ø× Ñ Ð(Ø$(×$FÑ$FÓ$HˆDÔ!à× Ñ Ð,Ø×-Ò-Ø×,Ñ,×1Ñ1Ó3�Ø—‘˜D×:Ñ:Ô;Ø�à×,Ñ,Ð,ð -r   c                 ób   — | j                  «       }|dk7  rt        d«      ‚| j                  «       S )Nr’   zcluster is not running)rr   r8   rÀ   r»   s     r	   ru   zCluster.get_connection_specA  s1   € Ø—‘Ó"ˆØ�YÒÜÐ7Ó8Ð8à×(Ñ(Ó*Ð*r   c                 ó   — || _         y r   )rJ   ©rK   ry   s     r	   Úoverride_connection_specz Cluster.override_connection_specH  s
   € Ø)/ˆÕ&r   )ÚoidÚxidc                óŒ  — | j                  «       }|dk(  rt        d«      ‚|dk(  rt        d«      ‚g }|�|j                  dt        |«      g«       |�|j                  dt        |«      g«       |sy |j	                  | j
                  «       	 | j                  d«      }t        j                  |g|z   t        j                  t        j                  ¬	«      }|j                  }|j                  d
k7  r3t        dj                  |j                  |j                  «       «      «      ‚y # t        $ r | j                  d«      }Y Œ£w xY w)Nr]   z4cannot modify WAL status: cluster is not initializedr’   z,cannot modify WAL status: cluster is runningr€   z-xÚpg_resetwalÚpg_resetxlogrY   r   z'pg_resetwal exited with status {:d}: {})rr   r8   r£   r·   rŸ   rC   Ú_find_pg_binaryrc   rd   re   r[   rf   rl   rk   )rK   rÅ   rÆ   rW   r¬   Ú	reset_walrp   r[   s           r	   rË   zCluster.reset_walK  s=  € Ø—‘Ó"ˆØÐ&Ò&ÜØFóHð Hð �YÒÜØ>ó@ð @ð ˆØˆ?Ø�K‰K˜œs 3›xÐ(Ô)Øˆ?Ø�K‰K˜œs 3›xÐ(Ô)ÙØà�‰�D—N‘NÔ#ð	=Ø×,Ñ,¨]Ó;ˆIô —.‘.ØˆK˜$ÑÜ—?‘?¬:¯?©?ô<ˆð —‘ˆà×Ñ Ò"ÜØ9×@Ñ@Ø×&Ñ&¨¯©«ó9ó:ð :ð #øô ò 	=Ø×,Ñ,¨^Ó<ŠIð	=ús   ÂD& Ä&EÅEc                 ó6  — | j                  «       }|dk(  rt        d«      ‚t        j                  j	                  | j
                  d«      }	 t        |d«      5  	 ddd«       y# 1 sw Y   yxY w# t        $ r }t        dj                  |«      «      |‚d}~ww xY w)z$Remove all records from pg_hba.conf.r]   ú5cannot modify HBA records: cluster is not initializedúpg_hba.confÚwNúcannot modify HBA records: {})	rr   r8   r'   r(   r   rC   ÚopenÚIOErrorrl   )rK   rW   Úpg_hbaÚes       r	   Ú	reset_hbazCluster.reset_hbao  s’   € à—‘Ó"ˆØÐ&Ò&ÜØGóIð Iô —‘—‘˜dŸn™n¨mÓ<ˆð	BÜ�f˜cÕ"Ø÷ #×"Ñ"ûäò 	BÜØ/×6Ñ6°qÓ9ó;Ø@AðBûð	Bús6   ÁA/ ÁA#ÁA/ Á#A,Á(A/ Á,A/ Á/	BÁ8BÂBÚhost©ÚtypeÚaddressÚauth_optionsc                ó‚  — | j                  «       }|dk(  rt        d«      ‚|dvrt        dj                  |«      «      ‚t        j
                  j                  | j                  d«      }dj                  |||«      }	|dk7  r0|€t        d	j                  |«      «      ‚|	d
j                  |«      z  }	|	d
j                  |«      z  }	|�|	ddj                  d„ |D «       «      z   z  }		 t        |d«      5 }
t        |	|
¬«       ddd«       y# 1 sw Y   yxY w# t        $ r }t        dj                  |«      «      |‚d}~ww xY w)zAdd a record to pg_hba.conf.r]   rÍ   >   rÖ   ÚlocalÚhostsslÚ	hostnosslzinvalid HBA record type: {!r}rÎ   z{} {} {}rÜ   Nz#{!r} entry requires a valid addressz {}r�   c              3   óF   K  — | ]  \  }}d j                  ||«      –— Œ y­w)r™   N)rl   )Ú.0r   r‹   s      r	   Ú	<genexpr>z(Cluster.add_hba_entry.<locals>.<genexpr>˜  s#   è ø€ ð %?Ù1=©¨¨A�—‘˜q !×$±ùs   ‚!Úarœ   rÐ   )rr   r8   Ú
ValueErrorrl   r'   r(   r   rC   rÑ   r¦   rÒ   )rK   rØ   ÚdatabaseÚuserrÙ   Úauth_methodrÚ   rW   rÓ   ÚrecordÚfrÔ   s               r	   Úadd_hba_entryzCluster.add_hba_entry  sQ  € ð —‘Ó"ˆØÐ&Ò&ÜØGóIð Ið Ð@Ñ@ÜÐ<×CÑCÀDÓIÓJÐJä—‘—‘˜dŸn™n¨mÓ<ˆà×"Ñ" 4¨°4Ó8ˆà�7Š?ØˆÜ Ø9×@Ñ@ÀÓFóHð Hð ˜%Ÿ,™, wÓ/Ñ/�à�%—,‘,˜{Ó+Ñ+ˆàÐ#Ø�c˜CŸH™Hñ %?Ù1=ó%?ó ?ñ ?ñ ?ˆFð	BÜ�f˜cÔ" aÜ�f 1Õ%÷ #×"Ñ"ûäò 	BÜØ/×6Ñ6°qÓ9ó;Ø@AðBûð	Bús6   Ã&D Ã2D	Ä D Ä	DÄD ÄD Ä	D>ÄD9Ä9D>c                 ó  — | j                  «        t        dk7  r| j                  dddd¬«       | j                  ddddd¬«       | j                  dd	ddd¬«       | j                  «       }|d
k(  r| j	                  «        y y )Nr   rÜ   ÚallÚtrust©rØ   rä   rå   ræ   rÖ   ú127.0.0.1/32©rØ   rÙ   rä   rå   ræ   ú::1/128r’   )rÕ   r1   ré   rr   r²   r»   s     r	   Útrust_local_connectionszCluster.trust_local_connections¢  s•   € Ø�‰Ôä�iÒØ×Ñ G°eØ$)°wð ô @à×Ñ °Ø$)°Ø'.ð 	ô 	0ð 	×Ñ °	Ø$)°Ø'.ð 	ô 	0ð —‘Ó"ˆØ�YÒØ�K‰K�Mð r   c                 óä   — t         dk7  r| j                  dd|d¬«       | j                  ddd|d¬«       | j                  dd	d|d¬«       | j                  «       }|d
k(  r| j                  «        y y )Nr   rÜ   Úreplicationrì   rí   rÖ   rî   rï   rð   r’   )r1   ré   rr   r²   )rK   rå   rW   s      r	   Útrust_local_replication_byz"Cluster.trust_local_replication_by²  sŠ   € Ü�iÒØ×Ñ G°mØ$(°gð ô ?à×Ñ °Ø$1¸Ø'.ð 	ô 	0ð 	×Ñ °	Ø$1¸Ø'.ð 	ô 	0ð —‘Ó"ˆØ�YÒØ�K‰K�Mð r   c                 óP  — | j                   sY| j                  | j                  «      }| j                  |«      }|j	                  d«      | _         | j                   st        d«      ‚| j                  d«      | _        | j                  d«      | _        | j                  «       | _
        y )NÚbindirz1pg_config output did not provide the BINDIR valueÚpg_ctlÚpostgres)rE   Ú_find_pg_configrD   Ú_run_pg_configr3   r8   rÊ   rF   r©   Ú_get_pg_versionrO   )rK   Ú	pg_configÚpg_config_datas      r	   rb   zCluster._init_envÀ  s–   € Ø×ÒØ×,Ñ,¨T×-AÑ-AÓBˆIØ!×0Ñ0°Ó;ˆNà-×1Ñ1°(Ó;ˆDÔØ×#Ò#Ü"ØGóIð Ið ×+Ñ+¨HÓ5ˆŒØ×-Ñ-¨jÓ9ˆŒØ×/Ñ/Ó1ˆÕr   c                 ól  — t         j                  j                  | j                  d«      }	 t	        |d«      5 }|j                  «       }d d d «       j                  «       }t        |«      dk  ry t        |d   «      }| j                  r|| j                  k7  ry |d   }|d   }|d   }|rR|d   dk7  rGt         j                  j                  t         j                  j                  | j                  |«      «      }|}	n|}	|	d	k(  rd
}	n|	dk(  rd}	n|	dk(  rd}	|	|dœS # 1 sw Y   ŒÓxY w# t        $ r Y y w xY w)Nzpostmaster.pidÚrté   r   r^   r\   é   Ú/Ú*Ú	localhostz0.0.0.0r   z::z::1)rÖ   r“   )r'   r(   r   rC   rÑ   ÚreadÚFileNotFoundErrorÚ
splitlinesÚlenrm   rG   Únormpath)
rK   Úpidfilerè   ÚpiddataÚlinesÚpmpidÚportnumr­   ÚhostaddrÚhost_strs
             r	   r¾   z%Cluster._connection_addr_from_pidfileÎ  s3  € Ü—'‘'—,‘,˜tŸ~™~Ð/?Ó@ˆð	Ü�g˜tÔ$¨ØŸ&™&›(�÷ %ð
 ×"Ñ"Ó$ˆäˆu‹:˜Š>àä�E˜!‘H“ˆØ×Ò ¨×)9Ñ)9Ò 9ð à˜‘(ˆØ˜‘(ˆØ˜‘8ˆáØ�q‰z˜SÒ äŸ'™'×*Ñ*Ü—G‘G—L‘L §¡°Ó9ó;�à‰HàˆHà�sŠ?Ø"‰HØ˜Ò"Ø"‰HØ˜ÒØˆHð Øñ
ð 	
÷K %Ð$ûä ò 	Ùð	ús(   ¬D' ¸DÁ	D' ÄD$Ä D' Ä'	D3Ä2D3c                 ó„  — d | _         t        j                  «       }	 t        |«      D ]Š  }| j                   €(| j	                  «       }|€t        j                  d«       Œ7	 |j                  t        j                  dddd|dœ| j                   ¤Ž«      }|j                  |j                  «       «        n |j                  «        y# t        t        j                  t        j                  t        j                  f$ r t        j                  d«       Y Œìt        j                  $ r Y  Œtw xY w# |j                  «        w xY w)Nr   rø   r  )rä   rå   ra   rt   r’   r   )rI   ÚasyncioÚnew_event_loopÚrangerÀ   ÚtimeÚsleepÚrun_until_completerw   rx   r   ÚOSErrorÚTimeoutErrorÚCannotConnectNowErrorÚPostgresConnectionErrorÚPostgresError)rK   ra   rt   ÚiÚ	conn_specÚcons         r	   ro   zCluster._test_connectionü  s#  € Ø $ˆÔä×%Ñ%Ó'ˆð	Ü˜7–^�Ø×(Ñ(Ð0Ø $× 9Ñ 9Ó ;�IØ Ð(ÜŸ
™
 1œØ ðØ×1Ñ1ÜŸ™ð A°Ø-7Ø01¸ñAð +/×*?Ñ*?ñAóB�Cð  ×+Ñ+¨C¯I©I«KÔ8Ùð3 $ð6 �J‰JŒLàøô!  ¤×!5Ñ!5Ü×5Ñ5Ü×7Ñ7ð9ò ô —J‘J˜q”MÙÜ×,Ñ,ò ò ð	ûð �J‰J�Lús=   �AD- Á 3CÂ"D- ÃAD*ÄD- ÄD*Ä&D- Ä)D*Ä*D- Ä-D?c                 óà  — t        j                  |t         j                  t         j                  ¬«      }|j                  |j                  }}|j
                  dk7  r%t        dj                  |j
                  |«      «      ‚i }|j                  «       D ]X  }|j                  d«      j                  d«      \  }}}	|sŒ*|	j                  «       ||j                  «       j                  «       <   ŒZ |S )NrY   r   z%pg_config exited with status {:d}: {}úutf-8Ú=)rc   rd   re   rZ   r[   rf   r8   rl   r  rk   Ú	partitionÚstripÚlower)
rK   r?   rp   rZ   r[   ÚconfigÚliner   Úeqr‹   s
             r	   rú   zCluster._run_pg_config!  sÅ   € Ü—.‘.Ø¤:§?¡?¼:¿?¹?ôLˆà Ÿ™¨¯©�ˆà×Ñ Ò"ÜÐF×MÑMØ×"Ñ" Fó ,ó -ð -ð ˆFà×)Ñ)Ö+�ØŸ;™; wÓ/×9Ñ9¸#Ó>‘��2�qÚØ01·±³	�F˜1Ÿ7™7›9Ÿ?™?Ó,Ò-ð ,ð
 ˆMr   c                 óŒ  — |€ût         j                  j                  d«      xs t         j                  j                  d«      }|r*t        t         j                  j                  |d«      «      }n�t         j                  j                  d«      j                  t         j                  «      }|D ]L  }t        t         j                  j                  |d«      «      }t         j                  j                  |«      sŒL n d }|st        d«      ‚t         j                  j                  |«      st        dj                  |«      «      ‚|S )NrA   rB   rü   ÚPATHz#could not find pg_config executablez{!r} is not an executable)r'   r2   r3   r
   r(   r   ÚsplitÚpathseprg   r8   Úisfilerl   )rK   r?   Ú
pg_installÚpathenvr(   s        r	   rù   zCluster._find_pg_config3  sü   € ØÐ!ä—
‘
—‘Ð/Ó0ò +Ü—:‘:—>‘> 'Ó*ð ñ Ü!-Ü—G‘G—L‘L ¨[Ó9ó";‘ô Ÿ*™*Ÿ.™.¨Ó0×6Ñ6´r·z±zÓB�Û#�DÜ%1ÜŸ™Ÿ™ T¨;Ó7ó&9�Nä—w‘w—~‘~ nÕ5Ùð	 $ð &*�NáÜÐDÓEÐEä�w‰w�~‰~˜nÔ-ÜÐ:×AÑAØó  ó !ð !ð Ðr   c                 ó  — t        t        j                  j                  | j                  |«      «      }t        j                  j                  |«      s,t        dj                  |«      dj                  |«      z   «      ‚|S )Nzcould not find {} executable: z${!r} does not exist or is not a file)r
   r'   r(   r   rE   r-  r8   rl   )rK   ÚbinaryÚbpaths      r	   rÊ   zCluster._find_pg_binaryO  si   € ÜœRŸW™WŸ\™\¨$×*:Ñ*:¸FÓCÓDˆä�w‰w�~‰~˜eÔ$ÜØ0×7Ñ7¸Ó?Ø6×=Ñ=¸eÓDñEóFð Fð ˆr   c                 óú  — t        j                  | j                  dgt         j                  t         j                  ¬«      }|j                  |j
                  }}|j                  dk7  r%t        dj                  |j                  |«      «      ‚|j                  d«      j                  d«      }d}|j                  |«      st        dj                  |«      «      ‚|t        |«      d  }t        j                  |«      S )	Nz	--versionrY   r   z.postgres --version exited with status {:d}: {}r!  z 
zpostgres (PostgreSQL) z,could not determine server version from {!r})rc   rd   r©   re   rZ   r[   rf   r8   rl   rk   r$  Ú
startswithr  r   Úsplit_server_version_string)rK   rp   rZ   r[   Úversion_stringr+   s         r	   rû   zCluster._get_pg_versionY  sß   € Ü—.‘.Ø�^‰^˜[Ð)Ü—?‘?¬:¯?©?ô<ˆð !Ÿ™¨¯©�ˆà×Ñ Ò"ÜØ@×GÑGØ×&Ñ&¨ó0ó1ð 1ð  Ÿ™ wÓ/×5Ñ5°eÓ<ˆØ)ˆØ×(Ñ(¨Ô0ÜØ>×EÑEØ"ó$ó%ð %ð (¬¨F«¨Ð5ˆä×8Ñ8¸ÓHÐHr   r   ©é<   )r9   r:   r;   rM   rQ   rS   rU   rr   rx   rƒ   r›   r²   rµ   r¼   rÀ   ru   rÄ   rË   rÕ   ré   rñ   rô   rb   r¾   ro   rú   rù   rÊ   rû   r   r   r	   r=   r=   M   s«   „ Ø37ô .ò òòò1ó6=ò
!ðF],°ô ],ò~:ó((ò(Kò
-ò+ò0ð  $¨ô ":òHBð  %+ÀDØ04ô!BòFò ò2ò,
ó\#òJò$ò8óIr   r=   c                   ó*   ‡ — e Zd Zdddddœˆ fd„
Zˆ xZS )ÚTempClusterN©Údata_dir_suffixÚdata_dir_prefixÚdata_dir_parentr?   c                ób   •— t        |||¬«      | _        t        ‰| �  | j                  |¬«       y )Nr5   r>   )r6   rC   ÚsuperrM   )rK   r<  r=  r>  r?   Ú	__class__s        €r	   rM   zTempCluster.__init__p  s1   ø€ ô "¨Ø)8Ø&5ô7ˆŒô 	‰Ñ˜Ÿ™¸ÐÕGr   )r9   r:   r;   rM   Ú__classcell__©rA  s   @r	   r:  r:  o  s   ø„ à!%°tØ!%°d÷Hò Hr   r:  c                   óL   ‡ — e Zd Zdddddœˆ fd„
Zˆ fd„Zd„ Zdi dœˆ fd„Zˆ xZS )	ÚHotStandbyClusterNr;  c                óH   •— || _         || _        t        ‰| �  ||||¬«       y )Nr;  )Ú_masterÚ
_repl_userr@  rM   )rK   ÚmasterÚreplication_userr<  r=  r>  r?   rA  s          €r	   rM   zHotStandbyCluster.__init__z  s1   ø€ ð ˆŒØ*ˆŒÜ‰ÑØ+Ø+Ø+Ø)ð	 	õ 	+r   c                 óN   •— t         ‰| �  «        | j                  d«      | _        y )NÚpg_basebackup)r@  rb   rÊ   Ú_pg_basebackup)rK   rA  s    €r	   rb   zHotStandbyCluster._init_env†  s!   ø€ Ü‰ÑÔØ"×2Ñ2°?ÓCˆÕr   c                 ó@  — | j                  «       dk7  r$t        dj                  | j                  «      «      ‚t	        j
                  | j                  d| j                  d   d| j                  d   d| j                  d| j                  g	t        j                  t        j                  ¬	«      }|j                  }|j                  d
k7  r3t        dj                  |j                  |j                  «       «      «      ‚| j                  dk  r§t        t         j"                  j%                  | j                  d«      d«      5 }|j'                  t)        j*                  dj                  | j                  d   | j                  d   | j                  ¬«      «      «       ddd«       |j                  «       S t        t         j"                  j%                  | j                  d«      d«      }|j-                  «        |j                  «       S # 1 sw Y   |j                  «       S xY w)r|   r]   r}   z-hrÖ   z-pr“   rX   z-UrY   r   z.pg_basebackup init exited with status {:d}:
{}©é   r   zrecovery.confrÏ   z…                    standby_mode = 'on'
                    primary_conninfo = 'host={host} port={port} user={user}'
                ©rÖ   r“   rå   Nzstandby.signal)rr   r8   rl   rC   rc   rd   rM  rG  rH  re   r‰   rZ   rf   rk   rO   rÑ   r'   r(   r   ÚwriteÚtextwrapÚdedentr   )rK   rŠ   rp   rŽ   rè   s        r	   rƒ   zHotStandbyCluster.initŠ  s¯  € à�?‰?ÓÐ 1Ò1ÜØ>×EÑEØ—N‘Nó$ó%ð %ô —.‘.Ø× Ñ  $¨¯©°VÑ(<Ø�4—<‘< Ñ'¨¨t¯~©~Ø�4—?‘?ð$ô —?‘?¬:×+<Ñ+<ô	>ˆð —‘ˆà×Ñ Ò"ÜØA×HÑHØ×&Ñ&¨¯©«ó9ó:ð :ð ×Ñ˜gÒ%Ü”b—g‘g—l‘l 4§>¡>°?ÓCÀSÔIÈQØ—‘œŸ™ð )÷ ‘FØŸ™ fÑ-ØŸ™ fÑ-ØŸ™ð ó *ó+ô ,÷ Jð �}‰}‹Ðô ”R—W‘W—\‘\ $§.¡.Ð2BÓCÀSÓIˆAØ�G‰GŒIà�}‰}‹Ð÷ Jð �}‰}‹Ðús   Ä>AHÈHr�   c                óÞ   •— | j                   dk\  rK|j                  «       }dj                  | j                  d   | j                  d   | j                  ¬«      |d<   t        ‰| �  d||dœ|¤Ž y )	NrO  z%"host={host} port={port} user={user}"rÖ   r“   rQ  Úprimary_conninfo)r«   r�   r   )rO   r¡   rl   rG  rH  r@  r›   )rK   r«   r�   r¬   rA  s       €r	   r›   zHotStandbyCluster.start­  st   ø€ Ø×Ñ˜wÒ&Ø-×2Ñ2Ó4ˆOà7×>Ñ>ØŸ™ fÑ-ØŸ™ fÑ-ØŸ™ð ?ó ð Ð.Ñ/ô 	‰‰ÐI˜4°ÑIÀDÓIr   r7  )r9   r:   r;   rM   rb   rƒ   r›   rB  rC  s   @r	   rE  rE  y  s4   ø„ ð "&°tØ!%°dö
+ôDò!ðFJ°÷ Jò Jr   rE  c                   óV   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zdd„Z	d„ Z
d	„ Zd
dddœd„Zy)ÚRunningClusterc                 ó   — || _         y r   )r  rÃ   s     r	   rM   zRunningCluster.__init__¼  s	   € Øˆ�r   c                  ó   — y)NFr   rP   s    r	   rS   zRunningCluster.is_managed¿  s   € Ør   c                 ó,   — t        | j                  «      S r   )r†   r  rP   s    r	   ru   z"RunningCluster.get_connection_specÂ  s   € Ü�D—N‘NÓ#Ð#r   c                  ó   — y)Nr’   r   rP   s    r	   rr   zRunningCluster.get_statusÅ  s   € Ør   c                  ó   — y r   r   )rK   rŠ   s     r	   rƒ   zRunningCluster.initÈ  ó   € Ør   c                  ó   — y r   r   )rK   r«   rŠ   s      r	   r›   zRunningCluster.startË  r^  r   c                  ó   — y r   r   )rK   r«   s     r	   rµ   zRunningCluster.stopÎ  r^  r   c                  ó   — y r   r   rP   s    r	   r¼   zRunningCluster.destroyÑ  r^  r   c                 ó   — t        d«      ‚©Nz.cannot modify HBA records of unmanaged cluster©r8   rP   s    r	   rÕ   zRunningCluster.reset_hbaÔ  s   € ÜÐKÓLÐLr   rÖ   Nr×   c                ó   — t        d«      ‚rc  rd  )rK   rØ   rä   rå   rÙ   ræ   rÚ   s          r	   ré   zRunningCluster.add_hba_entry×  s   € äÐKÓLÐLr   r7  )r9   r:   r;   rM   rS   ru   rr   rƒ   r›   rµ   r¼   rÕ   ré   r   r   r	   rX  rX  »  s@   „ ò òò$òòóóòòMð %+ÀDØ04õMr   rX  )NNN)r  r'   Úos.pathÚplatformr    ri   r    r   r"   rc   r¥   r$   rS  r  rw   r   ÚunameÚsystemr1   r
   r   r.   r6   r   r8   r=   r:  rE  rX  r   r   r	   Ú<module>rj     s´   ðó Û 	Û Û Û Û 	Û Û Û Û Û 
Û Û Û ã Ý !ð ˆ(�.‰.Ó
×
!Ñ
!€à
ˆiÒóò
òó
ó5ô	�9ô 	÷_Iñ _IôDH�'ô Hô?J˜ô ?JôDM�Wõ Mr   