in go/adbc/drivermgr/adbc_driver_manager.cc [1719:1834]
AdbcStatusCode AdbcLoadDriverFromInitFunc(AdbcDriverInitFunc init_func, int version,
void* raw_driver, struct AdbcError* error) {
constexpr std::array<int, 2> kSupportedVersions = {
ADBC_VERSION_1_1_0,
ADBC_VERSION_1_0_0,
};
if (!raw_driver) {
SetError(error, "Must provide non-NULL raw_driver");
return ADBC_STATUS_INVALID_ARGUMENT;
}
switch (version) {
case ADBC_VERSION_1_0_0:
case ADBC_VERSION_1_1_0:
break;
default:
SetError(error, "Only ADBC 1.0.0 and 1.1.0 are supported");
return ADBC_STATUS_NOT_IMPLEMENTED;
}
#define FILL_DEFAULT(DRIVER, STUB) \
if (!DRIVER->STUB) { \
DRIVER->STUB = &STUB; \
}
#define CHECK_REQUIRED(DRIVER, STUB) \
if (!DRIVER->STUB) { \
SetError(error, "Driver does not implement required function Adbc" #STUB); \
return ADBC_STATUS_INTERNAL; \
}
// Starting from the passed version, try each (older) version in
// succession with the underlying driver until we find one that's
// accepted.
AdbcStatusCode result = ADBC_STATUS_NOT_IMPLEMENTED;
for (const int try_version : kSupportedVersions) {
if (try_version > version) continue;
result = init_func(try_version, raw_driver, error);
if (result != ADBC_STATUS_NOT_IMPLEMENTED) break;
}
if (result != ADBC_STATUS_OK) {
return result;
}
if (version >= ADBC_VERSION_1_0_0) {
auto* driver = reinterpret_cast<struct AdbcDriver*>(raw_driver);
CHECK_REQUIRED(driver, DatabaseNew);
CHECK_REQUIRED(driver, DatabaseInit);
CHECK_REQUIRED(driver, DatabaseRelease);
FILL_DEFAULT(driver, DatabaseSetOption);
CHECK_REQUIRED(driver, ConnectionNew);
CHECK_REQUIRED(driver, ConnectionInit);
CHECK_REQUIRED(driver, ConnectionRelease);
FILL_DEFAULT(driver, ConnectionCommit);
FILL_DEFAULT(driver, ConnectionGetInfo);
FILL_DEFAULT(driver, ConnectionGetObjects);
FILL_DEFAULT(driver, ConnectionGetTableSchema);
FILL_DEFAULT(driver, ConnectionGetTableTypes);
FILL_DEFAULT(driver, ConnectionReadPartition);
FILL_DEFAULT(driver, ConnectionRollback);
FILL_DEFAULT(driver, ConnectionSetOption);
FILL_DEFAULT(driver, StatementExecutePartitions);
CHECK_REQUIRED(driver, StatementExecuteQuery);
CHECK_REQUIRED(driver, StatementNew);
CHECK_REQUIRED(driver, StatementRelease);
FILL_DEFAULT(driver, StatementBind);
FILL_DEFAULT(driver, StatementBindStream);
FILL_DEFAULT(driver, StatementGetParameterSchema);
FILL_DEFAULT(driver, StatementPrepare);
FILL_DEFAULT(driver, StatementSetOption);
FILL_DEFAULT(driver, StatementSetSqlQuery);
FILL_DEFAULT(driver, StatementSetSubstraitPlan);
}
if (version >= ADBC_VERSION_1_1_0) {
auto* driver = reinterpret_cast<struct AdbcDriver*>(raw_driver);
FILL_DEFAULT(driver, ErrorGetDetailCount);
FILL_DEFAULT(driver, ErrorGetDetail);
FILL_DEFAULT(driver, ErrorFromArrayStream);
FILL_DEFAULT(driver, DatabaseGetOption);
FILL_DEFAULT(driver, DatabaseGetOptionBytes);
FILL_DEFAULT(driver, DatabaseGetOptionDouble);
FILL_DEFAULT(driver, DatabaseGetOptionInt);
FILL_DEFAULT(driver, DatabaseSetOptionBytes);
FILL_DEFAULT(driver, DatabaseSetOptionDouble);
FILL_DEFAULT(driver, DatabaseSetOptionInt);
FILL_DEFAULT(driver, ConnectionCancel);
FILL_DEFAULT(driver, ConnectionGetOption);
FILL_DEFAULT(driver, ConnectionGetOptionBytes);
FILL_DEFAULT(driver, ConnectionGetOptionDouble);
FILL_DEFAULT(driver, ConnectionGetOptionInt);
FILL_DEFAULT(driver, ConnectionGetStatistics);
FILL_DEFAULT(driver, ConnectionGetStatisticNames);
FILL_DEFAULT(driver, ConnectionSetOptionBytes);
FILL_DEFAULT(driver, ConnectionSetOptionDouble);
FILL_DEFAULT(driver, ConnectionSetOptionInt);
FILL_DEFAULT(driver, StatementCancel);
FILL_DEFAULT(driver, StatementExecuteSchema);
FILL_DEFAULT(driver, StatementGetOption);
FILL_DEFAULT(driver, StatementGetOptionBytes);
FILL_DEFAULT(driver, StatementGetOptionDouble);
FILL_DEFAULT(driver, StatementGetOptionInt);
FILL_DEFAULT(driver, StatementSetOptionBytes);
FILL_DEFAULT(driver, StatementSetOptionDouble);
FILL_DEFAULT(driver, StatementSetOptionInt);
}
return ADBC_STATUS_OK;
#undef FILL_DEFAULT
#undef CHECK_REQUIRED
}