22#include " functions.hpp"
33#include " holders.hpp"
44#include " refs.hpp"
5- #include " scalar_functions.hpp"
65#include " util.hpp"
76
87static duckdb_scalar_function scalar_function_buf_to_scalar_function (JNIEnv *env, jobject scalar_function_buf) {
@@ -36,10 +35,20 @@ static duckdb_function_info function_info_buf_to_function_info(JNIEnv *env, jobj
3635 return function_info;
3736}
3837
38+ /*
39+ * Class: org_duckdb_DuckDBBindings
40+ * Method: duckdb_create_scalar_function
41+ * Signature: ()Ljava/nio/ByteBuffer;
42+ */
3943JNIEXPORT jobject JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1create_1scalar_1function (JNIEnv *env, jclass) {
4044 return make_ptr_buf (env, duckdb_create_scalar_function ());
4145}
4246
47+ /*
48+ * Class: org_duckdb_DuckDBBindings
49+ * Method: duckdb_destroy_scalar_function
50+ * Signature: (Ljava/nio/ByteBuffer;)V
51+ */
4352JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1destroy_1scalar_1function (JNIEnv *env, jclass,
4453 jobject scalar_function) {
4554 auto function = scalar_function_buf_to_scalar_function (env, scalar_function);
@@ -49,6 +58,11 @@ JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1destroy_1scalar_1f
4958 duckdb_destroy_scalar_function (&function);
5059}
5160
61+ /*
62+ * Class: org_duckdb_DuckDBBindings
63+ * Method: duckdb_scalar_function_set_name
64+ * Signature: (Ljava/nio/ByteBuffer;[B)V
65+ */
5266JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1set_1name (JNIEnv *env, jclass,
5367 jobject scalar_function,
5468 jbyteArray name) {
@@ -67,6 +81,11 @@ JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1
6781 duckdb_scalar_function_set_name (function, function_name.c_str ());
6882}
6983
84+ /*
85+ * Class: org_duckdb_DuckDBBindings
86+ * Method: duckdb_scalar_function_add_parameter
87+ * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)V
88+ */
7089JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1add_1parameter (JNIEnv *env, jclass,
7190 jobject scalar_function,
7291 jobject logical_type) {
@@ -81,6 +100,11 @@ JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1
81100 duckdb_scalar_function_add_parameter (function, type);
82101}
83102
103+ /*
104+ * Class: org_duckdb_DuckDBBindings
105+ * Method: duckdb_scalar_function_set_return_type
106+ * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)V
107+ */
84108JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1set_1return_1type (
85109 JNIEnv *env, jclass, jobject scalar_function, jobject logical_type) {
86110 auto function = scalar_function_buf_to_scalar_function (env, scalar_function);
@@ -94,6 +118,11 @@ JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1
94118 duckdb_scalar_function_set_return_type (function, type);
95119}
96120
121+ /*
122+ * Class: org_duckdb_DuckDBBindings
123+ * Method: duckdb_scalar_function_set_varargs
124+ * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)V
125+ */
97126JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1set_1varargs (JNIEnv *env, jclass,
98127 jobject scalar_function,
99128 jobject logical_type) {
@@ -108,6 +137,11 @@ JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1
108137 duckdb_scalar_function_set_varargs (function, type);
109138}
110139
140+ /*
141+ * Class: org_duckdb_DuckDBBindings
142+ * Method: duckdb_scalar_function_set_volatile
143+ * Signature: (Ljava/nio/ByteBuffer;)V
144+ */
111145JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1set_1volatile (JNIEnv *env, jclass,
112146 jobject scalar_function) {
113147 auto function = scalar_function_buf_to_scalar_function (env, scalar_function);
@@ -117,6 +151,11 @@ JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1
117151 duckdb_scalar_function_set_volatile (function);
118152}
119153
154+ /*
155+ * Class: org_duckdb_DuckDBBindings
156+ * Method: duckdb_scalar_function_set_special_handling
157+ * Signature: (Ljava/nio/ByteBuffer;)V
158+ */
120159JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1set_1special_1handling (
121160 JNIEnv *env, jclass, jobject scalar_function) {
122161 auto function = scalar_function_buf_to_scalar_function (env, scalar_function);
@@ -126,6 +165,11 @@ JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1
126165 duckdb_scalar_function_set_special_handling (function);
127166}
128167
168+ /*
169+ * Class: org_duckdb_DuckDBBindings
170+ * Method: duckdb_register_scalar_function
171+ * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I
172+ */
129173JNIEXPORT jint JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1register_1scalar_1function (JNIEnv *env, jclass,
130174 jobject connection,
131175 jobject scalar_function) {
@@ -140,16 +184,85 @@ JNIEXPORT jint JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1register_1scalar_1
140184 return static_cast <jint>(duckdb_register_scalar_function (conn, function));
141185}
142186
143- JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1set_1function (
144- JNIEnv *env, jclass, jobject scalar_function_buf, jobject function_j) {
145- try {
146- scalar_function_set_function (env, scalar_function_buf, function_j);
147- } catch (const std::exception &e) {
148- duckdb::ErrorData error (e);
149- ThrowJNI (env, error.Message ().c_str ());
187+ /*
188+ * Class: org_duckdb_DuckDBBindings
189+ * Method: duckdb_scalar_function_set_extra_info
190+ * Signature: (Ljava/nio/ByteBuffer;Ljava/lang/Object;)V
191+ */
192+ JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1set_1extra_1info (
193+ JNIEnv *env, jclass, jobject scalar_function, jobject callback) {
194+
195+ if (callback == nullptr ) {
196+ env->ThrowNew (J_SQLException, " Specified callback must be not null" );
197+ return ;
198+ }
199+
200+ auto sf = scalar_function_buf_to_scalar_function (env, scalar_function);
201+ if (env->ExceptionCheck ()) {
202+ return ;
203+ }
204+
205+ auto callback_holder = std::unique_ptr<GlobalRefHolder>(new GlobalRefHolder (env, callback));
206+ if (callback_holder->vm == nullptr ) {
207+ env->ThrowNew (J_SQLException, " Unable to create a global reference to the specified scalar function callback" );
208+ return ;
150209 }
210+
211+ duckdb_scalar_function_set_extra_info (sf, callback_holder.release (), GlobalRefHolder::destroy);
212+ }
213+
214+ /*
215+ * Class: org_duckdb_DuckDBBindings
216+ * Method: duckdb_scalar_function_set_function
217+ * Signature: (Ljava/nio/ByteBuffer;)V
218+ */
219+ JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1set_1function (JNIEnv *env, jclass,
220+ jobject scalar_function) {
221+ auto sf = scalar_function_buf_to_scalar_function (env, scalar_function);
222+ if (env->ExceptionCheck ()) {
223+ return ;
224+ }
225+
226+ duckdb_scalar_function_set_function (
227+ sf, [](duckdb_function_info info, duckdb_data_chunk input, duckdb_vector output) {
228+ auto callback_holder = reinterpret_cast <GlobalRefHolder *>(duckdb_scalar_function_get_extra_info (info));
229+ AttachedJNIEnv attached = callback_holder->attach_current_thread ();
230+ if (attached.env == nullptr ) {
231+ duckdb_scalar_function_set_error (info, " Unable to attach JNI environment" );
232+ return ;
233+ }
234+ jobject info_buf = make_ptr_buf (attached.env , info);
235+ if (info_buf == nullptr ) {
236+ duckdb_scalar_function_set_error (info, " Unable to create function info buffer" );
237+ return ;
238+ }
239+ LocalRefHolder info_buf_holder (attached.env , info_buf);
240+ jobject input_buf = make_ptr_buf (attached.env , input);
241+ if (input_buf == nullptr ) {
242+ duckdb_scalar_function_set_error (info, " Unable to create input buffer" );
243+ return ;
244+ }
245+ LocalRefHolder input_buf_holder (attached.env , input_buf);
246+ jobject output_buf = make_ptr_buf (attached.env , output);
247+ if (output_buf == nullptr ) {
248+ duckdb_scalar_function_set_error (info, " Unable to create output buffer" );
249+ return ;
250+ }
251+ LocalRefHolder output_buf_holder (attached.env , output_buf);
252+
253+ attached.env ->CallVoidMethod (callback_holder->global_ref , J_DuckDBScalarFunctionWrapper_execute, info_buf,
254+ input_buf, output_buf);
255+ if (attached.env ->ExceptionCheck ()) {
256+ duckdb_scalar_function_set_error (info, " Java callback system error" );
257+ }
258+ });
151259}
152260
261+ /*
262+ * Class: org_duckdb_DuckDBBindings
263+ * Method: duckdb_scalar_function_set_error
264+ * Signature: (Ljava/nio/ByteBuffer;[B)V
265+ */
153266JNIEXPORT void JNICALL Java_org_duckdb_DuckDBBindings_duckdb_1scalar_1function_1set_1error (JNIEnv *env, jclass,
154267 jobject function_info_buf,
155268 jbyteArray error) {
0 commit comments