This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push:
new c736592 fix(c/driver_manager): accept connection options pre-Init
(#230)
c736592 is described below
commit c7365929347a7f99c5f77a692508ecab4337404c
Author: David Li <[email protected]>
AuthorDate: Fri Dec 9 12:09:56 2022 -0500
fix(c/driver_manager): accept connection options pre-Init (#230)
---
c/driver_manager/adbc_driver_manager.cc | 13 +++++++++++--
c/driver_manager/adbc_driver_manager_test.cc | 28 +++++++++++++++++++++++++---
2 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/c/driver_manager/adbc_driver_manager.cc
b/c/driver_manager/adbc_driver_manager.cc
index 84a98d0..541d37d 100644
--- a/c/driver_manager/adbc_driver_manager.cc
+++ b/c/driver_manager/adbc_driver_manager.cc
@@ -436,7 +436,9 @@ AdbcStatusCode AdbcConnectionInit(struct AdbcConnection*
connection,
AdbcStatusCode AdbcConnectionNew(struct AdbcConnection* connection,
struct AdbcError* error) {
- // Allocate a temporary structure to store options pre-Init
+ // Allocate a temporary structure to store options pre-Init, because
+ // we don't get access to the database (and hence the driver
+ // function table) until then
connection->private_data = new TempConnection;
connection->private_driver = nullptr;
return ADBC_STATUS_OK;
@@ -480,9 +482,16 @@ AdbcStatusCode AdbcConnectionRollback(struct
AdbcConnection* connection,
AdbcStatusCode AdbcConnectionSetOption(struct AdbcConnection* connection,
const char* key,
const char* value, struct AdbcError*
error) {
- if (!connection->private_driver) {
+ if (!connection->private_data) {
+ SetError(error, "AdbcConnectionSetOption: must AdbcConnectionNew first");
return ADBC_STATUS_INVALID_STATE;
}
+ if (!connection->private_driver) {
+ // Init not yet called, save the option
+ TempConnection* args =
reinterpret_cast<TempConnection*>(connection->private_data);
+ args->options[key] = value;
+ return ADBC_STATUS_OK;
+ }
return connection->private_driver->ConnectionSetOption(connection, key,
value, error);
}
diff --git a/c/driver_manager/adbc_driver_manager_test.cc
b/c/driver_manager/adbc_driver_manager_test.cc
index 3f37fd6..f7a6afb 100644
--- a/c/driver_manager/adbc_driver_manager_test.cc
+++ b/c/driver_manager/adbc_driver_manager_test.cc
@@ -57,12 +57,12 @@ class DriverManager : public ::testing::Test {
}
protected:
- AdbcDriver driver;
- AdbcError error = {};
+ struct AdbcDriver driver = {};
+ struct AdbcError error = {};
};
TEST_F(DriverManager, DatabaseCustomInitFunc) {
- AdbcDatabase database;
+ struct AdbcDatabase database;
std::memset(&database, 0, sizeof(database));
// Explicitly set entrypoint
@@ -85,6 +85,28 @@ TEST_F(DriverManager, DatabaseCustomInitFunc) {
ASSERT_THAT(AdbcDatabaseRelease(&database, &error), IsOkStatus(&error));
}
+TEST_F(DriverManager, ConnectionOptions) {
+ struct AdbcDatabase database;
+ struct AdbcConnection connection;
+ std::memset(&database, 0, sizeof(database));
+ std::memset(&connection, 0, sizeof(connection));
+
+ ASSERT_THAT(AdbcDatabaseNew(&database, &error), IsOkStatus(&error));
+ ASSERT_THAT(AdbcDatabaseSetOption(&database, "driver", "adbc_driver_sqlite",
&error),
+ IsOkStatus(&error));
+ ASSERT_THAT(AdbcDatabaseInit(&database, &error), IsOkStatus(&error));
+
+ ASSERT_THAT(AdbcConnectionNew(&connection, &error), IsOkStatus(&error));
+ ASSERT_THAT(AdbcConnectionSetOption(&connection, "foo", "bar", &error),
+ IsOkStatus(&error));
+ ASSERT_EQ(ADBC_STATUS_NOT_IMPLEMENTED,
+ AdbcConnectionInit(&connection, &database, &error));
+ ASSERT_THAT(error.message, ::testing::HasSubstr("Unknown connection option
foo=bar"));
+
+ ASSERT_THAT(AdbcConnectionRelease(&connection, &error), IsOkStatus(&error));
+ ASSERT_THAT(AdbcDatabaseRelease(&database, &error), IsOkStatus(&error));
+}
+
class SqliteQuirks : public adbc_validation::DriverQuirks {
public:
AdbcStatusCode SetupDatabase(struct AdbcDatabase* database,