Prepare 2026.05.08 for first PyPI publish
- Bump version 2026.05.05.12 → 2026.05.08 (CalVer, publish date) - Expand sdist excludes to **/glob patterns: docs/**, docs-site/**, tests/reference/**, tests/benchmarks/.results/** — the trailing-slash form was silently passing through subtree contents - Sanitize tests/benchmarks/baseline.json hostname → PLACEHOLDER - Rewrite README relative docs/, tests/, Makefile links to absolute Gitea URLs (git.supported.systems/warehack.ing/informix-db) - pyproject urls: Homepage + Documentation → informix-db.warehack.ing, Source/Issues/Changelog → Gitea (warehack.ing org is now public)
This commit is contained in:
parent
86070e4688
commit
1582a5295d
24
README.md
24
README.md
@ -131,7 +131,7 @@ cur.write_blob_column(
|
|||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
Both work end-to-end in pure Python via the `lotofile` / `filetoblob` server functions intercepted at the `SQ_FILE` (98) wire-protocol level — no native machinery anywhere in the thread of execution. See [`docs/DECISION_LOG.md`](docs/DECISION_LOG.md) §10–11 for the architecture pivot that made this possible.
|
Both work end-to-end in pure Python via the `lotofile` / `filetoblob` server functions intercepted at the `SQ_FILE` (98) wire-protocol level — no native machinery anywhere in the thread of execution. See [`docs/DECISION_LOG.md`](https://git.supported.systems/warehack.ing/informix-db/src/branch/main/docs/DECISION_LOG.md) §10–11 for the architecture pivot that made this possible.
|
||||||
|
|
||||||
## Direct stored-procedure invocation (fast-path)
|
## Direct stored-procedure invocation (fast-path)
|
||||||
|
|
||||||
@ -149,7 +149,7 @@ The fast-path RPC (`SQ_FPROUTINE` / `SQ_EXFPROUTINE`) bypasses PREPARE → EXECU
|
|||||||
|
|
||||||
Tested against IBM Informix Dynamic Server **15.0.1.0.3DE** (the official `icr.io/informix/informix-developer-database` Docker image). The wire protocol is stable across modern Informix versions; should work against 12.10+ unmodified.
|
Tested against IBM Informix Dynamic Server **15.0.1.0.3DE** (the official `icr.io/informix/informix-developer-database` Docker image). The wire protocol is stable across modern Informix versions; should work against 12.10+ unmodified.
|
||||||
|
|
||||||
For features that need server-side configuration (smart-LOBs, logged transactions), see [`docs/DECISION_LOG.md`](docs/DECISION_LOG.md):
|
For features that need server-side configuration (smart-LOBs, logged transactions), see [`docs/DECISION_LOG.md`](https://git.supported.systems/warehack.ing/informix-db/src/branch/main/docs/DECISION_LOG.md):
|
||||||
- Phase 7 — logged-DB transactions
|
- Phase 7 — logged-DB transactions
|
||||||
- Phase 8 — BYTE/TEXT (needs blobspace)
|
- Phase 8 — BYTE/TEXT (needs blobspace)
|
||||||
- Phase 10/11 — BLOB/CLOB (needs sbspace + `SBSPACENAME` config + level-0 archive)
|
- Phase 10/11 — BLOB/CLOB (needs sbspace + `SBSPACENAME` config + level-0 archive)
|
||||||
@ -168,7 +168,7 @@ Single-connection benchmarks against the dev container on loopback:
|
|||||||
| Pool acquire + query + release | 295 µs | ~3.4K queries/sec |
|
| Pool acquire + query + release | 295 µs | ~3.4K queries/sec |
|
||||||
| Cold connect (login handshake) | 11 ms | ~90 connections/sec |
|
| Cold connect (login handshake) | 11 ms | ~90 connections/sec |
|
||||||
|
|
||||||
**Performance gotcha**: `executemany(...)` under `autocommit=True` is **53× slower** than the same call inside a single transaction (server flushes the transaction log per row). For bulk loads, `autocommit=False` (default) + `conn.commit()` at the end. See [`docs/USAGE.md`](docs/USAGE.md) for the full performance tips section.
|
**Performance gotcha**: `executemany(...)` under `autocommit=True` is **53× slower** than the same call inside a single transaction (server flushes the transaction log per row). For bulk loads, `autocommit=False` (default) + `conn.commit()` at the end. See [`docs/USAGE.md`](https://git.supported.systems/warehack.ing/informix-db/src/branch/main/docs/USAGE.md) for the full performance tips section.
|
||||||
|
|
||||||
### Compared to IfxPy (the C-bound PyPI driver)
|
### Compared to IfxPy (the C-bound PyPI driver)
|
||||||
|
|
||||||
@ -204,7 +204,7 @@ Head-to-head benchmarks against [IfxPy](https://pypi.org/project/IfxPy/) on iden
|
|||||||
|
|
||||||
These results are reproducible from `tests/benchmarks/compare/` — the Dockerfile, bench script, and README walk through every step.
|
These results are reproducible from `tests/benchmarks/compare/` — the Dockerfile, bench script, and README walk through every step.
|
||||||
|
|
||||||
Full methodology, IQR caveats, install gauntlet, and reproduction in [`tests/benchmarks/compare/README.md`](tests/benchmarks/compare/README.md).
|
Full methodology, IQR caveats, install gauntlet, and reproduction in [`tests/benchmarks/compare/README.md`](https://git.supported.systems/warehack.ing/informix-db/src/branch/main/tests/benchmarks/compare/README.md).
|
||||||
|
|
||||||
A note on IfxPy's install gauntlet: getting it to run on a modern system requires Python ≤ 3.11, setuptools <58, permissive CFLAGS, manual download of a 92 MB ODBC tarball, four `LD_LIBRARY_PATH` directories, and `libcrypt.so.1` (deprecated 2018, missing on Arch / Fedora 35+ / RHEL 9). `informix-db`'s install: `pip install informix-db`.
|
A note on IfxPy's install gauntlet: getting it to run on a modern system requires Python ≤ 3.11, setuptools <58, permissive CFLAGS, manual download of a 92 MB ODBC tarball, four `LD_LIBRARY_PATH` directories, and `libcrypt.so.1` (deprecated 2018, missing on Arch / Fedora 35+ / RHEL 9). `informix-db`'s install: `pip install informix-db`.
|
||||||
|
|
||||||
@ -217,7 +217,7 @@ A note on IfxPy's install gauntlet: getting it to run on a modern system require
|
|||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
The full test + lint workflow is in the [Makefile](Makefile). Quick summary:
|
The full test + lint workflow is in the [Makefile](https://git.supported.systems/warehack.ing/informix-db/src/branch/main/Makefile). Quick summary:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make test # 77 unit tests (no Docker)
|
make test # 77 unit tests (no Docker)
|
||||||
@ -226,22 +226,22 @@ make bench # benchmark suite
|
|||||||
make lint # ruff
|
make lint # ruff
|
||||||
```
|
```
|
||||||
|
|
||||||
For the smart-LOB tests specifically, the dev container needs additional one-time setup (blobspace + sbspace + level-0 archive). See [`docs/DECISION_LOG.md`](docs/DECISION_LOG.md) §10 for the `onspaces` / `onmode` / `ontape` commands.
|
For the smart-LOB tests specifically, the dev container needs additional one-time setup (blobspace + sbspace + level-0 archive). See [`docs/DECISION_LOG.md`](https://git.supported.systems/warehack.ing/informix-db/src/branch/main/docs/DECISION_LOG.md) §10 for the `onspaces` / `onmode` / `ontape` commands.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
- [**`docs/USAGE.md`**](docs/USAGE.md) — practical recipes: connections, parameter binding, type mapping, transactions, performance tips, scrollable cursors, BLOBs, async, TLS, locale/Unicode, error handling, known limitations
|
- [**`docs/USAGE.md`**](https://git.supported.systems/warehack.ing/informix-db/src/branch/main/docs/USAGE.md) — practical recipes: connections, parameter binding, type mapping, transactions, performance tips, scrollable cursors, BLOBs, async, TLS, locale/Unicode, error handling, known limitations
|
||||||
- [`tests/benchmarks/README.md`](tests/benchmarks/README.md) — performance baselines, headline numbers, how to run regressions
|
- [`tests/benchmarks/README.md`](https://git.supported.systems/warehack.ing/informix-db/src/branch/main/tests/benchmarks/README.md) — performance baselines, headline numbers, how to run regressions
|
||||||
- `CHANGELOG.md` — phase-by-phase release notes
|
- `CHANGELOG.md` — phase-by-phase release notes
|
||||||
|
|
||||||
## Project history & design rationale
|
## Project history & design rationale
|
||||||
|
|
||||||
This driver was built incrementally across 30 phases, each with a focused scope and decision log. The reasoning trail lives in:
|
This driver was built incrementally across 30 phases, each with a focused scope and decision log. The reasoning trail lives in:
|
||||||
|
|
||||||
- [`docs/PROTOCOL_NOTES.md`](docs/PROTOCOL_NOTES.md) — byte-level SQLI wire-format reference
|
- [`docs/PROTOCOL_NOTES.md`](https://git.supported.systems/warehack.ing/informix-db/src/branch/main/docs/PROTOCOL_NOTES.md) — byte-level SQLI wire-format reference
|
||||||
- [`docs/JDBC_NOTES.md`](docs/JDBC_NOTES.md) — index into the decompiled IBM JDBC driver, used as a clean-room reference
|
- [`docs/JDBC_NOTES.md`](https://git.supported.systems/warehack.ing/informix-db/src/branch/main/docs/JDBC_NOTES.md) — index into the decompiled IBM JDBC driver, used as a clean-room reference
|
||||||
- [`docs/DECISION_LOG.md`](docs/DECISION_LOG.md) — phase-by-phase architectural decisions, with the *why* preserved
|
- [`docs/DECISION_LOG.md`](https://git.supported.systems/warehack.ing/informix-db/src/branch/main/docs/DECISION_LOG.md) — phase-by-phase architectural decisions, with the *why* preserved
|
||||||
- [`docs/CAPTURES/`](docs/CAPTURES/) — annotated socat hex-dump captures
|
- [`docs/CAPTURES/`](https://git.supported.systems/warehack.ing/informix-db/src/branch/main/docs/CAPTURES/) — annotated socat hex-dump captures
|
||||||
|
|
||||||
Notable architectural pivots documented in the decision log:
|
Notable architectural pivots documented in the decision log:
|
||||||
- **Phase 10/11** (smart-LOB read/write): used `lotofile`/`filetoblob` SQL functions + `SQ_FILE` protocol intercept instead of the heavier `SQ_FPROUTINE` + `SQ_LODATA` stack — ~3x smaller than originally projected
|
- **Phase 10/11** (smart-LOB read/write): used `lotofile`/`filetoblob` SQL functions + `SQ_FILE` protocol intercept instead of the heavier `SQ_FPROUTINE` + `SQ_LODATA` stack — ~3x smaller than originally projected
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "informix-db"
|
name = "informix-db"
|
||||||
version = "2026.05.05.12"
|
version = "2026.05.08"
|
||||||
description = "Pure-Python driver for IBM Informix IDS — speaks the SQLI wire protocol over raw sockets. No CSDK, no JVM, no native libraries."
|
description = "Pure-Python driver for IBM Informix IDS — speaks the SQLI wire protocol over raw sockets. No CSDK, no JVM, no native libraries."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
license = { text = "MIT" }
|
license = { text = "MIT" }
|
||||||
@ -27,9 +27,11 @@ classifiers = [
|
|||||||
dependencies = []
|
dependencies = []
|
||||||
|
|
||||||
[project.urls]
|
[project.urls]
|
||||||
Homepage = "https://github.com/rsp2k/informix-db"
|
Homepage = "https://informix-db.warehack.ing"
|
||||||
Documentation = "https://github.com/rsp2k/informix-db/tree/main/docs"
|
Documentation = "https://informix-db.warehack.ing"
|
||||||
Issues = "https://github.com/rsp2k/informix-db/issues"
|
Source = "https://git.supported.systems/warehack.ing/informix-db"
|
||||||
|
Issues = "https://git.supported.systems/warehack.ing/informix-db/issues"
|
||||||
|
Changelog = "https://git.supported.systems/warehack.ing/informix-db/src/branch/main/CHANGELOG.md"
|
||||||
|
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
dev = [
|
dev = [
|
||||||
@ -49,13 +51,15 @@ packages = ["src/informix_db"]
|
|||||||
# (the wheel doesn't ship these by default, but the sdist would).
|
# (the wheel doesn't ship these by default, but the sdist would).
|
||||||
# See ~/.claude/rules/python.md for the full pre-publish PII audit playbook.
|
# See ~/.claude/rules/python.md for the full pre-publish PII audit playbook.
|
||||||
exclude = [
|
exclude = [
|
||||||
"CLAUDE.md", # operator-private context
|
"CLAUDE.md", # operator-private context
|
||||||
".env", ".env.local", ".env.*",
|
".env", ".env.local", ".env.*",
|
||||||
".mcp.json", # may contain local filesystem paths
|
".mcp.json", # may contain local filesystem paths
|
||||||
"build/", # decompiled JDBC, downloaded JARs
|
"build/", # decompiled JDBC, downloaded JARs
|
||||||
"audits/",
|
"audits/",
|
||||||
"docs/CAPTURES/", # spike artifacts; tests can re-capture against the dev container
|
"docs/**", # protocol notes / decision log / captures — go to GitHub for the depth
|
||||||
"tests/reference/", # Java reference client — spike infra
|
"docs-site/**", # Astro/Starlight site sources — published at informix-db.warehack.ing
|
||||||
|
"tests/reference/**", # Java reference client — spike infra
|
||||||
|
"tests/benchmarks/.results/**", # pytest-benchmark cache (gitignored, but still ships unless excluded)
|
||||||
".pytest_cache/", ".ruff_cache/", ".mypy_cache/",
|
".pytest_cache/", ".ruff_cache/", ".mypy_cache/",
|
||||||
"dist/", "*.egg-info/",
|
"dist/", "*.egg-info/",
|
||||||
]
|
]
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"machine_info": {
|
"machine_info": {
|
||||||
"node": "rpm-bullet",
|
"node": "PLACEHOLDER",
|
||||||
"processor": "",
|
"processor": "",
|
||||||
"machine": "x86_64",
|
"machine": "x86_64",
|
||||||
"python_compiler": "Clang 22.1.1 ",
|
"python_compiler": "Clang 22.1.1 ",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user