Ë
    ¹ûàg¾[  ã                   óÄ  — d Z ddlZddl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 ddl
mZ ddlmZ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„ Z  e «       dk  r e	dejB                  › �«      ‚d e «       cxk  rdk  rn n e	dejB                  › �«      ‚ddl"m#Z#m$Z$ e$r0ddlm%Z%m&Z& ddl'm(Z( ddl"m)Z)m*Z* e%jV                  d   jX                  Z-n¡ddl.Zddl/Zej`                  jc                  eej`                  jd                  «       ejf                  ji                  «        dZ5ej`                  jm                  e5fdej`                  jn                  «      Z8ej`                  js                  e8«       ddl:m;Z; ddl<m=Z= ddl>m?Z? dd l@mAZA dd!lBmCZC dd"lDmEZE d#„ ZF G d$„ d%e«      ZGe$rm G d&„ d'«      ZH G d(„ d)eHej’                  «      ZJ G d*„ d+eHej–                  «      ZI G d,„ d-eHej˜                  jš                  ejœ                  «      ZO G d.„ d/e«      Zyej`                  j                   ZI G d0„ d/e«      Zy# e$ r ddlZY �Œôw xY w# e$ r	  e	d«      ‚w xY w)1zY
PostgreSQL database backend for Django.

Requires psycopg2 >= 2.8.4 or psycopg >= 3.1.8
é    N)Úcontextmanager)Úsettings)ÚImproperlyConfigured)ÚDatabaseError)Úconnections)ÚNO_DB_ALIASÚBaseDatabaseWrapper©ÚCursorDebugWrapper)Úasync_unsafe)Úcached_property)Ú
SafeString)Úget_version_tuplez(Error loading psycopg2 or psycopg modulec                  ó^   — t         j                  j                  dd«      d   } t        | «      S )Nú é   r   )ÚDatabaseÚ__version__Úsplitr   )Úversions    ú`/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/django/db/backends/postgresql/base.pyÚpsycopg_versionr       s*   € Ü×"Ñ"×(Ñ(¨¨aÓ0°Ñ3€GÜ˜WÓ%Ð%ó    )é   é   é   z6psycopg2 version 2.8.4 or newer is required; you have )é   )r   r   r   z5psycopg version 3.1.8 or newer is required; you have r   )ÚIsolationLevelÚis_psycopg3)ÚadaptersÚsql)ÚFormat)Úget_adapters_templateÚregister_tzloaderÚtimestamptzi  Ú	INETARRAY)ÚDatabaseClient)ÚDatabaseCreation)ÚDatabaseFeatures)ÚDatabaseIntrospection)ÚDatabaseOperations)ÚDatabaseSchemaEditorc                 ó   — | d   €yd| z  S )NÚ
max_lengthÚvarcharúvarchar(%(max_length)s)© )Údatas    r   Ú_get_varchar_columnr3   S   s   € ØˆLÑÐ!ØØ$ tÑ+Ð+r   c                   óÞ  ‡ — e Zd ZdZdZi dd“dd“dd“d	d
“de“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dddd dd d d!d"d#d$œ
¥Zd%d%d%d&œZd'd'd'd(œZd)d*d+d,d-d.d/d0d1d2d+d+d,d,d3œZ	d4Z
d5d6d7d8d9d:d;œZeZeZeZeZeZeZeZd<Zi Zed=„ «       Zd>„ Zd?„ Zd@„ Ze dA„ «       Z!dB„ Z"dC„ Z#dD„ Z$dE„ Z%dF„ Z&ˆ fdG„Z'e dRdH„«       Z(dI„ Z)e dJ„ «       Z*dK„ Z+dRdL„Z,dM„ Z-ˆ fdN„Z.e/ˆ fdO„«       Z0e1dP„ «       Z2dQ„ Z3ˆ xZ4S )SÚDatabaseWrapperÚ
postgresqlÚ
PostgreSQLÚ	AutoFieldÚintegerÚBigAutoFieldÚbigintÚBinaryFieldÚbyteaÚBooleanFieldÚbooleanÚ	CharFieldÚ	DateFieldÚdateÚDateTimeFieldztimestamp with time zoneÚDecimalFieldz+numeric(%(max_digits)s, %(decimal_places)s)ÚDurationFieldÚintervalÚ	FileFieldr0   ÚFilePathFieldÚ
FloatFieldzdouble precisionÚIntegerFieldÚBigIntegerFieldÚIPAddressFieldÚinetÚGenericIPAddressFieldÚ	JSONFieldÚjsonbÚsmallintÚtextÚtimeÚuuid)
ÚOneToOneFieldÚPositiveBigIntegerFieldÚPositiveIntegerFieldÚPositiveSmallIntegerFieldÚ	SlugFieldÚSmallAutoFieldÚSmallIntegerFieldÚ	TextFieldÚ	TimeFieldÚ	UUIDFieldz"%(column)s" >= 0)rV   rW   rX   z GENERATED BY DEFAULT AS IDENTITY)r8   r:   rZ   z= %sz= UPPER(%s)zLIKE %szLIKE UPPER(%s)z~ %sz~* %sz> %sz>= %sz< %sz<= %s)ÚexactÚiexactÚcontainsÚ	icontainsÚregexÚiregexÚgtÚgteÚltÚlteÚ
startswithÚendswithÚistartswithÚ	iendswithzKREPLACE(REPLACE(REPLACE({}, E'\\', E'\\\\'), E'%%', E'\\%%'), E'_', E'\\_')zLIKE '%%' || {} || '%%'zLIKE '%%' || UPPER({}) || '%%'zLIKE {} || '%%'zLIKE UPPER({}) || '%%'zLIKE '%%' || {}zLIKE '%%' || UPPER({}))ra   rb   ri   rk   rj   rl   r   c                 óR  — | j                   d   j                  d«      }| j                  t        k(  s|sy | j                  | j                  vr¦| j                   j                  dd«      dk7  rt        d«      ‚|du ri }	 ddlm} | j                  «       }d|d	<   | j                   d
   } |d|d| j                  |r|j                  nd dœ|¤Ž}| j                  j                  | j                  |«       | j                  | j                     S # t        $ r}t        d«      |‚d }~ww xY w)NÚOPTIONSÚpoolÚCONN_MAX_AGEr   z/Pooling doesn't support persistent connections.T)ÚConnectionPoolzAError loading psycopg_pool module.
Did you install psycopg[pool]?Ú
autocommitÚCONN_HEALTH_CHECKSF)ÚkwargsÚopenÚ	configureÚcheckr1   )Úsettings_dictÚgetÚaliasr   Ú_connection_poolsr   Úpsycopg_poolrq   ÚImportErrorÚget_connection_paramsÚ_configure_connectionÚcheck_connectionÚ
setdefault)ÚselfÚpool_optionsrq   ÚerrÚconnect_kwargsÚenable_checksro   s          r   ro   zDatabaseWrapper.pool¸   s8  € à×)Ñ)¨)Ñ4×8Ñ8¸Ó@ˆØ�:‰:œÒ$©LØà�:‰:˜T×3Ñ3Ñ3Ø×!Ñ!×%Ñ% n°aÓ8¸AÒ=Ü*ØEóð ð ˜tÑ#Ø!�ðÝ7ð "×7Ñ7Ó9ˆNà+/ˆN˜<Ñ(Ø ×.Ñ.Ð/CÑDˆMÙ!ð Ø%ØØ×4Ñ4Ù9F�n×5Ò5ÈDñ	ð
 ñˆDð ×"Ñ"×-Ñ-¨d¯j©j¸$Ô?à×%Ñ% d§j¡jÑ1Ð1øô- ò Ü*ØXóàðûðús   Á>D Ä	D&ÄD!Ä!D&c                 ó€   — | j                   r2| j                   j                  «        | j                  | j                  = y y ©N)ro   Úcloser{   rz   ©r‚   s    r   Ú
close_poolzDatabaseWrapper.close_poolá   s.   € Ø�9Š9Ø�I‰I�O‰OÔØ×&Ñ& t§z¡zÑ2ð r   c                 ó.   — t        | j                  d«      S )zo
        Return a tuple of the database's version.
        E.g. for pg_version 120004, return (12, 4).
        i'  )ÚdivmodÚ
pg_versionrŠ   s    r   Úget_database_versionz$DatabaseWrapper.get_database_versionæ   s   € ô
 �d—o‘o uÓ-Ð-r   c                 ó¨  — | j                   }|d   dk(  r|d   j                  d«      st        d«      ‚t        |d   xs d«      | j                  j                  «       kD  r8t        d|d   t        |d   «      | j                  j                  «       fz  «      ‚|d   rd|d   i|d   ¥}n+|d   €|d   j                  dd «       ddi|d   ¥}ni |d   ¥}d	|d
<   |j                  dd «       |j                  dd «       |j                  dd «      }|rt        st        d«      ‚|j                  dd «      }|j                  dt        r
|du rt        nt        «       |d   r|d   |d<   |d   r|d   |d<   |d   r|d   |d<   |d   r|d   |d<   t        r<t        t        j                  | j                  «      |d<   |j                  dd «      |d<   |S )NÚNAMEÚ rn   Úservicez`settings.DATABASES is improperly configured. Please supply the NAME or OPTIONS['service'] value.z‡The database name '%s' (%d characters) is longer than PostgreSQL's limit of %d characters. Supply a shorter NAME in settings.DATABASES.ÚdbnameÚpostgresÚUTF8Úclient_encodingÚassume_roleÚisolation_levelro   z&Database pooling requires psycopg >= 3Úserver_side_bindingÚcursor_factoryTÚUSERÚuserÚPASSWORDÚpasswordÚHOSTÚhostÚPORTÚportÚcontextÚprepare_threshold)rx   ry   r   ÚlenÚopsÚmax_name_lengthÚpopr   r�   ÚServerBindingCursorÚCursorr#   r   ÚUSE_TZÚtimezone)r‚   rx   Úconn_paramsrƒ   rš   s        r   r~   z%DatabaseWrapper.get_connection_paramsí   s6  € Ø×*Ñ*ˆà˜Ñ  BÒ&¨}¸YÑ/G×/KÑ/KÈIÔ/VÜ&ðFóð ô ˆ}˜VÑ$Ò*¨Ó+¨d¯h©h×.FÑ.FÓ.HÒHÜ&ð)ð " &Ñ)Ü˜ fÑ-Ó.Ø—H‘H×,Ñ,Ó.ðñó	ð 	ð ˜Ò à˜-¨Ñ/ðà 	Ñ*ð‰Kð ˜6Ñ"Ð*à˜)Ñ$×(Ñ(¨°DÔ9Ø# ZÐL°=ÀÑ3KÐL‰Kà6˜]¨9Ñ5Ð6ˆKØ)/ˆÐ%Ñ&à�‰˜ tÔ,Ø�‰Ð)¨4Ô0à"—‘ v¨tÓ4ˆÙ¥Ü&Ð'OÓPÐPà)Ÿo™oÐ.CÀTÓJÐØ×ÑØõ Ð#6¸$Ñ#>õ $äô	
ð ˜Ò Ø"/°Ñ"7ˆK˜ÑØ˜Ò$Ø&3°JÑ&?ˆK˜
Ñ#Ø˜Ò Ø"/°Ñ"7ˆK˜ÑØ˜Ò Ø"/°Ñ"7ˆK˜ÑÝÜ%:Ü—‘ §¡ó&ˆK˜	Ñ"ð
 0;¯©Ø# Tó0ˆKÐ+Ñ,ð Ðr   c                 ó
  — | j                   d   }d}	 |d   }	 t        |«      | _        d}| j                  r5| j                  j                  «        | j                  j                  «       }n | j                  j                  d	i |¤Ž}|r| j                  |_        t        s"t        j                  j                  |d„ ¬«       |S # t        $ r t	        d|› d�«      ‚w xY w# t
        $ r t        j                  | _        Y ŒÖw xY w)
Nrn   Fr™   Tz$Invalid transaction isolation level z9 specified. Use one of the psycopg.IsolationLevel values.c                 ó   — | S rˆ   r1   )Úxs    r   ú<lambda>z4DatabaseWrapper.get_new_connection.<locals>.<lambda>T  s   € ¸€ r   )Úconn_or_cursÚloadsr1   )rx   r   r™   Ú
ValueErrorr   ÚKeyErrorÚREAD_COMMITTEDro   ru   Úgetconnr   Úconnectr   Úpsycopg2ÚextrasÚregister_default_jsonb)r‚   r®   ÚoptionsÚset_isolation_levelÚisolation_level_valueÚ
connections         r   Úget_new_connectionz"DatabaseWrapper.get_new_connection0  s  € ð ×$Ñ$ YÑ/ˆØ#Ðð	Ø$+Ð,=Ñ$>Ð!ð
Ü'5Ð6KÓ'L�Ô$Ø&*Ð#ð �9Š9à�I‰I�N‰NÔØŸ™×*Ñ*Ó,‰Jà.˜Ÿ™×.Ñ.Ñ=°Ñ=ˆJÙØ)-×)=Ñ)=ˆJÔ&Ýô �O‰O×2Ñ2Ø'©{ð 3ô ð Ðøô) ò Ü*Ø:Ð;PÐ:Qð ROð Póð ðûô ò 	AÜ#1×#@Ñ#@ˆDÖ ð	Aús   “C! ™C ÃCÃ!DÄDc                 ór   — | j                  «        | j                  €y| j                  | j                  «      S )NF)r‹   rÀ   Ú_configure_timezonerŠ   s    r   Úensure_timezonezDatabaseWrapper.ensure_timezoneX  s.   € à�‰ÔØ�?‰?Ð"ØØ×'Ñ'¨¯©Ó8Ð8r   c                 ó  — |j                   j                  d«      }| j                  }|rJ||k7  rE|j                  «       5 }|j	                  | j
                  j                  «       |g«       d d d «       yy# 1 sw Y   yxY w)NÚTimeZoneTF)ÚinfoÚparameter_statusÚtimezone_nameÚcursorÚexecuter§   Úset_time_zone_sql)r‚   rÀ   Úconn_timezone_namerÉ   rÊ   s        r   rÃ   z#DatabaseWrapper._configure_timezone_  st   € Ø'Ÿ_™_×=Ñ=¸jÓIÐØ×*Ñ*ˆÙÐ/°=Ò@Ø×"Ñ"Ó$ð N¨Ø—‘˜tŸx™x×9Ñ9Ó;¸m¸_ÔM÷NàØ÷Nàús   ¿,A5Á5A>c                 óì   — | j                   d   j                  d«      x}rH|j                  «       5 }| j                  j	                  d|g«      }|j                  |«       d d d «       yy# 1 sw Y   yxY w)Nrn   r˜   zSET ROLE %sTF)rx   ry   rÊ   r§   Úcompose_sqlrË   )r‚   rÀ   Únew_rolerÊ   r!   s        r   Ú_configure_rolezDatabaseWrapper._configure_roleh  sr   € Ø×)Ñ)¨)Ñ4×8Ñ8¸ÓGÐGˆ8ÐGØ×"Ñ"Ó$ð $¨Ø—h‘h×*Ñ*¨=¸8¸*ÓE�Ø—‘˜sÔ#÷$ð Ø÷	$ð ús   ±/A*Á*A3c                 óR   — | j                  |«      }| j                  |«      }|xs |S rˆ   )rÃ   rÑ   )r‚   rÀ   Ú	commit_tzÚcommit_roles       r   r   z%DatabaseWrapper._configure_connectionp  s1   € ð
 ×,Ñ,¨ZÓ8ˆ	ð ×*Ñ*¨:Ó6ˆàÒ'˜iÐ'r   c                 ó.  — | j                   �}| j                  5  | j                  r7| j                   j                  j	                  | j                   «       d | _         n#| j                   j                  «       cd d d «       S 	 d d d «       y y # 1 sw Y   y xY wrˆ   )rÀ   Úwrap_database_errorsro   Ú_poolÚputconnr‰   rŠ   s    r   Ú_closezDatabaseWrapper._close}  s�   € Ø�?‰?Ð&ð ×*Ñ*ñ 	3Ø—9’9ð —O‘O×)Ñ)×1Ñ1°$·/±/ÔBà&*�D•OàŸ?™?×0Ñ0Ó2÷	3ñ 	3ð $÷	3ð 	3ð	 '÷	3ð 	3ús   ™ABÂBc                 óè   •— t         ‰| �  «        | j                  �W| j                  sJ| j	                  | j                  «      }|r,| j                  «       s| j                  j                  «        y y y y y rˆ   )ÚsuperÚinit_connection_staterÀ   ro   r   Úget_autocommitÚcommit)r‚   rÞ   Ú	__class__s     €r   rÜ   z%DatabaseWrapper.init_connection_state�  s_   ø€ Ü‰Ñ%Ô'à�?‰?Ð&¨t¯yªyØ×/Ñ/°·±Ó@ˆFá˜d×1Ñ1Ô3Ø—‘×&Ñ&Õ(ð 4ˆvð 09Ð&r   c                 óp  — |r‡t         rN| j                  d   j                  d«      dur.t        | j                  |d| j                  j
                  ¬«      }nM| j                  j                  |d| j                  j
                  ¬«      }n| j                  j                  «       }t         ri| j                  j                  j                  t        t        j                  «      }| j                  |j                  k7  rt        | j                  |«       |S t        j                  r| j                   nd |_        |S )Nrn   rš   TF)ÚnameÚ
scrollableÚwithhold)râ   rã   )r   rx   ry   ÚServerSideCursorrÀ   rr   rÊ   r    Ú
get_loaderÚTIMESTAMPTZ_OIDr"   ÚTEXTr­   r$   r   r¬   Útzinfo_factory)r‚   rá   rÊ   Útzloaders       r   Úcreate_cursorzDatabaseWrapper.create_cursor–  sù   € áÝØ×"Ñ" 9Ñ-×1Ñ1Ð2GÓHÐPTÑTô *Ø—O‘OØØ$Ø!Ÿ_™_×7Ñ7ô	‘ð Ÿ™×/Ñ/Ø U°T·_±_×5OÑ5Oð 0ó ‘ð —_‘_×+Ñ+Ó-ˆFåð —‘×/Ñ/×:Ñ:¼?ÌFÏKÉKÓXˆHØ�}‰} × 1Ñ 1Ò1Ü! $§-¡-°Ô8ð ˆô <D¿?º? D×$7Ò$7ÐPTˆFÔ!Øˆr   c                 ó   — | j                   S rˆ   )r­   )r‚   Úoffsets     r   rè   zDatabaseWrapper.tzinfo_factory¹  s   € Ø�}‰}Ðr   c                 ó&  — | xj                   dz  c_         	 t        j                  «       }|rt	        t        |«      «      }nd}| j                  dt        j                  «       j                  || j                   fz  ¬«      S # t        $ r d }Y Œdw xY w)Nr   Úsyncz_django_curs_%d_%s_%d)rá   )
Ú_named_cursor_idxÚasyncioÚcurrent_taskÚRuntimeErrorÚstrÚidÚ_cursorÚ	threadingÚcurrent_threadÚident)r‚   rñ   Ú
task_idents      r   Úchunked_cursorzDatabaseWrapper.chunked_cursor¼  s˜   € à×Ò !Ñ#Õð	 Ü"×/Ñ/Ó1ˆLñ ÜœR Ó-Ó.‰JàˆJà�|‰|Ø(ô ×(Ñ(Ó*×0Ñ0ØØ×&Ñ&ð	ñð ó 
ð 	
øô ò 	 ØŠLð	 ús   —B ÂBÂBc                 óh   — | j                   5  || j                  _        d d d «       y # 1 sw Y   y xY wrˆ   )rÖ   rÀ   rr   )r‚   rr   s     r   Ú_set_autocommitzDatabaseWrapper._set_autocommitØ  s,   € Ø×&Ñ&ñ 	4Ø)3ˆD�O‰OÔ&÷	4÷ 	4ñ 	4ús   �(¨1c                 ó’   — | j                  «       5 }|j                  d«       |j                  d«       ddd«       y# 1 sw Y   yxY w)zl
        Check constraints by setting them to immediate. Return them to deferred
        afterward.
        zSET CONSTRAINTS ALL IMMEDIATEzSET CONSTRAINTS ALL DEFERREDN)rÊ   rË   )r‚   Útable_namesrÊ   s      r   Úcheck_constraintsz!DatabaseWrapper.check_constraintsÜ  s>   € ð
 �[‰[‹]ð 	;˜fØ�N‰NÐ:Ô;Ø�N‰NÐ9Ô:÷	;÷ 	;ñ 	;ús	   ‘#=½Ac                 óÒ   — | j                   €y	 | j                   j                  «       5 }|j                  d«       d d d «       y# 1 sw Y   yxY w# t        j                  $ r Y yw xY w)NFzSELECT 1T)rÀ   rÊ   rË   r   ÚError©r‚   rÊ   s     r   Ú	is_usablezDatabaseWrapper.is_usableå  sc   € Ø�?‰?Ð"Øð	à—‘×'Ñ'Ó)ð +¨VØ—‘˜zÔ*÷+ð
 ÷+ð
 ûô �~‰~ò 	Ùð	ús-   �A ©A»A ÁAÁ	A ÁA ÁA&Á%A&c                 ó:   •— | j                   ry t        ‰| �	  «       S rˆ   )ro   rÛ   Úclose_if_health_check_failed)r‚   rß   s    €r   r  z,DatabaseWrapper.close_if_health_check_failedñ  s   ø€ Ø�9Š9àÜ‰wÑ3Ó5Ð5r   c              #   ój  •K  — d }	 t         ‰| �  «       5 }|–— d d d «       y # 1 sw Y   y xY w# t        j                  t        f$ rè |�‚ t        j                  dt        «       t        j                  «       D ]²  }|j                  dk(  sŒ|j                  d   dk7  sŒ&| j                  i | j                  ¥d|j                  d   i¥| j                  ¬«      }	 |j                  «       5 }|–— d d d «       n# 1 sw Y   nxY w|j                  «        n# |j                  «        w xY w Y y  ‚ w xY w­w)Na8  Normally Django will use a connection to the 'postgres' database to avoid running initialization queries against the production database when it's not needed (for example, when running tests). Django was unable to create a connection to the 'postgres' database and will use the first PostgreSQL database instead.r6   r‘   r•   )rz   )rÛ   Ú_nodb_cursorr   r   ÚWrappedDatabaseErrorÚwarningsÚwarnÚRuntimeWarningr   ÚallÚvendorrx   rß   rz   rÊ   r‰   )r‚   rÊ   rÀ   Úconnrß   s       €r   r  zDatabaseWrapper._nodb_cursor÷  s5  øè ø€ àˆð!	Ü‘Ñ%Ó'ð ¨6Ø’÷÷ ñ ûä×&Ñ&Ô(<Ð=ò 	ØÐ!ØÜ�M‰MðFô
 ôô *Ÿo™oÓ/ò �
à×%Ñ%¨Ó5Ø"×0Ñ0°Ñ8¸JÓFàŸ>™>ðØ"×0Ñ0ðà" J×$<Ñ$<¸VÑ$Dñð #Ÿj™jð *ó �Dð%Ø!Ÿ[™[›]ð )¨fØ"(šL÷)÷ )ñ )úð Ÿ
™
�ø˜Ÿ
™
�úÚð#ð& ð=	üs{   ƒD3‡/ •#š/ ¢D3£,¨/ «D3¬/ ¯AD0ÂD0Â:D0ÃDÃ*C8Ã/	DÃ8DÃ=DÄD0ÄD'Ä'D0Ä+D3Ä-D0Ä0D3c                 óŽ   — | j                  «       5  | j                  j                  j                  cd d d «       S # 1 sw Y   y xY wrˆ   )Útemporary_connectionrÀ   rÇ   Úserver_versionrŠ   s    r   rŽ   zDatabaseWrapper.pg_version  s6   € à×&Ñ&Ó(ñ 	7Ø—?‘?×'Ñ'×6Ñ6÷	7÷ 	7ò 	7ús	   ‘ ;»Ac                 ó   — t        || «      S rˆ   r
   r  s     r   Úmake_debug_cursorz!DatabaseWrapper.make_debug_cursor"  s   € Ü! &¨$Ó/Ð/r   rˆ   )5Ú__name__Ú
__module__Ú__qualname__r  Údisplay_namer3   Ú
data_typesÚdata_type_check_constraintsÚdata_types_suffixÚ	operatorsÚpattern_escÚpattern_opsr   r,   ÚSchemaEditorClassr'   Úclient_classr(   Úcreation_classr)   Úfeatures_classr*   Úintrospection_classr+   Ú	ops_classrï   r{   Úpropertyro   r‹   r�   r~   r   rÁ   rÄ   rÃ   rÑ   r   rÙ   rÜ   rê   rè   rú   rü   rÿ   r  r  r   r  r   rŽ   r  Ú__classcell__)rß   s   @r   r5   r5   Y   s€  ø„ Ø€FØ€Lð
Ø�Yðà˜ðð 	�wðð 	˜	ð	ð
 	Ð(ðð 	�Vðð 	Ð3ðð 	ÐEðð 	˜ðð 	Ð.ðð 	Ð2ðð 	Ð(ðð 	˜	ðð 	˜8ðð 	˜&ðð  	  ð!ð" 	�Wð#ð$ #Ø#+Ø )Ø%/Ø.Ø$Ø'ØØØò7€Jð< $7Ø 3Ø%8ñ#Ðð 8Ø:Ø<ñÐð ØØØ%ØØØØØØØØØ'Ø%ñ€Ið4 	Wð ð .Ø5Ø'Ø/Ø%Ø-ñ€Kð €HØ,Ðà!€LØ%€NØ%€NØ/ÐØ"€IàÐØÐàñ&2ó ð&2òP3ò
.òAðF ñ%ó ð%òN9òòò(ò3ô )ð ò ó ð òDð ñ
ó ð
ò64ó;ò
ô6ð ó#ó ð#ðJ ñ7ó ð7ö0r   r5   c                   ó   — e Zd ZdZdd„Zy)ÚCursorMixinzE
        A subclass of psycopg cursor implementing callproc.
        Nc                 óö  — t        |t        j                  «      st        j                  |«      }t        j                  d«      |t        j                  d«      g}|rR|D ]J  }|j	                  t        j
                  |«      «       |j	                  t        j                  d«      «       ŒL |d= |j	                  t        j                  d«      «       t        j                  |«      }| j                  |«       |S )NzSELECT * FROM ú(ú,éÿÿÿÿú))Ú
isinstancer!   Ú
IdentifierÚSQLÚappendÚLiteralÚComposedrË   )r‚   rá   ÚargsÚqpartsÚitemÚstmts         r   ÚcallproczCursorMixin.callproc-  s³   € Ü˜d¤C§N¡NÔ3Ü—~‘~ dÓ+�ä—g‘gÐ.Ó/°´s·w±w¸s³|ÐDˆFÙØ ò 0�DØ—M‘M¤#§+¡+¨dÓ"3Ô4Ø—M‘M¤#§'¡'¨#£,Õ/ð0ð ˜2�Jà�M‰Mœ#Ÿ'™' #›,Ô'Ü—<‘< Ó'ˆDØ�L‰L˜ÔØˆKr   rˆ   )r  r  r  Ú__doc__r7  r1   r   r   r'  r'  (  s   „ ñ	ô	r   r'  c                   ó   — e Zd Zy)rª   N©r  r  r  r1   r   r   rª   rª   =  ó   „ Ør   rª   c                   ó   — e Zd Zy)r«   Nr:  r1   r   r   r«   r«   @  r;  r   r«   c                   ó   — e Zd ZdZy)rä   aD  
        psycopg >= 3 forces the usage of server-side bindings when using named
        cursors but the ORM doesn't yet support the systematic generation of
        prepareable SQL (#20516).

        ClientCursorMixin forces the usage of client-side bindings while
        ServerCursor implements the logic required to declare and scroll
        through named cursors.

        Mixing ClientCursorMixin in wouldn't be necessary if Cursor allowed to
        specify how parameters should be bound instead, which ServerCursor
        would inherit, but that's not the case.
        N)r  r  r  r8  r1   r   r   rä   rä   C  s   „ ò	r   rä   c                   ó   — e Zd Zd„ Zy)r   c                 ó†   — | j                  |«      5  | j                  j                  |«      cd d d «       S # 1 sw Y   y xY wrˆ   )Ú	debug_sqlrÊ   Úcopy)r‚   Ú	statements     r   rA  zCursorDebugWrapper.copyU  s5   € Ø—‘ 	Ó*ñ 3Ø—{‘{×'Ñ'¨	Ó2÷3÷ 3ò 3ús	   ’7·A N)r  r  r  rA  r1   r   r   r   r   T  s   „ ó	3r   r   c                   ó   — e Zd Zd„ Zd„ Zy)r   c                 óŒ   — | j                  |«      5   | j                  j                  ||g|¢­Ž cd d d «       S # 1 sw Y   y xY wrˆ   )r@  rÊ   Úcopy_expert)r‚   r!   Úfiler3  s       r   rE  zCursorDebugWrapper.copy_expert]  sB   € Ø—‘ Ó$ñ AØ.�t—{‘{×.Ñ.¨s°DÐ@¸4Ò@÷A÷ Aò Aús	   ’:ºAc                 óš   — | j                  d|z  ¬«      5   | j                  j                  ||g|¢­i |¤Žcd d d «       S # 1 sw Y   y xY w)NzCOPY %s TO STDOUT)r!   )r@  rÊ   Úcopy_to)r‚   rF  Útabler3  rt   s        r   rH  zCursorDebugWrapper.copy_toa  sO   € Ø—‘Ð$7¸%Ñ$?�Ó@ñ IØ*�t—{‘{×*Ñ*¨4°ÐH¸ÒHÀÑH÷I÷ Iò Iús   –!AÁA
N)r  r  r  rE  rH  r1   r   r   r   r   \  s   „ ò	Aó	Ir   )Qr8  rð   rö   r	  Ú
contextlibr   Údjango.confr   Údjango.core.exceptionsr   Ú	django.dbr   r  r   Údjango.db.backends.base.baser   r	   Údjango.db.backends.utilsr   ÚBaseCursorDebugWrapperÚdjango.utils.asyncior   Údjango.utils.functionalr   Údjango.utils.safestringr   Údjango.utils.versionr   Úpsycopgr   r}   rº   r   r   Úpsycopg_anyr   r   r    r!   Ú
psycopg.pqr"   r#   r$   ÚtypesÚoidræ   Úpsycopg2.extensionsÚpsycopg2.extrasÚ
extensionsÚregister_adapterÚQuotedStringr»   Úregister_uuidÚINETARRAY_OIDÚnew_array_typeÚUNICODEr&   Úregister_typeÚclientr'   Úcreationr(   Úfeaturesr)   Úintrospectionr*   Ú
operationsr+   Úschemar,   r3   r5   r'  r«   rª   ÚClientCursorÚclient_cursorÚClientCursorMixinÚServerCursorrä   rÊ   r1   r   r   ú<module>rn     s/  ðñó Û Û Ý %å  Ý 7Ý ;Ý !ß IÝ QÝ -Ý 3Ý .Ý 2ðKð$Û"ò&ñ
 Ó�yÒ Ù
Ø
@À×AUÑAUÐ@VÐWóð ð ‰?ÓÔ(˜yÕ(Ù
Ø
?À×@TÑ@TÐ?UÐVóð ÷
 5áß%Ý!çEà—n‘n ]Ñ3×7Ñ7�Oó Ûà×Ñ×(Ñ(¨°X×5HÑ5H×5UÑ5UÔVØ‡O�O×!Ñ!Ô#ð €MØ×#Ñ#×2Ñ2Ø	ÐØØ×Ñ×#Ñ#ó€Ið
 ×Ñ×%Ñ% iÔ0õ #Ý &Ý &Ý 0Ý *Ý (ò,ôJ0Ð)ô J0ñZ ÷ñ ô*˜k¨8¯?©?ô ô�˜h×3Ñ3ô ôØ�X×+Ñ+×=Ñ=¸x×?TÑ?Tôô"3Ð3õ 3ð × Ñ ×'Ñ'€FôIÐ3õ IøðE ò $Þ#ð$ûàò KÙ
ÐIÓ
JÐJðKús$   ÁI É	IÉ
I ÉIÉI ÉI