blob: b7eeaac857285d27017b513f76c011dc84d6e69e [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
#include <errno.h>
#include "nanoarrow.h"
struct BasicArrayStreamPrivate {
struct ArrowSchema schema;
int64_t n_arrays;
struct ArrowArray* arrays;
int64_t arrays_i;
};
static int ArrowBasicArrayStreamGetSchema(struct ArrowArrayStream* array_stream,
struct ArrowSchema* schema) {
if (array_stream == NULL || array_stream->release == NULL) {
return EINVAL;
}
struct BasicArrayStreamPrivate* private_data =
(struct BasicArrayStreamPrivate*)array_stream->private_data;
return ArrowSchemaDeepCopy(&private_data->schema, schema);
}
static int ArrowBasicArrayStreamGetNext(struct ArrowArrayStream* array_stream,
struct ArrowArray* array) {
if (array_stream == NULL || array_stream->release == NULL) {
return EINVAL;
}
struct BasicArrayStreamPrivate* private_data =
(struct BasicArrayStreamPrivate*)array_stream->private_data;
if (private_data->arrays_i == private_data->n_arrays) {
array->release = NULL;
return NANOARROW_OK;
}
ArrowArrayMove(&private_data->arrays[private_data->arrays_i++], array);
return NANOARROW_OK;
}
static const char* ArrowBasicArrayStreamGetLastError(
struct ArrowArrayStream* array_stream) {
NANOARROW_UNUSED(array_stream);
return NULL;
}
static void ArrowBasicArrayStreamRelease(struct ArrowArrayStream* array_stream) {
if (array_stream == NULL || array_stream->release == NULL) {
return;
}
struct BasicArrayStreamPrivate* private_data =
(struct BasicArrayStreamPrivate*)array_stream->private_data;
if (private_data->schema.release != NULL) {
ArrowSchemaRelease(&private_data->schema);
}
for (int64_t i = 0; i < private_data->n_arrays; i++) {
if (private_data->arrays[i].release != NULL) {
ArrowArrayRelease(&private_data->arrays[i]);
}
}
if (private_data->arrays != NULL) {
ArrowFree(private_data->arrays);
}
ArrowFree(private_data);
array_stream->release = NULL;
}
ArrowErrorCode ArrowBasicArrayStreamInit(struct ArrowArrayStream* array_stream,
struct ArrowSchema* schema, int64_t n_arrays) {
struct BasicArrayStreamPrivate* private_data =
(struct BasicArrayStreamPrivate*)ArrowMalloc(
sizeof(struct BasicArrayStreamPrivate));
if (private_data == NULL) {
return ENOMEM;
}
ArrowSchemaMove(schema, &private_data->schema);
private_data->n_arrays = n_arrays;
private_data->arrays = NULL;
private_data->arrays_i = 0;
if (n_arrays > 0) {
private_data->arrays =
(struct ArrowArray*)ArrowMalloc(n_arrays * sizeof(struct ArrowArray));
if (private_data->arrays == NULL) {
ArrowBasicArrayStreamRelease(array_stream);
return ENOMEM;
}
}
for (int64_t i = 0; i < private_data->n_arrays; i++) {
private_data->arrays[i].release = NULL;
}
array_stream->get_schema = &ArrowBasicArrayStreamGetSchema;
array_stream->get_next = &ArrowBasicArrayStreamGetNext;
array_stream->get_last_error = ArrowBasicArrayStreamGetLastError;
array_stream->release = ArrowBasicArrayStreamRelease;
array_stream->private_data = private_data;
return NANOARROW_OK;
}
void ArrowBasicArrayStreamSetArray(struct ArrowArrayStream* array_stream, int64_t i,
struct ArrowArray* array) {
struct BasicArrayStreamPrivate* private_data =
(struct BasicArrayStreamPrivate*)array_stream->private_data;
ArrowArrayMove(array, &private_data->arrays[i]);
}
ArrowErrorCode ArrowBasicArrayStreamValidate(const struct ArrowArrayStream* array_stream,
struct ArrowError* error) {
struct BasicArrayStreamPrivate* private_data =
(struct BasicArrayStreamPrivate*)array_stream->private_data;
struct ArrowArrayView array_view;
NANOARROW_RETURN_NOT_OK(
ArrowArrayViewInitFromSchema(&array_view, &private_data->schema, error));
for (int64_t i = 0; i < private_data->n_arrays; i++) {
if (private_data->arrays[i].release != NULL) {
int result = ArrowArrayViewSetArray(&array_view, &private_data->arrays[i], error);
if (result != NANOARROW_OK) {
ArrowArrayViewReset(&array_view);
return result;
}
}
}
ArrowArrayViewReset(&array_view);
return NANOARROW_OK;
}