Skip to main content

Hardcharger™

Hardcharger Python client documentation PyPI PyPI Downloads ADBC 1.12 Warp SQL protocol Go core Python bindings Hardcharger Apache 2.0 license GizmoData™

Query Hardcharger from Python, C/C++, Go, R, Rust or any ADBC language.


🔌 What is it?

The ADBC driver for Hardcharger™, GizmoData™'s DuckDB 2.0 server. It is a native Go driver built on the generic Warp SQL ADBC driver, which does the work (Arrow IPC streaming, bind parameters, cancel, retries, TLS, and by default results split into up to 32 partitions read at once and bulk ingests sent in up to 16 or 32 parts), compiled to one C shared library, libadbc_driver_hardcharger, that every ADBC language loads. On top of Warp SQL it adds what is particular to Hardcharger, for every language at once:

  • 🏎️ hardcharger:// URIs, with Hardcharger's port 31337 as the default;
  • 🏷️ query and session tags, recorded with every statement in Hardcharger's instrumentation;
  • ⚙️ hardcharger.* settings: set them for every session, or read, set and reset them on one;
  • 🌐 browser sign-in through the server's identity provider (SSO);
  • 🪪 client certificate sign-in (mutual TLS): the certificate is the credential, no password;
  • 🧾 "ADBC Hardcharger Driver - Go" as the driver name in GetInfo (the vendor name, "Hardcharger", comes from the server);
  • 🗂️ ADBC connection profiles, reusable TOML connections with environment-based credentials;
  • 🧩 a driver manifest, so driver = "hardcharger" finds it in any ADBC driver manager.

Status: 2.0.1, compatible with Hardcharger 2.0.0. Speaks the Warp SQL protocol 1.0.0, built on warp-sql-adbc 1.0.0; tested against hardcharger-server 2.0.0.

Package What it is
pip install adbc-driver-hardcharger this driver: Python bindings, with the library in the wheel
pip install hardcharger the Hardcharger server, started from Python
pip install "hardcharger[adbc]" both
go get github.com/gizmodata/hardcharger-adbc/go/v2 the Go package (versioned by go/vX.Y.Z tags, one per release, on the release's commit)
Releases the library and the manifest template, for C/C++, R, Rust, ...

🚀 Quick start

Python

from adbc_driver_hardcharger import dbapi as hardcharger

with hardcharger.connect(uri="hardcharger://localhost?tls=false", username="hardcharger", password="change-me") as conn:
    with conn.cursor() as cur:
        cur.execute(operation="SELECT 42 AS answer, ? AS greeting", parameters=["hello"])
        print(cur.fetch_arrow_table())

The connection and cursor are DB-API 2.0 objects with ADBC's extensions: fetch_arrow_table(), fetchall(), adbc_ingest() for bulk loads, adbc_get_objects() and the rest.

C/C++ (through the ADBC driver manager)

With the manifest installed (see Driver manifest), the driver manager finds the driver by name:

#include <arrow-adbc/adbc.h>
#include <arrow-adbc/adbc_driver_manager.h>

// (error handling elided; see examples/c/hello.c)
AdbcDatabaseNew(&database, &error);
// Search ADBC_DRIVER_PATH and the user and system directories for hardcharger.toml.
AdbcDriverManagerDatabaseSetLoadFlags(&database, ADBC_LOAD_FLAG_DEFAULT, &error);
AdbcDatabaseSetOption(&database, "driver", "hardcharger", &error);
AdbcDatabaseSetOption(&database, "uri", "hardcharger://localhost?tls=false", &error);
AdbcDatabaseSetOption(&database, "username", "hardcharger", &error);
AdbcDatabaseSetOption(&database, "password", "change-me", &error);
AdbcDatabaseSetOption(&database, "adbc.hardcharger.query_tag", "{\"app\": \"hello.c\"}", &error);
AdbcDatabaseInit(&database, &error);

examples/c/hello.c is the whole program (it prints answer = 42):

cc examples/c/hello.c -I"$ADBC/include" -L"$ADBC/lib" -ladbc_driver_manager -o hello && ./hello

R (adbcdrivermanager), Rust (adbc_driver_manager) and the other driver managers load it the same way, by the name hardcharger, with the same URIs and options.

Go

db, err := hardcharger.NewDriver(memory.DefaultAllocator).NewDatabaseWithContext(ctx, map[string]string{
	"uri":                      "hardcharger://localhost?tls=false",
	"username":                 "hardcharger",
	"password":                 "change-me",
	hardcharger.OptionQueryTag: `{"app": "hello.go"}`,
})
cnxn, err := db.Open(ctx)

go/examples/hello is the whole program (go run ./examples/hello in go/). The package is github.com/gizmodata/hardcharger-adbc/go/v2/hardcharger.

🔗 URIs

URI Meaning
hardcharger://host HTTPS to host:31337
hardcharger://host:port HTTPS to another port
hardcharger://host?tls=false Plain HTTP (development, loopback)
hardcharger://host:port/custom/prefix The server mounts Warp SQL under /custom/prefix
warp://…, https://…, http://… The Warp SQL driver's own spellings, as they are

hardcharger:// means exactly what Warp SQL's warp:// means, so TLS is on unless the URI says ?tls=false. Pointed at a server that speaks plain HTTP, a TLS URI fails at once, having sent nothing but the TLS hello, with The server at HOST:PORT speaks plain HTTP, not TLS. Add ?tls=false to the URI to connect without encryption.; the driver never falls back to plaintext. There is deliberately no hardcharger+http://: one spelling for plain HTTP keeps URIs the same in every driver (JDBC, the hardcharger command-line client), and the driver refuses hardcharger+http:// with a message naming ?tls=false.

⚙️ Options

Every option of the Warp SQL driver (adbc.warp.*: TLS, tokens, retries, compression, ...) applies, with its defaults. Two shape throughput, and the driver keeps the Warp SQL driver's defaults:

Option Default Meaning
adbc.warp.statement.result_partitions 32 A large result is split into up to this many partitions, read at once over their own connections (the server decides; a result of fewer than two batches is one stream). 1: never split
adbc.warp.ingest.parts (also adbc.hardcharger.ingest.parts) auto A bulk ingest of two batches or more goes over up to this many connections, committed as one. Its rows land in no defined order; 1: one stream, in the upload's order

Hardcharger's own:

Option Where Meaning
adbc.hardcharger.query_tag database, connection A JSON object recorded with every following statement (hardcharger.query_tag); "" removes it
adbc.hardcharger.session_tag database, connection A JSON object tagging the session (hardcharger.session_tag)
adbc.hardcharger.setting.NAME database, connection SET SESSION hardcharger.NAME: on every new session (database) or now (connection; "" resets, and GetOption reads the value that applies)
adbc.hardcharger.global_setting.NAME connection SET GLOBAL hardcharger.NAME (admins); "" resets
adbc.hardcharger.ingest.parts database, connection adbc.warp.ingest.parts under Hardcharger's name (on a statement, use the Warp SQL name)
adbc.hardcharger.auth_type database password (default), external (browser sign-in), or client_certificate (also mtls): sign in with the client certificate alone; it is the Warp SQL driver's adbc.warp.auth.type
adbc.hardcharger.oauth.timeout_seconds database How long to wait for the sign-in (default 300)
adbc.hardcharger.oauth.browser database Command that opens the sign-in page (the URL is appended); default $HARDCHARGER_BROWSER, else the system's; none prints the URL
adbc.hardcharger.oauth.share_sign_in database true: share one browser sign-in among this process's databases that sign in to the same server (see below); default false
adbc.hardcharger.oauth.sign_in_key database Names a shared sign-in (default ""): only databases with the same key share one

Tags are stored in _hardcharger_instr.sql_statements.query_tag and _hardcharger_instr.sessions.session_tag when the server runs with --enable-instrumentation; a tag that isn't a JSON object is refused with Invalid JSON for query_tag.

adbc.warp.session.transaction (read-only, connection; Python ConnectionOptions.SESSION_TRANSACTION) is the session's transaction as the server reports it: none, open, aborted, or unknown. It sees SQL BEGIN and COMMIT too.

Errors carry the server's error code in the detail warp.code (sql_error, permission_denied, ...), or a code beginning with client_ for a failure the driver found in the server's answer (client_protocol_error; client_http_error for an error status without a problem document, such as a proxy's page). warp.reason and warp.cancel_reason say why a token or session stopped working or a statement was cancelled (token_revoked, killed, ...). After token_revoked, credentials_changed or principal_dropped the driver does not sign in again on its own.

🐍 Python helpers

with hardcharger.connect(uri="hardcharger://localhost?tls=false", username="hardcharger", password="change-me",
                         session_tag={"app": "nightly-etl"}, query_tag={"job": "load-orders"},
                         settings={"query_timeout": 60}) as conn:
    conn.set_query_tag(tag={"job": "refresh-rollups"})          # every later statement
    conn.set_setting(name="query_timeout", value=120)           # SET SESSION hardcharger.query_timeout
    print(conn.get_setting(name="query_timeout"))                # '120'
    conn.reset_setting(name="query_timeout")
    conn.set_setting(name="max_concurrent_statements", value=8, scope="global")  # admins only
    conn.reset_setting(name="max_concurrent_statements", scope="global")
    print(conn.current_user(), conn.server_version())          # e.g. hardcharger 0.2.0
    print(conn.settings())                                       # hardcharger_settings(), as Arrow

They map to the options above, so they behave exactly as in C or Go.

🌐 Browser sign-in (SSO)

When the server offers browser sign-in (--oauth-client-id and --oauth-client-secret, with the identity provider in --token-allowed-issuer; it then lists the Warp SQL capability oauth_browser), sign in as yourself:

with hardcharger.connect(uri="hardcharger://db.example.com", auth_type="external") as conn:
    print(conn.current_user())  # the e-mail address you signed in with

When the first connection opens, the driver asks the server for a sign-in flow (Warp SQL's browser sign-in, on the server's own port and URL: nothing else to configure on the client), opens the identity provider's page in your browser, waits, and receives the server's own access token. The identity provider's settings stay on the server. open_browser=False (option oauth.browser=none) prints the URL instead, for a remote shell; a string is the command to open it with. The token can't be renewed: when it expires, open a new connection and sign in again.

One sign-in for many connections

Each database signs in on its own, and the DB-API's connect() makes a database per connection, so a program that opens several connections (dbt, a pool, a notebook) would open a browser window for each. share_sign_in=True (option adbc.hardcharger.oauth.share_sign_in) shares one sign-in among the process's databases that sign in to the same server, with the same TLS trust:

for model in ("orders", "customers", "rollups"):
    with hardcharger.connect(uri="hardcharger://db.example.com", auth_type="external",
                             share_sign_in=True) as conn:   # one browser sign-in for all three
        ...

The first connection signs in (others opened meanwhile wait for it); the rest reuse the server's access token it got, until shortly before it expires (a minute, or a quarter of a shorter lifetime), when the next connection signs in again. A shared token the server refuses is dropped and that connection signs in again, once. The token lives only in the process's memory and never goes to another server. To sign in as two people (or roles) to one server in one process, give each its own key: share_sign_in="alice" (option adbc.hardcharger.oauth.sign_in_key). In Go, hardcharger.ForgetSharedSignIns() drops them all, for a sign-out.

🪪 Client certificate sign-in (mutual TLS)

When the server verifies client certificates and lets them sign in (--mtls-ca-cert with --mtls-certificate-sign-in), the certificate is the credential: no user name or password.

HARDCHARGER_ADMIN_PASSWORD=change-me hardcharger-server --tls-cert server.pem --tls-key server-key.pem \
  --mtls-ca-cert client-ca.pem --mtls-certificate-sign-in --mtls-admin-identities ops@example.com
with hardcharger.connect(uri="hardcharger://db.example.com", auth_type="client_certificate",
                         tls_client_cert="client.pem", tls_client_key="client-key.pem",
                         tls_root_certs="server-ca.pem") as conn:  # when the server's CA is private
    print(conn.current_user())  # the certificate's identity: ops@example.com

In C, Go and every other language, set adbc.hardcharger.auth_type to client_certificate with the Warp SQL driver's adbc.warp.tls.client_cert and adbc.warp.tls.client_key (PEM text; adbc.warp.tls.root_certs too when the server's certificate comes from a private CA):

db, err := hardcharger.NewDriver(memory.DefaultAllocator).NewDatabaseWithContext(ctx, map[string]string{
	"uri":                      "hardcharger://db.example.com",
	hardcharger.OptionAuthType: hardcharger.AuthTypeClientCertificate,
	"adbc.warp.tls.client_cert": certPEM,
	"adbc.warp.tls.client_key":  keyPEM,
})

The identity is the certificate's e-mail SAN unless the server says otherwise (--mtls-identity-source); it must be one of --mtls-admin-identities or, under access control, a user of the store. The token the driver gets is bound to the certificate, and every connection it opens (result partitions, ingest parts) presents the same one. The driver refuses a user name, password or token beside client_certificate, a missing certificate or key, and plain HTTP before sending anything, and a server that doesn't offer certificate sign-in (capability mtls_identity) before trying it. The server's refusals carry its code in warp.code: unknown_certificate_identity, certificate_mismatch (a token bound to another certificate), certificate_required (also when the server refuses a connection without a certificate at the TLS handshake), certificate_revoked, and certificate_identity_mismatch.

🎫 Token exchange (your identity provider's tokens)

A program that already holds a token from your identity provider (an OpenID Connect ID token or another JWT: a workload identity, a CI job's token, a token your web app got at sign-in) signs in with it directly: the driver exchanges it for a Hardcharger access token (Warp SQL's token_exchange grant), with no password and no browser. The server checks the token against the provider's keys, issuer and audience:

HARDCHARGER_ADMIN_PASSWORD=change-me hardcharger-server --tls-cert server.pem --tls-key server-key.pem \
  --token-jwks-uri https://login.example.com/oauth2/v1/keys \
  --token-allowed-issuer https://login.example.com --token-allowed-audience hardcharger \
  --token-authorized-emails '*@example.com' --token-default-role user
with hardcharger.connect(uri="hardcharger://db.example.com", subject_token=id_token) as conn:
    print(conn.current_user())  # the token's e-mail address

subject_token= is the Warp SQL driver's adbc.warp.auth.subject_token (in C, Go and every other language, set that option). Python refuses it beside username, password, access_token, auth_type="external" or "client_certificate", and a different value for the same option in db_kwargs: the driver would otherwise use one credential and ignore the others. A token the server doesn't accept (another issuer or audience, expired, a bad signature, an e-mail address outside --token-authorized-emails) is refused with UNAUTHENTICATED and warp.code invalid_credentials. The driver exchanges the token when the first connection opens, and again shortly before Hardcharger's access token expires, as long as your provider's token is still valid. Once that token has expired the server refuses the next exchange (invalid_credentials), so open a new connection with a fresh subject_token.

🏷️ TLS server name

When the URI's host isn't the name on the server's certificate (you connect by IP address, or through a tunnel, port forward or load balancer), give the name with tls_server_name= (option adbc.warp.tls.server_name). The driver sends it as the TLS server name (SNI), so a proxy or ingress that routes on SNI sends the connection to the right server, and checks the certificate against it instead of the URI's host:

with hardcharger.connect(uri="hardcharger://10.0.0.7", username="hardcharger", password="change-me",
                         tls_server_name="db.example.com",
                         tls_root_certs="server-ca.pem") as conn:  # when the server's CA is private
    print(conn.current_user())

Without it, a connection by IP address sends no server name at all (TLS never carries an IP address as one) and the certificate must list that IP address. It is what GizmoSQL's tls_override_hostname was. Every connection the driver opens (result partitions, ingest parts) sends the same name; tls_skip_verify=True still sends it, without checking the certificate. Python refuses a different value for the same option in db_kwargs.

🗂️ ADBC connection profiles

ADBC connection profiles store a reusable connection in TOML. The Python wheel requires adbc-driver-manager >= 1.12.0. The ADBC driver manager resolves the profile, expands its environment variables and loads the native driver; the Go driver receives the resolved options. Install the driver manifest once in each client environment:

pip install adbc-driver-hardcharger
python -m adbc_driver_hardcharger.manifest

Save hardcharger_prod.toml in your ADBC profile directory:

  • Linux: ~/.config/adbc/profiles/ (or $XDG_CONFIG_HOME/adbc/profiles/).
  • macOS: ~/Library/Application Support/ADBC/Profiles/.
  • Windows: %LOCALAPPDATA%\ADBC\Profiles\.
  • Or a directory in ADBC_PROFILE_PATH (colon-separated on Unix, semicolon-separated on Windows).
profile_version = 1
driver = "hardcharger"

[Options]
uri = "hardcharger://db.example.com:31337"
username = "{{ env_var(HARDCHARGER_USERNAME) }}"
password = "{{ env_var(HARDCHARGER_PASSWORD) }}"

Set those environment variables, then use the profile from Python:

from adbc_driver_hardcharger import dbapi as hardcharger

with hardcharger.connect(profile="hardcharger_prod") as conn, conn.cursor() as cur:
    cur.execute("SELECT 42 AS answer")
    print(cur.fetch_arrow_table())

# Equivalent forms:
# hardcharger.connect(uri="profile://hardcharger_prod")
# hardcharger.connect(profile="/absolute/path/hardcharger_prod.toml")

The same profile works through the generic driver manager, without importing this package:

from adbc_driver_manager import dbapi

with dbapi.connect(profile="hardcharger_prod") as conn, conn.cursor() as cur:
    cur.execute("SELECT 42 AS answer")
    print(cur.fetch_arrow_table())

Explicit Python connection options override the profile's [Options]. hardcharger:// uses TLS by default; add ?tls=false only for local development. For browser SSO, replace the username and password options with "adbc.hardcharger.auth_type" = "external" and use a server configured for browser sign-in. Other ADBC languages can reuse this profile through a driver manager with connection-profile support; direct Go driver calls do not resolve TOML profiles themselves.

🔁 Attaching to an existing session

A session (its open transaction, temporary tables and settings) can outlive its connection and be picked up by another process: a job runner that begins a transaction in one step and commits it in the next, or a worker that restarts. The first connection keeps its session when it closes (close_session_on_release=False) and passes on conn.session_id with its conn.access_token (see below); the second attaches with session_id= and that token, since the session belongs to the user who created it:

# Process 1: begin a transaction, then hand the session on.
with hardcharger.connect(uri="hardcharger://db.example.com", username="hardcharger", password="change-me",
                         close_session_on_release=False) as conn:
    with conn.cursor() as cur:
        cur.execute(operation="BEGIN TRANSACTION")
        cur.execute(operation="INSERT INTO orders VALUES (1, 'pending')")
    session_id, token = conn.session_id, conn.access_token  # pass both on; the token is a secret

# Process 2: attach, see the uncommitted row, commit.
with hardcharger.connect(uri="hardcharger://db.example.com", access_token=token,
                         session_id=session_id) as conn:
    with conn.cursor() as cur:
        cur.execute(operation="SELECT count(*) FROM orders")
        print(cur.fetchone())  # (1,)
        cur.execute(operation="COMMIT")

They are the Warp SQL driver's database options adbc.warp.session.id and adbc.warp.session.close_on_release (a connection option too, settable any time), in every language. Opening checks the session (GET /warp/v1/sessions/{id}) and creates none: an id the server doesn't have, or another user's session, fails with NotFound and warp.code session_not_found (the server answers both the same way). Closing an attached connection leaves the session (close_session_on_release defaults to False for it, True for a session the connection created); it ends when a connection with True closes or when it idles out (--session-idle-timeout). An attached session the server loses is not replaced.

Several replicas: a session lives on the one Hardcharger replica that created it. Attaching from another client works only if its requests are routed to that replica. Affinity by client IP address won't do it when the second client's address differs from the first's (another host, NAT or CI runner): the attach then fails with session_not_found. Route on something both clients send, or connect both to that replica's own address.

🔑 Reading the access token

A connection's access token is readable: the token the driver got when it signed in (password, subject_token, browser), renewed first when it is about to expire, so after a renewal you get the new one; or the access_token you gave connect(), as it is.

with hardcharger.connect(uri="hardcharger://db.example.com", username="hardcharger", password="change-me") as conn:
    token = conn.access_token              # a bearer secret: never log it
    print(conn.access_token_expires_at)    # e.g. 2026-10-20 16:14:13+00:00 (None when unknown)
    print(conn.adbc_connection.get_option(key="adbc.warp.auth.access_token_expires_at"))
    # '2026-10-20T16:14:13Z'

They are the Warp SQL driver's adbc.warp.auth.access_token and adbc.warp.auth.access_token_expires_at (read-only; RFC 3339 UTC, from the token response's expires_in or the token's own exp, "" when unknown), readable on the database and the connection in every language. The token works as Authorization: Bearer <token> on the server's HTTP API, and with session_id it lets another process carry on in this connection's session (above).

It is a bearer secret: whoever holds it acts as the user until it expires (the server's --token-lifetime-seconds). Keep it in memory or store it encrypted, send it only over TLS, and never log it, print it or put it in a URL. A token handed to another process can't be renewed there (it was issued elsewhere): give that process a fresh one, or its own sign-in, before this one expires.

🧩 Driver manifest

driver = "hardcharger" works in any ADBC driver manager once hardcharger.toml is in one of its search directories:

python -m adbc_driver_hardcharger.manifest          # for this user, pointing at the wheel's library
python -m adbc_driver_hardcharger.manifest --print  # or print it

Without Python, fill in packaging/hardcharger.toml.in with the directory of the library from a release tarball, and install it as hardcharger.toml in ~/.config/adbc/drivers/ (Linux), ~/Library/Application Support/ADBC/Drivers/ (macOS), %LOCALAPPDATA%\ADBC\Drivers\ (Windows), or a directory on ADBC_DRIVER_PATH.

📂 Layout

go/hardcharger/      the driver (package hardcharger), on warp-sql-adbc's go/warpsql
go/pkg/hardcharger/  cgo exports for the C shared library (generated: make -C go regenerate)
go/examples/hello/   the Go example
python/              adbc-driver-hardcharger: ships the library in its wheel, adds dbapi.connect()
examples/c/          the C example, through the ADBC driver manager
packaging/           the driver manifest template

🛠️ Building and testing

Go 1.27 with cgo (and, on Linux, zig for the glibc 2.17 build), Python 3.11+. The Warp SQL driver is the Go module github.com/gizmodata/warp-sql-adbc/go, pinned to its released v1.0.0 in go/go.mod.

scripts/build_lib.sh                       # go/build/libadbc_driver_hardcharger.{so,dylib,dll}
make -C go test                            # Go unit tests (race detector)
cd python && uv venv .venv && uv pip install --python .venv/bin/python -e ".[test,dev]"

export HARDCHARGER_ADBC_TEST_SERVER_BINARY=/path/to/hardcharger-server
make -C go integration-test                # Go live suite (race detector)
.venv/bin/python -m pytest                 # Python: unit and live

The live suites start real hardcharger-server processes on free loopback ports (plain HTTP, TLS, instrumentation, browser sign-in against a mock identity provider; the defaults: a large result arrives in several partitions and an ingest goes in several parts, counted through a recording proxy) and, in Python, load the library by manifest through the driver manager. Without a server binary they fail, never skip, and a Go run in which no live test ran fails too. CI also builds the ADBC C driver manager and runs the C and Go examples against a server on the default port. CI's server is the ghcr.io/gizmodata/hardcharger:main image (Hardcharger's main branch), pulled with GITHUB_TOKEN; pin a :sha-<short> tag in ci.yml to reproduce an old run.

📦 Releasing

Releases follow semantic versioning and CHANGELOG.md. Pushing a vX.Y.Z tag runs every suite on the tagged commit, then builds the library for Linux amd64/arm64 (glibc 2.17; installed and loaded on Oracle Linux 8), macOS arm64/amd64 and Windows amd64/arm64, wheels for all of them but Windows arm64 (pyarrow and adbc-driver-manager publish no wheels there), a GitHub Release with the libraries, wheels and manifest template, and PyPI from the pypi environment (trusted publishing, after an approval). Before tagging: set __version__ in python/src/adbc_driver_hardcharger/_version.py, move [Unreleased] into a dated section, and regenerate THIRD_PARTY_NOTICES if a Go dependency moved (scripts/third_party_notices.sh; CI checks it).

📄 License

Apache License 2.0; see LICENSE. The shared library links the Go runtime and the Go modules listed, with their licenses, in THIRD_PARTY_NOTICES, which ships in every wheel and library tarball.


GizmoData™
Built by GizmoData™

Hardcharger™ and GizmoData™ are trademarks of GizmoData LLC.

Metadata

Release files for adbc-driver-hardcharger 2.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for adbc-driver-hardcharger 2.0.2
File
adbc_driver_hardcharger-2.0.2-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
adbc_driver_hardcharger-2.0.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details
adbc_driver_hardcharger-2.0.2-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl Python 3 none Linux glibc 2.5+ x86-64 Details
adbc_driver_hardcharger-2.0.2-py3-none-macosx_11_0_x86_64.whl Python 3 none macOS 11.0+ x86-64 Details
adbc_driver_hardcharger-2.0.2-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details

Total release size: 54.5 MB

Release files / adbc_driver_hardcharger-2.0.2-py3-none-win_amd64.whl

Download URL adbc_driver_hardcharger-2.0.2-py3-none-win_amd64.whl
Size 11.2 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
0be881ede95526879eecefa62f047ca533aa78349616b1952c92a82ae2a57636
BLAKE2b-256 checksum
How to use checksums
c86895462ec3e44889e1c84a6848fb82cc7904c6b83a4596d22444a8b2cc22e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / adbc_driver_hardcharger-2.0.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

Download URL adbc_driver_hardcharger-2.0.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Size 10.7 MB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
c1e2336d72094f066c6b0171c0c8f903a863237bdde77fcd1e9967976dc66e3b
BLAKE2b-256 checksum
How to use checksums
7e338cc96431ab91d63bc24c4a8869b2f4ffc0607c4434e3cba1bb761a3b0818
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / adbc_driver_hardcharger-2.0.2-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl

Download URL adbc_driver_hardcharger-2.0.2-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl
Size 12.0 MB
Tags Linux glibc 2.5+ x86-64 Python 3
SHA-256 checksum
How to use checksums
f82647c9f8af17909fac53544ad8d0a9300620af3cfe2d870e6f3e56b962b5fa
BLAKE2b-256 checksum
How to use checksums
7fcfb85d31d9bbf4e294eb472ff96f7583109acc4928f9cb0e7abc73600e6445
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / adbc_driver_hardcharger-2.0.2-py3-none-macosx_11_0_x86_64.whl

Download URL adbc_driver_hardcharger-2.0.2-py3-none-macosx_11_0_x86_64.whl
Size 11.0 MB
Tags Python 3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
24016e4393d1119cd2de5c92c039568b69594cb3d3d528ada5be345040a2e891
BLAKE2b-256 checksum
How to use checksums
07ff7b255a9d2e2b1055caedffc905372f7138ca1186c0712c19967ef2f478dc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / adbc_driver_hardcharger-2.0.2-py3-none-macosx_11_0_arm64.whl

Download URL adbc_driver_hardcharger-2.0.2-py3-none-macosx_11_0_arm64.whl
Size 9.7 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
3f2a7a962f22f163c15092d1631ed805ca506a9e6f2e951237c03a0ade25b9b4
BLAKE2b-256 checksum
How to use checksums
c3760ca926bc54ba9f8329b36df3ba3a37e3c346f4f441792e5c151a322b8f14
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Security for adbc-driver-hardcharger 2.0.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 5 files in this release have been uploaded with provenance metadata.

Select from 5 files

Attestation for adbc_driver_hardcharger-2.0.2-py3-none-win_amd64.whl

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page