Changes for version 0.082899_15 - 2017-10-05
- Notable Changes and Deprecations
- The entire class hierarchy now explicitly sets the 'c3' mro, even in cases where load_components was not used. Extensive testing led the maintainer believe this is safe, but this is a very complex area and reality may turn out to be different. If **ANYHTING** at all seems out of place, please file a report at once
- The unique constraint info (including the primary key columns) is no longer shared between related (class and schema-level) ResultSource instances. If your app stops working with no obvious pointers, set DBIC_ASSERT_NO_ERRONEOUS_METAINSTANCE_USE=1 to obtain extra info
- Neither exception_action() nor $SIG{__DIE__} handlers are invoked on recoverable errors. This ensures that the retry logic is fully insulated from changes in control flow, as the handlers are only invoked when an error is leaving the DBIC internals to be handled by the caller (n.b. https://github.com/PerlDancer/Dancer2/issues/1125) (also fixes the previously rejected RT#63874)
- Overrides of ResultSourceProxy-provided methods are no longer skipped silently: a one-per-callsite warning is issued any time this tricky situation is encoutered https://is.gd/dbic_rsrcproxy_methodattr
- $result->related_resultset() no longer passes extra arguments to an underlying search_rs(), as by design these arguments would be used only on the first call to ->related_resultset(), and ignored afterwards. Instead an exception (detailing the fix) is thrown.
- Change func_rs() and as_subselect_rs() to properly ignore list context (i.e. wantarray). Both were implemented broken from day 1 :/
- Increased checking for the correctness of the is_nullable attribute within the prefetch result parser may highlight previously unknown mismatches between your codebase and data source
- Calling the set_* many-to-many helper with a list (instead of an arrayref) now emits a deprecation warning
- Calling the getter $rsrc->from("argument") now throws an exception instead of silently discarding the argument
- search() calls with an empty select list are deprecated. While DBIC will still issue a SELECT * ..., it now warns given there is nothing higher up in the stack prepared to interpret the result
- New Features
- DBIC now performs a range of sanity checks on the entire hierarchy of Schema/Result/ResultSet classes loudly alerting the end user to potential extremely hard-to-diagnose pitfalls ( RT#93976, also fully addresses https://blog.afoolishmanifesto.com/posts/mros-and-you/ )
- A new low-level API for relationship resolution is available as an official method ( $rsrc->resolve_relationship_condition ). This is mainly of interest to builders of reflection tools
- InflateColumn::DateTime now accepts the ecosystem-standard option 'time_zone', in addition to the DBIC-only 'timezone' (GH#28)
- Massively optimised literal SQL snippet scanner - fixes all known slowdowns ( in some cases 50x ) of very complex prefetch/selects
- DBIx::Class::Optional::Dependencies now properly understands combinations of requirements and does the right thing with e.g. ->req_list_for([qw( rdbms_oracle ic_dt )]) bringing in the Oracle specific DateTime::Format dependencies
- Fixes
- Fix regresion (0.082800) of certain calls being presented stale result source metadata (RT#107462)
- Fix incorrect SQL generated with invalid {rows} on complex resultset operations, generally more robust handling of rows/offset attrs
- Fix silent failure to retrieve a primary key (RT#80283) or worse: returning an incorrect value (RT#115381) in case a rdbms-side autoinc column is declared as PK with the is_auto_increment attribute unset
- Fix incorrect $storage state on unexpected RDBMS disconnects and other failure events, preventing clean reconnection (RT#110429)
- Make sure exception objects stringifying to '' are properly handled and warned about (GH#15)
- Fix incorrect data returned in a corner case of partial-select HRI invocation (no known manifestations of this bug in the field, see commit message for description of exact failure scenario)
- Fix corner case of stringify-only overloaded objects being used in create()/populate()
- Fix spurious warning on MSSQL cursor invalidation retries (RT#102166)
- Fix incorrect ::Storage->_ping() behavior under Sybase (RT#114214)
- Fix some corner cases of non-fatal failures during relationship resolution showing up as hard errors
- Fix several corner cases with Many2Many over custom relationships
- Fix intermittent failure to infer the CASCADE attributes of relations during deployment_statements()/deploy()
- Fix corner cases of C3 composition being broken on OLD_MRO (5.8.x) only: https://github.com/frioux/DBIx-Class-Helpers/issues/61
- Misc
- Add explicit test for pathological example of asymmetric IC::DT setup working with copy() in t/icdt/engine_specific/sybase.t (GH#84)
- Fix t/54taint.t failing on local::lib's with upgraded Carp on 5.8.*
- Fix invalid variable names in ResultSource::View examples
- Fix missing ORDER BY leading to failures of t/prefetch/grouped.t under upcoming libsqlite (RT#117271)
- Skip tests in a way more intelligent and speedy manner when optional dependencies are missing
- Make the Optional::Dependencies error messages cpanm-friendly
- Incompatibly change values (not keys) of the hash returned by Optional::Dependencies::req_group_list (no known users in the wild)
- Stop using bare $] throughout - protects the codebase from issues similar (but likely not limited to) P5#72210
- Config::Any is no longer a core dep, but instead is migrated to a new optdep group 'config_file_reader'
Documentation
- DBIx::Class::Manual - Index of the Manual
- DBIx::Class::Manual::Component - Developing DBIx::Class Components
- DBIx::Class::Manual::Cookbook - Miscellaneous recipes
- DBIx::Class::Manual::DocMap - What documentation do we have?
- DBIx::Class::Manual::Example - Simple CD database example
- DBIx::Class::Manual::FAQ - Frequently Asked Questions (in theory)
- DBIx::Class::Manual::Features - A boatload of DBIx::Class features with links to respective documentation
- DBIx::Class::Manual::Glossary - Clarification of terms used.
- DBIx::Class::Manual::Intro - Introduction to DBIx::Class
- DBIx::Class::Manual::Joining - Manual on joining tables with DBIx::Class
- DBIx::Class::Manual::QuickStart - up and running with DBIC in 10 minutes
- DBIx::Class::Manual::Reading - How to read and write DBIx::Class POD.
- DBIx::Class::Manual::ResultClass - Representing a single result (row) from a DB query
- DBIx::Class::Manual::Troubleshooting - Got a problem? Shoot it.
- DBIx::Class::Storage::DBI::Replicated::Introduction - Minimum Need to Know
- dbicadmin - utility for administrating DBIx::Class schemata
Modules
- DBIx::Class - Extensible and flexible object <-> relational mapper.
- DBIx::Class::AccessorGroup - See Class::Accessor::Grouped
- DBIx::Class::Admin - Administration object for schemas
- DBIx::Class::CDBICompat - Class::DBI Compatibility layer.
- DBIx::Class::Carp - Provides advanced Carp::Clan-like warning functions for DBIx::Class internals
- DBIx::Class::Core - Core set of DBIx::Class modules
- DBIx::Class::Cursor - Abstract object representing a query cursor on a resultset.
- DBIx::Class::DB - (DEPRECATED) classdata schema component
- DBIx::Class::Exception - Exception objects for DBIx::Class
- DBIx::Class::FilterColumn - Automatically convert column data
- DBIx::Class::InflateColumn - Automatically create references from column data
- DBIx::Class::InflateColumn::DateTime - Auto-create DateTime objects from date and datetime columns.
- DBIx::Class::InflateColumn::File - DEPRECATED (superseded by DBIx::Class::InflateColumn::FS)
- DBIx::Class::MethodAttributes - DBIC-specific handling of CODE attributes
- DBIx::Class::Optional::Dependencies - Optional module dependency specifications (for module authors) EOC
- DBIx::Class::Ordered - Modify the position of objects in an ordered list.
- DBIx::Class::PK - Primary Key class
- DBIx::Class::PK::Auto - Automatic primary key class
- DBIx::Class::Relationship - Inter-table relationships
- DBIx::Class::Relationship::Base - Inter-table relationships
- DBIx::Class::ResultClass::HashRefInflator - Get raw hashrefs from a resultset
- DBIx::Class::ResultSet - Represents a query used for fetching a set of results.
- DBIx::Class::ResultSetColumn - helpful methods for messing with a single column of the resultset
- DBIx::Class::ResultSetManager - scheduled for deletion in 09000
- DBIx::Class::ResultSource - Result source object
- DBIx::Class::ResultSource::Table - Table object
- DBIx::Class::ResultSource::View - ResultSource object representing a view
- DBIx::Class::ResultSourceHandle - Serializable pointers to ResultSource instances
- DBIx::Class::ResultSourceProxy::Table - provides a classdata table object and method proxies
- DBIx::Class::Row - Basic row methods
- DBIx::Class::SQLMaker - An SQL::Abstract-based SQL maker class
- DBIx::Class::SQLMaker::LimitDialects - SQL::Abstract::Limit-like functionality for DBIx::Class::SQLMaker
- DBIx::Class::SQLMaker::OracleJoins - Pre-ANSI Joins-via-Where-Clause Syntax
- DBIx::Class::Schema - composable schemas
- DBIx::Class::Schema::SanityChecker - Extensible "critic" for your Schema class hierarchy
- DBIx::Class::Schema::Versioned - DBIx::Class::Schema plugin for Schema upgrades
- DBIx::Class::Serialize::Storable - hooks for Storable nfreeze/thaw
- DBIx::Class::StartupCheck - Run environment checks on startup
- DBIx::Class::Storage - Generic Storage Handler
- DBIx::Class::Storage::BlockRunner - Try running a block of code until success with a configurable retry logic
- DBIx::Class::Storage::DBI - DBI storage handler
- DBIx::Class::Storage::DBI::ACCESS - Support specific to MS Access
- DBIx::Class::Storage::DBI::ADO - Support for DBD::ADO
- DBIx::Class::Storage::DBI::ADO::MS_Jet - Support for MS Access over ADO
- DBIx::Class::Storage::DBI::ADO::MS_Jet::Cursor - GUID Support for MS Access over ADO
- DBIx::Class::Storage::DBI::ADO::Microsoft_SQL_Server - Support for Microsoft SQL Server via DBD::ADO
- DBIx::Class::Storage::DBI::ADO::Microsoft_SQL_Server::Cursor - Remove trailing NULLs in binary data and normalize GUIDs for MSSQL over ADO
- DBIx::Class::Storage::DBI::AutoCast - Storage component for RDBMS requiring explicit placeholder typing
- DBIx::Class::Storage::DBI::Cursor - Object representing a query cursor on a resultset.
- DBIx::Class::Storage::DBI::DB2 - IBM DB2 support for DBIx::Class
- DBIx::Class::Storage::DBI::Firebird - Driver for the Firebird RDBMS via DBD::Firebird
- DBIx::Class::Storage::DBI::Firebird::Common - Driver Base Class for the Firebird RDBMS
- DBIx::Class::Storage::DBI::IdentityInsert - Storage Component for Sybase ASE and MSSQL for Identity Inserts / Updates
- DBIx::Class::Storage::DBI::Informix - Base Storage Class for Informix Support
- DBIx::Class::Storage::DBI::InterBase - Driver for the Firebird RDBMS via DBD::InterBase
- DBIx::Class::Storage::DBI::MSSQL - Base Class for Microsoft SQL Server support in DBIx::Class
- DBIx::Class::Storage::DBI::NoBindVars - Sometime DBDs have poor to no support for bind variables
- DBIx::Class::Storage::DBI::ODBC - Base class for ODBC drivers
- DBIx::Class::Storage::DBI::ODBC::ACCESS - Support specific to MS Access over ODBC
- DBIx::Class::Storage::DBI::ODBC::DB2_400_SQL - Support specific to DB2/400 over ODBC
- DBIx::Class::Storage::DBI::ODBC::Firebird - Driver for using the Firebird RDBMS through ODBC
- DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server - Support specific to Microsoft SQL Server over ODBC
- DBIx::Class::Storage::DBI::ODBC::SQL_Anywhere - Driver for using Sybase SQL Anywhere through ODBC
- DBIx::Class::Storage::DBI::Oracle - Base class for Oracle driver
- DBIx::Class::Storage::DBI::Oracle::Generic - Oracle Support for DBIx::Class
- DBIx::Class::Storage::DBI::Oracle::WhereJoins - Oracle joins in WHERE syntax support (instead of ANSI).
- DBIx::Class::Storage::DBI::Pg - Automatic primary key class for PostgreSQL
- DBIx::Class::Storage::DBI::Replicated - BETA Replicated database support
- DBIx::Class::Storage::DBI::Replicated::Balancer - A Software Load Balancer
- DBIx::Class::Storage::DBI::Replicated::Balancer::First - Just get the First Balancer
- DBIx::Class::Storage::DBI::Replicated::Balancer::Random - A 'random' Balancer
- DBIx::Class::Storage::DBI::Replicated::Pool - Manage a pool of replicants
- DBIx::Class::Storage::DBI::Replicated::Replicant - A replicated DBI Storage Role
- DBIx::Class::Storage::DBI::Replicated::WithDSN - A DBI Storage Role with DSN information in trace output
- DBIx::Class::Storage::DBI::SQLAnywhere - Driver for SQL Anywhere
- DBIx::Class::Storage::DBI::SQLAnywhere::Cursor - GUID Support for SQL Anywhere over DBD::SQLAnywhere
- DBIx::Class::Storage::DBI::SQLite - Automatic primary key class for SQLite
- DBIx::Class::Storage::DBI::Sybase - Base class for drivers using DBD::Sybase
- DBIx::Class::Storage::DBI::Sybase::ASE - Sybase ASE SQL Server support for DBIx::Class
- DBIx::Class::Storage::DBI::Sybase::ASE::NoBindVars - Storage::DBI subclass for Sybase ASE without placeholder support
- DBIx::Class::Storage::DBI::Sybase::FreeTDS - Base class for drivers using DBD::Sybase over FreeTDS.
- DBIx::Class::Storage::DBI::Sybase::MSSQL - (DEPRECATED) Legacy storage class for MSSQL via DBD::Sybase
- DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server - Support for Microsoft SQL Server via DBD::Sybase
- DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::NoBindVars - Support for Microsoft SQL Server via DBD::Sybase without placeholders
- DBIx::Class::Storage::DBI::UniqueIdentifier - Storage component for RDBMSes supporting GUID types
- DBIx::Class::Storage::DBI::mysql - Storage::DBI class implementing MySQL specifics
- DBIx::Class::Storage::Statistics - SQL Statistics
- DBIx::Class::Storage::TxnScopeGuard - Scope-based transaction handling
- DBIx::Class::UTF8Columns - Force UTF8 (Unicode) flag on columns (DEPRECATED)
- SQL::Translator::Parser::DBIx::Class - Create a SQL::Translator schema from a DBIx::Class::Schema instance
- SQL::Translator::Producer::DBIx::Class::File - DBIx::Class file producer
Examples
- examples/Benchmarks/benchmark_datafetch.pl
- examples/Benchmarks/benchmark_hashrefinflator.pl
- examples/Benchmarks/benchmark_join_optimizer.pl
- examples/Benchmarks/semicolon_vs_comma_rowparser/comma.src
- examples/Benchmarks/semicolon_vs_comma_rowparser/semicol.src
- examples/Benchmarks/semicolon_vs_comma_rowparser/sloppy_bench.pl
- examples/MiscTools/determine_cpan_joint_deps.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/db/example.db
- examples/Schema/db/example.sql
- examples/Schema/insertdb.pl
- examples/Schema/testdb.pl