-
Notifications
You must be signed in to change notification settings - Fork 16
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: avoid allocating ADBC inputs and outputs twice (#97)
* arrow_metadata_to_nif_term * `res->private_data` should only alloc once * check if stream ends in `adbc_arrow_array_stream_next` * fix `get_arrow_array_map_children` * fix: use strcmp/strncmp properly * added a helper function * return reference(s) in `Adbc.Column.data` * implemented `Adbc.{Result,Column}.materialize/1` * updated existing test cases * added support for using data with a single reference inside * added rwlock * updated new test case * a shallow copy + setting `release` to nullptr seems to be fine * Update lib/adbc_connection.ex Co-authored-by: José Valim <[email protected]> * flatten top-level columns in result * updated test cases * minor changes to helper functions * fix materialize/1 * fix segfault * removed unused var * updated make_env * removed make_env * Update lib/adbc_connection.ex Co-authored-by: José Valim <[email protected]> --------- Co-authored-by: José Valim <[email protected]>
- Loading branch information
Showing
16 changed files
with
1,810 additions
and
570 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
#ifndef ADBC_ARROW_ARRAY_STREAM_RECORD_HPP | ||
#define ADBC_ARROW_ARRAY_STREAM_RECORD_HPP | ||
#pragma once | ||
|
||
#include <adbc.h> | ||
|
||
struct ArrowArrayStreamRecord { | ||
struct ArrowSchema *schema = nullptr; | ||
struct ArrowArray *values = nullptr; | ||
|
||
/// Allocate memory for schema and values | ||
/// @return 0 if success, 1 if failed | ||
int allocate_schema_and_values() { | ||
this->schema = (struct ArrowSchema *)enif_alloc(sizeof(struct ArrowSchema)); | ||
if (this->schema == nullptr) { | ||
return 1; | ||
} | ||
memset(this->schema, 0, sizeof(struct ArrowSchema)); | ||
|
||
this->values = (struct ArrowArray *)enif_alloc(sizeof(struct ArrowArray)); | ||
if (this->values == nullptr) { | ||
enif_free(this->schema); | ||
this->schema = nullptr; | ||
return 1; | ||
} | ||
memset(this->values, 0, sizeof(struct ArrowArray)); | ||
|
||
return 0; | ||
} | ||
|
||
void release_schema_and_values() { | ||
if (this->schema) { | ||
if (this->schema->release) { | ||
this->schema->release(this->schema); | ||
} | ||
enif_free(this->schema); | ||
this->schema = nullptr; | ||
} | ||
|
||
if (this->values) { | ||
if (this->values->release) { | ||
this->values->release(this->values); | ||
} | ||
enif_free(this->values); | ||
this->values = nullptr; | ||
} | ||
} | ||
}; | ||
|
||
#endif // ADBC_ARROW_ARRAY_STREAM_RECORD_HPP |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
#ifndef ADBC_ARROW_METADATA_HPP | ||
#define ADBC_ARROW_METADATA_HPP | ||
#pragma once | ||
|
||
#include <stdio.h> | ||
#include <vector> | ||
#include <adbc.h> | ||
#include <erl_nif.h> | ||
#include "adbc_consts.h" | ||
#include "nif_utils.hpp" | ||
|
||
static int arrow_metadata_to_nif_term(ErlNifEnv *env, const char * metadata, ERL_NIF_TERM * out_metadata) { | ||
std::vector<ERL_NIF_TERM> metadata_keys, metadata_values; | ||
*out_metadata = kAtomNil; | ||
if (metadata == nullptr) return NANOARROW_OK; | ||
|
||
struct ArrowMetadataReader metadata_reader{}; | ||
struct ArrowStringView key; | ||
struct ArrowStringView value; | ||
NANOARROW_RETURN_NOT_OK(ArrowMetadataReaderInit(&metadata_reader, metadata)); | ||
while (ArrowMetadataReaderRead(&metadata_reader, &key, &value) == NANOARROW_OK) { | ||
// printf("key: %.*s, value: %.*s\n", (int)key.size_bytes, key.data, (int)value.size_bytes, value.data); | ||
metadata_keys.push_back(erlang::nif::make_binary(env, key.data, (size_t)key.size_bytes)); | ||
metadata_values.push_back(erlang::nif::make_binary(env, value.data, (size_t)value.size_bytes)); | ||
} | ||
if (metadata_keys.size() > 0) { | ||
enif_make_map_from_arrays(env, metadata_keys.data(), metadata_values.data(), (unsigned)metadata_keys.size(), out_metadata); | ||
} | ||
return NANOARROW_OK; | ||
} | ||
|
||
#endif // ADBC_ARROW_METADATA_HPP |
Oops, something went wrong.