Skip to content

Commit

Permalink
bindgen for outbound-pg with go sdk
Browse files Browse the repository at this point in the history
Signed-off-by: Justin Pflueger <justin.pflueger@fermyon.com>
  • Loading branch information
jpflueger committed Mar 3, 2023
1 parent 9890afc commit b325a55
Show file tree
Hide file tree
Showing 3 changed files with 425 additions and 6 deletions.
18 changes: 12 additions & 6 deletions sdk/go/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,13 @@ $(EXAMPLES_DIR)/%/main.wasm: $(EXAMPLES_DIR)/%/main.go
# ----------------------------------------------------------------------
# Generate C bindings
# ----------------------------------------------------------------------
GENERATED_SPIN_CONFIG = config/spin-config.c config/spin-config.h
GENERATED_OUTBOUND_HTTP = http/wasi-outbound-http.c http/wasi-outbound-http.h
GENERATED_SPIN_HTTP = http/spin-http.c http/spin-http.h
GENERATED_OUTBOUND_REDIS = redis/outbound-redis.c redis/outbound-redis.h
GENERATED_SPIN_REDIS = redis/spin-redis.c redis/spin-redis.h
GENERATED_KEY_VALUE = key_value/key-value.c key_value/key-value.h
GENERATED_SPIN_CONFIG = config/spin-config.c config/spin-config.h
GENERATED_OUTBOUND_HTTP = http/wasi-outbound-http.c http/wasi-outbound-http.h
GENERATED_SPIN_HTTP = http/spin-http.c http/spin-http.h
GENERATED_OUTBOUND_REDIS = redis/outbound-redis.c redis/outbound-redis.h
GENERATED_SPIN_REDIS = redis/spin-redis.c redis/spin-redis.h
GENERATED_KEY_VALUE = key_value/key-value.c key_value/key-value.h
GENERATED_OUTBOUND_POSTGRES = outbound_postgres/outbound_postgres.c outbound_postgres/outbound_postgres.h

SDK_VERSION_SOURCE_FILE = sdk_version/sdk-version-go-template.c

Expand All @@ -52,6 +53,7 @@ generate: $(GENERATED_OUTBOUND_HTTP) $(GENERATED_SPIN_HTTP)
generate: $(GENERATED_OUTBOUND_REDIS) $(GENERATED_SPIN_REDIS)
generate: $(GENERATED_SPIN_CONFIG) $(GENERATED_KEY_VALUE)
generate: $(SDK_VERSION_DEST_FILES)
generate: $(GENERATED_OUTBOUND_POSTGRES)

$(SDK_VERSION_DEST_FILES): $(SDK_VERSION_SOURCE_FILE)
export version="$$(cd ../rust && cargo run)"; \
Expand All @@ -76,6 +78,9 @@ $(GENERATED_SPIN_REDIS):
$(GENERATED_KEY_VALUE):
wit-bindgen c --import ../../wit/ephemeral/key-value.wit --out-dir ./key_value

$(GENERATED_OUTBOUND_POSTGRES):
wit-bindgen c --import ../../wit/ephemeral/outbound-pg.wit --out-dir ./outbound_postgres

# ----------------------------------------------------------------------
# Cleanup
# ----------------------------------------------------------------------
Expand All @@ -85,6 +90,7 @@ clean:
rm -f $(GENERATED_OUTBOUND_HTTP) $(GENERATED_SPIN_HTTP)
rm -f $(GENERATED_OUTBOUND_REDIS) $(GENERATED_SPIN_REDIS)
rm -f $(GENERATED_KEY_VALUE) $(GENERATED_SDK_VERSION)
rm -f $(GENERATED_OUTBOUND_POSTGRES)
rm -f http/testdata/http-tinygo/main.wasm
rm -f $(EXAMPLES_DIR)/http-tinygo/main.wasm
rm -f $(EXAMPLES_DIR)/http-tinygo-outbound-http/main.wasm
Expand Down
239 changes: 239 additions & 0 deletions sdk/go/outbound_postgres/outbound-pg.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
#include <stdlib.h>
#include <outbound-pg.h>

__attribute__((weak, export_name("canonical_abi_realloc")))
void *canonical_abi_realloc(
void *ptr,
size_t orig_size,
size_t org_align,
size_t new_size
) {
void *ret = realloc(ptr, new_size);
if (!ret)
abort();
return ret;
}

__attribute__((weak, export_name("canonical_abi_free")))
void canonical_abi_free(
void *ptr,
size_t size,
size_t align
) {
free(ptr);
}
#include <string.h>

void outbound_pg_string_set(outbound_pg_string_t *ret, const char *s) {
ret->ptr = (char*) s;
ret->len = strlen(s);
}

void outbound_pg_string_dup(outbound_pg_string_t *ret, const char *s) {
ret->len = strlen(s);
ret->ptr = canonical_abi_realloc(NULL, 0, 1, ret->len);
memcpy(ret->ptr, s, ret->len);
}

void outbound_pg_string_free(outbound_pg_string_t *ret) {
canonical_abi_free(ret->ptr, ret->len, 1);
ret->ptr = NULL;
ret->len = 0;
}
void outbound_pg_pg_error_free(outbound_pg_pg_error_t *ptr) {
switch ((int32_t) ptr->tag) {
case 1: {
outbound_pg_string_free(&ptr->val.connection_failed);
break;
}
case 2: {
outbound_pg_string_free(&ptr->val.bad_parameter);
break;
}
case 3: {
outbound_pg_string_free(&ptr->val.query_failed);
break;
}
case 4: {
outbound_pg_string_free(&ptr->val.value_conversion_failed);
break;
}
case 5: {
outbound_pg_string_free(&ptr->val.other_error);
break;
}
}
}
void outbound_pg_column_free(outbound_pg_column_t *ptr) {
outbound_pg_string_free(&ptr->name);
}
void outbound_pg_list_u8_free(outbound_pg_list_u8_t *ptr) {
canonical_abi_free(ptr->ptr, ptr->len * 1, 1);
}
void outbound_pg_db_value_free(outbound_pg_db_value_t *ptr) {
switch ((int32_t) ptr->tag) {
case 11: {
outbound_pg_string_free(&ptr->val.str);
break;
}
case 12: {
outbound_pg_list_u8_free(&ptr->val.binary);
break;
}
}
}
void outbound_pg_parameter_value_free(outbound_pg_parameter_value_t *ptr) {
switch ((int32_t) ptr->tag) {
case 11: {
outbound_pg_string_free(&ptr->val.str);
break;
}
case 12: {
outbound_pg_list_u8_free(&ptr->val.binary);
break;
}
}
}
void outbound_pg_row_free(outbound_pg_row_t *ptr) {
for (size_t i = 0; i < ptr->len; i++) {
outbound_pg_db_value_free(&ptr->ptr[i]);
}
canonical_abi_free(ptr->ptr, ptr->len * 16, 8);
}
void outbound_pg_list_column_free(outbound_pg_list_column_t *ptr) {
for (size_t i = 0; i < ptr->len; i++) {
outbound_pg_column_free(&ptr->ptr[i]);
}
canonical_abi_free(ptr->ptr, ptr->len * 12, 4);
}
void outbound_pg_list_row_free(outbound_pg_list_row_t *ptr) {
for (size_t i = 0; i < ptr->len; i++) {
outbound_pg_row_free(&ptr->ptr[i]);
}
canonical_abi_free(ptr->ptr, ptr->len * 8, 4);
}
void outbound_pg_row_set_free(outbound_pg_row_set_t *ptr) {
outbound_pg_list_column_free(&ptr->columns);
outbound_pg_list_row_free(&ptr->rows);
}
void outbound_pg_list_parameter_value_free(outbound_pg_list_parameter_value_t *ptr) {
for (size_t i = 0; i < ptr->len; i++) {
outbound_pg_parameter_value_free(&ptr->ptr[i]);
}
canonical_abi_free(ptr->ptr, ptr->len * 16, 8);
}
void outbound_pg_expected_row_set_pg_error_free(outbound_pg_expected_row_set_pg_error_t *ptr) {
if (!ptr->is_err) {
outbound_pg_row_set_free(&ptr->val.ok);
} else {
outbound_pg_pg_error_free(&ptr->val.err);
}
}
void outbound_pg_expected_u64_pg_error_free(outbound_pg_expected_u64_pg_error_t *ptr) {
if (!ptr->is_err) {
} else {
outbound_pg_pg_error_free(&ptr->val.err);
}
}

__attribute__((aligned(8)))
static uint8_t RET_AREA[20];
__attribute__((import_module("outbound-pg"), import_name("query")))
void __wasm_import_outbound_pg_query(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t);
void outbound_pg_query(outbound_pg_string_t *address, outbound_pg_string_t *statement, outbound_pg_list_parameter_value_t *params, outbound_pg_expected_row_set_pg_error_t *ret0) {
int32_t ptr = (int32_t) &RET_AREA;
__wasm_import_outbound_pg_query((int32_t) (*address).ptr, (int32_t) (*address).len, (int32_t) (*statement).ptr, (int32_t) (*statement).len, (int32_t) (*params).ptr, (int32_t) (*params).len, ptr);
outbound_pg_expected_row_set_pg_error_t expected;
switch ((int32_t) (*((uint8_t*) (ptr + 0)))) {
case 0: {
expected.is_err = false;

expected.val.ok = (outbound_pg_row_set_t) {
(outbound_pg_list_column_t) { (outbound_pg_column_t*)(*((int32_t*) (ptr + 4))), (size_t)(*((int32_t*) (ptr + 8))) },
(outbound_pg_list_row_t) { (outbound_pg_row_t*)(*((int32_t*) (ptr + 12))), (size_t)(*((int32_t*) (ptr + 16))) },
};
break;
}
case 1: {
expected.is_err = true;
outbound_pg_pg_error_t variant13;
variant13.tag = (int32_t) (*((uint8_t*) (ptr + 4)));
switch ((int32_t) variant13.tag) {
case 0: {
break;
}
case 1: {
variant13.val.connection_failed = (outbound_pg_string_t) { (char*)(*((int32_t*) (ptr + 8))), (size_t)(*((int32_t*) (ptr + 12))) };
break;
}
case 2: {
variant13.val.bad_parameter = (outbound_pg_string_t) { (char*)(*((int32_t*) (ptr + 8))), (size_t)(*((int32_t*) (ptr + 12))) };
break;
}
case 3: {
variant13.val.query_failed = (outbound_pg_string_t) { (char*)(*((int32_t*) (ptr + 8))), (size_t)(*((int32_t*) (ptr + 12))) };
break;
}
case 4: {
variant13.val.value_conversion_failed = (outbound_pg_string_t) { (char*)(*((int32_t*) (ptr + 8))), (size_t)(*((int32_t*) (ptr + 12))) };
break;
}
case 5: {
variant13.val.other_error = (outbound_pg_string_t) { (char*)(*((int32_t*) (ptr + 8))), (size_t)(*((int32_t*) (ptr + 12))) };
break;
}
}

expected.val.err = variant13;
break;
}
}*ret0 = expected;
}
__attribute__((import_module("outbound-pg"), import_name("execute")))
void __wasm_import_outbound_pg_execute(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t);
void outbound_pg_execute(outbound_pg_string_t *address, outbound_pg_string_t *statement, outbound_pg_list_parameter_value_t *params, outbound_pg_expected_u64_pg_error_t *ret0) {
int32_t ptr = (int32_t) &RET_AREA;
__wasm_import_outbound_pg_execute((int32_t) (*address).ptr, (int32_t) (*address).len, (int32_t) (*statement).ptr, (int32_t) (*statement).len, (int32_t) (*params).ptr, (int32_t) (*params).len, ptr);
outbound_pg_expected_u64_pg_error_t expected;
switch ((int32_t) (*((uint8_t*) (ptr + 0)))) {
case 0: {
expected.is_err = false;

expected.val.ok = (uint64_t) (*((int64_t*) (ptr + 8)));
break;
}
case 1: {
expected.is_err = true;
outbound_pg_pg_error_t variant;
variant.tag = (int32_t) (*((uint8_t*) (ptr + 8)));
switch ((int32_t) variant.tag) {
case 0: {
break;
}
case 1: {
variant.val.connection_failed = (outbound_pg_string_t) { (char*)(*((int32_t*) (ptr + 12))), (size_t)(*((int32_t*) (ptr + 16))) };
break;
}
case 2: {
variant.val.bad_parameter = (outbound_pg_string_t) { (char*)(*((int32_t*) (ptr + 12))), (size_t)(*((int32_t*) (ptr + 16))) };
break;
}
case 3: {
variant.val.query_failed = (outbound_pg_string_t) { (char*)(*((int32_t*) (ptr + 12))), (size_t)(*((int32_t*) (ptr + 16))) };
break;
}
case 4: {
variant.val.value_conversion_failed = (outbound_pg_string_t) { (char*)(*((int32_t*) (ptr + 12))), (size_t)(*((int32_t*) (ptr + 16))) };
break;
}
case 5: {
variant.val.other_error = (outbound_pg_string_t) { (char*)(*((int32_t*) (ptr + 12))), (size_t)(*((int32_t*) (ptr + 16))) };
break;
}
}

expected.val.err = variant;
break;
}
}*ret0 = expected;
}
Loading

0 comments on commit b325a55

Please sign in to comment.