Skip to content

Instantly share code, notes, and snippets.

@nekokak
Created November 10, 2011 04:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nekokak/1354082 to your computer and use it in GitHub Desktop.
Save nekokak/1354082 to your computer and use it in GitHub Desktop.
prepare data
use strict;
use warnings;
use DBIx::Handler;
use Data::Dumper;
unlink './foo.db';
my $handler = DBIx::Handler->new('dbi:SQLite:./foo.db','','');
$handler->dbh->do(q{
create table foo (
id int,
name varchar(10) NOT NULL,
bar_id int,
PRIMARY KEY (id)
);
});
$handler->dbh->do(q{
create table bar (
id int,
name varchar(10) NOT NULL,
PRIMARY KEY (id)
);
});
{
package Mock::Result;
use Data::Dumper;
sub new {
my ($class, $handler, $sth) = @_;
bless {
handler => $handler,
sth => $sth,
rows => +[],
bar_row_map => +{},
idx => 0,
}
}
sub prepare_data {
my $self = shift;
my $sth = $self->{sth};
my @rows;
while (my $row = $sth->fetchrow_hashref) {
push @rows, $row;
}
$self->{rows} = \@rows;
my @bar_ids = map {$_->{bar_id}} @rows;
my $obj = $self->{handler}->query('SELECT * FROM bar WHERE id IN :ids', +{ids => \@bar_ids});
$self->{bar_row_map} = $obj->{sth}->fetchall_hashref('id');
return;
}
sub next {
my $self = shift;
my $row = $self->{rows}->[$self->{idx}++];
return unless $row;
$row->{bar} = $self->{bar_row_map}->{$row->{bar_id}};
$row;
}
}
$handler->query(q{insert into bar (id, name) values (1, 'satoshi')});
$handler->query(q{insert into foo (id, name, bar_id) values (1, 'ueda', 1)});
$handler->query(q{insert into bar (id, name) values (2, 'nekokak')});
$handler->query(q{insert into foo (id, name, bar_id) values (2, 'kobayashi', 2)});
$handler->result_class('Mock::Result');
my $obj = $handler->query('select * from foo');
$obj->prepare_data;
while (my $row = $obj->next) {
warn Dumper $row;
}
unlink './foo.db';
__END__
$VAR1 = {
'bar' => {
'name' => 'satoshi',
'id' => 1
},
'name' => 'ueda',
'id' => 1,
'bar_id' => 1
};
$VAR1 = {
'bar' => {
'name' => 'nekokak',
'id' => 2
},
'name' => 'kobayashi',
'id' => 2,
'bar_id' => 2
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment