Skip to content

Releases: cgnl/plex-postgresql

v1.3.1

01 Apr 18:04

Choose a tag to compare

v1.3.1: fix BindAddrInUseException crash loop with subreaper wrapper

v1.3.0

01 Apr 16:54

Choose a tag to compare

v1.3.0: fix LD_PRELOAD deadlock, decltype/bad_cast, DDL routing, SQLi…

v1.2.0 — Rust-safe shim: unsafe reduction

27 Mar 23:56

Choose a tag to compare

92% unsafe reduction + memory leak fix + deadlock fixes

The shim's business logic is now Rust-safe. Unsafe is confined to the FFI boundary.

Safety

  • Raw pointer dereferences: 806 → 59 internal functions use &mut PgStmt / &mut PgConnection
  • PgStmt: pthread_mutex_tstd::sync::Mutex<()> — auto-initialized, no manual pthread
  • PgStmt: [T; 1024]Vec<T> — on-demand allocation, 540 bytes for 0-param queries (was 88KB)
  • 138 functions de-FFI'dextern "C" removed from Rust-only functions
  • 55 safe accessors for orig_sqlite3_* function pointers
  • 11 data races fixed — atomic counters, seqlocks, OnceLock, eager hook resolution

Performance

  • **Memory: PGresult leak, transaction routing, cached_result cleanup
  • **Browse 500 items: PQcancel fast path, conditional type validation
  • Lazy log macros — ~300 format!() allocations eliminated at production log levels

Reliability

  • 3 deadlocks eliminated — recursive conn mutex, ABBA prevention, convoy fix
  • Stack overflow fix — heap-allocated thread-local buffers
  • Clippy clean — zero warnings with -D warnings

Full Changelog

v1.1.0 — 100% Rust shim runtime

26 Mar 19:05

Choose a tag to compare

Pre-release

100% Rust shim runtime

The entire interpose layer is now pure Rust. All C runtime code has been eliminated.

Changed

  • Full Rust runtime — all interpose, column access, step execution, and connection management in Rust. No C object files remain.
  • Module architecture — monolithic files split into focused submodules (db_interpose_column/, db_interpose_common/, db_interpose_step/, pg_client/, pg_statement/, etc.)
  • Thread-local text buffers heap-allocated — fixes stack overflow on Plex worker threads (544K stacks)

Fixed

  • Connection mutex self-deadlockPgConnection.mutex changed to PTHREAD_MUTEX_RECURSIVE, fixing self-deadlock in metadata fetch path
  • Connection mutex convoy — reduced lock hold time in ensure_pg_result_for_metadata
  • ABBA deadlock (stmt/LOGGER) — logger uses try_lock with stderr fallback when contended
  • Double-lock on stmt mutex — lock ordering fixed across all column accessor modules
  • rusqlite 0.32 compatibility — test files updated for API changes

Stats

  • 712 tests passing
  • 246 files changed, +28K/-23K lines vs v1.0.0

Full Changelog

v1.0.0 — Rust migration complete [alpha]

22 Feb 19:57

Choose a tag to compare

v1.0.0 — Rust migration complete

The entire SQLite-to-PostgreSQL translation pipeline and all backend modules have been migrated from C to Rust.

What changed

  • SQL translator fully in Rustsqlparser-rs AST-based translation replaces the old C string-manipulation translator. 525 Rust tests.
  • PG modules migrated to hybrid C/Rust — pg_config, pg_logging, pg_mem_telemetry, shim_alloc, pg_query_cache, pg_statement, pg_client. ~550 C tests across 25 suites.
  • Docker and CI updated — Dockerfiles, build scripts, and GitHub Actions workflows now build the Rust staticlib.
  • Log level cleanup — informational pool messages demoted from ERROR to INFO, reducing log noise in production.
  • 1,075+ tests total (525 Rust + ~550 C)

Architecture

Layer 4+3: C interposer (~9,400 lines)        — fishhook, DYLD_INTERPOSE, LD_PRELOAD
Layer 2:   Rust PG modules (hybrid C/Rust)     — pool, statement, cache, config, logging
Layer 1:   Rust SQL translator (sqlparser-rs)   — full AST-based SQLite → PostgreSQL translation

Upgrading

Drop-in replacement. No configuration changes needed.

v0.9.40

22 Feb 12:32

Choose a tag to compare

fix: handle duplicate prepared statements (SQLSTATE 42P05) + DEALLOCA…

v0.9.39

22 Feb 09:46

Choose a tag to compare

v0.9.39: stale prepared statement recovery after PG restart (SQLSTATE…

v0.9.38

22 Feb 08:22

Choose a tag to compare

v0.9.38: exec retry + pre-flight reconnect (Issue #8)

v0.9.37

21 Feb 15:31

Choose a tag to compare

v0.9.37: add PLEX_PG_IDLE_TIMEOUT to all configs and docs

v0.9.36

21 Feb 14:56

Choose a tag to compare

docs: add PLEX_PG_IDLE_TIMEOUT to docs, examples, and changelog