
    KiE              
       D   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	m
Z
mZmZmZmZ d dlZd dlmZmZmZmZ d dlmZmZmZmZmZ ddlmZ ddlmZ ddl m!Z!m"Z" d	d
dddZ# ejH                  dd      Z% ejL                         5   ejN                  e#e%         Z(ddd        ejR                  d      Z*d ddddZ+ejX                  ejZ                  ejZ                  ej\                  dZ/ e0       Z1 G d d      Z2de	de3de3de3fdZ4dede5fdZ6de(jn                  de
e   ddfd Z8de(jn                  de
e   d!e9d"eddf
d#Z:d$edefd%Z;d$edefd&Z<de(jn                  de
e   dede5fd'Z=de(jn                  de
e   d(e3defd)Z>d*e"d+e!de3fd,Z?y# 1 sw Y   xY w)-    N)CallableAnyStrSetAnyTupleListOptional)commandInt	SignatureFloat)SimpleErrorSimpleStringnull_terminateOKdecode_command_bytes   )_msgs)
FakeServer)VersionType
ServerTypez
lupa.lua51z
lupa.lua52z
lupa.lua53z
lupa.lua54)5.1z5.2z5.3z5.4FAKEREDIS_LUA_VERSIONr   	fakeredis      )s	   LOG_DEBUGs   LOG_VERBOSEs
   LOG_NOTICEs   LOG_WARNING)r   r   r   r   c            
       4    e Zd ZU eegeeedef      ef   f   e	d<   eedef   ee
e   egef   e	d<   dedef fdZdej                  ded	efd
Zd(deded	efdZdej                  dee   deded	ef
dZdej                  dee   deded	ef
dZded	ej                  fdZ eeefefej4                        dededed	efd       Z edeefefej4                        dededed	efd       Z edefefej4                        ded	efd       Z eddefej4                        ded	e
e   fd        Z ed!defej4                        ded	e fd"       Z! edej4                        ded	d#fd$       Z" ed%d&      ded	e
e   fd'       Z# xZ$S ))ScriptingCommandsMixin._name_to_func_run_commandargskwargsc                 z    |  |  |j                  dd       xs
 t               | _        t        t        |   |i | y )Nlua_modules)popsetload_lua_modulessuperr   __init__)selfr!   r"   	__class__s      u/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/fakeredis/commands_mixins/scripting_mixin.pyr)   zScriptingCommandsMixin.__init__8   s8    *0**]D*I*RSU$d4dEfE    lua_runtimeresultreturnc                     t        |t        t        f      r|S t        |t              rt	        j
                  |d      S t        |t              r|j                  d|j                  i      S |yt        |t              r0|D cg c]  }| j                  ||       }}|j                  |      S t        |t              rYt        t        j                  |j                                }|D cg c]  }| j                  ||       }}|j                  |      S t        |t              r6|j                  j!                  d      rt        t"        j$                        |t'        dt)        |             c c}w c c}w )NF)humanfriendly   okzERR wrong number of argumentsz#Unexpected return type from redis: )
isinstancebytesintfloatr   encoder   
table_fromvaluelist_convert_redis_resultdict	itertoolschainitemsr   
startswithmsgsWRONG_ARGS_MSG7RuntimeErrortype)r*   r.   r/   item	converteds        r,   r<   z,ScriptingCommandsMixin._convert_redis_result>   sA   fucl+Mfe$<<e<<-))5&,,*?@@^%SYZ433KFZIZ)))44fd#)//6<<>:;FSYZ433KFZIZ)))44,||&&'FG!$"6"677L!DT&\NSTT [ [s   E6-E;nestedc                    t         j                  |      dk(  rdD ]  }||v s| j                  ||         }t        |t              st        t        j                        |dk(  rt        |      c S |rt        |j                  dd            c S t        |j                  dd             g }t        j                  d      D ].  }||vr |S ||   }|j                  | j                  |             0 |S t        |t              r|j                         S t        |t              rt!        |      S t        |t"              r|rdS d S |S )Ntable)r3      errr3   utf-8replacer   )
LUA_MODULElua_type_convert_lua_resultr4   r5   r   rB   LUA_WRONG_NUMBER_ARGS_MSGr   decoder>   countappendstrr8   r7   r6   bool)r*   r/   rH   keymsgresult_listindexrF   s           r,   rP   z*ScriptingCommandsMixin._convert_lua_resultU   sC   v&'1& 
J&=226#;?C%c51)$*H*HIIe|+C00*3::gy+IJJ)#**Wi*HII
J K"+ C&  e}""4#;#;D#AB	C
 $==?"&v;%1(D(r-   expected_globalsopc                     t        ||       | j                  t        |            \  }}|D cg c]  }t        |       }}| j	                  |||d      }	| j                  ||	      }	|	S c c}w )NT)_check_for_lua_globalsr   r   _convert_redis_argr    r<   )
r*   r.   r[   r\   r!   funcsigargnew_argsr/   s
             r,   _lua_redis_callz&ScriptingCommandsMixin._lua_redis_callr   st     	{,<=&&';B'?@	c7;<&s+<<""4h=++K@ =s   A*c                     	  | j                   |||g| S # t        $ r&}|j                  dt        |      i      cY d }~S d }~ww xY w)NrK   )rd   	Exceptionr9   rU   )r*   r.   r[   r\   r!   exs         r,   _lua_redis_pcallz'ScriptingCommandsMixin._lua_redis_pcall}   sN    	='4''5ErQDQQ 	=))63r7*;<<	=s    	AAAAserverc           
         t        d      sat        j                  d d      _        j                  t	               }| j
                  D ]3  }	 j                  |j                                |j                  |       5 || _        dj                  | j
                  D cg c]
  }| d| d c}      }dj                  t        j                         D cg c]  \  }}d	|j                          d
|  c}}      }j!                  d| d| d      }	j!                  d      _         |	d d d d d t$               t	        j'                         j)                               _        j*                  d g_        dt.        dt0        f   ffd}
dt.        dt0        f   ffd} |
       _         |       _        t7        j8                  t:              _        t7        j8                  t>              _         t7        j8                  tB              _"         |	j2                  j4                  j<                  j@                  jD                  t$               j                  S # t        j                  $ r&}t        j                  d| d|        Y d }~cd }~ww xY wc c}w c c}}w )N_lua_runtimeT)encodingunpack_returned_tupleszFailed to load LUA module "z", make sure it is installed: 
z = require('z')zredis.z = a  
                function(redis_call, redis_pcall, redis_log, cjson_encode, cjson_decode, cjson_null)
                    redis = {}
                    redis.call = redis_call
                    redis.pcall = redis_pcall
                    redis.log = redis_log
                    a  
                    redis.error_reply = function(msg) return {err=msg} end
                    redis.status_reply = function(msg) return {ok=msg} end

                    cjson = {}
                    cjson.encode = cjson_encode
                    cjson.decode = cjson_decode
                    cjson.null = cjson_null

                    KEYS = {}
                    ARGV = {}
                    z%
                end
                z
                function(keys, argv)
                    KEYS = keys
                    ARGV = argv
                end
                c                       y N r!   s    r,   <lambda>z<ScriptingCommandsMixin._get_server_runtime.<locals>.<lambda>       r-   c                       y rp   rq   rr   s    r,   rs   z<ScriptingCommandsMixin._get_server_runtime.<locals>.<lambda>   rt   r-   c                       y rp   rq   rr   s    r,   rs   z<ScriptingCommandsMixin._get_server_runtime.<locals>.<lambda>   rt   r-   c                       y rp   rq   rr   s    r,   rs   z<ScriptingCommandsMixin._get_server_runtime.<locals>.<lambda>   rt   r-   c                       y rp   rq   rr   s    r,   rs   z<ScriptingCommandsMixin._get_server_runtime.<locals>.<lambda>   rt   r-   r0   .c                  <    dt         dt        dt        ffd} | S )Nr\   r!   r0   c                 L    j                   d   } |j                  | g| S Nr   )_lua_current_socketrd   r\   r!   socketr[   r.   ri   s      r,   wrapperz\ScriptingCommandsMixin._get_server_runtime.<locals>.make_redis_call_wrapper.<locals>.wrapper   s2    #77:F1611+?OQS[VZ[[r-   r5   r   r   r[   r.   ri   s    r,   make_redis_call_wrapperzKScriptingCommandsMixin._get_server_runtime.<locals>.make_redis_call_wrapper   s(    \ \c \c \ r-   c                  <    dt         dt        dt        ffd} | S )Nr\   r!   r0   c                 L    j                   d   } |j                  | g| S r{   )r|   rh   r}   s      r,   r   z]ScriptingCommandsMixin._get_server_runtime.<locals>.make_redis_pcall_wrapper.<locals>.wrapper   s2    #77:F2622;@PRT\W[\\r-   r   r   s    r,   make_redis_pcall_wrapperzLScriptingCommandsMixin._get_server_runtime.<locals>.make_redis_pcall_wrapper   s(    ] ]c ]c ] r-   )#hasattrrN   
LuaRuntimerk   r&   r'   requirer8   addLuaErrorLOGGERerrorjoinREDIS_LOG_LEVELSr@   rR   eval_lua_set_keys_argv_lua_cjson_nullglobalskeys_lua_expected_globalsr|   r   r   _lua_redis_call_wrapper_lua_redis_pcall_wrapper	functoolspartial_lua_redis_log_lua_log_partial_lua_cjson_encode_lua_cjson_encode_partial_lua_cjson_decode_lua_cjson_decode_partial)r*   ri   valid_modulesmodulerg   modules_import_strlevelr:   log_levels_strset_globals_initr   r   r[   r.   s    `          @@r,   _get_server_runtimez*ScriptingCommandsMixin._get_server_runtime   s   v~.","7"7^b"7"cF --K&)eM// kk''8!%%f-k %2D!!%\`\q\q+rRXvhl6(",M+r!s!YYIYI_I_Iab6%,,.)UG4bN
  +// $$ % (( )# 0 )4(8(8)F% """"" ,/{/B/B/D/I/I/K+LF(%;; 6:FF&Xc3h-? hsCx.@  .E-FF*.F.HF+&/&7&7Ue&fF#/8/@/@ART_aq/rF,/8/@/@ART_aq/rF, ..//''0000 """u "** kLL#>vhFdegdh!ijjk ,sbs$   0I>%J: J?
>J7J22J7)flagsscriptnumkeyskeys_and_argsc                    |t        |      kD  rt        t        j                        |dk  rt        t        j                        t        j                  |      j                         j                         }|| j                  j                  |<   | j                  | j                        }| j                  j                  }| | j                  j                  d<   | j                  j                  |j                  |d |       |j                  ||d               	 |j!                  |      }	 |j!                  d       t7        ||       | j9                  |d      S # t        $ r}|j"                  t        j$                  k(  r)t        t'        | j(                  | j*                              | j*                  dk  r7t        t        j,                  j/                  |j1                         |            t        |j"                        d }~wt2        j4                  $ r<}t        t        j,                  j/                  |j1                         |            d }~ww xY w# |j!                  d       w xY w)Nr      zcollectgarbage()F)rH   )lenr   rB   TOO_MANY_KEYS_MSGNEGATIVE_KEYS_MSGhashlibsha1	hexdigestr8   _serverscript_cacher   r   r|   r   r9   executer:   LUA_COMMAND_ARG_MSG_get_lua_bad_command_arg_msgserver_typeversionSCRIPT_ERROR_MSGformatrR   rN   r   r^   rP   )	r*   r   r   r   r   r.   r[   r/   rg   s	            r,   r   zScriptingCommandsMixin.eval   s   S''d4455Q;d4455||F#--/668*0!!$'..t||<<<== /3((+ 	''""='#:;""=#:;	

	4 ((0F  23{,<=''u'==  	(xx4333!">t?O?OQUQ]Q]"^__||d"!$"7"7">">t{{}b"QRRbhh''"" 	Od33::4;;="MNN	O  23s1   E 	I&B!HI7III I/EVALSHA)namefixedrepeatr   r   c                     	 | j                   j                  |   } | j                  ||g| S # t        $ r t        t        j
                        w xY wrp   )r   r   KeyErrorr   rB   NO_MATCHING_SCRIPT_MSGr   )r*   r   r   r   r   s        r,   evalshazScriptingCommandsMixin.evalsha  sW    	;\\..t4F tyy9=99  	;d99::	;s	   / #AzSCRIPT LOADc                    t        |      dk7  r(t        t        j                  j	                  d            |d   }t        j                  |      j                         j                         }|| j                  j                  |<   |S )Nr   SCRIPTr   )r   r   rB   BAD_SUBCOMMAND_MSGr   r   r   r   r8   r   r   )r*   r!   r   r   s       r,   script_loadz"ScriptingCommandsMixin.script_load  sk    t9>d55<<XFGGa||F#--/668*0!!$'r-   zSCRIPT EXISTSrq   c                     | j                   dk\  r't        |      dk(  rt        t        j                        |D cg c]#  }t        || j                  j                  v       % c}S c c}w )Nr   r   )r   r   r   rB   rC   r6   r   r   )r*   r!   r   s      r,   script_existsz$ScriptingCommandsMixin.script_exists#  sQ    <<4CINd2233CGH4DDLL5556HHHs   (A&zSCRIPT FLUSHc                     t        |      dkD  st        |      dk(  r8t        |d         dvr(t        t        j                  j                  d            i | j                  _        t        S )Nr   r   >      sync   asyncr   )	r   r   r   rB   r   r   r   r   r   r*   r!   s     r,   script_flushz#ScriptingCommandsMixin.script_flush)  sU    t9q=SY!^tAw0GOb0bd55<<XFGG$&!	r-   Nc                 R    t        t        j                  j                  d            )Nr   )r   rB   r   r   r   s     r,   r   zScriptingCommandsMixin.script0  s    $1188BCCr-   zSCRIPT HELP)r   r   c                     ddddddddd	d
dddddd| j                   dk  rdndg}|D cg c]  }|j                          c}S c c}w )Nz?SCRIPT <subcommand> [<arg> [value] [opt] ...]. Subcommands are:zDEBUG (YES|SYNC|NO)z7    Set the debug mode for subsequent scripts executed.zEXISTS <sha1> [<sha1> ...]zN    Return information about the existence of the scripts in the script cache.zFLUSH [ASYNC|SYNC]z<    Flush the Lua scripts cache. Very dangerous on replicas.zU    When called without the optional mode argument, the behavior is determined by thezF    lazyfree-lazy-user-flush configuration directive. Valid modes are:z4    * ASYNC: Asynchronously flush the scripts cache.z2    * SYNC: Synchronously flush the scripts cache.KILLz,    Kill the currently executing Lua script.zLOAD <script>z>    Load a script into the scripts cache without executing it.HELP)r   r   z    Prints this help.z    Print this help.)r   r8   )r*   r!   help_stringsss       r,   script_helpz"ScriptingCommandsMixin.script_help4  sj     N!E(\ JcTB@:L(,v(=$CY#
( %11q
111s   A)T)%__name__
__module____qualname__r   rU   r   r	   r   r   __annotations__r   rV   r)   rN   r   r<   rP   r   r5   rd   rh   r   r   r
   r   rB   FLAG_NO_SCRIPTr6   r   r   r   r   r   r   r   r   __classcell__)r+   s   @r,   r   r   4   s   SE5(382D)Ey)P#QQRRHS#X.	49dKSPQQFc FS FU1F1F UPS UX[ U.# t s :	%00	DGH	RW	`c			=%00=DGH=RW=`c=	=d#* d#9N9N d#L eS\E84+>+>?$>5 $>3 $> $># $> @$>L )E3<H[H[\:E :C : :3 : ]: -xH[H[\ 5  ] /UHDDWDWXI5 IT#Y I YI
 .E84CVCVW% L  X Rt**+DE Dd D ,D -r*2 24; 2 +2r-   r   r   rl   
replaceerrr0   c                 f    t        | t              r| j                  ||      }|S t        |       }|S )N)rl   errors)r4   r5   rR   rU   )r   rl   r   ress       r,   _ensure_strr   M  s5    !Uhhh< J !fJr-   r:   c                     t        |       t        u r| S t        |       t        t        hv rdj	                  |       j                         S t        t        j                        )Nz{:.17g})	rE   r5   r6   r7   r   r8   r   rB   r   )r:   s    r,   r_   r_   U  sN    E{e	ee	$&--//$2233r-   r.   r[   c                     t        | j                         j                               |z
  }t        |      dkD  rQ|D cg c]  }t	        |dd       }}t        t        j                  j                  dj                  |                  y c c}w )Nr   rL   rM   z, )
r&   r   r   r   r   r   rB   GLOBAL_VARIABLE_MSGr   r   )r.   r[   unexpected_globalsvar
unexpecteds        r,   r^   r^   _  s|    [002779:=MM
"FXYsk#w	:Y
Y$2299$))J:OPQQ #Ys   Blvlr!   c           	         t        | |       t        |      dk  r)t        t        j                  j                  dd            |t        j                         vrt        t        j                        dj                  |D cg c]?  }t        |t              rt        |t              r|j                  d      n
t        |      A c}      }t        j!                  t        |   |       y c c}w )Nr   zredis.log()two rL   )r^   r   r   rB   REQUIRES_MORE_ARGS_MSGr   REDIS_LOG_LEVELS_TO_LOGGINGr   LOG_INVALID_DEBUG_LEVEL_MSGr   r4   rV   r5   rR   rU   r   log)r.   r[   r   r!   xrX   s         r,   r   r   f  s    ;(89
4y1}$55<<]ERSS
-2244$::;;
((SWsa_ijkmq_rAu)=AHHW%3q6Is
tC
JJ*3/5 ts   C+.C+objc                 J   | t         S t        | t              r| j                         S t        | t              r| D cg c]  }t        |       c}S t        | t              r6| j                         D ci c]  \  }}t        |      t        |       c}}S | S c c}w c c}}w )ziConvert a pure python object obtained after JSON deserialization into a usable object in the lua runtime.)r   r4   rU   r8   r;   _cjson_python_to_luar=   r@   )r   rF   rW   r:   s       r,   r   r   p  s    
{#szz|#t7:;t$T*;;#tY\YbYbYde:3PU$S)+?+FFeeJ <es   B5Bc           	      *   | t         u ryt        | t              r| j                         S t        j                  |       }|dk7  r| S t        | j                               }t        d |D              xr- t        |      t        t        dt        |      dz               k(  }|r'| j                         D cg c]  }t        |       c}S t        |       }|j                         D ci c]  \  }}t        |      t        |       c}}S c c}w c c}}w )zaConvert a passed lua runtime object obtained before JSON serialization into a pure python object.NrJ   c              3   <   K   | ]  }t        |t                y wrp   )r4   r6   ).0ks     r,   	<genexpr>z'_cjson_lua_to_python.<locals>.<genexpr>  s     4!:a%4s   r   )r   r4   r5   rR   rN   rO   r;   r   allsortedranger   values_cjson_lua_to_pythonr=   r@   )r   rO   r   is_arrayrF   drW   r:   s           r,   r   r   }  s    
o#uzz|""3'H7

 
D4t44feTUWZ[_W`cdWdNeIf9fH7:zz|Dt$T*DD 	S	AUVU\U\U^_zsE %';E'BB__	 E `s   4D
'Dc                 z    t        | |       t        |      }t        j                  |d      j	                         S )N),:)
separators)r^   r   jsondumpsr8   )r.   r[   r:   s      r,   r   r     s1    ;(89 'E::e
3::<<r-   json_strc                     t        | |       t        j                  |      }t        |      }t	        |t
        t        f      r| j                  |d      }|S )NT)	recursive)r^   r  loadsr   r4   r=   r;   r9   )r.   r[   r  json_objs       r,   r   r     sM    ;(89zz(#H#H-H(T4L)))(d)COr-   r   server_versionc                 v    | dk(  rt         j                  S |dk  rt         j                  S t         j                  S )Nvalkeyr   )rB   VALKEY_LUA_COMMAND_ARG_MSGLUA_COMMAND_ARG_MSG6r   )r   r
  s     r,   r   r     s6    h...(((###r-   )@r   r   	importlibr>   r  loggingostypingr   r   r   r   r   r   r	   lupafakeredis._commandsr
   r   r   r   fakeredis._helpersr   r   r   r   r    r   rB   r   r   _typingr   r   __LUA_RUNTIMES_MAPgetenvLUA_VERSIONallow_lua_module_loadingimport_modulerN   	getLoggerr   r   DEBUGINFOWARNINGr   objectr   r   rU   r   r5   r_   r   r^   r6   r   r   r   r   r   r   rq   r-   r,   <module>r"     sE         	 D D D  > >     - 	  bii/7"T""$ J((();K)HIJJ 
		;	'	  }}||||	  (V2 V2r6 S c c 4c 4e 4R
(=(= RQTUXQY R^b R6
 5 5 6S 6X[ 6dg 6lp 6
c 
c 
`c `c `2=:#8#8 =CPSH =]` =ej =:#8#8 CPSH `c hk $j $+ $Z] $KJ Js   FF