Changes for version 0.900005 - 2026-11-13
- Added
- DBIO::Test::Slow marks a test file as slow: with it loaded after Test::More, the file is skipped when DBIO_TEST_FAST is true, unless RELEASE_TESTING or AUTOMATED_TESTING is true, which always runs the full suite.
- Changed
- InflateColumn::DateTime gives every column type its own channel: a column asking for inflation (inflate_datetime, inflate_timestamp, inflate_date) whose data_type is not date, datetime, timestamp or one of their listed variants goes to parse_<type>/format_<type> of the storage's datetime parser (datetime2(7) to datetime2, time with time zone to time_with_time_zone), each direction on its own. Where the parser lacks the method, inflate_date uses parse_date/format_date and any other request parse_datetime/format_datetime.
- InflateColumn::DateTime inflates a date read through the date channel to the calendar day the parser read, floating at 12:00:00 instead of midnight, whatever time and zone the parser returned, so that the calendar day survives the conversion to the column's timezone. Writing through the date channel does not convert to the column's timezone: the calendar day of the value in its own time zone is written (2026-10-25 00:30 Europe/Berlin into a date column with timezone UTC writes 2026-10-25), and the caller's DateTime object is not changed.
- A storage whose date type carries a time of day, as Oracle's DATE does, says so with datetime_date_carries_time (DBIO::Storage::DBI); its date columns keep the time they are read and written with and follow the column's timezone like a datetime.
- InflateColumn::DateTime leaves a time of day (time, time without time zone, time with time zone, timetz) a string unless inflate_datetime or inflate_timestamp asks for it. Asked for, the column goes to the channel of its type, then to parse_time/format_time (for a type with a zone to parse_timetz/format_timetz), then to the core's own reader and writer for HH:MM:SS[.fraction] (with Z, +HH or +HH:MM for a type with a zone); it never falls back to parse_datetime/format_datetime. The inflated value stands on 1970-01-01, is floating without a zone and keeps the offset it was read with as a fixed offset with one, and is not converted to the column's timezone, neither read nor written. Writing uses the time in the value's own zone and leaves the caller's object as it is; a floating value in a column with a zone is written without an offset.
- InflateColumn::DateTime converts a copy of a value to the column's timezone when writing; the caller's DateTime object keeps its zone and locale.
- A driver declares a pending refusal in DBIO::Test::Conformance (conformance_refusals, conformance_refused_areas) and a transport a pending deviation in DBIO::Test::AsyncParity (parity_deviations) with kind => 'pending' and a reason regex saying why; the declaration has no card field, the closing line of a run names each case or area and its kind, and the cases carry no cards field.
- Fixes
- An exception or carp message raised from DBIO names the place of the caller outside DBIO ("at FILE line N") also when only skipped frames (eval, anonymous subs, Try::Tiny blocks) lie between that caller and DBIO, e.g. a callback run by a future; the full stack trace is given only when there is no such place.
- dbiogen never prints the connect info's password when the connect itself dies, e.g. for a DSN without a dbi:<driver>: prefix; every failed connect is reported as 'Could not connect to database' with the password masked.
- DBIO::Test::AsyncHarness->await works where Time::HiRes::alarm is not implemented (Windows), using perl's alarm in whole seconds rounded up.
- DBIO::Test::AsyncHarness->await lets an outer alarm due before the timeout fire on systems that deliver the signal late (BSD, macOS): it takes the alarm off the clock only once it has fired (its handler has run), with no fixed waiting time. A DEFAULT alarm is left untouched, an IGNOREd one counts as fired when it is due, and a ceiling ends the wait if the signal never comes. It also does not take a negative remaining time (Cygwin) for a running alarm, and sees an alarm set with perl's alarm where that is a separate timer (Solaris).
- maint/test-runner/check-ways masks passwords in the DSNs and connect errors it prints.
- DBIO::Test::Conformance copies its case lists without Storable::dclone, so they load on Perl before 5.28 where Storable cannot store a Regexp; new DBIO::Util::deep_copy.
- Extension input verification compares the value an extension can see (including Regexp, code references and objects) instead of Storable's byte image, so reading a value in another context no longer reports a changed input.
- Stack traces built by DBIO::Util name the last-read handle of a chunk read only where the running Carp does, so they match Carp's own on older perls.
- InflateColumn::Serializer::YAML requires YAML 1.25 and dies at load with an older YAML, instead of returning blessed objects.
- Extension option and result comparison share one value form, DBIO::Util::canonical_text: the same code reference declared twice no longer dies in Storable, a Regexp compares by pattern and flags, and 4326 equals '4326'.
- Core requires Carp 1.38, so stack traces built by DBIO::Util show the same number of arguments as Carp (older Carp shows one more than $Carp::MaxArgNums).
- The async pool runs with Future::XS installed as it does with Future::PP: the connection handed over once it is ready no longer lets go of the Future whose callback is running.
- A transaction cancelled through its coderef's Future settles once with Future::XS installed: a cancel does not cancel its own Future a second time.
- DBIO::Test::Future has set_udata and udata like Future.pm, so tests can lay data on a Future that is no hash.
- Tests
- TestDBIO::Child gives the child's output with \n as line end on every platform, as on Linux.
- The dbiogen and dbioadmin script tests run without a shell, and the execute-bit and 0600 trace-file checks skip on Windows, which has no Unix file modes.
- The live-preflight test skips itself where the host does not start PATH shebang scripts (the kubectl and ip stubs), and the password-options test passes its JSON arguments through a launcher that keeps their quotation marks (Windows).
- The capped-test test for a missing CPU quota accepts both host forms of the message (cpu.max "is max 100000" or "is not readable").
- The test suite runs on Windows with Strawberry Perl from 5.20 like on Linux: test child perls start through TestDBIO::Child (open3, script file, output in a file, time limit by polling), with no list-form pipe open, no timeout command and no multi-line -e. DBIO::Test::AsyncHarness::await ends a wait by the clock in its own loop where the platform delivers the alarm late; its POD says an outer alarm cannot be borrowed where perl's alarm reports no time left (Windows). The late-timer test is skipped where Time::HiRes::alarm is unimplemented.
- Documentation
- The agent skills, house rules and agents state the current Conformance areas (DDL, Diff, Bind), skipping a test on a missing capability, value-free error texts, the coordinated version step, and that release, tag and push wait for the maintainer's go; the DBIO::SQLMaker::ClassicExtensions POD says how an upsert condition renders without a table.
- The live-testing reference of the dbio-driver-development skill names the short form dbio-db env <db> the driver skills use.
- Dependencies
- Requires DBI 1.634, the floor the driver dists ask for.
Documentation
List or deploy the DBIO agent skills available to your app
CLI for DBIO schema administration
Dump a database schema to DBIO Result classes
Index of the Manual
Writing an async-capable storage backend for DBIO
Developing DBIO Components
Miscellaneous recipes
Guide to the DBIO documentation set
Simple CD database example
Frequently Asked Questions (in theory)
Feature overview with links to the relevant DBIO documentation
Clarification of terms used.
Everything that changed from DBIx::Class to DBIO
Introduction to DBIO
Manual on joining tables with DBIO
Step-by-step guide for migrating an existing DBIx::Class codebase to DBIO
Up and running with DBIO in 10 minutes
Conventions for reading and writing DBIO POD
Representing a single result (row) from a DB query
Troubleshooting common DBIO problems
Run DBIO tests against Kubernetes-provisioned databases
Modules
Native relational mapping for Perl, built on DBI
Credential lifecycle for DBIO connections
One credential identity pinned to one host
One fixed set of connection parameters as an AccessBroker
Credential rotation with TTL
per-driver base->native column type resolver (one-way)
Lightweight schema administration helper for DBIO
Meta-infrastructure base for all DBIO internal classes
DDL-like DSL for defining DBIO result classes
Sugar syntax for defining DBIO result classes
Create sugar for DBIO components
Error reporting utilities for DBIO
Row-level change tracking component
ResultSource definition for per-source changelog tables
Schema-level change tracking component
ResultSource definition for the changelog_set table
Shared utilities for changelog table source definitions
Component loading and management for DBIO
Standard base class for DBIO result classes
Abstract object representing a query cursor on a resultset.
Base class for DBIO driver deploy orchestrators
Deploy base for drivers that diff against a temporary database
Extensible DBIO deployment
Parent class for DeploymentHandlers
Native DBIO driver deploy (no SQL::Translator needed)
Interface for deploy methods
Interface for version storage methods
Interface for version methods
Obvious version progressions
Standard version storage implementation
Attach this component to your schema to ensure you stay up to date
The typical way to store versions in the database
The typical way to query versions in the database
Base class for DBIO driver diff orchestrators
Engine-agnostic comparison helpers for DBIO diff operations
Base class for DBIO driver diff operation objects
One-way encode selected columns: passwords with Bcrypt or Argon2, tokens with Digest
Exception objects for DBIO
A refusal by the database server, with its SQLSTATE
Base class of a database extension (PostGIS, AGE, pgvector, ...) known to deploy, introspection and diff
The declared list of database extensions of a schema, resolved to classes
Runs the phases of the extension interface over the active extensions and merges their answers
Automatically convert column data
Future interface contract for async DBIO operations
Dependency-free immediate Future for DBIO's 'immediate' async mode
Driver-agnostic Result class generator for DBIO
Relationship inference for DBIO::Generate
DBIO::Cake DSL emitter for DBIO::Generate
DBIO::Candy DSL emitter for DBIO::Generate
Moo-style emitter for DBIO::Generate
Moose-style emitter for DBIO::Generate
Vanilla-style Result class emitter for DBIO::Generate
Safe Perl-literal emission helpers for DBIO::Generate styles
Accessor methods for serialized hash columns
Automatically create references from column data
Auto-create DateTime objects from date and datetime columns.
Inflators to serialize data structures for DBIO
JSON Inflator
MessagePack Inflator
YAML Inflator
Base class for DBIO driver introspectors
DBI-based introspection via standard metadata APIs
Enable Moo attributes in DBIO result classes
Enable Moose attributes in DBIO result classes
Optional dependency declarations for DBIO
Maintain a position column over an ordered list of rows
Primary Key class
Automatic primary key class (compatibility shim)
Enhanced populate with cross-source references
Relationship declaration helpers for DBIO result classes
Inter-table relationships
Declare a foreign-key relationship to a parent row
Cascade delete and update actions across relationships
Schema-time relationship method synthesis (accessors and proxies)
Declare a one-to-many relationship
Declare a one-to-one relationship
Load all standard relationship declaration components
Declare a many-to-many relationship via a bridge table
Replicated storage support for DBIO
Wrapper base class for replicated backends
Master backend wrapper
Replicant backend wrapper
Base class for replicated read balancing
Always use the first active replicant
Randomly choose an active replicant
Prefix trace output with replicated backend identity
Manage a pool of replicant backends
Replicated DBI storage coordinator
Get raw hashrefs from a resultset
Lazy query object for fetching and manipulating DBIO rows
help when paging through sets of results
Convenience wrapper for working with a single ResultSet column
Metadata object describing a table, view, or query source
Build row-inflating parsers from result source metadata
Assemble row-parser source code for simple and collapsing queries
Table object
ResultSource object representing a view
Proxy result source methods onto a result class
Basic row methods
Shared SQL utility functions for DBIO
An SQL::Abstract-based SQL maker class
Class containing generic enhancements to SQL::Abstract
Schema class and connection container for DBIO applications
compile a base-type schema into one engine's native target model
portable base-type vocabulary for multi-engine schemas
Runtime access to the AI agent skills bundled with DBIO
Generic Storage Handler
Base class for async storage implementations
Generic pinned-connection context for async pipeline batches
Generic pinned-connection context for async transactions
Execute code blocks with transaction wrapping and retry logic
Runtime C3 composition of storage extension layers over a base storage class
DBI storage handler
DBI-specific AccessBroker integration for DBIO storage
Storage component for RDBMS requiring explicit placeholder typing
Three-tier capability probing for DBI storage drivers
Object representing a query cursor on a resultset.
Native data type and LOB classification helpers for DBI storage
Storage Component for Sybase ASE and MSSQL for Identity Inserts / Updates
Some DBDs have poor to no support for bind variables
Base class for ODBC drivers
Storage component for RDBMSes supporting GUID types
Strptime-backed datetime format base for driver format classes
Pretty Tracing DebugObj
Abstract connection pool interface for async storage
Shared connection pool mechanics for async DBIO drivers
SQL analysis and query rewrite utilities
SQL Statistics
Scope-based transaction handling
Test utilities for DBIO and DBIO driver distributions
Parameterised live harness base for DBIO async transports
The same ResultSet operations, synchronous and asynchronous, on one database, compared
The case table of DBIO::Test::AsyncParity: ResultSet operations, once synchronous and once asynchronous
Base class for DBIO test Result classes
Base class for DBIO test ResultSet classes
Shared case table runner: a driver answers every case: correctly, by refusing, or by a declared deviation
The shared Bind cases every DBIO driver answers
The shared DDL cases every DBIO driver answers
The shared Diff cases every DBIO driver answers
The shared cases for names a driver writes as identifiers: schema, extension, load library
Test cursor subclass for DBIO storage testing
Minimal datetime parser for DBIO offline test storage
Test component for sqlt_deploy_hook testing
Test result class for dynamic foreign column resolution
Test result class for dynamic foreign column joining
Test component that fails to load due to missing true value
Commutativity test for a set of database extension classes (ADR 0066)
Test component for ensure_class_loaded testing
Test class for foreign component loading
Test component loaded as a foreign component
Manually settled Future for deterministic DBIO tests
Provision temporary database pods in Kubernetes for DBIO testing
Test schema with Moo + DBIO::Cake result classes
Moo + Cake test result class for the artist table
Moo + Cake test result class for the cd table (no custom ResultSet)
Custom Moo-based ResultSet for the MooCake artist source
Test schema with Moo-enabled result classes
Moo-enabled test result class for the artist table
Moo-enabled test result class for the cd table
Custom Moo-based ResultSet for the artist source
Test schema with Moose-enabled result classes
Moose-enabled test result class for the artist table
Moose-enabled test result class for the cd table
Custom Moose-based ResultSet for the artist source
Test schema with Moose + DBIO::Cake result classes
Moose + Cake test result class for the artist table
Moose + Cake test result class for the cd table (no custom ResultSet)
Custom Moose-based ResultSet for the MooseSugar artist source
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test fixture for namespace resolution
Test component for optional component loading
Test schema for ResultSetManager component testing
Test result class for ResultSetManager component testing
Test SQLMaker subclass with select call counting
SQL statement tracing object for test diagnostics
Standard test schema for the DBIO ecosystem
Test result class for the artist table
Test result class for the artist_guid table (UNIQUEIDENTIFIER PK)
Test result class for custom source name on the artist table
Test result subclass of the artist table
Test result class for the artist_undirected_map table
Test result class for the cd_artwork table
Test result class for the artwork_to_artist table
Test result class for the bindtype_test table
Test result class for the bookmark table
Test result class for the books table
Test result class for the cd table
Test result class for the cd_to_producer table
Test result class for the collection table
Test result class for the collection_object table
Test result class for the computed_column_test table
Test result class using a custom SQL query as source
Test result class for the dummy table
Test result class for the employee table with ordering
Test result class for the encoded table
Test result class for the event table with datetime inflation
Test result class for the event_small_dt table with smalldatetime inflation
Test result class for the forceforeign table
Test result class for the fourkeys table
Test result class for the fourkeys_to_twokeys table
Test result class for the genre table
Test result class for the images table
Test result class for the liner_notes table
Test result class for the link table
Test result class for the lyric_versions table
Test result class for the lyrics table
Test result class for the money_test table (MONEY column)
Test result class for a table with no primary key
Test non-result class for load_classes error testing
Test result class for the onekey table
Test result class for the owners table
Test result class for the producer table
Test result class for columns with punctuated names
Test schema using DBIO::Cake syntax
Test Cake result class for the artist table
Test Cake result class for the cd table
Test result class for the self_ref table
Test result class for the self_ref_alias table
Test result class for the serialized table
Test result class for the tags table
Test result class for timestamp primary key handling
Test result class for the track table
Test result class for the treelike table
Test result class for the twokeytreelike table
Test result class for the twokeys table
Test result class for the typed_object table
Test virtual view result class for 1999 CDs
Test virtual view result class for 2000 CDs
Mark a test file as slow so DBIO_TEST_FAST skips it
Fake storage for testing SQL generation without a database
Structural contract check for DBIO storage-extension components and layers
Test component with intentional syntax error
Test component with intentional syntax error
Test component with intentional syntax error
Test class for taint mode with auto-loading
Test class for taint mode with manual loading
Test result class for taint mode namespace loading
Utility functions for DBIO test suite
Memory leak detection and tracing for DBIO tests
Override CORE::GLOBAL::require for testing
RAII guard that restores the umask on scope exit
Automatically set and update timestamp columns
Automatically populate UUID columns on insert
Internal utility functions for DBIO
Bring your own database magic!
Provides
in lib/DBIO/Storage/DBI/NoBindVars.pm
Examples
- examples/Benchmarks/benchmark_datafetch.pl
- examples/Benchmarks/benchmark_hashrefinflator.pl
- examples/Schema/MyApp/Schema.pm
- examples/Schema/MyApp/Schema/Result/Artist.pm
- examples/Schema/MyApp/Schema/Result/Cd.pm
- examples/Schema/MyApp/Schema/Result/Track.pm
- examples/Schema/MyApp/SchemaCake.pm
- examples/Schema/MyApp/SchemaCake/Result/Artist.pm
- examples/Schema/MyApp/SchemaCake/Result/Cd.pm
- examples/Schema/MyApp/SchemaCake/Result/Track.pm
- examples/Schema/MyApp/SchemaCandy.pm
- examples/Schema/MyApp/SchemaCandy/Result/Artist.pm
- examples/Schema/MyApp/SchemaCandy/Result/Cd.pm
- examples/Schema/MyApp/SchemaCandy/Result/Track.pm
- examples/Schema/MyApp/SchemaVanilla.pm
- examples/Schema/MyApp/SchemaVanilla/Result/Artist.pm
- examples/Schema/MyApp/SchemaVanilla/Result/Cd.pm
- examples/Schema/MyApp/SchemaVanilla/Result/Track.pm
- examples/Schema/insertdb.pl
- examples/Schema/testdb.pl