
This commit creates a new compilation unit for the scripting engine code by extracting the existing code from the functions unit. We're doing this refactor to prepare the code for running the `EVAL` command using different scripting engines. This PR has a module API change: we changed the type of error messages returned by the callback `ValkeyModuleScriptingEngineCreateFunctionsLibraryFunc` to be a `ValkeyModuleString` (aka `robj`); This PR also fixes #1470. --------- Signed-off-by: Ricardo Dias <ricardo.dias@percona.com>
108 lines
4.3 KiB
C
108 lines
4.3 KiB
C
/*
|
|
* Copyright (c) 2021, Redis Ltd.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* * Neither the name of Redis nor the names of its contributors may be used
|
|
* to endorse or promote products derived from this software without
|
|
* specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef __FUNCTIONS_H_
|
|
#define __FUNCTIONS_H_
|
|
|
|
/*
|
|
* functions.c unit provides the Functions API:
|
|
* * FUNCTION LOAD
|
|
* * FUNCTION LIST
|
|
* * FUNCTION CALL (FCALL and FCALL_RO)
|
|
* * FUNCTION DELETE
|
|
* * FUNCTION STATS
|
|
* * FUNCTION KILL
|
|
* * FUNCTION FLUSH
|
|
* * FUNCTION DUMP
|
|
* * FUNCTION RESTORE
|
|
* * FUNCTION HELP
|
|
*
|
|
* Also contains implementation for:
|
|
* * Save/Load function from rdb
|
|
* * Register engines
|
|
*/
|
|
|
|
#include "server.h"
|
|
#include "scripting_engine.h"
|
|
#include "script.h"
|
|
#include "valkeymodule.h"
|
|
|
|
typedef struct functionLibInfo functionLibInfo;
|
|
|
|
/* Hold information about an engine.
|
|
* Used on rdb.c so it must be declared here. */
|
|
typedef struct engineInfo {
|
|
sds name; /* Name of the engine */
|
|
ValkeyModule *engineModule; /* the module that implements the scripting engine */
|
|
ValkeyModuleCtx *module_ctx; /* Scripting engine module context */
|
|
scriptingEngine *engine; /* engine callbacks that allows to interact with the engine */
|
|
client *c; /* Client that is used to run commands */
|
|
} engineInfo;
|
|
|
|
/* Hold information about the specific function.
|
|
* Used on rdb.c so it must be declared here. */
|
|
typedef struct functionInfo {
|
|
sds name; /* Function name */
|
|
void *function; /* Opaque object that set by the function's engine and allow it
|
|
to run the function, usually it's the function compiled code. */
|
|
functionLibInfo *li; /* Pointer to the library created the function */
|
|
sds desc; /* Function description */
|
|
uint64_t f_flags; /* Function flags */
|
|
} functionInfo;
|
|
|
|
/* Hold information about the specific library.
|
|
* Used on rdb.c so it must be declared here. */
|
|
struct functionLibInfo {
|
|
sds name; /* Library name */
|
|
dict *functions; /* Functions dictionary */
|
|
scriptingEngine *engine; /* Pointer to the scripting engine */
|
|
sds code; /* Library code */
|
|
};
|
|
|
|
sds functionsCreateWithLibraryCtx(sds code, int replace, sds *err, functionsLibCtx *lib_ctx, size_t timeout);
|
|
unsigned long functionsMemory(void);
|
|
unsigned long functionsMemoryOverhead(void);
|
|
unsigned long functionsNum(void);
|
|
unsigned long functionsLibNum(void);
|
|
dict *functionsLibGet(void);
|
|
size_t functionsLibCtxFunctionsLen(functionsLibCtx *functions_ctx);
|
|
functionsLibCtx *functionsLibCtxGetCurrent(void);
|
|
functionsLibCtx *functionsLibCtxCreate(void);
|
|
void functionsLibCtxClearCurrent(int async, void(callback)(dict *));
|
|
void functionsLibCtxFree(functionsLibCtx *functions_lib_ctx);
|
|
void functionsLibCtxClear(functionsLibCtx *lib_ctx, void(callback)(dict *));
|
|
void functionsLibCtxSwapWithCurrent(functionsLibCtx *new_lib_ctx, int async);
|
|
|
|
void functionsRemoveLibFromEngine(scriptingEngine *engine);
|
|
|
|
int luaEngineInitEngine(void);
|
|
int functionsInit(void);
|
|
|
|
#endif /* __FUNCTIONS_H_ */
|