Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions duckdb_java.def
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ Java_org_duckdb_DuckDBBindings_duckdb_1create_1list_1type
Java_org_duckdb_DuckDBBindings_duckdb_1create_1array_1type
Java_org_duckdb_DuckDBBindings_duckdb_1create_1struct_1type
Java_org_duckdb_DuckDBBindings_duckdb_1struct_1type_1child_1count
Java_org_duckdb_DuckDBBindings_duckdb_1struct_1type_1child_1name
Java_org_duckdb_DuckDBBindings_duckdb_1array_1type_1array_1size
Java_org_duckdb_DuckDBBindings_duckdb_1destroy_1logical_1type
Java_org_duckdb_DuckDBBindings_duckdb_1create_1vector
Expand Down
1 change: 1 addition & 0 deletions duckdb_java.exp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ _Java_org_duckdb_DuckDBBindings_duckdb_1create_1list_1type
_Java_org_duckdb_DuckDBBindings_duckdb_1create_1array_1type
_Java_org_duckdb_DuckDBBindings_duckdb_1create_1struct_1type
_Java_org_duckdb_DuckDBBindings_duckdb_1struct_1type_1child_1count
_Java_org_duckdb_DuckDBBindings_duckdb_1struct_1type_1child_1name
_Java_org_duckdb_DuckDBBindings_duckdb_1array_1type_1array_1size
_Java_org_duckdb_DuckDBBindings_duckdb_1destroy_1logical_1type
_Java_org_duckdb_DuckDBBindings_duckdb_1create_1vector
Expand Down
1 change: 1 addition & 0 deletions duckdb_java.map
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ DUCKDB_JAVA {
Java_org_duckdb_DuckDBBindings_duckdb_1create_1array_1type;
Java_org_duckdb_DuckDBBindings_duckdb_1create_1struct_1type;
Java_org_duckdb_DuckDBBindings_duckdb_1struct_1type_1child_1count;
Java_org_duckdb_DuckDBBindings_duckdb_1struct_1type_1child_1name;
Java_org_duckdb_DuckDBBindings_duckdb_1array_1type_1array_1size;
Java_org_duckdb_DuckDBBindings_duckdb_1destroy_1logical_1type;
Java_org_duckdb_DuckDBBindings_duckdb_1create_1vector;
Expand Down
38 changes: 37 additions & 1 deletion src/jni/bindings_logical_type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "refs.hpp"
#include "util.hpp"

#include <cstring>
#include <vector>

duckdb_logical_type logical_type_buf_to_logical_type(JNIEnv *env, jobject logical_type_buf) {
Expand Down Expand Up @@ -209,8 +210,9 @@ JNIEXPORT jobject JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1create_1struct_
if (env->ExceptionCheck()) {
return nullptr;
}
names_cstr_vec.emplace_back(str.c_str());
names_vec.emplace_back(std::move(str));
std::string &str_ref = names_vec.back();
names_cstr_vec.emplace_back(str_ref.c_str());
}

duckdb_logical_type struct_type =
Expand All @@ -237,6 +239,40 @@ JNIEXPORT jlong JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1struct_1type_1chi
return static_cast<jlong>(count);
}

/*
* Class: org_duckdb_DuckDBBindings
* Method: duckdb_struct_type_child_name
* Signature: (Ljava/nio/ByteBuffer;J)[B
*/
JNIEXPORT jbyteArray JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1struct_1type_1child_1name(JNIEnv *env, jclass,
jobject logical_type,
jlong index) {

duckdb_logical_type lt = logical_type_buf_to_logical_type(env, logical_type);
if (env->ExceptionCheck()) {
return nullptr;
}
idx_t index_idx = jlong_to_idx(env, index);
if (env->ExceptionCheck()) {
return nullptr;
}

idx_t count = duckdb_struct_type_child_count(lt);
if (index_idx >= count) {
env->ThrowNew(J_SQLException, "Invalid struct field index specified");
return nullptr;
}

auto name_ptr = varchar_ptr(duckdb_struct_type_child_name(lt, index_idx), varchar_deleter);
if (name_ptr.get() == nullptr) {
return nullptr;
}

idx_t len = static_cast<idx_t>(std::strlen(name_ptr.get()));

return make_jbyteArray(env, name_ptr.get(), len);
}

/*
* Class: org_duckdb_DuckDBBindings
* Method: duckdb_array_type_array_size
Expand Down
8 changes: 6 additions & 2 deletions src/jni/util.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,14 @@ extern "C" {
#include <memory>
#include <string>

using jstring_ptr = std::unique_ptr<const char, std::function<void(const char *)>>;

using jbyteArray_ptr = std::unique_ptr<char, std::function<void(char *)>>;

using varchar_ptr = std::unique_ptr<char, void (*)(char *)>;

inline void varchar_deleter(char *val) {
duckdb_free(val);
}

void check_java_exception_and_rethrow(JNIEnv *env);

std::string jbyteArray_to_string(JNIEnv *env, jbyteArray ba_j);
Expand Down
Loading