CCF
Loading...
Searching...
No Matches
Namespaces | Macros | Typedefs | Functions | Variables
kv_helpers.h File Reference
#include "js/global_class_ids.h"
#include "js/permissions_checks.h"
#include "kv/untyped_map.h"

Go to the source code of this file.

Namespaces

namespace  ccf
 
namespace  ccf::js
 
namespace  ccf::js::extensions
 
namespace  ccf::js::extensions::kvhelpers
 

Macros

#define JS_KV_PERMISSION_ERROR_HELPER(C_FUNC_NAME, JS_METHOD_NAME)
 
#define JS_CHECK_HANDLE(h)
 
#define MAKE_FUNCTION(C_FUNC_NAME, JS_METHOD_NAME, ARG_COUNT, FUNC_FACTORY_METHOD, SETTER_METHOD, PERMISSION_FLAGS, HANDLE_GETTER)
 
#define MAKE_READ_FUNCTION(C_FUNC_NAME, JS_METHOD_NAME, ARG_COUNT)
 
#define MAKE_WRITE_FUNCTION(C_FUNC_NAME, JS_METHOD_NAME, ARG_COUNT)
 

Typedefs

using ccf::js::extensions::kvhelpers::KVMap = ::ccf::kv::untyped::Map
 
using ccf::js::extensions::kvhelpers::ROHandleGetter = KVMap::ReadOnlyHandle *(*)(js::core::Context &jsctx, JSValueConst this_val)
 
using ccf::js::extensions::kvhelpers::RWHandleGetter = KVMap::Handle *(*)(js::core::Context &jsctx, JSValueConst this_val)
 

Functions

 ccf::js::extensions::kvhelpers::JS_KV_PERMISSION_ERROR_HELPER (js_kv_get_version_of_previous_write_denied, "getVersionOfPreviousWrite") template< ROHandleGetter GetReadOnlyHandle > static JSValue js_kv_map_has(JSContext *ctx
 
 ccf::js::extensions::kvhelpers::if (argc !=1)
 
 ccf::js::extensions::kvhelpers::if (!key)
 
 ccf::js::extensions::kvhelpers::JS_CHECK_HANDLE (handle)
 
return ccf::js::extensions::kvhelpers::JS_NewBool (ctx, has)
 

Variables

JSValueConst ccf::js::extensions::kvhelpers::this_val
 
JSValueConst int ccf::js::extensions::kvhelpers::argc
 
JSValueConst int JSValueConst * ccf::js::extensions::kvhelpers::argv
 
size_t ccf::js::extensions::kvhelpers::key_size
 
uint8_t * ccf::js::extensions::kvhelpers::key = JS_GetArrayBuffer(ctx, &key_size, argv[0])
 
auto ccf::js::extensions::kvhelpers::handle = GetReadOnlyHandle(jsctx, this_val)
 
auto ccf::js::extensions::kvhelpers::has = handle->has({key, key + key_size})
 

Macro Definition Documentation

◆ JS_CHECK_HANDLE

#define JS_CHECK_HANDLE (   h)
Value:
do \
{ \
if (h == nullptr) \
{ \
return JS_ThrowInternalError( \
ctx, "Internal: Unable to access MapHandle"); \
} \
} while (0)

◆ JS_KV_PERMISSION_ERROR_HELPER

#define JS_KV_PERMISSION_ERROR_HELPER (   C_FUNC_NAME,
  JS_METHOD_NAME 
)
Value:
static JSValue C_FUNC_NAME( \
JSContext* ctx, JSValueConst this_val, int, JSValueConst*) \
{ \
js::core::Context& jsctx = *(js::core::Context*)JS_GetContextOpaque(ctx); \
const auto table_name = \
jsctx.to_str(JS_GetPropertyStr(jsctx, this_val, "_map_name")) \
.value_or(""); \
if (table_name.empty()) \
{ \
return JS_ThrowTypeError(ctx, "Internal: No map name stored on handle"); \
} \
auto func = jsctx.get_property(this_val, JS_METHOD_NAME); \
std::string explanation; \
auto error_msg = func["_error_msg"]; \
if (!error_msg.is_undefined()) \
{ \
explanation = jsctx.to_str(error_msg).value_or(""); \
} \
return JS_ThrowTypeError( \
ctx, \
"Cannot call " #JS_METHOD_NAME " on table named %s. %s", \
table_name.c_str(), \
explanation.c_str()); \
}

◆ MAKE_FUNCTION

#define MAKE_FUNCTION (   C_FUNC_NAME,
  JS_METHOD_NAME,
  ARG_COUNT,
  FUNC_FACTORY_METHOD,
  SETTER_METHOD,
  PERMISSION_FLAGS,
  HANDLE_GETTER 
)
Value:
do \
{ \
/* This could use std::to_underlying from C++23 */ \
const auto permitted = \
ccf::js::intersect_access_permissions( \
access_permission, PERMISSION_FLAGS) != KVAccessPermissions::ILLEGAL; \
auto fn_val = ctx.FUNC_FACTORY_METHOD( \
!permitted ? C_FUNC_NAME##_denied : C_FUNC_NAME<HANDLE_GETTER>, \
JS_METHOD_NAME, \
ARG_COUNT); \
JS_CHECK_EXC(fn_val); \
if (!permitted) \
{ \
JS_CHECK_SET( \
fn_val.set("_error_msg", ctx.new_string(permission_explanation))); \
} \
JS_CHECK_SET(view_val.SETTER_METHOD(JS_METHOD_NAME, std::move(fn_val))); \
} while (0)

◆ MAKE_READ_FUNCTION

#define MAKE_READ_FUNCTION (   C_FUNC_NAME,
  JS_METHOD_NAME,
  ARG_COUNT 
)
Value:
C_FUNC_NAME, \
JS_METHOD_NAME, \
ARG_COUNT, \
new_c_function, \
set, \
KVAccessPermissions::READ_ONLY, \
GetReadOnlyHandle)
#define MAKE_FUNCTION(C_FUNC_NAME, JS_METHOD_NAME, ARG_COUNT, FUNC_FACTORY_METHOD, SETTER_METHOD, PERMISSION_FLAGS, HANDLE_GETTER)

◆ MAKE_WRITE_FUNCTION

#define MAKE_WRITE_FUNCTION (   C_FUNC_NAME,
  JS_METHOD_NAME,
  ARG_COUNT 
)
Value:
C_FUNC_NAME, \
JS_METHOD_NAME, \
ARG_COUNT, \
new_c_function, \
set, \
KVAccessPermissions::WRITE_ONLY, \
GetWriteHandle)