
    hS4                        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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ZddlZd Z! e!       Z"e"dk  r e	dejF                  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/ ej`                  jc                  eej`                  jd                         ejf                  ji                          dZ5ej`                  jm                  e5fdej`                  jn                        Z8ej`                  js                  e8        G d de      Z: G d de      Zy# e$ rZ  e	de z        dZ [ ww xY w)zW
PostgreSQL database backend for Django.

Requires psycopg 2: https://www.psycopg.org/
    N)contextmanager)settings)ImproperlyConfigured)DatabaseErrorconnections)BaseDatabaseWrapperCursorDebugWrapper)async_unsafe)cached_property)
SafeString)get_version_tuplez!Error loading psycopg2 module: %sc                  ^    t         j                  j                  dd      d   } t        |       S )N    r   )psycopg2__version__splitr   )versions    e/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/db/backends/postgresql/base.pypsycopg2_versionr       s*    ""((a03GW%%    )         z8psycopg2_version 2.5.4 or newer is required; you have %sr   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditori  	INETARRAYc                       e Zd ZdZdZi 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
dddd"dd#d"d$d%d&d'Zd(d(d(d)Zd*d+d,d-d.d/d0d1d2d3d,d,d-d-d4Zd5Zd6d7d8d9d:d;d<Z	e
Z
eZeZeZeZeZeZd=Zd> Zed?        Zd@ ZdA ZedKdB       ZdC ZedD        ZdE Z dKdFZ!dG Z"e# fdH       Z$e%dI        Z&dJ Z' xZ(S )LDatabaseWrapper
postgresql
PostgreSQL	AutoFieldserialBigAutoField	bigserialBinaryFieldbyteaBooleanFieldboolean	CharFieldzvarchar(%(max_length)s)	DateFielddateDateTimeFieldztimestamp with time zoneDecimalFieldz+numeric(%(max_digits)s, %(decimal_places)s)DurationFieldinterval	FileFieldFilePathField
FloatFieldzdouble precisionIntegerFieldintegerBigIntegerFieldbigintIPAddressFieldinetGenericIPAddressField	JSONFieldjsonbsmallintsmallserialtexttimeuuid)NullBooleanFieldOneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField	SlugFieldSmallAutoFieldSmallIntegerField	TextField	TimeField	UUIDFieldz"%(column)s" >= 0)rI   rJ   rK   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({}))rT   rU   r\   r^   r]   r_   r   c                    | j                   }|d   dk(  rt        d      t        |d   xs d      | j                  j	                         kD  r8t        d|d   t        |d         | j                  j	                         fz        d|d   xs di|d   }|j                  dd        |d	   r|d	   |d
<   |d   r|d   |d<   |d   r|d   |d<   |d   r|d   |d<   |S )NNAME zJsettings.DATABASES is improperly configured. Please supply the NAME value.zThe database name '%s' (%d characters) is longer than PostgreSQL's limit of %d characters. Supply a shorter NAME in settings.DATABASES.databasepostgresOPTIONSisolation_levelUSERuserPASSWORDpasswordHOSThostPORTport)settings_dictr   lenopsmax_name_lengthpop)selfro   conn_paramss      r   get_connection_paramsz%DatabaseWrapper.get_connection_params   s-   ** B&&01 1 }V$*+dhh.F.F.HH&) "&)f-.HH,,.,  f-;
I&
 	)40 "/"7K$&3J&?K
# "/"7K "/"7Kr   c                 T   t        j                  di |}| j                  d   }	 |d   | _        | j                  |j                  k7  r|j	                  | j                         	 t        j                  j                  |d        |S # t
        $ r |j                  | _        Y @w xY w)Nre   rf   )rf   c                     | S N )xs    r   <lambda>z4DatabaseWrapper.get_new_connection.<locals>.<lambda>   s    XY r   )conn_or_cursloadsrz   )	Databaseconnectro   rf   set_sessionKeyErrorr   extrasregister_default_jsonb)rt   ru   
connectionoptionss       r   get_new_connectionz"DatabaseWrapper.get_new_connection   s    %%44
 $$Y/	M#*+<#=D 
 ##z'A'AA&&t7K7K&L 	..Jk.Z  	>#-#=#=D 	>s   
B
 
B'&B'c                 0   | j                   y| j                   j                  d      }| j                  }|rT||k7  rO| j                   j                         5 }|j	                  | j
                  j                         |g       d d d        yy# 1 sw Y   yxY w)NFTimeZoneT)r   get_parameter_statustimezone_namecursorexecuterq   set_time_zone_sql)rt   conn_timezone_namer   r   s       r   ensure_timezonezDatabaseWrapper.ensure_timezone   s    ??"!__AA*M**/=@'') NVtxx99;m_MNNs   ,BBc                     | j                   j                  d       | j                         }|r,| j                         s| j                   j	                          y y y )NUTF8)r   set_client_encodingr   get_autocommitcommit)rt   timezone_changeds     r   init_connection_statez%DatabaseWrapper.init_connection_state   sL    ++F3//1&&(&&( ) r   c                     |r3| j                   j                  |d| j                   j                        }n| j                   j                         }t        j                  r| j
                  |_        |S d |_        |S )NF)
scrollablewithhold)r   r   
autocommitr   USE_TZtzinfo_factory)rt   namer   s      r   create_cursorzDatabaseWrapper.create_cursor   sh     __++DUT__MgMg+hF__++-F7? 3 3 MQr   c                     | j                   S ry   )timezone)rt   offsets     r   r   zDatabaseWrapper.tzinfo_factory   s    }}r   c                    | xj                   dz  c_         	 t        t        d      rt        j                         }nt        j                  j                         }|rt        t        |            }nd}| j                  dt        j                         j                  || j                   fz        S # t
        $ r d }Y dw xY w)Nr   current_tasksyncz_django_curs_%d_%s_%d)r   )_named_cursor_idxhasattrasyncior   TaskRuntimeErrorstrid_cursor	threadingcurrent_threadident)rt   r   
task_idents      r   chunked_cursorzDatabaseWrapper.chunked_cursor   s    !#	 w/&335  '||88: R-.JJ||(((*00&&	,   
 	
  	 L	 s   AB1 1B?>B?c                 h    | j                   5  || j                  _        d d d        y # 1 sw Y   y xY wry   )wrap_database_errorsr   r   )rt   r   s     r   _set_autocommitzDatabaseWrapper._set_autocommit  s,    && 	4)3DOO&	4 	4 	4s   (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   )rt   table_namesr   s      r   check_constraintsz!DatabaseWrapper.check_constraints  s>    
 [[] 	;fNN:;NN9:	; 	; 	;s	   #=Ac                     	 | 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)NzSELECT 1TF)r   r   r   r   Errorrt   r   s     r   	is_usablezDatabaseWrapper.is_usable   sV    	'') +Vz*+
 +
  ~~ 		s*   A 7A A A  A AAc              #   `  K   	 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.r%   ra   rd   )alias)super_nodb_cursorr   r   WrappedDatabaseErrorwarningswarnRuntimeWarningr   allvendorro   	__class__r   r   close)rt   r   r   connr   s       r   r   zDatabaseWrapper._nodb_cursor*  s    	%' 6  &&(<= 	MMF
  *oo/ 
$$49Q9QRX9Y]g9g>>X4--Xvz7O7OPV7WX"jj * D%![[] )f"(L) ) ) 



 -	s{   D.- !- D.*- D.- AD+D+:D+D%C3*	D3C<8D?D+D""D+&D.(D++D.c                 z    | j                         5  | j                  j                  cd d d        S # 1 sw Y   y xY wry   )temporary_connectionr   server_version)rt   s    r   
pg_versionzDatabaseWrapper.pg_versionG  s0    &&( 	2??11	2 	2 	2s   1:c                     t        ||       S ry   r	   r   s     r   make_debug_cursorz!DatabaseWrapper.make_debug_cursorL  s    !&$//r   ry   ))__name__
__module____qualname__r   display_name
data_typesdata_type_check_constraints	operatorspattern_escpattern_opsr   r!   SchemaEditorClassr   client_classr   creation_classr   features_classr   introspection_classr    	ops_classr   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r$   r$   A   s+   FL
X 	w 			
 	. 	V 	3 	E 	 	. 	2 	( 		 	8 	&  	 !" 	W#$ &"#+ )%/.''9J> $7 3%8# %'%I2 aK-5'/%-K H,!L%N%N/"I@  .	)   
 
>4;  8 2 20r   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ry   )	debug_sqlr   copy_expert)rt   sqlfileargss       r   r   zCursorDebugWrapper.copy_expertQ  s>    ^^C  	=*4;;**3<t<	= 	= 	=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)rt   r   tabler   kwargss        r   r   zCursorDebugWrapper.copy_toU  sO    ^^ 3e ;^< 	E&4;;&&tUDTDVD	E 	E 	Es   !AA
N)r   r   r   r   r   rz   r   r   r
   r
   P  s    =Er   r
   );__doc__r   r   r   
contextlibr   django.confr   django.core.exceptionsr   	django.dbr   r   r   django.db.backends.base.baser   django.db.backends.utilsr
   BaseCursorDebugWrapperdjango.utils.asyncior   django.utils.functionalr   django.utils.safestringr   django.utils.versionr   r   r   psycopg2.extensionspsycopg2.extrasImportErrorer   PSYCOPG2_VERSIONr   clientr   creationr   featuresr   introspectionr   
operationsr    schemar!   
extensionsregister_adapterQuotedStringr   register_uuidINETARRAY_OIDnew_array_typeUNICODEr"   register_typer$   rz   r   r   <module>r
     sL      %   7 H < . 3 . 2H
&
 $% i
Y\d\p\pp
qq # & & 0 * (    $ $Z1D1D1Q1Q R     ..	
 	   ! !) ,L0) L0^E/ Ei	  H
BQF
GGHs   E E'E""E'