c/driver/common/utils.h (189 lines of code) (raw):
// 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.
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include <adbc.h>
#include "nanoarrow/nanoarrow.h"
#ifdef __cplusplus
extern "C" {
#endif
// The printf checking attribute doesn't work properly on gcc 4.8
// and results in spurious compiler warnings
#if defined(__clang__) || (defined(__GNUC__) && __GNUC__ >= 5)
#define ADBC_CHECK_PRINTF_ATTRIBUTE __attribute__((format(printf, 2, 3)))
#else
#define ADBC_CHECK_PRINTF_ATTRIBUTE
#endif
/// Set error details using a format string.
void SetError(struct AdbcError* error, const char* format,
...) ADBC_CHECK_PRINTF_ATTRIBUTE;
struct StringBuilder {
char* buffer;
// Not including null terminator
size_t size;
size_t capacity;
};
int StringBuilderInit(struct StringBuilder* builder, size_t initial_size);
int ADBC_CHECK_PRINTF_ATTRIBUTE StringBuilderAppend(struct StringBuilder* builder,
const char* fmt, ...);
void StringBuilderReset(struct StringBuilder* builder);
#undef ADBC_CHECK_PRINTF_ATTRIBUTE
/// Wrap a single batch as a stream.
AdbcStatusCode BatchToArrayStream(struct ArrowArray* values, struct ArrowSchema* schema,
struct ArrowArrayStream* stream,
struct AdbcError* error);
/// Check an NanoArrow status code.
#define CHECK_NA(CODE, EXPR, ERROR) \
do { \
ArrowErrorCode arrow_error_code = (EXPR); \
if (arrow_error_code != 0) { \
SetError(ERROR, "%s failed: (%d) %s\nDetail: %s:%d", #EXPR, arrow_error_code, \
strerror(arrow_error_code), __FILE__, __LINE__); \
return ADBC_STATUS_##CODE; \
} \
} while (0)
/// Check an NanoArrow status code.
#define CHECK_NA_DETAIL(CODE, EXPR, NA_ERROR, ERROR) \
do { \
ArrowErrorCode arrow_error_code = (EXPR); \
if (arrow_error_code != 0) { \
SetError(ERROR, "%s failed: (%d) %s: %s\nDetail: %s:%d", #EXPR, arrow_error_code, \
strerror(arrow_error_code), (NA_ERROR)->message, __FILE__, __LINE__); \
return ADBC_STATUS_##CODE; \
} \
} while (0)
/// Check a generic status.
#define RAISE(CODE, EXPR, ERRMSG, ERROR) \
do { \
if (!(EXPR)) { \
SetError(ERROR, "%s failed: %s\nDetail: %s:%d", #EXPR, ERRMSG, __FILE__, \
__LINE__); \
return ADBC_STATUS_##CODE; \
} \
} while (0)
/// Check an NanoArrow status code.
#define RAISE_NA(EXPR) \
do { \
ArrowErrorCode arrow_error_code = (EXPR); \
if (arrow_error_code != 0) return arrow_error_code; \
} while (0)
/// Check an ADBC status code.
#define RAISE_ADBC(EXPR) \
do { \
AdbcStatusCode adbc_status_code = (EXPR); \
if (adbc_status_code != ADBC_STATUS_OK) return adbc_status_code; \
} while (0)
/// \defgroup adbc-connection-utils Connection Utilities
/// Utilities for implementing connection-related functions for drivers
///
/// @{
AdbcStatusCode AdbcInitConnectionGetInfoSchema(const uint32_t* info_codes,
size_t info_codes_length,
struct ArrowSchema* schema,
struct ArrowArray* array,
struct AdbcError* error);
AdbcStatusCode AdbcConnectionGetInfoAppendString(struct ArrowArray* array,
uint32_t info_code,
const char* info_value,
struct AdbcError* error);
AdbcStatusCode AdbcInitConnectionObjectsSchema(struct ArrowSchema* schema,
struct AdbcError* error);
/// @}
struct AdbcGetObjectsUsage {
struct ArrowStringView fk_catalog;
struct ArrowStringView fk_db_schema;
struct ArrowStringView fk_table;
struct ArrowStringView fk_column_name;
};
struct AdbcGetObjectsConstraint {
struct ArrowStringView constraint_name;
struct ArrowStringView constraint_type;
struct ArrowStringView* constraint_column_names;
int n_column_names;
struct AdbcGetObjectsUsage** constraint_column_usages;
int n_column_usages;
};
struct AdbcGetObjectsColumn {
struct ArrowStringView column_name;
int32_t ordinal_position;
struct ArrowStringView remarks;
int16_t xdbc_data_type;
struct ArrowStringView xdbc_type_name;
int32_t xdbc_column_size;
int16_t xdbc_decimal_digits;
int16_t xdbc_num_prec_radix;
int16_t xdbc_nullable;
struct ArrowStringView xdbc_column_def;
int16_t xdbc_sql_data_type;
int16_t xdbc_datetime_sub;
int32_t xdbc_char_octet_length;
struct ArrowStringView xdbc_is_nullable;
struct ArrowStringView xdbc_scope_catalog;
struct ArrowStringView xdbc_scope_schema;
struct ArrowStringView xdbc_scope_table;
bool xdbc_is_autoincrement;
bool xdbc_is_generatedcolumn;
};
struct AdbcGetObjectsTable {
struct ArrowStringView table_name;
struct ArrowStringView table_type;
struct AdbcGetObjectsColumn** table_columns;
int n_table_columns;
struct AdbcGetObjectsConstraint** table_constraints;
int n_table_constraints;
};
struct AdbcGetObjectsSchema {
struct ArrowStringView db_schema_name;
struct AdbcGetObjectsTable** db_schema_tables;
int n_db_schema_tables;
};
struct AdbcGetObjectsCatalog {
struct ArrowStringView catalog_name;
struct AdbcGetObjectsSchema** catalog_db_schemas;
int n_db_schemas;
};
struct AdbcGetObjectsData {
struct AdbcGetObjectsCatalog** catalogs;
int n_catalogs;
struct ArrowArrayView* catalog_name_array;
struct ArrowArrayView* catalog_schemas_array;
struct ArrowArrayView* db_schema_name_array;
struct ArrowArrayView* db_schema_tables_array;
struct ArrowArrayView* table_name_array;
struct ArrowArrayView* table_type_array;
struct ArrowArrayView* table_columns_array;
struct ArrowArrayView* table_constraints_array;
struct ArrowArrayView* column_name_array;
struct ArrowArrayView* column_position_array;
struct ArrowArrayView* column_remarks_array;
struct ArrowArrayView* xdbc_data_type_array;
struct ArrowArrayView* xdbc_type_name_array;
struct ArrowArrayView* xdbc_column_size_array;
struct ArrowArrayView* xdbc_decimal_digits_array;
struct ArrowArrayView* xdbc_num_prec_radix_array;
struct ArrowArrayView* xdbc_nullable_array;
struct ArrowArrayView* xdbc_column_def_array;
struct ArrowArrayView* xdbc_sql_data_type_array;
struct ArrowArrayView* xdbc_datetime_sub_array;
struct ArrowArrayView* xdbc_char_octet_length_array;
struct ArrowArrayView* xdbc_is_nullable_array;
struct ArrowArrayView* xdbc_scope_catalog_array;
struct ArrowArrayView* xdbc_scope_schema_array;
struct ArrowArrayView* xdbc_scope_table_array;
struct ArrowArrayView* xdbc_is_autoincrement_array;
struct ArrowArrayView* xdbc_is_generatedcolumn_array;
struct ArrowArrayView* constraint_name_array;
struct ArrowArrayView* constraint_type_array;
struct ArrowArrayView* constraint_column_names_array;
struct ArrowArrayView* constraint_column_name_array;
struct ArrowArrayView* constraint_column_usages_array;
struct ArrowArrayView* fk_catalog_array;
struct ArrowArrayView* fk_db_schema_array;
struct ArrowArrayView* fk_table_array;
struct ArrowArrayView* fk_column_name_array;
};
// does not copy any data from array
// returns NULL on error
struct AdbcGetObjectsData* AdbcGetObjectsDataInit(struct ArrowArrayView* array_view);
void AdbcGetObjectsDataDelete(struct AdbcGetObjectsData* get_objects_data);
// returns NULL on error
// for now all arguments are required
struct AdbcGetObjectsCatalog* AdbcGetObjectsDataGetCatalogByName(
struct AdbcGetObjectsData* get_objects_data, const char* const catalog_name);
struct AdbcGetObjectsSchema* AdbcGetObjectsDataGetSchemaByName(
struct AdbcGetObjectsData* get_objects_data, const char* const catalog_name,
const char* const schema_name);
struct AdbcGetObjectsTable* AdbcGetObjectsDataGetTableByName(
struct AdbcGetObjectsData* get_objects_data, const char* const catalog_name,
const char* const schema_name, const char* const table_name);
struct AdbcGetObjectsColumn* AdbcGetObjectsDataGetColumnByName(
struct AdbcGetObjectsData* get_objects_data, const char* const catalog_name,
const char* const schema_name, const char* const table_name,
const char* const column_name);
struct AdbcGetObjectsConstraint* AdbcGetObjectsDataGetConstraintByName(
struct AdbcGetObjectsData* get_objects_data, const char* const catalog_name,
const char* const schema_name, const char* const table_name,
const char* const constraint_name);
#ifdef __cplusplus
}
#endif