#pragma once
#ifndef CPP_WORKLOAD_H
#define CPP_WORKLOAD_H
#include <string>
#include <vector>
#include <functional>
#include <memory>
#ifndef DLLEXPORT
#if defined(_MSC_VER)
#define DLLEXPORT __declspec(dllexport)
#elif defined(__GNUG__)
#define DLLEXPORT __attribute__((visibility("default")))
#else
#error Missing symbol export
#endif
#endif
typedef struct FDB_future FDBFuture;
typedef struct FDB_result FDBResult;
typedef struct FDB_database FDBDatabase;
typedef struct FDB_transaction FDBTransaction;
enum class FDBSeverity { Debug, Info, Warn, WarnAlways, Error };
class FDBLogger {
public:
virtual void trace(FDBSeverity sev,
const std::string& name,
const std::vector<std::pair<std::string, std::string>>& details) = 0;
};
class FDBWorkloadContext : public FDBLogger {
public:
virtual uint64_t getProcessID() const = 0;
virtual void setProcessID(uint64_t processID) = 0;
virtual double now() const = 0;
virtual uint32_t rnd() const = 0;
virtual bool getOption(const std::string& name, bool defaultValue) = 0;
virtual long getOption(const std::string& name, long defaultValue) = 0;
virtual unsigned long getOption(const std::string& name, unsigned long defaultValue) = 0;
virtual double getOption(const std::string& name, double defaultValue) = 0;
virtual std::string getOption(const std::string& name, std::string defaultValue) = 0;
virtual int clientId() const = 0;
virtual int clientCount() const = 0;
virtual int64_t sharedRandomNumber() const = 0;
};
struct FDBPromise {
virtual ~FDBPromise() = default;
virtual void send(void*) = 0;
};
template <class T>
class GenericPromise {
std::shared_ptr<FDBPromise> impl;
public:
template <class Ptr>
explicit GenericPromise(Ptr&& impl) : impl(std::forward<Ptr>(impl)) {}
void send(T val) { impl->send(&val); }
};
struct FDBPerfMetric {
std::string name;
double value;
bool averaged;
std::string format_code = "%.3g";
};
class DLLEXPORT FDBWorkload {
public:
#if FDB_API_VERSION <= 730
virtual std::string description() const = 0;
#endif
virtual bool init(FDBWorkloadContext* context) = 0;
virtual void setup(FDBDatabase* db, GenericPromise<bool> done) = 0;
virtual void start(FDBDatabase* db, GenericPromise<bool> done) = 0;
virtual void check(FDBDatabase* db, GenericPromise<bool> done) = 0;
virtual void getMetrics(std::vector<FDBPerfMetric>& out) const = 0;
virtual double getCheckTimeout() { return 3000; }
};
class DLLEXPORT FDBWorkloadFactory {
public:
virtual std::shared_ptr<FDBWorkload> create(const std::string& name) = 0;
};
#endif