🐎 GetLog() snapshot

This commit is contained in:
EntireTwix 2021-06-27 21:08:10 -07:00
parent ba20e461f6
commit 1adb23f5b8
7 changed files with 57 additions and 15 deletions

View file

@ -36,7 +36,7 @@ public:
//Usage
METHOD_ADD(api::GetBal, "/v1/user/bal?name={name}", Get, Options); //done
METHOD_ADD(api::GetLog, "/v1/user/log", Get, Options, "UserFilter"); //snapshot not implemented
METHOD_ADD(api::GetLog, "/v1/user/log", Get, Options, "UserFilter"); //done (could be optimized further)
METHOD_ADD(api::SendFunds, "/v1/user/transfer", Post, Options, "UserFilter"); //responses incomplete
METHOD_ADD(api::VerifyPassword, "/v1/user/verify_password", Get, Options, "UserFilter"); //done

View file

@ -7,6 +7,9 @@ private:
std::atomic<bool> change_flag = false; //if true changes have been made
public:
ChangeFlag() noexcept;
ChangeFlag(ChangeFlag &&) noexcept;
void SetChangesOn() noexcept;
void SetChangesOff() noexcept;
bool GetChangeState() const noexcept;

View file

@ -1,13 +1,21 @@
#pragma once
#include <json/json.h>
#include <json/json.h> // to be removed later
#include <array>
#include <algorithm>
#include "change_flag.h"
#include "consts.hpp"
#include "transaction.h"
struct Log
{
private:
ChangeFlag log_flag;
Json::Value log_snapshot;
public:
const Json::Value &GetLog();
std::vector<Transaction> data;
void AddTrans(Transaction &&t);
Json::Value Serialize() const;
Json::Value Serialize() const; // to be removed later
};

View file

@ -1,5 +1,5 @@
#pragma once
#include <json/json.h>
#include <json/json.h> //to be removed later
#include <string>
#include <xxhash.h>
#include "log.h"
@ -15,5 +15,5 @@ struct User
User(uint32_t init_bal, uint64_t init_pass);
User(uint32_t init_bal, uint64_t init_pass, const Json::Value &log_j);
Json::Value Serialize() const;
Json::Value Serialize() const; //to be removed later
};

View file

@ -15,16 +15,8 @@ BankResponse Bank::GetBal(const std::string &name) const noexcept
BankResponse Bank::GetLogs(const std::string &name) noexcept
{
BankResponse res;
if (!users.if_contains(name, [&res](const User &u) {
Json::Value temp;
for (uint32_t i = u.log.data.size(); i > 0; --i)
{
temp[i - 1]["to"] = u.log.data[u.log.data.size() - i].to;
temp[i - 1]["from"] = u.log.data[u.log.data.size() - i].from;
temp[i - 1]["amount"] = (Json::UInt)u.log.data[u.log.data.size() - i].amount;
temp[i - 1]["time"] = (Json::UInt64)u.log.data[u.log.data.size() - i].time;
}
res = {k200OK, std::move(temp)};
if (!users.modify_if(name, [&res](User &u) {
res = {k200OK, u.log.GetLog()};
}))
{
return BankResponse(k404NotFound, "User not found");

View file

@ -1,5 +1,12 @@
#include "change_flag.h"
ChangeFlag::ChangeFlag() noexcept {}
ChangeFlag::ChangeFlag(ChangeFlag &&f) noexcept
{
change_flag.store(f.GetChangeState(), std::memory_order_release); //is this safe?
}
void ChangeFlag::SetChangesOn() noexcept
{
return change_flag.store(1, std::memory_order_release);

View file

@ -16,7 +16,35 @@ void Log::AddTrans(Transaction &&t)
data.reserve(data.capacity() + pre_log_size); // Reserve more memory
}
data.push_back(std::move(t)); // In either case we have space under max length, move to new spot
log_flag.SetChangesOn();
}
const Json::Value &Log::GetLog()
{
if (log_flag.GetChangeState()) //if there are changes
{
//re-generate snapshot
Json::Value res;
for (uint32_t i = data.size(); i > 0; --i)
{
res[i - 1]["to"] = data[data.size() - i].to;
res[i - 1]["from"] = data[data.size() - i].from;
res[i - 1]["amount"] = (Json::UInt)data[data.size() - i].amount;
#ifdef _USE_32BIT_TIME_T
res[i - 1]["time"] = (Json::UInt)data[data.size() - i].time;
#else
res[i - 1]["time"] = (Json::UInt64)data[data.size() - i].time;
#endif
}
log_flag.SetChangesOff();
return log_snapshot = res;
}
else
{
return log_snapshot;
}
}
Json::Value Log::Serialize() const
{
Json::Value res;
@ -25,7 +53,11 @@ Json::Value Log::Serialize() const
res[i]["to"] = data[i].to;
res[i]["from"] = data[i].from;
res[i]["amount"] = (Json::UInt)data[i].amount;
#ifdef _USE_32BIT_TIME_T
res[i]["time"] = (Json::UInt)data[i].time;
#else
res[i]["time"] = (Json::UInt64)data[i].time;
#endif
}
return res;
}