NAME

DBIx::Custom - DBI with hash parameter binding and filtering system

STABILITY

This module is not stable. Method name and implementations will be changed.

SYNOPSYS

# Connect
my $dbi = DBIx::Custom->connect(data_source => "dbi:mysql:database=books",
                                user => 'ken', password => '!LFKD%$&');
# Insert 
$dbi->insert(table  => 'books',
             param  => {title => 'perl', author => 'Ken'},
             filter => {title => 'encode_utf8'});

# Update 
$dbi->update(table  => 'books', 
             param  => {title => 'aaa', author => 'Ken'}, 
             where  => {id => 5},
             filter => {title => 'encode_utf8'});

# Update all
$dbi->update_all(table  => 'books',
                 param  => {title => 'aaa'},
                 filter => {title => 'encode_utf8'});

# Delete
$dbi->delete(table  => 'books',
             where  => {author => 'Ken'},
             filter => {title => 'encode_utf8'});

# Delete all
$dbi->delete_all(table => 'books');

# Select
my $result = $dbi->select(table => 'books');

# Select(more complex)
my $result = $dbi->select(
    table  => 'books',
    column => [qw/author title/],
    where  => {author => 'Ken'},
    append => 'order by id limit 1',
    filter => {tilte => 'encode_utf8'}
);

# Select(Join table)
my $result = $dbi->select(
    table => ['books', 'rental'],
    column => ['books.name as book_name']
    relation => {'books.id' => 'rental.book_id'}
);

# Execute SQL
$dbi->execute("select title from books");

# Execute SQL with parameters and filter
$dbi->execute("select id from books where {= author} && {like title}",
              param  => {author => 'ken', title => '%Perl%'},
              filter => {tilte => 'encode_utf8'});

# Create query and execute it
my $query = $dbi->build_query(
    "select id from books where {= author} && {like title}"
);
$dbi->execute($query, param => {author => 'ken', title => '%Perl%'})

# Default filter
$dbi->default_bind_filter('encode_utf8');
$dbi->default_fetch_filter('decode_utf8');

# Fetch
while (my $row = $result->fetch) {
    # ...
}

# Fetch hash
while (my $row = $result->fetch_hash) {
    
}

# Get DBI object
my $dbh = $dbi->dbh;

DESCRIPTION

DBIx::Custom is useful DBI extention. This module have hash parameter binding and filtering system.

Normally, binding parameter is array. DBIx::Custom enable you to pass binding parameter as hash.

This module also provide filtering system. You can filter the binding parameter or the value of fetching row.

And have useful method such as insert(), update(), delete(), and select().

Features

  • Hash parameter binding.

  • Value filtering.

  • Provide suger methods, such as insert(), update(), delete(), and select().

ATTRIBUTES

user

my $user = $dbi->user;
$dbi     = $dbi->user('Ken');

Database user name. This is used for connect().

password

my $password = $dbi->password;
$dbi         = $dbi->password('lkj&le`@s');

Database password. This is used for connect().

data_source

my $data_source = $dbi->data_source;
$dbi            = $dbi->data_source("dbi:mysql:dbname=$database");

Database data source. This is used for connect().

dbh

my $dbh = $dbi->dbh;
$dbi    = $dbi->dbh($dbh);

Database handle. This is a DBI object. You can call all methods of DBI

my $sth    = $dbi->dbh->prepare("...");
my $errstr = $dbi->dbh->errstr;
$dbi->dbh->begin_work;
$dbi->dbh->commit;
$dbi->dbh->rollback;

filters

my $filters = $dbi->filters;
$dbi        = $dbi->filters(\%filters);

Filter functions. By default, "encode_utf8" and "decode_utf8" is registered.

$encode_utf8 = $dbi->filters->{encode_utf8};
$decode_utf8 = $dbi->filters->{decode_utf8};

default_bind_filter

my $default_bind_filter = $dbi->default_bind_filter
$dbi                    = $dbi->default_bind_filter('encode_utf8');

Default filter for value binding

default_fetch_filter

my $default_fetch_filter = $dbi->default_fetch_filter;
$dbi                     = $dbi->default_fetch_filter('decode_utf8');

Default filter for fetching.

result_class

my $result_class = $dbi->result_class;
$dbi             = $dbi->result_class('DBIx::Custom::Result');

Result class for select statement. Default to DBIx::Custom::Result.

sql_builder

my $sql_class = $dbi->sql_builder;
$dbi          = $dbi->sql_builder(DBIx::Custom::QueryBuilder->new);

SQL builder. sql_builder must be the instance of DBIx::Custom::QueryBuilder subclass Default to DBIx::Custom::QueryBuilder.

METHODS

This class is Object::Simple subclass. You can use all methods of Object::Simple

connect

my $dbi = DBIx::Custom->connect(data_source => "dbi:mysql:database=books",
                                user => 'ken', password => '!LFKD%$&');

Connect to database. "AutoCommit" and "RaiseError" option is true, and "PrintError" option is false by default.

insert

$affected = $dbi->insert(table  => $table, 
                         param  => \%param,
                         append => $append,
                         filter => \%filter);

Insert row. Retrun value is the count of affected rows.

Example:

$dbi->insert(table  => 'books', 
             param  => {title => 'Perl', author => 'Taro'},
             append => "some statement",
             filter => {title => 'encode_utf8'})

update

$affected = $dbi->update(table  => $table, 
                         param  => \%params,
                         where  => \%where,
                         append => $append,
                         filter => \%filter)

Update rows. Retrun value is the count of affected rows.

Example:

$dbi->update(table  => 'books',
             param  => {title => 'Perl', author => 'Taro'},
             where  => {id => 5},
             append => "some statement",
             filter => {title => 'encode_utf8'});

update_all

$affected = $dbi->update_all(table  => $table, 
                             param  => \%params,
                             filter => \%filter,
                             append => $append);

Update all rows. Retrun value is the count of affected rows.

Example:

$dbi->update_all(table  => 'books', 
                 param  => {author => 'taro'},
                 filter => {author => 'encode_utf8'});

delete

$affected = $dbi->delete(table  => $table,
                         where  => \%where,
                         append => $append,
                         filter => \%filter);

Delete rows. Retrun value is the count of affected rows.

Example:

$dbi->delete(table  => 'books',
             where  => {id => 5},
             append => 'some statement',
             filter => {id => 'encode_utf8'});

delete_all

$affected = $dbi->delete_all(table => $table);

Delete all rows. Retrun value is the count of affected rows.

Example:

$dbi->delete_all(table => 'books');

select

$result = $dbi->select(table    => $table,
                       column   => [@column],
                       where    => \%where,
                       append   => $append,
                       relation => \%relation,
                       filter   => \%filter);

Select rows. Return value is the instance of DBIx::Custom::Result.

Example:

# select * from books;
$result = $dbi->select(table => 'books');

# select * from books where title = 'Perl';
$result = $dbi->select(table => 'books', where => {title => 1});

# select title, author from books where id = 1 for update;
$result = $dbi->select(
    table  => 'books',
    column => ['title', 'author'],
    where  => {id => 1},
    appned => 'for update'
);

# select books.name as book_name from books, rental 
# where books.id = rental.book_id;
my $result = $dbi->select(
    table    => ['books', 'rental'],
    column   => ['books.name as book_name']
    relation => {'books.id' => 'rental.book_id'}
);

build_query

my $query = $dbi->build_query(
    "select * from authors where {= name} and {= age};"
);

Build the instance of DBIx::Custom::Query using DBIx::Custom::QueryBuilder.

execute

$result = $dbi->execute($query,  param => $params, filter => \%filter);
$result = $dbi->execute($source, param => $params, filter => \%filter);

Execute the instace of DBIx::Custom::Query or the string written by SQL template. Return value is the instance of DBIx::Custom::Result.

Example:

$result = $dbi->execute("select * from authors where {= name} and {= age}", 
                        param => {name => 'taro', age => 19});

while (my $row = $result->fetch) {
    # do something
}

register_filter

$dbi->register_filter(%filters);
$dbi->register_filter(\%filters);

Resister filter.

Example:

$dbi->register_filter(
    encode_utf8 => sub {
        my $value = shift;
        
        require Encode;
        
        return Encode::encode('UTF-8', $value);
    },
    decode_utf8 => sub {
        my $value = shift;
        
        require Encode;
        
        return Encode::decode('UTF-8', $value)
    }
);

cache

$dbi   = $dbi->cache(1);
$cache = $dbi->cache;

Cache the result of parsing SQL template. Default to 1.

cache_method

$dbi          = $dbi->cache_method(\&cache_method);
$cache_method = $dbi->cache_method

Method for cache.

Example:

$dbi->cache_method(
    sub {
        my $self = shift;
        
        $self->{_cached} ||= {};
        
        if (@_ > 1) {
            $self->{_cached}{$_[0]} = $_[1] 
        }
        else {
            return $self->{_cached}{$_[0]}
        }
    }
);

BUGS

Please tell me bugs.

<kimoto.yuki at gmail.com>

http://github.com/yuki-kimoto/DBIx-Custom

AUTHOR

Yuki Kimoto, <kimoto.yuki at gmail.com>

COPYRIGHT & LICENSE

Copyright 2009 Yuki Kimoto, all rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.