mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-24 00:59:02 -05:00
687210f155
Added `FUNCTION FLUSH` command. The new sub-command allows delete all the functions. An optional `[SYNC|ASYNC]` argument can be given to control whether or not to flush the functions synchronously or asynchronously. if not given the default flush mode is chosen by `lazyfree-lazy-user-flush` configuration values. Add the missing `functions.tcl` test to the list of tests that are executed in test_helper.tcl, and call FUNCTION FLUSH in between servers in external mode
119 lines
4.7 KiB
C
119 lines
4.7 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 Redis Functions API:
|
|
* * FUNCTION CREATE
|
|
* * FUNCTION CALL
|
|
* * FUNCTION DELETE
|
|
* * FUNCTION KILL
|
|
* * FUNCTION INFO
|
|
*
|
|
* Also contains implementation for:
|
|
* * Save/Load function from rdb
|
|
* * Register engines
|
|
*/
|
|
|
|
#include "server.h"
|
|
#include "script.h"
|
|
#include "redismodule.h"
|
|
|
|
typedef struct engine {
|
|
/* engine specific context */
|
|
void *engine_ctx;
|
|
|
|
/* Create function callback, get the engine_ctx, and function code.
|
|
* returns NULL on error and set sds to be the error message */
|
|
void* (*create)(void *engine_ctx, sds code, sds *err);
|
|
|
|
/* Invoking a function, r_ctx is an opaque object (from engine POV).
|
|
* The r_ctx should be used by the engine to interaction with Redis,
|
|
* such interaction could be running commands, set resp, or set
|
|
* replication mode
|
|
*/
|
|
void (*call)(scriptRunCtx *r_ctx, void *engine_ctx, void *compiled_function,
|
|
robj **keys, size_t nkeys, robj **args, size_t nargs);
|
|
|
|
/* get current used memory by the engine */
|
|
size_t (*get_used_memory)(void *engine_ctx);
|
|
|
|
/* Return memory overhead for a given function,
|
|
* such memory is not counted as engine memory but as general
|
|
* structs memory that hold different information */
|
|
size_t (*get_function_memory_overhead)(void *compiled_function);
|
|
|
|
/* Return memory overhead for engine (struct size holding the engine)*/
|
|
size_t (*get_engine_memory_overhead)(void *engine_ctx);
|
|
|
|
/* free the given function */
|
|
void (*free_function)(void *engine_ctx, void *compiled_function);
|
|
} engine;
|
|
|
|
/* Hold information about an engine.
|
|
* Used on rdb.c so it must be declared here. */
|
|
typedef struct engineInfo {
|
|
sds name; /* Name of the engine */
|
|
engine *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. */
|
|
engineInfo *ei; /* Pointer to the function engine */
|
|
sds code; /* Function code */
|
|
sds desc; /* Function description */
|
|
} functionInfo;
|
|
|
|
int functionsRegisterEngine(const char *engine_name, engine *engine_ctx);
|
|
int functionsCreateWithFunctionCtx(sds function_name, sds engine_name, sds desc, sds code,
|
|
int replace, sds* err, functionsCtx *functions);
|
|
unsigned long functionsMemory();
|
|
unsigned long functionsMemoryOverhead();
|
|
int functionsLoad(rio *rdb, int ver);
|
|
unsigned long functionsNum();
|
|
dict* functionsGet();
|
|
size_t functionsLen(functionsCtx *functions_ctx);
|
|
functionsCtx* functionsCtxGetCurrent();
|
|
functionsCtx* functionsCtxCreate();
|
|
void functionsCtxFree(functionsCtx *functions_ctx);
|
|
void functionsCtxClear(functionsCtx *functions_ctx);
|
|
void functionsCtxSwapWithCurrent(functionsCtx *functions_ctx);
|
|
|
|
int luaEngineInitEngine();
|
|
int functionsInit();
|
|
|
|
#endif /* __FUNCTIONS_H_ */
|