
    Dh.                         d dl mZ d dlZd dlZd dlmZ ej                  dk\  rd dlmZ nd dl	mZ d dl
mZmZ d dlmZ 	 d dlmZmZ d	Z G d de      Zy# e$ r d
ZY w xY w)    )unicode_literalsN)settings      )BaseDatabaseOperations)sixtimezone
force_text)datetime_to_mysqltime_to_mysqlTFc                   f    e Zd ZdZej
                  dk\  r eej                  dd      Zd Z	d Z
d Zd	 Zej
                  d
k\  rd Znd Zd Zd Zd Zd Zd Zd Zd Zd Zd&dZd Zd Zd Zd Zd Zej
                  d
k  rd Z fdZd Zd Zd Z d  Z! fd!Z" fd"Z#d# Z$d$ Z%d% Z& xZ'S )'DatabaseOperationszmysql.connector.django.compiler)r      )r   l    )r       )PositiveSmallIntegerFieldPositiveIntegerFieldc                 n    |dk(  rdj                  |      S dj                  |j                         |      S )Nweek_dayDAYOFWEEK({0})EXTRACT({0} FROM {1}))formatupper)selflookup_type
field_names      a/var/www/html/civilisation/venv/lib/python3.12/site-packages/mysql/connector/django/operations.pydate_extract_sqlz#DatabaseOperations.date_extract_sql$   s>    *$ $**:66*11!!#Z1 1    c                    g d}d}d}	 |j                  |      dz   }dj                  |d| D cg c]  }| c}||d D cg c]  }| c}z         }dj                  ||      }	|	S c c}w c c}w # t        $ r |}	Y |	S w xY w)zReturns SQL simulating DATE_TRUNC

        This function uses MySQL functions DATE_FORMAT and CAST to
        simulate DATE_TRUNC.

        The field_name is returned when lookup_type is not supported.
        yearmonthdayhourminutesecondz%Y-z%mz-%dz %H:z%iz:%Sz0000-01z-01z 00:00z:00r    N)CAST(DATE_FORMAT({0}, '{1}') AS DATETIME))indexjoinr   
ValueError)
r   r   r   fieldsr   
format_defif
format_strsqls
             r   date_trunc_sqlz!DatabaseOperations.date_trunc_sql.   s     F:@
		([)A-A
 VBQZ!8!!8-7^!<!!<"= >J=DDJ(C
	 "9!<  	C 
	s   A2 	A(	A-
2B Bc                     t         j                  rdj                  |      }|g}ng }|dk(  rdj                  |      }||fS dj                  |j                         |      }||fS )NCONVERT_TZ({0}, 'UTC', %s)r   r   r   )r   USE_TZr   r   )r   r   r   tznameparamsr7   s         r   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sqlE   sw    ??5<<ZHJXFF *$ #))*5C F{ *001B1B1D1;=CF{r    c                 ^   t         j                  rdj                  |      }|g}ng }g d}d}d}	 |j                  |      dz   }dj	                  |d | D 	cg c]  }	|	 c}	||d  D 	cg c]  }	|	 c}	z         }
dj                  ||
      }||fS c c}	w c c}	w # t
        $ r |}Y ||fS w xY w)Nr:   r"   r)   r*   r   r-   r.   )r   r;   r   r/   r0   r1   )r   r   r   r<   r=   r2   format_r3   r4   r5   r6   r7   s               r   datetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sqlW   s    ??5<<ZHJXFFE;@
	([)A-A WRa[!9!!9-7^!<!!<"= >J=DDJ(CF{	 ":!<	  	C F{	s   B 	B)	B
B,+B,r   c                 R    d|j                   |j                  |j                  fz  g fS )<Returns SQL for calculating date/time intervals
            z'INTERVAL '%d 0:0:%d:%d' DAY_MICROSECOND)dayssecondsmicroseconds)r   	timedeltas     r   date_interval_sqlz$DatabaseOperations.date_interval_sqlm   s:     =	 1 193I3I@K KLNO Or    c                 n    d}|j                  |||j                  |j                  |j                        S )rC   zH({sql} {connector} INTERVAL '{days} 0:0:{secs}:{msecs}' DAY_MICROSECOND))r7   	connectorrD   secsmsecs)r   rD   rE   rF   )r   r7   rJ   rG   fmts        r   rH   z$DatabaseOperations.date_interval_sqls   sC    7  ::#^^&&,,   r    c                 V    | j                   j                  j                  rd|z  S d|z  S )NzINTERVAL %s MICROSECONDz#INTERVAL FLOOR(%s / 1000000) SECOND)
connectionfeaturessupports_microsecond_precision)r   r7   s     r   format_for_duration_arithmeticz1DatabaseOperations.format_for_duration_arithmetic   s+    ??##BB,s2283>>r    c                      y)NzDROP FOREIGN KEY r   s    r   drop_foreignkey_sqlz&DatabaseOperations.drop_foreignkey_sql   s    !r    c                 >    t         j                  dk\  rddg dffgS dgS )z
        "ORDER BY NULL" prevents MySQL from implicitly ordering by grouped
        columns. If no ordering would otherwise be applied, we don't want any
        implicit sorting going on.
        r   NNULLF)djangoVERSIONrU   s    r   force_no_orderingz$DatabaseOperations.force_no_ordering   s,     >>V#FB./008Or    c                 $    dj                  |      S )Nz(MATCH ({0}) AGAINST (%s IN BOOLEAN MODE)r   )r   r   s     r   fulltext_search_sqlz&DatabaseOperations.fulltext_search_sql   s    9@@LLr    c                 0    t        |j                  d      S )Nreplace)errors)r   	statement)r   cursorr7   r=   s       r   last_executed_queryz&DatabaseOperations.last_executed_query   s    &**9==r    c                      y)Nr   rT   rU   s    r   no_limit_valuez!DatabaseOperations.no_limit_value   s    #r    c                 l    |j                  d      r|j                  d      r|S dj                  |      S )N`z`{0}`)
startswithendswithr   )r   names     r   
quote_namezDatabaseOperations.quote_name   s-    ??3DMM#$6K~~d##r    c                      y)NzRAND()rT   rU   s    r   random_function_sqlz&DatabaseOperations.random_function_sql   s    r    c                 $   |rdg}|D ]Q  }|j                  dj                  |j                  d      |j                  | j	                  |                         S |j                  d       |j                  | j                  ||             |S g S )NzSET FOREIGN_KEY_CHECKS = 0;z{keyword} {table};TRUNCATE)keywordtablezSET FOREIGN_KEY_CHECKS = 1;)appendr   SQL_KEYWORD	SQL_FIELDrl   extendsequence_reset_by_name_sql)r   styletables	sequencesallow_cascader7   rr   s          r   	sql_flushzDatabaseOperations.sql_flush   s    01C D

/66!--j9//$//%*@A 7 C DD JJ45JJt66uiHIJIr    c                 &    |dk(  rt        d      |S )Nr   z@The database backend does not accept 0 as a value for AutoField.)r1   r   values     r   validate_autopk_valuez(DatabaseOperations.validate_autopk_value   s     A: 4 5 5r    c                    |y t        j                  |      rKt        j                  r0|j	                  t         j
                        j                  d       }nt        d      | j                  j                  j                  s|j                  d      }| j                  j                  st        |      S | j                  j                  j                  |      S )N)tzinfo4MySQL backend does not support timezone-aware times.r   microsecond)r
   is_awarer   r;   
astimezoneutcr`   r1   rO   rP   rQ   use_purer   	converterto_mysqlr~   s     r   value_to_db_datetimez'DatabaseOperations.value_to_db_datetime   s    =U#((6>>d>K J  ''FFMMaM0E''$U++((11%88r    c                     |y t        j                  |      rt        d      | j                  j                  st        |      S | j                  j                  j                  |      S )Nr   )r
   r   r1   rO   r   r   r   r   r~   s     r   value_to_db_timez#DatabaseOperations.value_to_db_time   sa    = U# & ' ' '' ''((11%88r    c                      y)N@   rT   rU   s    r   max_name_lengthz"DatabaseOperations.max_name_length   s    r    c                     dj                  dj                  dgt        |      z              }ddj                  |g|z        z   S )Nz({0})z, z%szVALUES )r   r0   len)r   r2   
num_values	items_sqls       r   bulk_insert_sqlz"DatabaseOperations.bulk_insert_sql   s?    NN499dVc&k-A#BC	499i[:%=>>>r    c                 N    d}d}|j                  |      |j                  |      gS )Nz{0}-01-01 00:00:00z{0}-12-31 23:59:59.999999r]   )r   r   firstr(   s       r   year_lookup_boundsz%DatabaseOperations.year_lookup_bounds   s)    (E0FLL'u)=>>r    c                     t         t        |   |      \  }}| j                  j                  dk\  r|j                  d      |gS |j                  d      |j                  d      gS )N)         r   r   )superr   %year_lookup_bounds_for_datetime_fieldrO   mysql_versionr`   )r   r   r   r(   	__class__s       r   r   z8DatabaseOperations.year_lookup_bounds_for_datetime_field   sp     ""4<<AB E6,,	9!4f==!4NNqN13 3r    c                 x   g }| j                   j                  dk  rdj                  |j                  d      |j                  d      |j                  d      |j	                  d            }|D ]F  }|j                  | j                  |d               }|j                  |j                  |	             H |S |S )
N)r   r      z1{alter} {table} {{tablename}} {auto_inc} {field};ALTERTABLEAUTO_INCREMENTz= 1)alterrr   auto_incfieldrr   )	tablename)rO   r   r   rt   ru   	SQL_TABLErl   rs   )r   rx   rz   resrM   sequencer   s          r   rw   z-DatabaseOperations.sequence_reset_by_name_sql   s     C,,z9IPP++G4++G4"../?@//%0	 Q  !* @H %@Q0R SIJJszzIz>?@ 
Jr    c                 $    dj                  |      S )NzSAVEPOINT {0}r]   r   sids     r   savepoint_create_sqlz'DatabaseOperations.savepoint_create_sql  s    "))#..r    c                 $    dj                  |      S )NzRELEASE SAVEPOINT {0}r]   r   s     r   savepoint_commit_sqlz'DatabaseOperations.savepoint_commit_sql  s    *11#66r    c                 $    dj                  |      S )NzROLLBACK TO SAVEPOINT {0}r]   r   s     r   savepoint_rollback_sqlz)DatabaseOperations.savepoint_rollback_sql
  s    .55c::r    c                 ^    |dk(  rddj                  |      z  S t        t        |   ||      S )zS
        MySQL requires special cases for ^ operators in query expressions
        ^zPOW(%s),)r0   r   r   combine_expression)r   rJ   sub_expressionsr   s      r   r   z%DatabaseOperations.combine_expression  s;     sxx888'A( 	(r    c                     t         t        |   |      }|j                  j	                         }|dv r|j                  | j                         |dk(  r|j                  | j                         |dk(  r|j                  | j                         |S )N)BooleanFieldNullBooleanField	UUIDField	TextField)	r   r   get_db_convertersoutput_fieldget_internal_typers   convert_booleanfield_valueconvert_uuidfield_valueconvert_textfield_value)r   
expression
convertersinternal_typer   s       r   r   z$DatabaseOperations.get_db_converters  s    -tF
"//AAC@@d==>K'd::;K'd::;r    c                 $    |dv rt        |      }|S )N)r   r   )boolr   r   r   rO   contexts        r   r   z-DatabaseOperations.convert_booleanfield_value#  s     F?KEr    c                 4    |t        j                  |      }|S N)uuidUUIDr   s        r   r   z*DatabaseOperations.convert_uuidfield_value*  s    IIe$Er    c                      |t        |      }|S r   r   r   s        r   r   z*DatabaseOperations.convert_textfield_value0  s    u%Er    )F)(__name__
__module____qualname__compiler_modulerY   rZ   dictr   integer_field_rangesr   r8   r>   rA   rH   rR   rV   r[   r^   rd   rf   rl   rn   r|   r   r   r   r   r   r   r   rw   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r      s    7O ~~#$:$O$O>M:A C
1.$* ~~	O	?"	M>$$
9"9? ~~	?		3	"	/	7	;(r    r   )
__future__r   r   rY   django.confr   rZ   "django.db.backends.base.operationsr   django.db.backendsdjango.utilsr	   r
   django.utils.encodingr   _mysql_connectorr   r   	HAVE_CEXTImportErrorr   rT   r    r   <module>r      s_   
 (    	>>VI9 & ,A IZ/ Z  Is    A A A 