DBD-RAM
view release on metacpan or search on metacpan
@col_names = $dbh->func(
$first_line,$table_name,$data_type,'read_fields');
$num_params = scalar @col_names;
}
#
# COLUMN NAMES FROM USER-SUPPLIED LIST
#
if ( $col_names && $col_names ne 'first_line' ) {
$col_names =~ s/\s+//g;
@col_names = split /,/,$col_names;
$num_params = scalar @col_names;
}
#
# AUTOMATICALLY ASSIGNED COLUMN NAMES
#
if ( $data_type eq 'HASH' && !$num_params ) {
@col_names = keys %{$first_line};
$num_params = scalar @col_names;
}
if ( !$num_params ) {
if ( $data_type eq 'INI' ) {
$num_params = 2;
}
if ( $data_type eq 'FIX' ) {
my @x = split /\s+/,$pattern;
$num_params = scalar @x;
}
if ( $data_type eq 'CSV' or $data_type eq 'USR' ) {
my @colAry = $dbh->func(
$first_line,$table_name,$data_type,'read_fields');
$num_params = scalar @colAry;
}
$num_params = scalar @{ $first_line } if
!$num_params && ref $first_line eq 'ARRAY';
die "Couldn't find column names!" if !$num_params;
for ( 1 .. $num_params ) { push(@col_names,"col$_"); }
}
return @col_names;
}
sub prep_insert {
my( $dbh, $table_name, @col_names ) = @_;
my($colstr,$num_params);
for ( @col_names ) { $colstr .= $_ . ' TEXT,'; }
$colstr =~ s/,$//;
my $create_stmt = "CREATE TABLE $table_name ($colstr)";
my $param_str = (join ",", ("?") x @col_names);
my $insert_stmt = "INSERT INTO $table_name VALUES ($param_str)";
$dbh->do($create_stmt);
my $sth = $dbh->prepare($insert_stmt);
}
sub get_remote_data {
my $dbh = shift;
my $remote_source = shift;
undef $@;
eval{ require 'LWP/UserAgent.pm'; };
die "LWP module not found! $@" if $@;
my $ua = new LWP::UserAgent;
my $req = new HTTP::Request GET => $remote_source;
my $res = $ua->request($req);
die "[$remote_source] : " . $res->message if !$res->is_success;
my $data = $res->content;
return $data;
}
sub get_file_data {
my $dbh = shift;
my $file_source = shift;
$file_source = $dbh->{f_dir} . '/' .$file_source;
$file_source =~ s#//#/#g;
open(I,$file_source) || die "[$file_source]: $!\n";
local $/ = undef;
my $data = <I>;
close(I) || die "$file_source: $!\n";
return $data;
}
sub get_xml_db {
# Hat tip to Randal Schwartz for the XML/LWP stuff
my($dbh,$specs,$table_name) = @_;
my $remote_source = $specs->{remote_source} || '';
my $file_source = $specs->{file_source} || '';
my $data_source = $specs->{data_source} || '';
my $record_tag = $specs->{record_tag} || '';
my $col_tags = $specs->{col_tags} || '';
my $fold_col = $specs->{fold_col} || '';
my $col_mapping = $specs->{col_mapping} || '';
my $col_names = $specs->{col_names} || '';
my $read_sub = $specs->{read_sub} || '';
my $attr = $specs->{attr} || '';
my $data;
my @columns;
if (ref $col_names ne 'ARRAY') { $col_names = [split ',',$col_names]; }
for ( @{$col_names} ) {
if ($_ =~ /^\[(.*)\]$/ ) {
my @newCols = split ',', $1;
for (@newCols) { push @columns, $_; }
}
else {
push @columns, $_;
}
}
my $colstr;
for ( @columns ) { $colstr .= $_ . ' TEXT,'; }
$colstr =~ s/,$//;
my $sql = "CREATE TABLE $table_name ($colstr)";
$dbh->do($sql) || die DBI::errstr, " : $sql";
$DBD::RAM::ramdata->{$table_name}->{data_type} = 'XML';
if ($remote_source){$data = $dbh->func($remote_source,'get_remote_data') or die; }
if ($file_source) { $data = &get_file_data($dbh,$file_source); }
if ($data_source) { $data = $data_source; }
die "No file or data source supplied!" unless $data;
my $insert = $dbh->prepare("INSERT INTO $table_name (".
(join ", ", @columns).
") VALUES (".
(join ",", ("?") x @columns).")");
My_XML_Parser::doParse($data, $insert, $record_tag,
$col_names, $col_mapping,$fold_col,$attr,$read_sub);
#use Data::Dumper; print Dumper $DBD::RAM::ramdata; exit;
( run in 0.748 second using v1.01-cache-2.11-cpan-13bb782fe5a )