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,

Reply via email to