NAME DBIx::AnyDBD - DBD independant class DESCRIPTION This class provides application developers with an abstraction class a level away from DBI, that allows them to write an application that works on multiple database platforms. The idea isn't to take away the responsibility for coding different SQL on different platforms, but to simply provide a platform that uses the right class at the right time for whatever DB is currently in use. SYNOPSIS use DBIx::AnyDBD; my $db = DBIx::AnyDBD->connect("dbi:Oracle:sid1", "user", "pass", {}, "MyClass"); my $foo = $db->foo; my $blee = $db->blee; That doesn't really tell you much... Because you have to implement a bit more than that. Underneath you have to have a module MyClass::Oracle that has methods foo() and blee in it. If those methods don't exist in MyClass::Oracle, it will check in MyClass::Default, allowing you to implement code that doesn't need to be driver dependant in the same module. The foo() and blee() methods will recieve the DBIx::AnyDBD instance as thier first parameter, and any parameters you pass just go as parameters. See the example Default.pm and Sybase.pm classes in the AnyDBD directory for an example. Implementation Underneath it's all implemented using the ISA hierarchy, which is modified when you connect to your database. The inheritance tree ensures that the right functions get called at the right time. There is also an AUTOLOADer that steps in if the function doesn't exist and tries to call the function on the database handle (i.e. in the DBI class). The sub-classing uses `ucfirst($dbh-'{Driver}->{Name})> (along with some clever fiddling for ODBC and ADO) to get the super-class, so if you don't know what to name your class (see the list below first) then check that. API new( ... ) dsn => $dsn, user => $user, pass => $pass, attr => $attr, package => $package new() is a named parameter call that connects and creates a new db object for your use. The named parameters are dsn, user, pass, attr and package. The first 4 are just the parameters passed to DBI->connect, and package contains the package prefix for your database dependant modules, for example, if package was "MyPackage", the AUTOLOADer would look for MyPackage::Oracle::func, and then MyPackage::Default::func. Beware that the DBD driver will be ucfirst'ed, because lower case package names are reserved as pragmas in perl. See the known DBD package mappings below. If attr is undefined then the default attributes are: AutoCommit => 1 PrintError => 0 RaiseError => 1 So be aware if you don't want your application dying to either eval{} all db sections and catch the exception, or pass in a different attr parameter. connect($dsn, $user, $pass, $attr, $package) connect() is very similar to DBI->connect, taking exactly the same first 4 parameters. The 5th parameter is the package prefix, as above. connect() doesn't try and default attributes for you if you don't pass them. $db->get_dbh() This method is mainly for the DB dependant modules to use, it returns the underlying DBI database handle. There will probably have code added here to check the db is still connected, so it may be wise to always use this method rather than trying to retrieve $self->{dbh} directly. Known DBD Package Mappings The following are the known DBD driver name mappings, including ucfirst'ing them: DBD::Oracle => Oracle.pm DBD::Sybase => Sybase.pm DBD::Pg => Pg.pm DBD::mysql => Mysql.pm DBD::Informix => Informix.pm If you use this on other platforms, let me know what the mappings are. ODBC ODBC needed special support, so when run with DBD::ODBC, we call GetInfo to find out what database we're connecting to, and then map to a known package. The following are the known package mappings for ODBC: Microsoft SQL Server (7.0 and MSDE) => MSSQL.pm Microsoft SQL Server (6.5 and below) => Sybase.pm (sorry!) Sybase (ASE and ASA) => Sybase.pm Microsoft Access => Access.pm Informix => Informix.pm Oracle => Oracle.pm Anything that isn't listed above will get mapped using the following rule: Get rdbms name using: $dbh->func(17, GetInfo); Change whitespace to a single underscore Add .pm on the end. So if you need to know what your particular database will map to, simply run the $dbh->func(17, GetInfo) method to find out. ODBC also inserts `$package::ODBC.pm' into the hierarchy if it exists, so the hierarchy will look like: DBIx::AnyDBD <= ODBC.pm <= Informix.pm (given that the database you're connecting to would be Informix). This is useful because ODBC provides its own SQL abstraction layer. ADO ADO uses the same semantics as ODBC for determining the right driver or module to load. However in extension to that, it inserts an ADO.pm into the inheritance hierarchy if it exists, so the hierarchy would look like: DBIx::AnyDBD <= ODBC.pm <= ADO.pm <= Informix.pm I do understand that this is not fundamentally correct, as not all ADO connections go through ODBC, but if you're doing some of that funky stuff with ADO (such as queries on MS Index Server) then you're not likely to need this module! LICENCE This module is free software, and you may distribute it under the same terms as Perl itself. SUPPORT Commercial support for this module is available on a pay per incident basis from Fastnet Software Ltd. Contact matt@sergeant.org for further details. Alternatively join the DBI-Users mailing list, where I'll help you out for free!