DBD-RAM

 view release on metacpan or  search on metacpan

RAM.pm  view on Meta::CPAN

        @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 )