#ifndef OLIPHAUNT_H
#define OLIPHAUNT_H
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#define OLIPHAUNT_ABI_VERSION 6u
#define OLIPHAUNT_INIT_OPTIONS_ABI_VERSION 1u
#define OLIPHAUNT_STATIC_EXTENSION_ABI_VERSION 1u
#define OLIPHAUNT_CAP_PROTOCOL_RAW (1ull << 0)
#define OLIPHAUNT_CAP_PROTOCOL_STREAM (1ull << 1)
#define OLIPHAUNT_CAP_MULTI_INSTANCE (1ull << 2)
#define OLIPHAUNT_CAP_SERVER_MODE (1ull << 3)
#define OLIPHAUNT_CAP_EXTENSIONS (1ull << 4)
#define OLIPHAUNT_CAP_QUERY_CANCEL (1ull << 5)
#define OLIPHAUNT_CAP_BACKUP_RESTORE (1ull << 6)
#define OLIPHAUNT_CAP_SIMPLE_QUERY (1ull << 7)
#define OLIPHAUNT_CAP_STATIC_EXTENSIONS (1ull << 8)
#define OLIPHAUNT_CAP_LOGICAL_REOPEN (1ull << 9)
#define OLIPHAUNT_BACKUP_FORMAT_SQL 1u
#define OLIPHAUNT_BACKUP_FORMAT_PHYSICAL_ARCHIVE 2u
#define OLIPHAUNT_BACKUP_FORMAT_OLIPHAUNT_ARCHIVE 3u
#if defined(_WIN32) && defined(OLIPHAUNT_BUILDING_DLL)
#define OLIPHAUNT_API __declspec(dllexport)
#elif defined(_WIN32)
#define OLIPHAUNT_API __declspec(dllimport)
#else
#define OLIPHAUNT_API
#endif
#define OLIPHAUNT_CONFIG_EXTERNAL_ROOT_LOCK (1ull << 0)
#define OLIPHAUNT_RESTORE_REPLACE_EXISTING (1ull << 0)
typedef struct OliphauntHandle OliphauntHandle;
typedef struct OliphauntStaticExtensionSymbol {
const char *name;
void *address;
} OliphauntStaticExtensionSymbol;
typedef struct OliphauntStaticExtension {
uint32_t abi_version;
const char *name;
const void *(*magic)(void);
void (*init)(void);
const OliphauntStaticExtensionSymbol *symbols;
size_t symbol_count;
uint64_t reserved_flags;
} OliphauntStaticExtension;
typedef struct OliphauntConfig {
uint32_t abi_version;
const char *pgdata;
const char *runtime_dir;
const char *username;
const char *database;
uint64_t reserved_flags;
const char *const *startup_args;
size_t startup_arg_count;
} OliphauntConfig;
typedef struct OliphauntInitOptions {
uint32_t abi_version;
const char *module_dir;
uint64_t reserved_flags;
} OliphauntInitOptions;
typedef struct OliphauntResponse {
uint8_t *data;
size_t len;
} OliphauntResponse;
typedef struct OliphauntArchiveFile {
const char *path;
const uint8_t *data;
size_t len;
uint32_t mode;
uint64_t reserved_flags;
} OliphauntArchiveFile;
typedef struct OliphauntBackupOptions {
uint32_t abi_version;
uint32_t format;
const OliphauntArchiveFile *generated_files;
size_t generated_file_count;
uint64_t reserved_flags;
} OliphauntBackupOptions;
typedef struct OliphauntRestoreOptions {
uint32_t abi_version;
const char *root;
uint32_t format;
const uint8_t *data;
size_t len;
uint64_t flags;
} OliphauntRestoreOptions;
typedef int32_t (*OliphauntStreamCallback)(void *context, const uint8_t *data, size_t len);
OLIPHAUNT_API int32_t oliphaunt_init(const OliphauntConfig *config, OliphauntHandle **out);
OLIPHAUNT_API int32_t oliphaunt_init_ex(
const OliphauntConfig *config,
const OliphauntInitOptions *options,
OliphauntHandle **out);
OLIPHAUNT_API int32_t oliphaunt_exec_protocol(
OliphauntHandle *handle,
const uint8_t *request,
size_t request_len,
OliphauntResponse *out);
OLIPHAUNT_API int32_t oliphaunt_exec_simple_query(
OliphauntHandle *handle,
const char *sql,
size_t sql_len,
OliphauntResponse *out);
OLIPHAUNT_API int32_t oliphaunt_exec_protocol_stream(
OliphauntHandle *handle,
const uint8_t *request,
size_t request_len,
OliphauntStreamCallback callback,
void *callback_context);
OLIPHAUNT_API int32_t oliphaunt_backup(OliphauntHandle *handle, uint32_t format, OliphauntResponse *out);
OLIPHAUNT_API int32_t oliphaunt_backup_ex(
OliphauntHandle *handle,
const OliphauntBackupOptions *options,
OliphauntResponse *out);
OLIPHAUNT_API int32_t oliphaunt_restore(const OliphauntRestoreOptions *options);
OLIPHAUNT_API int32_t oliphaunt_cancel(OliphauntHandle *handle);
OLIPHAUNT_API int32_t oliphaunt_detach(OliphauntHandle *handle);
OLIPHAUNT_API uint64_t oliphaunt_logical_generation(OliphauntHandle *handle);
OLIPHAUNT_API int32_t oliphaunt_close_if_generation(
uint64_t generation);
OLIPHAUNT_API int32_t oliphaunt_close(OliphauntHandle *handle);
OLIPHAUNT_API int32_t oliphaunt_register_static_extensions(const OliphauntStaticExtension *extensions, size_t count);
OLIPHAUNT_API const char *oliphaunt_last_error(OliphauntHandle *handle);
OLIPHAUNT_API const char *oliphaunt_version(void);
OLIPHAUNT_API uint64_t oliphaunt_capabilities(void);
OLIPHAUNT_API void oliphaunt_free_response(OliphauntResponse *response);
#ifdef __cplusplus
}
#endif
#endif