§
    ¢]¶jV  ã                  óÀ   — U d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d	d
lmZ d	dlmZ d dlZd dlmZ daded<    G d„ dee¦  «        ZdS )é    )Úannotations)ÚCallable)ÚAny)Úconnect)Ú
Connection)ÚCursor)Údict_row)Úget_settingsé   )ÚBasePostgresHelpersMixin)ÚBasePostgresPilotMixinN)ÚConnectionPoolzConnectionPool | NoneÚ_GLOBAL_POOLc                  óT   — e Zd ZdZd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S )ÚBasePostgresClientzJMinimal PostgreSQL client using psycopg_pool and env-driven configuration.NÚdatabase_urlú
str | NoneÚreturnÚNonec                óV   — t          ¦   «         }|p|j        | _        |j        | _        d S ©N)r
   r   Ú_database_urlÚ database_connect_timeout_secondsÚ_connect_timeout)Úselfr   Úsettingss      ú<C:\Projects\DSCons\app\core\postgres\base_pkg\base_client.pyÚ__init__zBasePostgresClient.__init__   s,   € Ý‘>”>ˆØ)ÐB¨XÔ-BˆÔØ (Ô IˆÔÐÐó    Úboolc                ó*   — t          | j        ¦  «        S )z.Return True when a database URL is configured.)r    r   ©r   s    r   Ú
is_enabledzBasePostgresClient.is_enabled!   s   € å�DÔ&Ñ'Ô'Ð'r   c                ó4  — |                       ¦   «         sdS |                      ¦   «         5 }|                     ¦   «         5 }|                     d¦  «         |                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   dS )zGCheck if database connection is alive by executing a lightweight query.FzSELECT 1NT)r#   Úget_connectionÚcursorÚexecuteÚfetchone)r   Ú
connectionr&   s      r   ÚpingzBasePostgresClient.ping%   s
  € à�ŠÑ Ô ð 	Ø�5Ø× Ò Ñ"Ô"ð 	" jØ×"Ò"Ñ$Ô$ð "¨Ø—’˜zÑ*Ô*Ð*Ø—’Ñ!Ô!Ð!ð"ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð ˆts5   «BÁ *A6Á*BÁ6A:	Á:BÁ=A:	Á>BÂBÂBr   c                óÒ   — | j         st          d¦  «        ‚t          €Dt          | j         dd| j        t
          dœd¬¦  «        at          j        t          j        ¦  «         t          S )NzDATABASE_URL is not configured.é   é   ©Úconnect_timeoutÚrow_factoryT)ÚconninfoÚmin_sizeÚmax_sizeÚkwargsÚopen)	r   Ú
ValueErrorr   r   r   r	   ÚatexitÚregisterÚcloser"   s    r   Ú	_get_poolzBasePostgresClient._get_pool/   sv   € àÔ!ð 	@ÝÐ>Ñ?Ô?Ð?åÐÝ)ØÔ+ØØà'+Ô'<Ý#+ðð ð ð	ñ 	ô 	ˆLõ ŒO�LÔ.Ñ/Ô/Ð/ÝÐr   r   c                óN   — |                       ¦   «                              ¦   «         S )z6Get a managed connection context from the global pool.)r:   r)   r"   s    r   r%   z!BasePostgresClient.get_connectionB   s   € à�~Š~ÑÔ×*Ò*Ñ,Ô,Ð,r   c                óD   — t          | j        | j        t          ¬¦  «        S )z7Backward compatibility for direct raw connection usage.r.   )r   r   r   r	   r"   s    r   Ú_open_connectionz#BasePostgresClient._open_connectionF   s*   € õ ØÔØ Ô1Ý ð
ñ 
ô 
ð 	
r   Ú	operationú Callable[[Connection[Any]], Any]c                óè   — |                       ¦   «         5 }	  ||¦  «        }|                     ¦   «          |cddd¦  «         S # t          $ r |                     ¦   «          ‚ w xY w# 1 swxY w Y   dS )zOExecute one callback inside a single transaction with explicit commit/rollback.N)r%   ÚcommitÚ	ExceptionÚrollback)r   r>   r)   Úresults       r   Úrun_in_transactionz%BasePostgresClient.run_in_transactionO   sÐ   € à× Ò Ñ"Ô"ð 	 jðØ"˜ :Ñ.Ô.�Ø×!Ò!Ñ#Ô#Ð#Øð		ð 	ð 	ð 	ñ 	ô 	ð 	ð 	øõ
 ð ð ð Ø×#Ò#Ñ%Ô%Ð%Øðøøøð	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s"   •A'— AÁ A$Á$A'Á'A+Á.A+r)   úConnection[Any] | NoneúCallable[[Cursor[Any]], Any]c                óf  — |�7|                      ¦   «         5 } ||¦  «        cddd¦  «         S # 1 swxY w Y   |                      ¦   «         5 }|                      ¦   «         5 } ||¦  «        }ddd¦  «         n# 1 swxY w Y   |                     ¦   «          ddd¦  «         n# 1 swxY w Y   |S )zQExecute cursor-bound work either inside an existing transaction or a private one.N)r&   r%   rA   )r   r)   r>   r&   Úowned_connectionrD   s         r   Ú!_execute_with_optional_connectionz4BasePostgresClient._execute_with_optional_connectionZ   ss  € ð Ð!Ø×"Ò"Ñ$Ô$ð )¨Ø �y Ñ(Ô(ð)ð )ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð × Ò Ñ"Ô"ð 	&Ð&6Ø!×(Ò(Ñ*Ô*ð +¨fØ"˜ 6Ñ*Ô*�ð+ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +à×#Ò#Ñ%Ô%Ð%ð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&ð ˆsB   —/¯3¶3ÁB&Á#A;Á/B&Á;A?	Á?B&ÂA?	ÂB&Â&B*Â-B*r   )r   r   r   r   )r   r    )r   r   )r   r   )r>   r?   r   r   )r)   rF   r>   rG   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   r*   r:   r%   r=   rE   rJ   © r   r   r   r      sÇ   € € € € € ð UÐTðJð Jð Jð Jð Jð
(ð (ð (ð (ðð ð ð ðð ð ð ð&-ð -ð -ð -ð
ð 
ð 
ð 
ð	ð 	ð 	ð 	ðð ð ð ð ð r   r   )Ú
__future__r   Úcollections.abcr   Útypingr   Úpsycopgr   Úpsycopg.connectionr   Úpsycopg.cursorr   Úpsycopg.rowsr	   Úapp.core.settingsr
   Úhelpersr   Úpilot_queriesr   r7   Úpsycopg_poolr   r   Ú__annotations__r   rO   r   r   ú<module>r\      s,  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ø !Ð !Ð !Ð !Ð !Ð !Ø !Ð !Ð !Ð !Ð !Ð !à *Ð *Ð *Ð *Ð *Ð *à -Ð -Ð -Ð -Ð -Ð -Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1ð €€€Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'à&*€Ð *Ð *Ð *Ñ *ðRð Rð Rð Rð RØØñRô Rð Rð Rð Rr   