
    1yi;              
          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 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d	d
dZ  ejB                  dd      Z" ejF                         5   ejH                  e e"         Z%ddd        ejL                  d      Z'd ddddZ(ejR                  ejT                  ejT                  ejV                  dZ,de	de-de-de-fdZ.de%j^                  de
e   ddfdZ0de%j^                  de
e   de1deddf
dZ2 e3       Z4dedefd Z5dedefd!Z6de%j^                  de
e   d"ede7fd#Z8de%j^                  de
e   d$e-defd%Z9 G d& d'      Z:y# 1 sw Y   xY w)(    N)CallableAnyStrSetAnyTupleListOptional)_msgs)commandInt	SignatureFloat)SimpleErrorSimpleStringnull_terminateOKdecode_command_bytes)VersionTypez
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   sencoding
replaceerrreturnc                 f    t        | t              r| j                  ||      }|S t        |       }|S )N)r   errors)
isinstancebytesdecodestr)r   r   r   ress       k/var/www/html/content_weaver/venv/lib/python3.12/site-packages/fakeredis/commands_mixins/scripting_mixin.py_ensure_strr'   1   s5    !Uhhh< J !fJ    lua_runtimeexpected_globalsc                     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   utf-8replacez, )
setglobalskeyslenr'   r   msgsGLOBAL_VARIABLE_MSGformatjoin)r)   r*   unexpected_globalsvar
unexpecteds        r&   _check_for_lua_globalsr9   9   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lvlargsc           	         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 r,   )r9   r1   r   r2   REQUIRES_MORE_ARGS_MSGr4   REDIS_LOG_LEVELS_TO_LOGGINGr0   LOG_INVALID_DEBUG_LEVEL_MSGr5   r!   boolr"   r#   r$   LOGGERlog)r)   r*   r:   r;   xmsgs         r&   _lua_redis_logrG   @   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.)_lua_cjson_nullr!   r$   encodelist_cjson_python_to_luadictitems)rH   itemkeyvalues       r&   rM   rM   M   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.Ntablec              3   <   K   | ]  }t        |t                y wN)r!   int).0ks     r&   	<genexpr>z'_cjson_lua_to_python.<locals>.<genexpr>i   s     4!:a%4s   r   )rJ   r!   r"   r#   
LUA_MODULElua_typerL   r0   allsortedranger1   values_cjson_lua_to_pythonrN   rO   )rH   r\   r0   is_arrayrP   drQ   rR   s           r&   ra   ra   Z   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rR   c                 z    t        | |       t        |      }t        j                  |d      j	                         S )N),:)
separators)r9   ra   jsondumpsrK   )r)   r*   rR   s      r&   _lua_cjson_encoderj   s   s1    ;(89 'E::e
3::<<r(   json_strc                     t        | |       t        j                  |      }t        |      }t	        |t
        t        f      r| j                  |d      }|S )NT)	recursive)r9   rh   loadsrM   r!   rN   rL   
table_from)r)   r*   rk   json_objs       r&   _lua_cjson_decoderq   y   sM    ;(89zz(#H#H-H(T4L)))(d)COr(   c            
       8    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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 eeefefej2                        dededed	efd       Z edeefefej2                        dededed	efd       Z edefefej2                        ded	efd       Z eddefej2                        ded	e
e   fd        Z ed!defej2                        ded	efd"       Z  edej2                        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_commandr;   kwargsc                    |  t               | _        |j                  dd       xs
 t               }t        |      dkD  rYt        j                  d d      }|D ]=  }	 |j                  |j                                | j                  j                  |       ? t        t        | :  |i | y # t        j                  $ r%}t        j                  d| d|        Y d }~d }~ww xY w)Nlua_modulesr   Tr   unpack_returned_tupleszFailed to load LUA module "z", make sure it is installed: )r.   load_lua_modulespopr1   r[   
LuaRuntimerequirerK   addLuaErrorrC   errorsuperrs   __init__)selfr;   rv   lua_modules_setr)   moduleex	__class__s          r&   r   zScriptingCommandsMixin.__init__   s     #$*JJ}d$C$Lsu!#1;1F1FPTmq1F1rK) kk''8))--f5k 	$d4dEfE "** kLL#>vhFdegdh!ijjks   :B,,C$?CC$r)   rR   r   c                     t        |      t        u r|S t        |      t        t        hv rdj	                  |      j                         S t        t        j                        )Nz{:.17g})	typer"   rW   floatr4   rK   r   r2   LUA_COMMAND_ARG_MSG)r   r)   rR   s      r&   _convert_redis_argz)ScriptingCommandsMixin._convert_redis_arg   sN    ;%L%[S%L(##E*1133d6677r(   resultc                    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j)                  t+        |                  c c}w c c}w )NF)humanfriendly   okzERR wrong number of argumentsz%Unexpected return type from redis: {})r!   r"   rW   r   r   rK   r   ro   rR   rL   _convert_redis_resultrN   	itertoolschainrO   r   
startswithr2   WRONG_ARGS_MSG7RuntimeErrorr4   r   )r   r)   r   rP   	converteds        r&   r   z,ScriptingCommandsMixin._convert_redis_result   sF   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FMMdSYl[\\ [ [s   F-F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 )NrT   )r      errr   r,   r-   r   )r[   r\   _convert_lua_resultr!   r"   r   r2   LUA_WRONG_NUMBER_ARGS_MSGr   r#   r   countappendr$   rK   r   rW   rB   )r   r   r   rQ   rF   result_listindexrP   s           r&   r   z*ScriptingCommandsMixin._convert_lua_result   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(   r*   opc                     t        ||       | j                  t        |            \  }}|D cg c]  }| j                  ||       }}| j	                  |||d      }	| j                  ||	      }	|	S c c}w )NT)r9   rt   r   r   ru   r   )
r   r)   r*   r   r;   funcsigargnew_argsr   s
             r&   _lua_redis_callz&ScriptingCommandsMixin._lua_redis_call   s|     	{,<=&&';B'?@	cIMN#D++K=NN""4h=++K@ Os   A1c                     	  | j                   |||g| S # t        $ r&}|j                  dt        |      i      cY d }~S d }~ww xY w)Nr   )r   	Exceptionro   r$   )r   r)   r*   r   r;   r   s         r&   _lua_redis_pcallz'ScriptingCommandsMixin._lua_redis_pcall   sN    	='4''5ErQDQQ 	=))63r7*;<<	=s    	AAAA)flagsscriptnumkeyskeys_and_argsc                 .   |t        |      kD  rt        t        j                        |dk  rt        t        j                        t        j                  |      j                         j                         }|| j                  j                  |<   t        j                  d d      }dj                  | j                  D cg c]
  }| d| d c}      }|j                  d| d      }t!               }	 ||j#                  |d |       |j#                  ||d        t%        j&                  | j(                  ||	      t%        j&                  | j*                  ||	      t%        j&                  t,        ||	      t        j/                  t0              t%        j&                  t2        ||	      t%        j&                  t4        ||	      t6        	       |	j9                  |j;                         j=                                	 |j?                  |      }
tU        ||	       | jW                  |
d      S c c}w # t        $ r}|j@                  t        jB                  k(  r| jD                  d	k  rt        t        jF                        | j                  jH                  d
k(  r6t        t        jJ                  jM                  |jO                                     t        t        jB                        | jD                  d	k  r7t        t        jP                  jM                  |jO                         |            t        |j@                        d }~wt        jR                  $ r<}t        t        jP                  jM                  |jO                         |            d }~ww xY w)Nr   Try   
z = require('z')a  
            function(keys, argv, redis_call, redis_pcall, redis_log, redis_log_levels, cjson_encode, cjson_decode, cjson_null)
                redis = {}
                redis.call = redis_call
                redis.pcall = redis_pcall
                redis.log = redis_log
                for level, pylevel in python.iterex(redis_log_levels.items()) do
                    redis[level] = pylevel
                end
                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 = keys
                ARGV = argv
                z
            end
               valkeyF)r   ),r1   r   r2   TOO_MANY_KEYS_MSGNEGATIVE_KEYS_MSGhashlibsha1	hexdigestrK   _serverscript_cacher[   r}   r5   r{   evalr.   ro   	functoolspartialr   r   rG   as_attrgetterREDIS_LOG_LEVELSrj   rq   rJ   updater/   r0   executerR   r   versionLUA_COMMAND_ARG_MSG6server_typeVALKEY_LUA_COMMAND_ARG_MSGr4   r#   SCRIPT_ERROR_MSGr   r9   r   )r   r   r   r   r   r)   r   modules_import_strset_globalsr*   r   r   s               r&   r   zScriptingCommandsMixin.eval   s   S''d4455Q;d4455||F#--/668*0!!$'-7-B-BDim-B-n!YYX\XmXm'nf6(,vhb(I'no!&&& $$ %'
0 &)U""='#:;""=#:;d22KAQRd33[BRSnk;KL$$%56/>NO/>NO
	
 	 3 3 5 : : <=	O ((0F 	{,<=''u'==s (oR  
	(xx4333<<$&%d&?&?@@\\--9%d&E&E&L&LT[[]&[\\%d&>&>??||d"!$"7"7">">t{{}b"QRRbhh''"" 	Od33::4;;="MNN	Os+    H+;H0 0
N:DMN7NNEVALSHA)namefixedrepeatr   r   c                     	 | j                   j                  |   } | j                  ||g| S # t        $ r t        t        j
                        w xY wrV   )r   r   KeyErrorr   r2   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   )r1   r   r2   BAD_SUBCOMMAND_MSGr4   r   r   r   rK   r   r   )r   r;   r   r   s       r&   script_loadz"ScriptingCommandsMixin.script_load1  sk    t9>d55<<XFGGa||F#--/668*0!!$'r(   zSCRIPT EXISTS 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   r1   r   r2   r   rW   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   )	r1   r   r   r2   r   r4   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   r2   r   r4   r   s     r&   r   zScriptingCommandsMixin.scriptG  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   rK   )r   r;   help_stringsr   s       r&   script_helpz"ScriptingCommandsMixin.script_helpK  sj     N!E(\ JcTB@:L(,v(=$CY#
( %11q
111s   A)T)$__name__
__module____qualname__r   r$   r   r	   r   r   __annotations__r   rB   r   r[   r}   r"   r   r   r   r   r   r   r   r   r2   FLAG_NO_SCRIPTrW   r   r   r   r   r   r   r   r   __classcell__)r   s   @r&   rs   rs      s   SE5(382D)Ey)P#QQRRHS#X.	49dKSPQQFc FS F8j.C.C 8C 8TY 8]1F1F ]PS ]X[ ].# t s :	%00	DGH	RW	`c			=%00=DGH=RW=`c=	= eS\E84+>+>?A>5 A>3 A> A># A> @A>F )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(   rs   );r   r   	importlibr   rh   loggingostypingr   r   r   r   r   r   r	   lupar   r
   r2   fakeredis._commandsr   r   r   r   fakeredis._helpersr   r   r   r   r   fakeredis._typingr   __LUA_RUNTIMES_MAPgetenvLUA_VERSIONallow_lua_module_loadingimport_moduler[   	getLoggerrC   r   DEBUGINFOWARNINGr@   r$   r'   r}   r9   rW   rG   objectrJ   rM   ra   r"   rj   rq   rs   r   r(   r&   <module>r      s         	 D D D  # > >  * 	  bii/7"T""$ J((();K)HIJJ 
		;	'	  }}||||	 6 S c c 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 _2 _2GJ Js   E<<F