mirror of
https://github.com/EQEmu/Server.git
synced 2026-03-24 20:02:27 +00:00
[Databuckets] Fix issue with expired databuckets not being expired and returned properly (#3504)
This commit is contained in:
parent
fb3159b657
commit
4c2f9a4423
@ -21,20 +21,11 @@ void DataBucket::SetData(const std::string &bucket_key, const std::string &bucke
|
|||||||
|
|
||||||
void DataBucket::SetData(const DataBucketKey &k)
|
void DataBucket::SetData(const DataBucketKey &k)
|
||||||
{
|
{
|
||||||
auto r = DataBucketsRepository::GetWhere(
|
|
||||||
database,
|
|
||||||
fmt::format(
|
|
||||||
"{} `key` = '{}' AND (`expires` > {} OR `expires` = 0) LIMIT 1",
|
|
||||||
DataBucket::GetScopedDbFilters(k),
|
|
||||||
Strings::Escape(k.key),
|
|
||||||
(long long) std::time(nullptr)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
// if we have an entry, use it
|
|
||||||
auto b = DataBucketsRepository::NewEntity();
|
auto b = DataBucketsRepository::NewEntity();
|
||||||
if (!r.empty()) {
|
auto r = GetData(k);
|
||||||
b = r[0];
|
// if we have an entry, use it
|
||||||
|
if (r.id > 0) {
|
||||||
|
b = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (k.character_id > 0) {
|
if (k.character_id > 0) {
|
||||||
@ -72,18 +63,17 @@ std::string DataBucket::GetData(const std::string &bucket_key)
|
|||||||
{
|
{
|
||||||
DataBucketKey k = {};
|
DataBucketKey k = {};
|
||||||
k.key = bucket_key;
|
k.key = bucket_key;
|
||||||
return GetData(k);
|
return GetData(k).value;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DataBucket::GetData(const DataBucketKey &k)
|
DataBucketsRepository::DataBuckets DataBucket::GetData(const DataBucketKey &k)
|
||||||
{
|
{
|
||||||
auto r = DataBucketsRepository::GetWhere(
|
auto r = DataBucketsRepository::GetWhere(
|
||||||
database,
|
database,
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} `key` = '{}' AND (`expires` > {} OR `expires` = 0) LIMIT 1",
|
"{} `key` = '{}' LIMIT 1",
|
||||||
DataBucket::GetScopedDbFilters(k),
|
DataBucket::GetScopedDbFilters(k),
|
||||||
k.key,
|
k.key
|
||||||
(long long) std::time(nullptr)
|
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -91,7 +81,13 @@ std::string DataBucket::GetData(const DataBucketKey &k)
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
return r[0].value;
|
// if the entry has expired, delete it
|
||||||
|
if (r[0].expires > 0 && r[0].expires < (long long) std::time(nullptr)) {
|
||||||
|
DeleteData(k);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return r[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DataBucket::GetDataExpires(const std::string &bucket_key)
|
std::string DataBucket::GetDataExpires(const std::string &bucket_key)
|
||||||
@ -174,40 +170,22 @@ bool DataBucket::DeleteData(const DataBucketKey &k)
|
|||||||
|
|
||||||
std::string DataBucket::GetDataExpires(const DataBucketKey &k)
|
std::string DataBucket::GetDataExpires(const DataBucketKey &k)
|
||||||
{
|
{
|
||||||
auto r = DataBucketsRepository::GetWhere(
|
auto r = GetData(k);
|
||||||
database,
|
if (r.id == 0) {
|
||||||
fmt::format(
|
|
||||||
"{} `key` = '{}' AND (`expires` > {} OR `expires` = 0) LIMIT 1",
|
|
||||||
DataBucket::GetScopedDbFilters(k),
|
|
||||||
k.key,
|
|
||||||
(long long) std::time(nullptr)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (r.empty()) {
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt::format("{}", r[0].expires);
|
return fmt::format("{}", r.expires);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DataBucket::GetDataRemaining(const DataBucketKey &k)
|
std::string DataBucket::GetDataRemaining(const DataBucketKey &k)
|
||||||
{
|
{
|
||||||
auto r = DataBucketsRepository::GetWhere(
|
auto r = GetData(k);
|
||||||
database,
|
if (r.id == 0) {
|
||||||
fmt::format(
|
|
||||||
"{} `key` = '{}' AND (`expires` > {} OR `expires` = 0) LIMIT 1",
|
|
||||||
DataBucket::GetScopedDbFilters(k),
|
|
||||||
k.key,
|
|
||||||
(long long) std::time(nullptr)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (r.empty()) {
|
|
||||||
return "0";
|
return "0";
|
||||||
}
|
}
|
||||||
|
|
||||||
return fmt::format("{}", r[0].expires - (long long) std::time(nullptr));
|
return fmt::format("{}", r.expires - (long long) std::time(nullptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DataBucket::GetScopedDbFilters(const DataBucketKey &k)
|
std::string DataBucket::GetScopedDbFilters(const DataBucketKey &k)
|
||||||
|
|||||||
@ -34,7 +34,7 @@ public:
|
|||||||
// scoped bucket methods
|
// scoped bucket methods
|
||||||
static void SetData(const DataBucketKey& k);
|
static void SetData(const DataBucketKey& k);
|
||||||
static bool DeleteData(const DataBucketKey& k);
|
static bool DeleteData(const DataBucketKey& k);
|
||||||
static std::string GetData(const DataBucketKey& k);
|
static DataBucketsRepository::DataBuckets GetData(const DataBucketKey& k);
|
||||||
static std::string GetDataExpires(const DataBucketKey& k);
|
static std::string GetDataExpires(const DataBucketKey& k);
|
||||||
static std::string GetDataRemaining(const DataBucketKey& k);
|
static std::string GetDataRemaining(const DataBucketKey& k);
|
||||||
static std::string CheckBucketKey(const Mob* mob, const DataBucketKey& k);
|
static std::string CheckBucketKey(const Mob* mob, const DataBucketKey& k);
|
||||||
|
|||||||
@ -1276,10 +1276,10 @@ uint8 Client::GetCharMaxLevelFromBucket()
|
|||||||
DataBucketKey k = GetScopedBucketKeys();
|
DataBucketKey k = GetScopedBucketKeys();
|
||||||
k.key = "CharMaxLevel";
|
k.key = "CharMaxLevel";
|
||||||
|
|
||||||
auto bucket_value = DataBucket::GetData(k);
|
auto b = DataBucket::GetData(k);
|
||||||
if (!bucket_value.empty()) {
|
if (!b.value.empty()) {
|
||||||
if (Strings::IsNumber(bucket_value)) {
|
if (Strings::IsNumber(b.value)) {
|
||||||
return static_cast<uint8>(Strings::ToUnsignedInt(bucket_value));
|
return static_cast<uint8>(Strings::ToUnsignedInt(b.value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8062,9 +8062,9 @@ std::string Mob::GetBucket(std::string bucket_name)
|
|||||||
DataBucketKey k = GetScopedBucketKeys();
|
DataBucketKey k = GetScopedBucketKeys();
|
||||||
k.key = bucket_name;
|
k.key = bucket_name;
|
||||||
|
|
||||||
std::string bucket_value = DataBucket::GetData(k);
|
auto b = DataBucket::GetData(k);
|
||||||
if (!bucket_value.empty()) {
|
if (!b.value.empty()) {
|
||||||
return bucket_value;
|
return b.value;
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5880,14 +5880,14 @@ bool Client::SpellBucketCheck(uint16 spell_id, uint32 character_id) {
|
|||||||
DataBucketKey k = GetScopedBucketKeys();
|
DataBucketKey k = GetScopedBucketKeys();
|
||||||
k.key = spell_bucket_name;
|
k.key = spell_bucket_name;
|
||||||
|
|
||||||
auto bucket_value = DataBucket::GetData(k);
|
auto b = DataBucket::GetData(k);
|
||||||
if (!bucket_value.empty()) {
|
if (!b.value.empty()) {
|
||||||
if (Strings::IsNumber(bucket_value) && Strings::IsNumber(spell_bucket_value)) {
|
if (Strings::IsNumber(b.value) && Strings::IsNumber(spell_bucket_value)) {
|
||||||
if (Strings::ToInt(bucket_value) >= Strings::ToInt(spell_bucket_value)) {
|
if (Strings::ToInt(b.value) >= Strings::ToInt(spell_bucket_value)) {
|
||||||
return true; // If value is greater than or equal to spell bucket value, allow scribing.
|
return true; // If value is greater than or equal to spell bucket value, allow scribing.
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (bucket_value == spell_bucket_value) {
|
if (b.value == spell_bucket_value) {
|
||||||
return true; // If value is equal to spell bucket value, allow scribing.
|
return true; // If value is equal to spell bucket value, allow scribing.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5899,7 +5899,7 @@ bool Client::SpellBucketCheck(uint16 spell_id, uint32 character_id) {
|
|||||||
spell_bucket_name
|
spell_bucket_name
|
||||||
);
|
);
|
||||||
|
|
||||||
bucket_value = DataBucket::GetData(old_bucket_name);
|
auto bucket_value = DataBucket::GetData(old_bucket_name);
|
||||||
if (!bucket_value.empty()) {
|
if (!bucket_value.empty()) {
|
||||||
if (Strings::IsNumber(bucket_value) && Strings::IsNumber(spell_bucket_value)) {
|
if (Strings::IsNumber(bucket_value) && Strings::IsNumber(spell_bucket_value)) {
|
||||||
if (Strings::ToInt(bucket_value) >= Strings::ToInt(spell_bucket_value)) {
|
if (Strings::ToInt(bucket_value) >= Strings::ToInt(spell_bucket_value)) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user