| <!--- |
| 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. |
| --> |
| |
| # nanoarrow |
| |
| The nanoarrow library is a set of helper functions to interpret and generate |
| [Arrow C Data Interface](https://arrow.apache.org/docs/format/CDataInterface.html) |
| and [Arrow C Stream Interface](https://arrow.apache.org/docs/format/CStreamInterface.html) |
| structures. The library is in active development and should currently be used only |
| for entertainment purposes. Everything from the name of the project to the variable |
| names are up for grabs (i.e., suggest/pull request literally any ideas you may |
| have!). |
| |
| Whereas the current suite of Arrow implementations provide the basis for a |
| comprehensive data analysis toolkit, this library is intended to support clients |
| that wish to produce or interpret Arrow C Data and/or Arrow C Stream structures. |
| The library will: |
| |
| - Create, copy, parse, and validate struct ArrowSchema objects (all types mentioned |
| in the C Data interface specification) |
| - Create and validate struct ArrowArray/struct ArrowSchema pairs for (all types |
| mentioned in the C Data interface specification) |
| - Iterate over struct ArrowArrays element-wise (non-nested types) (i.e., is the |
| ith element null; get the ith element). |
| - Build Arrays element-wise (non-nested types) (i.e., basic Array Builder logic). |
| |
| While it will not provide full support for nested types, it should provide enough |
| infrastructure that an extension library with a similar format could implement such |
| support. |
| |
| ## Usage |
| |
| You can use nanoarrow in your project in two ways: |
| |
| 1. Copy contents of the `src/nanoarrow/` into your favourite include directory and |
| `#include <nanoarrow/nanoarrow.c>` somewhere in your project exactly once. |
| 2. Clone and use `cmake`, `cmake --build`, and `cmake --install` to build/install |
| the static library and add `-L/path/to/nanoarrow/lib -lnanoarrow` to your favourite |
| linker flag configuration. |
| |
| All public functions and types are declared in `nanoarrow/nanoarrow.h`. |
| |
| In all cases you will want to copy this project or pin your build to a specific commit |
| since it will change rapidly and regularly. The nanoarrow library does not and will |
| not provide ABI stability (i.e., you must vendor or link to a private version of |
| the static library). |
| |
| ## Background |
| |
| The design of nanoarrow reflects the needs of a few previous libraries/prototypes |
| requiring a library with a similar scope: |
| |
| - DuckDB’s Arrow wrappers, the details of which are in a few places |
| (e.g., [here](https://github.com/duckdb/duckdb/blob/master/src/common/arrow_wrapper.cpp), |
| [here](https://github.com/duckdb/duckdb/blob/master/src/main/query_result.cpp), |
| and a few other places) |
| - An [R wrapper around the C Data interface](https://github.com/paleolimbot/narrow), |
| along which a [C-only library](https://github.com/paleolimbot/narrow/tree/master/src/narrow) |
| was prototyped. |
| - An [R implementation of the draft GeoArrow specification](https://github.com/paleolimbot/geoarrow), |
| along which a [mostly header-only C++ library](https://github.com/paleolimbot/geonanoarrowpp/tree/main/src/geoarrow/internal/arrow-hpp) |
| was prototyped. |
| - The [Arrow Database Connectivity](https://github.com/apache/arrow-adbc) C API, for which drivers |
| in theory can be written in C (which is currently difficult in practice because there |
| are few if any tools to help do this properly). |