info > DBI::DBD::SqlEngine::Developers

```html

DBI::DBD::SqlEngine::Developers(3pm)

📛 NAME

DBI::DBD::SqlEngine::Developers - Developers documentation for DBI::DBD::SqlEngine

🚀 Quick Reference

Use CaseCommand / MethodDescription
🧩 Base your DBD on SqlEngineuse base qw(DBI::DBD::SqlEngine);Inherit driver from SqlEngine
🔧 Override driver connectionsub driver { ... }Customize initialization
📋 Define valid attributessub init_valid_attributes { ... }Set allowed dbh attributes
⚙️ Set default attributessub init_default_attributes { ... }Initialize defaults (multi-phase)
📊 Provide version infosub set_versions { ... }Set f_version, sql_version, etc.
📁 Open table datasub open_data { ... }Open storage for table
🔍 Fetch rowsub fetch_row { ... }Retrieve next row from table
✏️ Update rowsub update_current_row { ... }Optimize SQL engine updates
🗑️ Delete rowsub delete_current_row { ... }Optimize SQL engine deletes
📝 Quote strings$dbh->quote($string)Safe SQL quoting

📖 SYNOPSIS

package DBD::myDriver;

use base qw(DBI::DBD::SqlEngine);

sub driver
{
    ...
    my $drh = $proto->SUPER::driver($attr);
    ...
    return $drh->{class};
}

sub CLONE { ... }

package DBD::myDriver::dr;

@ISA = qw(DBI::DBD::SqlEngine::dr);

sub data_sources { ... }
...

package DBD::myDriver::db;

@ISA = qw(DBI::DBD::SqlEngine::db);

sub init_valid_attributes { ... }
sub init_default_attributes { ... }
sub set_versions { ... }
sub validate_STORE_attr { my ($dbh, $attrib, $value) = @_; ... }
sub validate_FETCH_attr { my ($dbh, $attrib) = @_; ... }
sub get_myd_versions { ... }
sub get_avail_tables { ... }

package DBD::myDriver::st;

@ISA = qw(DBI::DBD::SqlEngine::st);

sub FETCH { ... }
sub STORE { ... }

package DBD::myDriver::Statement;

@ISA = qw(DBI::DBD::SqlEngine::Statement);

sub open_table { ... }

package DBD::myDriver::Table;

@ISA = qw(DBI::DBD::SqlEngine::Table);

my %reset_on_modify = (
                        myd_abc => "myd_foo",
                        myd_mno => "myd_bar",
                      );
__PACKAGE__->register_reset_on_modify( \%reset_on_modify );
my %compat_map = (
                  abc => 'foo_abc',
                  xyz => 'foo_xyz',
                );
__PACKAGE__->register_compat_map( \%compat_map );

sub bootstrap_table_meta { ... }
sub init_table_meta { ... }
sub table_meta_attr_changed { ... }
sub open_data { ... }

sub new { ... }

sub fetch_row { ... }
sub push_row { ... }
sub push_names { ... }
sub seek { ... }
sub truncate { ... }
sub drop { ... }

# optimize the SQL engine by add one or more of
sub update_current_row { ... }
# or
sub update_specific_row { ... }
# or
sub update_one_row { ... }
# or
sub insert_new_row { ... }
# or
sub delete_current_row { ... }
# or
sub delete_one_row { ... }

📝 DESCRIPTION

This document describes the interface of DBI::DBD::SqlEngine for DBD developers who write DBI::DBD::SqlEngine based DBI drivers. It supplements DBI::DBD and DBI::DBD::SqlEngine::HowTo, which you should read first.

📂 CLASSES

Each DBI driver must provide a package global "driver" method and three DBI related classes:

📦 DBI::DBD::SqlEngine::dr

Driver package, contains the methods DBI calls indirectly via DBI interface:

DBI->connect ('DBI:DBM:', undef, undef, {})

# invokes
package DBD::DBM::dr;
@DBD::DBM::dr::ISA = qw(DBI::DBD::SqlEngine::dr);

sub connect ($$;$$$)
{
    ...
}

Similar for data_sources () and disconnect_all().

Pure Perl DBI drivers derived from DBI::DBD::SqlEngine usually don't need to override any of the methods provided through the DBD::XXX::dr package. However if you need additional initialization not fitting in init_valid_attributes() and init_default_attributes() of your ::db class, the connect method might be the final place to be modified.

📦 DBI::DBD::SqlEngine::db

Contains the methods which are called through DBI database handles ($dbh). e.g.,

$sth = $dbh->prepare ("select * from foo");
# returns the f_encoding setting for table foo
$dbh->csv_get_meta ("foo", "f_encoding");

DBI::DBD::SqlEngine provides the typical methods required here. Developers who write DBI drivers based on DBI::DBD::SqlEngine need to override the methods set_versions and init_valid_attributes.

📦 DBI::DBD::SqlEngine::TieMeta

Provides the tie-magic for $dbh->{$drv_pfx . "_meta"}. Routes STORE through $drv->set_sql_engine_meta() and FETCH through $drv->get_sql_engine_meta(). DELETE is not supported, you have to execute a DROP TABLE statement, where applicable.

📦 DBI::DBD::SqlEngine::TieTables

Provides the tie-magic for tables in $dbh->{$drv_pfx . "_meta"}. Routes STORE through $tblClass->set_table_meta_attr() and FETCH through $tblClass->get_table_meta_attr(). DELETE removes an attribute from the meta object retrieved by $tblClass->get_table_meta().

📦 DBI::DBD::SqlEngine::st

Contains the methods to deal with prepared statement handles. e.g.,

$sth->execute () or die $sth->errstr;

📦 DBI::DBD::SqlEngine::TableSource

Base class for 3rd party table sources:

$dbh->{sql_table_source} = "DBD::Foo::TableSource";

📦 DBI::DBD::SqlEngine::DataSource

Base class for 3rd party data sources:

$dbh->{sql_data_source} = "DBD::Foo::DataSource";

📦 DBI::DBD::SqlEngine::Statement

Base class for derived drivers statement engine. Implements open_table.

📦 DBI::DBD::SqlEngine::Table

Contains tailoring between SQL engine's requirements and DBI::DBD::SqlEngine magic for finding the right tables and storage. Builds bridges between sql_meta handling of DBI::DBD::SqlEngine::db, table initialization for SQL engines and meta object's attribute management for derived drivers.

🧩 DBI::DBD::SqlEngine

This is the main package containing the routines to initialize DBI::DBD::SqlEngine based DBI drivers. Primarily the DBI::DBD::SqlEngine::driver method is invoked, either directly from DBI when the driver is initialized or from the derived class.

package DBD::DBM;

use base qw( DBI::DBD::SqlEngine );

sub driver
{
    my ( $class, $attr ) = @_;
    ...
    my $drh = $class->SUPER::driver( $attr );
    ...
    return $drh;
}

It is not necessary to implement your own driver method as long as additional initialization (e.g. installing more private driver methods) is not required. You do not need to call setup_driver as DBI::DBD::SqlEngine takes care of it.

⚙️ DBI::DBD::SqlEngine::dr Methods

The driver package contains the methods DBI calls indirectly via the DBI interface (see DBI Class Methods in DBI).

DBI::DBD::SqlEngine based DBI drivers usually do not need to implement anything here, it is enough to do the basic initialization:

package DBD:XXX::dr;

@DBD::XXX::dr::ISA = qw (DBI::DBD::SqlEngine::dr);
$DBD::XXX::dr::imp_data_size     = 0;
$DBD::XXX::dr::data_sources_attr = undef;
$DBD::XXX::ATTRIBUTION = "DBD::XXX $DBD::XXX::VERSION by Hans Mustermann";

Methods provided by DBI::DBD::SqlEngine::dr:

⚙️ DBI::DBD::SqlEngine::db Methods

This package defines the database methods, which are called via the DBI database handle $dbh.

Methods provided by DBI::DBD::SqlEngine::db:

🎛️ Attributes used by DBI::DBD::SqlEngine::db

This section describes attributes which are important to developers of DBI Database Drivers derived from DBI::DBD::SqlEngine.

⚙️ DBI::DBD::SqlEngine::st Methods

Contains the methods to deal with prepared statement handles:

⚙️ DBI::DBD::SqlEngine::TableSource Methods

Provides data sources and table information on database driver and database handle level.

package DBI::DBD::SqlEngine::TableSource;

sub data_sources ($;$)
{
  my ( $class, $drh, $attrs ) = @_;
  ...
}

sub avail_tables
{
  my ( $class, $drh ) = @_;
  ...
}

The data_sources method is called when the user invokes any of the following:

@ary = DBI->data_sources($driver);
@ary = DBI->data_sources($driver, \%attr);

@ary = $dbh->data_sources();
@ary = $dbh->data_sources(\%attr);

The avail_tables method is called when the user invokes any of the following:

@names = $dbh->tables( $catalog, $schema, $table, $type );

$sth = $dbh->table_info( $catalog, $schema, $table, $type );
$sth = $dbh->table_info( $catalog, $schema, $table, $type, \%attr );

$dbh->func( "list_tables" );

Every time where an \%attr argument can be specified, this \%attr object's sql_table_source attribute is preferred over the $dbh attribute or the driver default.

⚙️ DBI::DBD::SqlEngine::DataSource Methods

Provides base functionality for dealing with tables. It is primarily designed for allowing transparent access to files on disk or already opened (file-)streams (e.g. for DBD::CSV). Derived classes shall be restricted to similar functionality, too (e.g. opening streams from an archive, transparently compress/uncompress log files before parsing them).

package DBI::DBD::SqlEngine::DataSource;

sub complete_table_name ($$;$)
{
  my ( $self, $meta, $table, $respect_case ) = @_;
  ...
}

The method complete_table_name is called when first setting up the meta information for a table:

"SELECT user.id, user.name, user.shell FROM user WHERE ..."

results in opening the table "user". First step of the table open process is completing the name. Let's imagine you're having a DBD::CSV handle with following settings:

$dbh->{sql_identifier_case} = SQL_IC_LOWER;
$dbh->{f_ext} = '.lst';
$dbh->{f_dir} = '/data/web/adrmgr';

Those settings will result in looking for files matching [Uu][Ss][Ee][Rr](\.lst)?$ in /data/web/adrmgr/. The scanning of the directory /data/web/adrmgr/ and the pattern match check will be done in DBD::File::DataSource::File by the complete_table_name method.

If you intend to provide other sources of data streams than files, in addition to provide an appropriate complete_table_name method, a method to open the resource is required:

package DBI::DBD::SqlEngine::DataSource;

sub open_data ($)
{
  my ( $self, $meta, $attrs, $flags ) = @_;
  ...
}

After the method open_data has been run successfully, the table's meta information are in a state which allows the table's data accessor methods will be able to fetch/store row information. Implementation details heavily depends on the table implementation, whereby the most famous is surely DBD::File::Table.

⚙️ DBI::DBD::SqlEngine::Statement

Derives from DBI::SQL::Nano::Statement for unified naming when deriving new drivers. No additional feature is provided from here.

⚙️ DBI::DBD::SqlEngine::Table Methods

Derives from DBI::SQL::Nano::Table for unified naming when deriving new drivers.

You should consult the documentation of SQL::Eval::Table (see SQL::Eval) to get more information about the abstract methods of the table's base class you have to override and a description of the table meta information expected by the SQL engines.

👤 AUTHOR

The module DBI::DBD::SqlEngine is currently maintained by

H.Merijn Brand < h.m.brand at xs4all.nl > and Jens Rehsack < rehsack at googlemail.com >

📄 COPYRIGHT AND LICENSE

Copyright (C) 2010 by H.Merijn Brand & Jens Rehsack

All rights reserved.

You may freely distribute and/or modify this module under the terms of either the GNU General Public License (GPL) or the Artistic License, as specified in the Perl README file.

perl v5.34.0 2026-06-DBI::DBD::SqlEngine::Developers(3pm)

```
DBI::DBD::SqlEngine::Developers
📛 NAME 🚀 Quick Reference 📖 SYNOPSIS 📝 DESCRIPTION 📂 CLASSES
📦 DBI::DBD::SqlEngine::dr 📦 DBI::DBD::SqlEngine::db 📦 DBI::DBD::SqlEngine::TieMeta 📦 DBI::DBD::SqlEngine::TieTables 📦 DBI::DBD::SqlEngine::st 📦 DBI::DBD::SqlEngine::TableSource 📦 DBI::DBD::SqlEngine::DataSource 📦 DBI::DBD::SqlEngine::Statement 📦 DBI::DBD::SqlEngine::Table 🧩 DBI::DBD::SqlEngine ⚙️ DBI::DBD::SqlEngine::dr Methods ⚙️ DBI::DBD::SqlEngine::db Methods ⚙️ DBI::DBD::SqlEngine::st Methods ⚙️ DBI::DBD::SqlEngine::TableSource Methods ⚙️ DBI::DBD::SqlEngine::DataSource Methods ⚙️ DBI::DBD::SqlEngine::Statement ⚙️ DBI::DBD::SqlEngine::Table Methods
👤 AUTHOR 📄 COPYRIGHT AND LICENSE

Generated by phpman v4.9.26-1-g511901d Author: Che Dong Under GNU General Public License
2026-08-09 09:40 @2600:1f28:365:80b0:50b3:453e:ff52:20f7
CrawledBy CCBot/2.0 (https://commoncrawl.org/faq/)
Valid XHTML 1.0 Transitional!Valid CSS!
Enhanced by LLM: deepseek-v4-flash / taotoken.net / www.chedong.com - original format