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 d67320d  test(c/driver_manager): test two drivers in-process (#232)
d67320d is described below

commit d67320d0aab1d28d9926ca400689448e5bbdf2b2
Author: David Li <[email protected]>
AuthorDate: Fri Dec 9 16:23:53 2022 -0500

    test(c/driver_manager): test two drivers in-process (#232)
    
    Fixes #226.
---
 .github/workflows/cpp.yml                    | 14 ++++++++
 c/driver_manager/adbc_driver_manager.cc      |  3 ++
 c/driver_manager/adbc_driver_manager_test.cc | 50 ++++++++++++++++++++++++++++
 c/validation/adbc_validation_util.h          | 13 ++++++++
 4 files changed, 80 insertions(+)

diff --git a/.github/workflows/cpp.yml b/.github/workflows/cpp.yml
index fc3bd0d..05366ee 100644
--- a/.github/workflows/cpp.yml
+++ b/.github/workflows/cpp.yml
@@ -177,6 +177,13 @@ jobs:
           BUILD_DRIVER_MANAGER: "1"
         run:
           .\ci\scripts\cpp_build.ps1 $pwd $pwd\build
+      - name: Build Driver PostgreSQL
+        shell: pwsh
+        env:
+          BUILD_ALL: "0"
+          BUILD_DRIVER_POSTGRES: "1"
+        run:
+          .\ci\scripts\cpp_build.ps1 $pwd $pwd\build
       - name: Build Driver SQLite
         shell: pwsh
         env:
@@ -206,6 +213,13 @@ jobs:
           BUILD_DRIVER_MANAGER: "1"
         run:
           .\ci\scripts\python_build.ps1 $pwd $pwd\build
+      - name: Build Python Driver PostgreSQL
+        shell: pwsh
+        env:
+          BUILD_ALL: "0"
+          BUILD_DRIVER_POSTGRES: "1"
+        run:
+          .\ci\scripts\python_build.ps1 $pwd $pwd\build
       - name: Build Python Driver SQLite
         shell: pwsh
         env:
diff --git a/c/driver_manager/adbc_driver_manager.cc 
b/c/driver_manager/adbc_driver_manager.cc
index 541d37d..e4dfda4 100644
--- a/c/driver_manager/adbc_driver_manager.cc
+++ b/c/driver_manager/adbc_driver_manager.cc
@@ -416,6 +416,9 @@ AdbcStatusCode AdbcConnectionInit(struct AdbcConnection* 
connection,
   if (!connection->private_data) {
     SetError(error, "Must call AdbcConnectionNew first");
     return ADBC_STATUS_INVALID_STATE;
+  } else if (!database->private_driver) {
+    SetError(error, "Database is not initialized");
+    return ADBC_STATUS_INVALID_ARGUMENT;
   }
   TempConnection* args = 
reinterpret_cast<TempConnection*>(connection->private_data);
   connection->private_data = nullptr;
diff --git a/c/driver_manager/adbc_driver_manager_test.cc 
b/c/driver_manager/adbc_driver_manager_test.cc
index f7a6afb..c7b78ac 100644
--- a/c/driver_manager/adbc_driver_manager_test.cc
+++ b/c/driver_manager/adbc_driver_manager_test.cc
@@ -32,6 +32,7 @@
 namespace adbc {
 
 using adbc_validation::IsOkStatus;
+using adbc_validation::IsStatus;
 
 class DriverManager : public ::testing::Test {
  public:
@@ -107,6 +108,55 @@ TEST_F(DriverManager, ConnectionOptions) {
   ASSERT_THAT(AdbcDatabaseRelease(&database, &error), IsOkStatus(&error));
 }
 
+TEST_F(DriverManager, MultiDriverTest) {
+  // Make sure two distinct drivers work in the same process (basic smoke test)
+  adbc_validation::Handle<struct AdbcError> error;
+  adbc_validation::Handle<struct AdbcDatabase> sqlite_db;
+  adbc_validation::Handle<struct AdbcDatabase> postgres_db;
+  adbc_validation::Handle<struct AdbcConnection> sqlite_conn;
+  adbc_validation::Handle<struct AdbcConnection> postgres_conn;
+
+  ASSERT_THAT(AdbcDatabaseNew(&sqlite_db.value, &error.value), 
IsOkStatus(&error.value));
+  ASSERT_THAT(AdbcDatabaseNew(&postgres_db.value, &error.value),
+              IsOkStatus(&error.value));
+
+  ASSERT_THAT(AdbcDatabaseSetOption(&sqlite_db.value, "driver", 
"adbc_driver_sqlite",
+                                    &error.value),
+              IsOkStatus(&error.value));
+  ASSERT_THAT(AdbcDatabaseSetOption(&postgres_db.value, "driver", 
"adbc_driver_postgres",
+                                    &error.value),
+              IsOkStatus(&error.value));
+
+  ASSERT_THAT(AdbcDatabaseInit(&sqlite_db.value, &error.value), 
IsOkStatus(&error.value));
+  ASSERT_THAT(AdbcDatabaseInit(&postgres_db.value, &error.value),
+              IsStatus(ADBC_STATUS_INVALID_STATE, &error.value));
+  ASSERT_THAT(error->message,
+              ::testing::HasSubstr(
+                  "[libpq] Must set database option 'uri' before creating a 
connection"));
+  error->release(&error.value);
+
+  ASSERT_THAT(AdbcDatabaseSetOption(&postgres_db.value, "uri",
+                                    "postgres://localhost:5432", &error.value),
+              IsOkStatus(&error.value));
+  ASSERT_THAT(AdbcDatabaseSetOption(&sqlite_db.value, "unknown", "foo", 
&error.value),
+              IsStatus(ADBC_STATUS_NOT_IMPLEMENTED, &error.value));
+  ASSERT_THAT(error->message,
+              ::testing::HasSubstr("[SQLite] Unknown database option 
unknown=foo"));
+  error->release(&error.value);
+
+  ASSERT_THAT(AdbcConnectionNew(&sqlite_conn.value, &error.value),
+              IsOkStatus(&error.value));
+  ASSERT_THAT(AdbcConnectionNew(&postgres_conn.value, &error.value),
+              IsOkStatus(&error.value));
+
+  ASSERT_THAT(AdbcConnectionInit(&sqlite_conn.value, &sqlite_db.value, 
&error.value),
+              IsOkStatus(&error.value));
+  ASSERT_THAT(AdbcConnectionInit(&postgres_conn.value, &postgres_db.value, 
&error.value),
+              IsStatus(ADBC_STATUS_IO, &error.value));
+  ASSERT_THAT(error->message, ::testing::HasSubstr("[libpq] Failed to 
connect"));
+  error->release(&error.value);
+}
+
 class SqliteQuirks : public adbc_validation::DriverQuirks {
  public:
   AdbcStatusCode SetupDatabase(struct AdbcDatabase* database,
diff --git a/c/validation/adbc_validation_util.h 
b/c/validation/adbc_validation_util.h
index b9a11a3..787925f 100644
--- a/c/validation/adbc_validation_util.h
+++ b/c/validation/adbc_validation_util.h
@@ -82,6 +82,19 @@ struct Releaser<struct AdbcConnection> {
   }
 };
 
+template <>
+struct Releaser<struct AdbcDatabase> {
+  static void Release(struct AdbcDatabase* value) {
+    if (value->private_data) {
+      struct AdbcError error = {};
+      auto status = AdbcDatabaseRelease(value, &error);
+      if (status != ADBC_STATUS_OK) {
+        FAIL() << StatusCodeToString(status) << ": " << ToString(&error);
+      }
+    }
+  }
+};
+
 template <>
 struct Releaser<struct AdbcStatement> {
   static void Release(struct AdbcStatement* value) {

Reply via email to