man > DBD::File::Developers(3pm)

📝 NAME

DBD::File::Developers - Developers documentation for DBD::File

🚀 Quick Reference

Use CaseCommandDescription
Inherit from DBD::Fileuse base qw(DBD::File);Base class for DBD::File-based drivers
Override driver initializationsub driver { ... }Custom driver method, call SUPER::driver
Define valid private attributessub init_valid_attributes { ... }Initialize f_valid_attrs and f_readonly_attrs
Custom FETCH for statement handlesub FETCH { ... }Override statement handle attribute fetching
Initialize table meta datasub init_table_meta { ... }Called after file/table mapping succeeds
Register reset-on-modify rules__PACKAGE__->register_reset_on_modify(\%map)Reset calculated attrs on change
Register compatibility mapping__PACKAGE__->register_compat_map(\%map)Map old attribute names to new
Open data filesub open_data { ... }Override to customize file opening
Optimize SQL operationssub update_current_row { ... }Advanced row update methods

📋 SYNOPSIS

package DBD::myDriver;

use base qw( DBD::File );

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

sub CLONE { ... }

package DBD::myDriver::dr;

@ISA = qw( DBD::File::dr );

sub data_sources { ... }
...

package DBD::myDriver::db;

@ISA = qw( DBD::File::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 { ... }

package DBD::myDriver::st;

@ISA = qw( DBD::File::st );

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

package DBD::myDriver::Statement;

@ISA = qw( DBD::File::Statement );

package DBD::myDriver::Table;

@ISA = qw( DBD::File::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 fetch_row { ... }
sub push_row { ... }
sub push_names { ... }

# 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 how DBD developers can write DBD::File based DBI drivers. It supplements DBI::DBD and DBI::DBD::SqlEngine::Developers, which you should read first.

📂 CLASSES

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

🔹 DBD::File::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( DBD::File::dr );

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

Similar for data_sources and disconnect_all. Pure Perl DBI drivers derived from DBD::File do not usually need to override any of the methods provided through the DBD::XXX::dr package however if you need additional initialization in the connect method you may need to.

🔹 DBD::File::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");

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

🔹 DBD::File::st

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

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

🔹 DBD::File

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

package DBD::DBM;

use base qw( DBD::File );

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 DBD::File takes care of it.

🔹 DBD::File::dr (detailed)

The driver package contains the methods DBI calls indirectly via the DBI interface (see "DBI Class Methods" in DBI). DBD::File 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 (DBD::File::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";

🔹 DBD::File::db (detailed)

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

Methods provided by DBD::File:

🔹 DBD::File::st (detailed)

Contains the methods to deal with prepared statement handles:

🔹 DBD::File::TableSource::FileSystem

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

package DBD::File::TableSource::FileSystem;

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

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

The data_sources method is called when the user invokes DBI->data_sources or $dbh->data_sources. The avail_tables method is called when the user invokes $dbh->tables, $dbh->table_info, or $dbh->func("list_tables"). Every time an %attr argument can be specified, the sql_table_source attribute is preferred over the $dbh attribute or driver default.

🔹 DBD::File::DataSource::Stream

package DBD::File::DataSource::Stream;

@DBD::File::DataSource::Stream::ISA = 'DBI::DBD::SqlEngine::DataSource';

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

Clears all meta attributes identifying a file: f_fqfn, f_fqbn and f_fqln. The table name is set according to $respect_case and $meta->{sql_identifier_case}.

sub apply_encoding
{
    my ($self, $meta, $fn) = @_;
    ...
}

Applies the encoding from meta information ($meta->{f_encoding}) to the file handled opened in open_data.

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

Opens (dup(2)) the file handle provided in $meta->{f_file}.

sub can_flock { ... }

Returns whether flock(2) is available or not.

🔹 DBD::File::DataSource::File

package DBD::File::DataSource::File;

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

The method complete_table_name tries to map a filename to the associated table name. It is called with a partially filled meta structure containing f_ext, f_dir, f_lockfile and sql_identifier_case. If a file/table map can be found, it sets f_fqfn, f_fqbn, f_fqln and table_name in the meta structure. If a map cannot be found, the table name will be undef.

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

Depending on the attributes set in the table's meta data, the following steps are performed. Unless f_dontopen is set to a true value, f_fqfn must contain the full qualified file name. The encoding in f_encoding is applied if set and the file is opened. If f_fqln (full qualified lock name) is set, this file is opened, too. Depending on the value in f_lock, the appropriate lock is set on the opened data file or lock file.

🔹 DBD::File::Statement

Derives from DBI::SQL::Nano::Statement to provide the following method:

sub open_table ($$$$$)
{
    my ($self, $data, $table, $createMode, $lockMode) = @_;

    my $class = ref $self;
    $class =~ s/::Statement/::Table/;

    my $flags = {
        createMode => $createMode,
        lockMode   => $lockMode,
    };
    $self->{command} eq "DROP" and $flags->{dropMode} = 1;

    return $class->new ($data, { table => $table }, $flags);
}

🔹 DBD::File::Table

Derives from DBI::SQL::Nano::Table and provides physical file access for the table data stored in files.

Consult the documentation of SQL::Eval::Table (see SQL::Eval) for more information about abstract methods and expected table meta information.

👤 AUTHOR

The module DBD::File is currently maintained by H.Merijn Brand <h.m.brand at xs4all.nl> and Jens Rehsack <rehsack at googlemail.com>. The original author is Jochen Wiedmann.

ÂŠī¸ COPYRIGHT AND LICENSE

Copyright (C) 2010-2013 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.

DBD::File::Developers(3pm)
📝 NAME 🚀 Quick Reference 📋 SYNOPSIS 📖 DESCRIPTION 📂 CLASSES
🔹 DBD::File::dr 🔹 DBD::File::db 🔹 DBD::File::st 🔹 DBD::File 🔹 DBD::File::dr (detailed) 🔹 DBD::File::db (detailed) 🔹 DBD::File::st (detailed) 🔹 DBD::File::TableSource::FileSystem 🔹 DBD::File::DataSource::Stream 🔹 DBD::File::DataSource::File 🔹 DBD::File::Statement 🔹 DBD::File::Table
👤 AUTHOR ÂŠī¸ COPYRIGHT AND LICENSE

Generated by phpman v4.9.29 · Markdown · JSON · MCP Author: Che Dong Under GNU General Public License
2026-07-22 04:27 @2600:1f28:365:80b0:8802:8bb4:3873:328e
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

^_top_^