Ë
    õ¡Ÿj  ã                  óÖ   — d Z ddlmZ ddlZddlZddlmZ ddlZ ej                  e	«      Z
 eh d£«      Zdd„Zdd„Zdd„Zd	dd
ddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zy)zM
author: Yagnik Poshiya
organization: Webbrains Technologies Private Limited
é    )ÚannotationsN)ÚAny>A   ÚASÚBYÚINÚISÚONÚORÚABSÚALLÚANDÚASCÚAVGÚENDÚMAXÚMINÚNOTÚSETÚSUMÚCASEÚCASTÚDATEÚDESCÚELSEÚFROMÚFULLÚINTOÚJOINÚLEFTÚLIKEÚNULLÚTHENÚTIMEÚTRIMÚTRUEÚWHENÚWITHÚCOUNTÚCROSSÚFALSEÚGROUPÚINNERÚLIMITÚLOWERÚORDERÚOUTERÚRIGHTÚROUNDÚUNIONÚUPPERÚUSINGÚWHEREÚEXISTSÚHAVINGÚIFNULLÚLENGTHÚOFFSETÚSELECTÚSUBSTRÚVALUESÚBETWEENÚNATURALÚREPLACEÚCOALESCEÚDATETIMEÚDISTINCTÚ	RECURSIVEc                ó¶   — t        t        j                  d| t        j                  «      «      }|D �ch c]  }|j	                  «       t
        vsŒ|’Œ c}S c c}w )Nz4(?:FROM|JOIN)\s+[\"`]?([A-Za-z_][A-Za-z0-9_]*)[\"`]?)ÚsetÚreÚfindallÚ
IGNORECASEÚupperÚ_SQL_KEYWORDS)ÚsqlÚfoundÚts      úJ/var/www/html/agent-engine/apps/agents/rag-agent/src/agent/mysql_runner.pyÚ_tables_referencedrQ      sG   € ÜÜ
�
‰
ÐJÈCÔQS×Q^ÑQ^Ó_ó€Eð Ö?�! §¡£	´Ò >ŠAÒ?Ð?ùÒ?s   ³AÁAc                ó\  — | j                  «       j                  d«      }|j                  «       j                  «       }|j                  d«      syd}|D ]%  }t	        j
                  d|› d�|«      sŒdd|› �fc S  t        |«      }||z
  }|rddd	j                  t        |«      «      › �fS y
)Nú;Úselect)Fz Only SELECT queries are allowed.)ÚinsertÚupdateÚdeleteÚdropÚalterÚcreateÚreplaceÚtruncateÚgrantÚrevokeÚlockÚunlockÚshowÚuserG   ÚdescribeÚexplainz\bFzForbidden keyword: zUnknown table(s): z, )TÚ )	ÚstripÚrstripÚlowerÚ
startswithrH   ÚsearchrQ   ÚjoinÚsorted)rM   Úallowed_tablesÚsÚlowÚ	forbiddenÚfÚrefsÚunknowns           rP   Úvalidate_sqlrt   %   s·   € Ø�	‰	‹×Ñ˜3Ó€AØ
�'‰'‹)�/‰/Ó
€CØ�>‰>˜(Ô#Ø8ð€Ið& ò 4ˆÜ�9‰9˜˜1˜#˜R�[ #Õ&ØÐ/°¨sÐ3Ð3Ò3ð4ô ˜aÓ €DØ�^Ñ#€GÙØÐ*¨4¯9©9´V¸G³_Ó+EÐ*FÐGÐGÐGØó    c                ó¾   — | xs dj                  «       j                  «       }|dv ri S |dv rddiS |dv r&|xs dj                  «       st        d«      ‚dd	|id
œS ddiS )NÚrequired)Údisable)Ú	preferredrw   Ússl_disabledF)Ú	verify_caÚverify_identityre   zSSL/TLS mode requires CA PEM.Úca)rz   Ússl)rf   rh   Ú
ValueError)Ússl_modeÚ
ssl_ca_pemÚmodes      rP   Ú_build_ssl_argsrƒ   G   s‡   € ØÒ"˜
×)Ñ)Ó+×1Ñ1Ó3€DØˆ|ÑØˆ	ØÐ(Ñ(Ø Ð&Ð&ØÐ/Ñ/ØÒ ˜b×'Ñ'Ô)ÜÐ<Ó=Ð=à!Ø˜*Ð%ñ
ð 	
ð ˜EÐ"Ð"ru   rw   éÈ   é
   é   )r€   r�   Úmax_rowsÚconnect_timeout_secondsÚread_timeout_secondsÚwrite_timeout_secondsc                óÌ  — t        ||«      \  }}|st        |«      ‚t        |xs d«      j                  «       j	                  d«      }d|› d|	› �}t        ||«      }d }	 t        j                  d| ||||«       t        j                  d
| |||||
||t        j                  j                  dœ	|¤Ž}|j                  «       5 }t        j                  d|«       |j                  |«       t        |j                  «       «      }|rt        |d   j!                  «       «      n |j"                  xs g D �cg c]  }|d   ‘Œ	 c}}||fcd d d «       |�|j%                  «        S S c c}w # 1 sw Y   nxY wnF# t        j&                  $ r0}t        j)                  d	|«       t        t        |«      «      |‚d }~ww xY w	 |�|j%                  «        y y # |�|j%                  «        w w xY w)Nre   rS   zSELECT * FROM (z) AS _q LIMIT zJlive_mysql_connect_attempt host=%s port=%s database=%s user=%s ssl_mode=%s)	ÚhostÚportÚuserÚpasswordÚdatabaseÚconnect_timeoutÚread_timeoutÚwrite_timeoutÚcursorclasszlive_mysql_query_execute sql=%sr   z$live_mysql_query_failed raw_error=%r© )rt   r   Ústrrf   rg   rƒ   ÚloggerÚinfoÚpymysqlÚconnectÚcursorsÚ
DictCursorÚcursorÚexecuteÚlistÚfetchallÚkeysÚdescriptionÚcloseÚ
MySQLErrorÚ	exception)rŒ   r�   rŽ   r�   r�   rM   rm   r€   r�   r‡   rˆ   r‰   rŠ   ÚokÚerrÚ	sql_innerÚlimitedÚ
ssl_kwargsÚconnÚcurÚrowsÚdÚcolnamesÚes                           rP   Úrun_select_mysqlr±   W   sá  € ô  ˜3 Ó/�G€BˆÙÜ˜‹oÐä�C’I˜2“×$Ñ$Ó&×-Ñ-¨cÓ2€IØ 	˜{¨.¸¸
ÐC€GÜ  ¨:Ó6€JØ€Dð Ü�‰ØXØØØØØô	
ô �‰ð 
ØØØØØØ3Ø-Ø/ÜŸ™×2Ñ2ñ
ð ñ
ˆð �[‰[‹]ð 	"˜cÜ�K‰KÐ9¸3Ô?Ø�K‰K˜Ô Ü˜Ÿ™›Ó'ˆDÙ/3”t˜D ™GŸL™L›NÔ+ÈÏÉÒI^Ð\^Ö9`À1¸!¸A»$Ò9`ˆHØ˜T�>÷	"ð 	"ð ÐØ�J‰J�Lð ùò :a÷		"ð 	"úð 	"øô ×Ñò (Ü×ÑÐ?ÀÔCÜœ˜Q›Ó  aÐ'ûð(úð	"ð ÐØ�J‰J�Lð øˆ4ÐØ�J‰J�Lð úsV   Á A!E3 ÃA1E&Ä2E!Ä>E&Å	E3 Å!E&Å&E/Å+E3 Å2G Å3F6Æ+F1Æ1F6Æ6G ÇG#)rM   r–   Úreturnúset[str])rM   r–   rm   r³   r²   ztuple[bool, str])r€   r–   r�   ú
str | Noner²   zdict[str, Any])rŒ   r–   r�   ÚintrŽ   r–   r�   r–   r�   r–   rM   r–   rm   r³   r€   r–   r�   r´   r‡   rµ   rˆ   rµ   r‰   rµ   rŠ   rµ   r²   z&tuple[list[str], list[dict[str, Any]]])Ú__doc__Ú
__future__r   ÚloggingrH   Útypingr   r™   Ú	getLoggerÚ__name__r—   Ú	frozensetrL   rQ   rt   rƒ   r±   r•   ru   rP   ú<module>r½      sò   ðñõ
 #ã Û 	Ý ã à	ˆ×	Ñ	˜8Ó	$€ñ ò 
ó 
€ó@óóD#ð2 Ø!ØØ#%Ø "Ø!#ñ8à
ð8ð ð8ð ð	8ð
 ð8ð ð8ð 
ð8ð ð8ð ð8ð ð8ð ð8ð !ð8ð ð8ð ð8ð ,ô8ru   