Skip to content

Commit 9d3063e

Browse files
committed
Make key renaming compatible with cluster
1 parent 7ce5c0b commit 9d3063e

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

src/app/models/key-models/abstractkey.h

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,33 @@ class KeyModel : public ValueEditor::Model {
6868

6969
virtual void setKeyName(const QByteArray& newKeyName,
7070
ValueEditor::Model::Callback c) override {
71+
// NOTE(u_glide): DUMP + RESTORE + DEL is cluster compatible alternative to RENAME command
7172
executeCmd(
72-
{"RENAMENX", m_keyFullPath, newKeyName}, c,
73+
{"DUMP", m_keyFullPath}, c,
7374
[this, newKeyName](RedisClient::Response r, Callback c) {
74-
if (r.value().toInt() == 0) {
75-
return c(QCoreApplication::translate(
76-
"RDM",
77-
"Key with new name %1 already exist in "
78-
"database or original key was "
79-
"removed")
80-
.arg(getKeyName()));
81-
}
82-
83-
m_keyFullPath = newKeyName;
84-
c(QString());
75+
executeCmd(
76+
{"RESTORE", newKeyName,
77+
QString::number(m_ttl > 0 ? m_ttl : 0).toLatin1(),
78+
r.value().toByteArray()},
79+
c,
80+
[this, newKeyName](RedisClient::Response r, Callback c) {
81+
if (!r.isOkMessage()) {
82+
return c(QCoreApplication::translate(
83+
"RDM", "Cannot rename key %1: %2")
84+
.arg(getKeyName())
85+
.arg(r.value().toString()));
86+
}
87+
88+
executeCmd(
89+
{"DEL", m_keyFullPath}, [](const QString&) {},
90+
[](RedisClient::Response, Callback) {});
91+
92+
m_keyFullPath = newKeyName;
93+
c(QString());
94+
},
95+
RedisClient::Response::Type::Status);
8596
},
86-
RedisClient::Response::Type::Integer);
97+
RedisClient::Response::Type::String);
8798
}
8899

89100
virtual void setTTL(const long long ttl,

0 commit comments

Comments
 (0)