mirror of
https://github.com/dragonflydb/dragonfly
synced 2024-11-22 07:33:19 +00:00
Support returning arrays from lua scripts
This commit is contained in:
parent
789724584a
commit
e46f2b5384
@ -397,6 +397,8 @@ bool Interpreter::Exists(string_view sha) const {
|
||||
}
|
||||
|
||||
auto Interpreter::RunFunction(string_view sha, std::string* error) -> RunResult {
|
||||
DVLOG(1) << "RunFunction " << sha << " " << lua_gettop(lua_);
|
||||
|
||||
DCHECK_EQ(40u, sha.size());
|
||||
|
||||
lua_getglobal(lua_, "__redis__err__handler");
|
||||
@ -413,6 +415,8 @@ auto Interpreter::RunFunction(string_view sha, std::string* error) -> RunResult
|
||||
return NOT_EXISTS;
|
||||
}
|
||||
|
||||
// At this point lua stack has 2 globals.
|
||||
|
||||
/* We have zero arguments and expect
|
||||
* a single return value. */
|
||||
int err = lua_pcall(lua_, 0, 1, -2);
|
||||
@ -438,7 +442,11 @@ bool Interpreter::IsResultSafe() const {
|
||||
return true;
|
||||
|
||||
bool res = IsTableSafe();
|
||||
lua_settop(lua_, top);
|
||||
|
||||
// Stack can contain intermediate unwindings that were not clean up.
|
||||
DCHECK_GE(lua_gettop(lua_), top);
|
||||
lua_settop(lua_, top); // restore to the original setting.
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -506,7 +514,6 @@ bool Interpreter::IsTableSafe() const {
|
||||
|
||||
lua_pop(lua_, 1);
|
||||
};
|
||||
DCHECK_EQ(1, lua_gettop(lua_));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -248,10 +248,7 @@ TEST_F(DflyEngineTest, FlushDb) {
|
||||
}
|
||||
|
||||
TEST_F(DflyEngineTest, Eval) {
|
||||
auto resp = Run({"eval", "return 43", "0"});
|
||||
EXPECT_THAT(resp[0], IntArg(43));
|
||||
|
||||
resp = Run({"incrby", "foo", "42"});
|
||||
auto resp = Run({"incrby", "foo", "42"});
|
||||
EXPECT_THAT(resp[0], IntArg(42));
|
||||
|
||||
resp = Run({"eval", "return redis.call('get', 'foo')", "0"});
|
||||
@ -272,6 +269,14 @@ TEST_F(DflyEngineTest, Eval) {
|
||||
ASSERT_FALSE(service_->IsShardSetLocked());
|
||||
}
|
||||
|
||||
TEST_F(DflyEngineTest, EvalResp) {
|
||||
auto resp = Run({"eval", "return 43", "0"});
|
||||
EXPECT_THAT(resp[0], IntArg(43));
|
||||
|
||||
resp = Run({"eval", "return {5, 'foo', 17.5}", "0"});
|
||||
EXPECT_THAT(resp, ElementsAre(IntArg(5), "foo", "17.5"));
|
||||
}
|
||||
|
||||
TEST_F(DflyEngineTest, EvalSha) {
|
||||
auto resp = Run({"script", "load", "return 5"});
|
||||
EXPECT_THAT(resp, ElementsAre(ArgType(RespExpr::STRING)));
|
||||
|
@ -120,11 +120,10 @@ class EvalSerializer : public ObjectExplorer {
|
||||
}
|
||||
|
||||
void OnArrayStart(unsigned len) final {
|
||||
LOG(FATAL) << "TBD";
|
||||
rb_->StartArray(len);
|
||||
}
|
||||
|
||||
void OnArrayEnd() final {
|
||||
LOG(FATAL) << "TBD";
|
||||
}
|
||||
|
||||
void OnNil() final {
|
||||
@ -802,6 +801,7 @@ void Service::EvalInternal(const EvalArgs& eval_args, Interpreter* interpreter,
|
||||
string resp = absl::StrCat("Error running script (call to ", eval_args.sha, "): ", error);
|
||||
return (*cntx)->SendError(resp, facade::kScriptErrType);
|
||||
}
|
||||
|
||||
CHECK(result == Interpreter::RUN_OK);
|
||||
|
||||
EvalSerializer ser{static_cast<RedisReplyBuilder*>(cntx->reply_builder())};
|
||||
|
Loading…
Reference in New Issue
Block a user