DBD::File::Developers - Developers documentation for DBD::File
| Use Case | Command | Description |
|---|---|---|
| ๐ง Create driver package | use base qw( DBD::File ); | Base your DBD driver on DBD::File |
| ๐ฆ Driver package class | package DBD::XXX::dr; @ISA = qw( DBD::File::dr ); | Define driver class inheriting from DBD::File::dr |
| ๐๏ธ Database handle class | package DBD::XXX::db; @ISA = qw( DBD::File::db ); | Define database handle class |
| ๐ Statement handle class | package DBD::XXX::st; @ISA = qw( DBD::File::st ); | Define statement handle class |
| ๐ Statement class | package DBD::XXX::Statement; @ISA = qw( DBD::File::Statement ); | Define statement class for SQL engine |
| ๐ Table class | package DBD::XXX::Table; @ISA = qw( DBD::File::Table ); | Define table class for file access |
| ๐ Connect to database | DBI->connect('DBI:XXX:', undef, undef, {}) | Connect to DBD::File-based driver |
| ๐ Get meta attribute | $dbh->xxx_get_meta($table, $attr) | Retrieve a table's meta attribute |
| โ๏ธ Set meta attribute | $dbh->xxx_set_meta($table, $attr, $value) | Set a table's meta attribute |
| ๐งน Clear meta cache | $dbh->xxx_clear_meta($table) | Clear cached meta information for a table |
| ๐ List tables | $dbh->tables() | List available tables |
| ๐ Data sources | DBI->data_sources($driver) | Get available data sources for a driver |
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 { ... }
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.
Each DBI driver must provide a package global "driver" method and three DBI related classes:
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.
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".
Contains the methods to deal with prepared statement handles. e.g.,
$sth->execute () or die $sth->errstr;
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.
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";
This package defines the database methods, which are called via the DBI database handle $dbh.
Methods provided by DBD::File:
# for DBD::CSV
$dbh->{csv_meta} = "csv_tables";
# for DBD::DBM
$dbh->{dbm_meta} = "dbm_tables";
# for DBD::AnyData
$dbh->{ad_meta} = "ad_tables";
Contains the methods to deal with prepared statement handles:
Provides data sources and table information on database 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 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.
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}" (SQL_IC_LOWER, SQL_IC_UPPER).
package DBD::File::DataSource::Stream;
sub apply_encoding
{
my ($self, $meta, $fn) = @_;
...
}
Applies the encoding from meta information ("$meta->{f_encoding}") to the file handled opened in "open_data".
package DBD::File::DataSource::Stream;
sub open_data
{
my ($self, $meta, $attrs, $flags) = @_;
...
}
Opens ("dup (2)") the file handle provided in "$meta->{f_file}".
package DBD::File::DataSource::Stream;
sub can_flock { ... }
Returns whether "flock (2)" is available or not (avoids retesting in subclasses).
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 for the resulting table containing at least the following attributes: "f_ext", "f_dir", "f_lockfile" and "sql_identifier_case".
If a file/table map can be found then this method sets the "f_fqfn", "f_fqbn", "f_fqln" and "table_name" attributes in the meta structure. If a map cannot be found the table name will be undef.
package DBD::File::DataSource::File;
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 for the table to work on (file2table ensures this). 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.
Derives from DBI::SQL::Nano::Statement to provide 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);
} # open_table
Derives from DBI::SQL::Nano::Table and provides physical file access for the table data which are stored in the files.
my %reset_on_modify = (xxx_foo => "xxx_bar");
__PACKAGE__->register_reset_on_modify (\%reset_on_modify);
# from DBD::DBM
my %compat_map = (dbm_ext => "f_ext");
__PACKAGE__->register_compat_map (\%compat_map);
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.
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 (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.
perl v5.34.0 โ 2026-06-22 โ DBD::File::Developers(3pm)
Generated by phpman v4.9.26-5-g7740029 Author: Che Dong Under GNU General Public License
2026-08-14 21:50 @2600:1f28:365:80b0:4d23:66fa:c2bb:7bae
CrawledBy CCBot/2.0 (https://commoncrawl.org/faq/)