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) {