18
18
#include <errno.h>
19
19
#include <inttypes.h>
20
20
#include <stdarg.h>
21
+ #include <stdbool.h>
21
22
#include <stdio.h>
22
23
#include <stdlib.h>
23
24
#include <string.h>
@@ -32,6 +33,12 @@ static void ArrowArrayReleaseInternal(struct ArrowArray* array) {
32
33
ArrowBitmapReset (& private_data -> bitmap );
33
34
ArrowBufferReset (& private_data -> buffers [0 ]);
34
35
ArrowBufferReset (& private_data -> buffers [1 ]);
36
+ ArrowFree (private_data -> buffer_data );
37
+ for (int32_t i = 0 ; i < private_data -> n_variadic_buffers ; ++ i ) {
38
+ ArrowBufferReset (& private_data -> variadic_buffers [i ]);
39
+ }
40
+ ArrowFree (private_data -> variadic_buffers );
41
+ ArrowFree (private_data -> variadic_buffer_sizes );
35
42
ArrowFree (private_data );
36
43
}
37
44
@@ -106,6 +113,10 @@ static ArrowErrorCode ArrowArraySetStorageType(struct ArrowArray* array,
106
113
case NANOARROW_TYPE_DENSE_UNION :
107
114
array -> n_buffers = 2 ;
108
115
break ;
116
+ case NANOARROW_TYPE_BINARY_VIEW :
117
+ case NANOARROW_TYPE_STRING_VIEW :
118
+ array -> n_buffers = NANOARROW_BINARY_VIEW_FIXED_BUFFERS ;
119
+ break ;
109
120
case NANOARROW_TYPE_STRING :
110
121
case NANOARROW_TYPE_LARGE_STRING :
111
122
case NANOARROW_TYPE_BINARY :
@@ -148,12 +159,17 @@ ArrowErrorCode ArrowArrayInitFromType(struct ArrowArray* array,
148
159
ArrowBitmapInit (& private_data -> bitmap );
149
160
ArrowBufferInit (& private_data -> buffers [0 ]);
150
161
ArrowBufferInit (& private_data -> buffers [1 ]);
151
- private_data -> buffer_data [0 ] = NULL ;
152
- private_data -> buffer_data [1 ] = NULL ;
153
- private_data -> buffer_data [2 ] = NULL ;
162
+ private_data -> buffer_data =
163
+ (const void * * )ArrowMalloc (sizeof (void * ) * NANOARROW_MAX_FIXED_BUFFERS );
164
+ for (int i = 0 ; i < NANOARROW_MAX_FIXED_BUFFERS ; ++ i ) {
165
+ private_data -> buffer_data [i ] = NULL ;
166
+ }
167
+ private_data -> n_variadic_buffers = 0 ;
168
+ private_data -> variadic_buffers = NULL ;
169
+ private_data -> variadic_buffer_sizes = NULL ;
154
170
155
171
array -> private_data = private_data ;
156
- array -> buffers = (const void * * )(& private_data -> buffer_data );
172
+ array -> buffers = (const void * * )(private_data -> buffer_data );
157
173
158
174
// These are not technically "storage" in the sense that they do not appear
159
175
// in the ArrowSchemaView's storage_type member; however, allowing them here
@@ -456,10 +472,26 @@ static void ArrowArrayFlushInternalPointers(struct ArrowArray* array) {
456
472
struct ArrowArrayPrivateData * private_data =
457
473
(struct ArrowArrayPrivateData * )array -> private_data ;
458
474
459
- for (int64_t i = 0 ; i < NANOARROW_MAX_FIXED_BUFFERS ; i ++ ) {
475
+ const bool is_binary_view = private_data -> storage_type == NANOARROW_TYPE_STRING_VIEW ||
476
+ private_data -> storage_type == NANOARROW_TYPE_BINARY_VIEW ;
477
+ const int32_t nfixed_buf = is_binary_view ? 2 : NANOARROW_MAX_FIXED_BUFFERS ;
478
+
479
+ for (int32_t i = 0 ; i < nfixed_buf ; i ++ ) {
460
480
private_data -> buffer_data [i ] = ArrowArrayBuffer (array , i )-> data ;
461
481
}
462
482
483
+ if (is_binary_view ) {
484
+ const int32_t nvirt_buf = private_data -> n_variadic_buffers ;
485
+ private_data -> buffer_data = (const void * * )ArrowRealloc (
486
+ private_data -> buffer_data , sizeof (void * ) * (nfixed_buf + nvirt_buf + 1 ));
487
+ for (int32_t i = 0 ; i < nvirt_buf ; i ++ ) {
488
+ private_data -> buffer_data [nfixed_buf + i ] = private_data -> variadic_buffers [i ].data ;
489
+ }
490
+ private_data -> buffer_data [nfixed_buf + nvirt_buf ] =
491
+ private_data -> variadic_buffer_sizes ;
492
+ array -> buffers = (const void * * )(private_data -> buffer_data );
493
+ }
494
+
463
495
for (int64_t i = 0 ; i < array -> n_children ; i ++ ) {
464
496
ArrowArrayFlushInternalPointers (array -> children [i ]);
465
497
}
@@ -664,6 +696,7 @@ void ArrowArrayViewSetLength(struct ArrowArrayView* array_view, int64_t length)
664
696
_ArrowRoundUpToMultipleOf8 (array_view -> layout .element_size_bits [i ] * length ) /
665
697
8 ;
666
698
continue ;
699
+ case NANOARROW_BUFFER_TYPE_DATA_VIEW :
667
700
case NANOARROW_BUFFER_TYPE_TYPE_ID :
668
701
case NANOARROW_BUFFER_TYPE_UNION_OFFSET :
669
702
array_view -> buffer_views [i ].size_bytes = element_size_bytes * length ;
@@ -700,9 +733,15 @@ static int ArrowArrayViewSetArrayInternal(struct ArrowArrayView* array_view,
700
733
array_view -> offset = array -> offset ;
701
734
array_view -> length = array -> length ;
702
735
array_view -> null_count = array -> null_count ;
736
+ array_view -> variadic_buffer_sizes = NULL ;
737
+ array_view -> n_variadic_buffers = 0 ;
703
738
704
739
int64_t buffers_required = 0 ;
705
- for (int i = 0 ; i < NANOARROW_MAX_FIXED_BUFFERS ; i ++ ) {
740
+ const int nfixed_buf = array_view -> storage_type == NANOARROW_TYPE_STRING_VIEW ||
741
+ array_view -> storage_type == NANOARROW_TYPE_BINARY_VIEW
742
+ ? NANOARROW_BINARY_VIEW_FIXED_BUFFERS
743
+ : NANOARROW_MAX_FIXED_BUFFERS ;
744
+ for (int i = 0 ; i < nfixed_buf ; i ++ ) {
706
745
if (array_view -> layout .buffer_type [i ] == NANOARROW_BUFFER_TYPE_NONE ) {
707
746
break ;
708
747
}
@@ -720,7 +759,19 @@ static int ArrowArrayViewSetArrayInternal(struct ArrowArrayView* array_view,
720
759
}
721
760
}
722
761
723
- // Check the number of buffers
762
+ if (array_view -> storage_type == NANOARROW_TYPE_STRING_VIEW ||
763
+ array_view -> storage_type == NANOARROW_TYPE_BINARY_VIEW ) {
764
+ const int64_t n_buffers = array -> n_buffers ;
765
+ const int32_t nfixed_buf = NANOARROW_BINARY_VIEW_FIXED_BUFFERS ;
766
+
767
+ const int32_t nvariadic_buf = (int32_t )(n_buffers - nfixed_buf - 1 );
768
+ if (nvariadic_buf > 0 ) {
769
+ array_view -> n_variadic_buffers = nvariadic_buf ;
770
+ buffers_required += nvariadic_buf + 1 ;
771
+ array_view -> variadic_buffer_sizes = (int64_t * )array -> buffers [n_buffers - 1 ];
772
+ }
773
+ }
774
+
724
775
if (buffers_required != array -> n_buffers ) {
725
776
ArrowErrorSet (error ,
726
777
"Expected array with %" PRId64 " buffer(s) but found %" PRId64
@@ -814,6 +865,7 @@ static int ArrowArrayViewValidateMinimal(struct ArrowArrayView* array_view,
814
865
break ;
815
866
case NANOARROW_BUFFER_TYPE_TYPE_ID :
816
867
case NANOARROW_BUFFER_TYPE_UNION_OFFSET :
868
+ case NANOARROW_BUFFER_TYPE_DATA_VIEW :
817
869
min_buffer_size_bytes = element_size_bytes * offset_plus_length ;
818
870
break ;
819
871
case NANOARROW_BUFFER_TYPE_NONE :
0 commit comments