
    2iZ                     8   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 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    W/var/www/html/marco-python-backend/venv/lib/python3.12/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                       e Zd Zy)ClusterErrorN)__name__
__module____qualname__r   r   r	   r   r   0   s    r   r   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_pathosenvironget_pg_bin_dir_pg_ctl_daemon_pid_daemon_process_connection_addr_connection_spec_override)selfdata_dirr#   s      r	   __init__zCluster.__init__5   sh    !-JJNN+, 'zz~~g& 	 # $)-&r   c                     | j                   S r   )_pg_versionr2   s    r	   get_pg_versionzCluster.get_pg_versionB   s    r   c                      y)NTr   r7   s    r	   
is_managedzCluster.is_managedE   s    r   c                     | j                   S r   )r'   r7   s    r	   get_data_dirzCluster.get_data_dirH   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}: {})r-   	_init_env
subprocessrunr'   PIPErA   rB   
returncoder)   pathexistslistdirrematchdecoder   formatintgroupr.   _test_connection)r2   processrA   rB   rs        r	   
get_statuszCluster.get_statusK   s9   <<NN..\\8T4>>:??:??< !!#277>>$..+IJJt~~.$1$1$/AA">EE)* *  #1771: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)r2   r\   kwargs	conn_infos       r	   r`   zCluster.connectf   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d	| j                  g|z   t        j                  t        j                  
      }|j                  }|j                  dk7  r3t        dj                  |j                  |j                                     |j                         S c c}}w )Initialize cluster.rD   ,cluster in {!r} has already been initializedencodingzUTF-8--{}={}-o initr?   r@   r   z'pg_ctl init exited with status {:d}:
{})rZ   r   rT   r'   dictitemsjoinrJ   rK   r-   rL   STDOUTrA   rM   rS   )r2   settingskvsettings_args
extra_argsrX   outputs           r	   rj   zCluster.initk   s4   ?? 11>EENN$% % >X%#*HZ )1)9;!%A '--a3 ;M ;388M#:";;JJ..\\648:E??:+<+<> ":AA&&9: : }}#;s   !E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(  rEt        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<                  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:                        | _"        | jD                  jF                  | _$        | jK                  |       yc c}}w )zStart the cluster.runningNrD   z(cluster in {!r} has not been initializedportdynamicrg   z	--port={}unix_socket_directoriesunix_socket_directoryr   ssl_key_filez
srvkey.pemi  )	   rE   z-c{}={}ASYNCPG_DEBUG_SERVERzasyncpg.cluster: Runningri   startr?   rh   filer@   r   z:
{} z&pg_ctl start exited with status {:d}{}rG   )&rZ   r   rT   r'   popr   rl   appendr+   _systemtempfile
gettempdirr)   rN   rm   shutilcopychmodr6   extendgetenvsysrA   printr-   rB   rJ   DEVNULLrK   rn   rM   rS   Popen	_postgresr/   pidr.   rW   )r2   waitrv   optsr>   ry   rp   rq   rs   sockdirssl_keykeyfilesockdir_optrA   rX   rB   s                   r	   r   zCluster.start   sC   "Y((:AANN$% % xx%9&(D9=FAi&&q!,F
F+,,T23!%%&?@?%))*ABG?w)3))+G!%%n5ggll4>><@GKK)HHWe$-224O.5ON+&(57+2OK(#))+ 	<DAqtW^^Aq%9:;	< i
 yy/0.HHgtT^^chhz2   $++ nnwdnnsxx
+-j&7&79G
 !!Q&>>$^^GNN,A,A,CDFF"<CC**F45 5 yy/0#++   ^^T4>>GJG!**;*;=  
  $3377Dd+S Gs   4Oc                 x   | j                         }|dk7  rt        d      t        j                  | j                  dd| j
                  gt        j                  t        j                        }|j                  }|j                  dk7  r3t        dj                  |j                  |j                                     y)	zReload server configuration.rx   z%cannot reload: cluster is not runningreloadr?   r@   r   'pg_ctl stop exited with status {:d}: {}N)rZ   r   rJ   rK   r-   r'   rL   rB   rM   rT   rS   )r2   r>   rX   rB   s       r	   r   zCluster.reload   s    "YFGG..\\8T4>>:??:??< "9@@&&9: : #r   c           
         t        j                  | j                  dd| j                  dt	        |      ddgt         j
                  t         j
                        }|j                  }|j                  dk7  r3t        dj                  |j                  |j                                     | j                  2| j                  j                  | j                  j                          y y y )	Nstopr?   z-tz-mfastr@   r   r   )rJ   rK   r-   r'   strrL   rB   rM   r   rT   rS   r/   kill)r2   r   rX   rB   s       r	   r   zCluster.stop   s    ..\\64s4y6??:??<
 "9@@&&9: :   ,$$//7  %%' 8 -r   c                     | j                         }|dk(  s|dk(  r t        j                  | j                         y t	        dj                  |            )NrF   rD   zcannot destroy {} cluster)rZ   r   rmtreer'   r   rT   r2   r>   s     r	   destroyzCluster.destroy  sE    "Y&,="=MM$..):AA&IJJr   c                     | j                   | j                         | _         | j                   O| j                  r7| j                   j                         }|j	                  | j                         |S | j                   S y r   )r0   _connection_addr_from_pidfiler1   r   r^   )r2   argss     r	   _get_connection_speczCluster._get_connection_spec  sp      ($($F$F$HD!  ,--,,113D::;,,, -r   c                 b    | j                         }|dk7  rt        d      | j                         S )Nrx   zcluster is not running)rZ   r   r   r   s     r	   r]   zCluster.get_connection_spec  s1    "Y788((**r   c                     || _         y r   )r1   r2   ra   s     r	   override_connection_specz Cluster.override_connection_spec  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)NrD   z4cannot modify WAL status: cluster is not initializedrx   z,cannot modify WAL status: cluster is runningrh   z-xpg_resetwalpg_resetxlogr@   r   z'pg_resetwal exited with status {:d}: {})rZ   r   r   r   r   r'   _find_pg_binaryrJ   rK   rL   rB   rM   rT   rS   )r2   r   r   r>   r   	reset_walrX   rB   s           r	   r   zCluster.reset_wal"  s=   "&&FH H Y>@ @ ?KKs3x()?KKs3x()DNN#	=,,];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.rD   5cannot modify HBA records: cluster is not initializedpg_hba.confwNcannot modify HBA records: {})	rZ   r   r)   rN   rm   r'   openIOErrorrT   )r2   r>   pg_hbaes       r	   	reset_hbazCluster.reset_hbaF  s    "&&GI I dnnm<	Bfc"    	B/66q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.rD   r   >   r   localhostssl	hostnosslzinvalid HBA record type: {!r}r   z{} {} {}r   Nz#{!r} entry requires a valid addressz {}ri   c              3   F   K   | ]  \  }}d j                  ||        yw)r   N)rT   ).0rp   rq   s      r	   	<genexpr>z(Cluster.add_hba_entry.<locals>.<genexpr>o  s$      %?)-Aq!$%?s   !ar   r   )rZ   r   
ValueErrorrT   r)   rN   rm   r'   r   r   r   )r2   r   databaseuserr   auth_methodr   r>   r   recordfr   s               r	   add_hba_entryzCluster.add_hba_entryV  sZ    "&&GI I @@<CCDIJJdnnm<""4487? 9@@FH H %,,w//%,,{++#cCHH %?1=%? ? ? ?F	Bfc" &af1%& & & 	B/66q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/128rx   )r   r   r   rZ   r   r   s     r	   trust_local_connectionszCluster.trust_local_connectionsy  s    iGe$)w  @$)'. 	 	0 		$)'. 	 	0 "YKKM 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   rx   )r   r   rZ   r   )r2   r   r>   s      r	   trust_local_replication_byz"Cluster.trust_local_replication_by  s    iGm$(g  ?$1'. 	 	0 		$1'. 	 	0 "YKKM 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)r,   _find_pg_configr(   _run_pg_configr+   r   r   r-   r   _get_pg_versionr6   )r2   	pg_configpg_config_datas      r	   rI   zCluster._init_env  s    ,,T-A-ABI!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   rE   rC      /*	localhostz0.0.0.0r   z::z::1)r   ry   )r)   rN   rm   r'   r   readFileNotFoundError
splitlineslenrU   r.   normpath)
r2   pidfiler   piddatalinespmpidportnumr   hostaddrhost_strs
             r	   r   z%Cluster._connection_addr_from_pidfile  s:   '',,t~~/?@	gt$ #&&(#
 ""$u:>E!H)9)9 9 ((8qzS ''**GGLL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   rH   r\   rx   r   )r0   asyncionew_event_loopranger   timesleeprun_until_completer_   r`   r   OSErrorTimeoutErrorCannotConnectNowErrorPostgresConnectionErrorPostgresError)r2   rH   r\   i	conn_speccons         r	   rW   zCluster._test_connection  s(    $%%'	7^ ((0 $ 9 9 ;I (

1 11 A-701A +/*?*?ABC  ++CIIK836 JJL!  !5!555779  JJqM,,  	 JJLs=   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 )Nr@   r   z%pg_config exited with status {:d}: {}utf-8=)rJ   rK   rL   rA   rB   rM   r   rT   r   rS   	partitionstriplower)
r2   r#   rX   rA   rB   configlinerp   eqrq   s
             r	   r   zCluster._run_pg_config  s    ..:??:??L "FMM""F , - - F))+ :;;w/99#>2q01	F1779??,-:
 Mr   c                    |t         j                  j                  d      xs t         j                  j                  d      }|r*t        t         j                  j                  |d            }nt         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 )Nr%   r&   r   PATHz#could not find pg_config executablez{!r} is not an executable)r)   r*   r+   r
   rN   rm   splitpathseprO   r   isfilerT   )r2   r#   
pg_installpathenvrN   s        r	   r   zCluster._find_pg_config
  s   !

/0 +::>>'*  !-GGLL[9"; **..066rzzB# *D%1T;7&9Nww~~n5	* &*NDEEww~~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)   rN   rm   r,   r  r   rT   )r2   binarybpaths      r	   r   zCluster._find_pg_binary&  si    RWW\\$*:*:FCDww~~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	--versionr@   r   z.postgres --version exited with status {:d}: {}r  z 
zpostgres (PostgreSQL) z,could not determine server version from {!r})rJ   rK   r   rL   rA   rB   rM   r   rT   rS   r  
startswithr   r   split_server_version_string)r2   rX   rA   rB   version_stringprefixs         r	   r   zCluster._get_pg_version0  s    ..^^[)??:??< !"@GG&&01 1  w/55e<)((0>EE"$% % (F588HHr   r   <   )r   r   r   r4   r8   r:   r<   rZ   r`   rj   r   r   r   r   r   r]   r   r   r   r   r   r   rI   r   rW   r   r   r   r   r   r   r	   r!   r!   4   s    37 . 16=
>W, W,r:"("K
-+0  $ ":HB  %+D04!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                v    t        j                  |||      | _        t        |   | j                  |       y )N)suffixr!  dirr"   )r   mkdtempr'   superr4   )r2   r'  r(  r)  r#   	__class__s        r	   r4   zTempCluster.__init__G  s7     "))1@.=? 	Gr   )r   r   r   r4   __classcell__r/  s   @r	   r%  r%  F  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.  r4   )r2   masterreplication_userr'  r(  r)  r#   r/  s          r	   r4   zHotStandbyCluster.__init__Q  s1     *+++)	 	 	+r   c                 N    t         |           | j                  d      | _        y )Npg_basebackup)r.  rI   r   _pg_basebackup)r2   r/  s    r	   rI   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  rt        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)rd   rD   re   z-hr   z-pry   r?   z-Ur@   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   ry   r   Nzstandby.signal)rZ   r   rT   r'   rJ   rK   r;  r5  r6  rL   rn   rA   rM   rS   r6   r   r)   rN   rm   writetextwrapdedentr   )r2   ro   rX   rt   r   s        r	   rj   zHotStandbyCluster.inita  s   ?? 11>EENN$% % ..  $V(<4<<'t~~4??$ ??:+<+<	> "AHH&&9: : g%bggll4>>?CSI ,Q ) Ff-f-  *+ ,, }} RWW\\$..2BCSIAGGI}}, }}s   >AHHru   c                    | j                   dk\  rK|j                         }dj                  | j                  d   | j                  d   | j                        |d<   t        |   d||d| y )	Nr=  z%"host={host} port={port} user={user}"r   ry   r?  primary_conninfo)r   rv   r   )r6   r   rT   r5  r6  r.  r   )r2   r   rv   r   r/  s       r	   r   zHotStandbyCluster.start  st    w&-224O7>>f-f- ?  ./ 	I4IDIr   r"  )r   r   r   r4   rI   rj   r   r0  r1  s   @r	   r3  r3  P  s4     "&t!%d
+D!FJ J Jr   r3  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	   r4   zRunningCluster.__init__  s	    r   c                      y)NFr   r7   s    r	   r:   zRunningCluster.is_managed  s    r   c                 ,    t        | j                        S r   )rk   r  r7   s    r	   r]   z"RunningCluster.get_connection_spec  s    DNN##r   c                      y)Nrx   r   r7   s    r	   rZ   zRunningCluster.get_status  s    r   c                      y r   r   )r2   ro   s     r	   rj   zRunningCluster.init      r   c                      y r   r   )r2   r   ro   s      r	   r   zRunningCluster.start  rL  r   c                      y r   r   )r2   r   s     r	   r   zRunningCluster.stop  rL  r   c                      y r   r   r7   s    r	   r   zRunningCluster.destroy  rL  r   c                     t        d      Nz.cannot modify HBA records of unmanaged clusterr   r7   s    r	   r   zRunningCluster.reset_hba  s    KLLr   r   Nr   c                    t        d      rQ  rR  )r2   r   r   r   r   r   r   s          r	   r   zRunningCluster.add_hba_entry  s    KLLr   r"  )r   r   r   r4   r:   r]   rZ   rj   r   r   r   r   r   r   r   r	   rF  rF    s@     $M %+D04Mr   rF  )r   r)   os.pathplatformrQ   r   r   rJ   r   r   rA  r   r_   r   unamesystemr   r
   r   r   r   r!   r%  r3  rF  r   r   r	   <module>rX     s     	   	    
     ! (..

!
!
i
	9 	OI OIdH' H?J ?JDMW Mr   