Data-Shark

 view release on metacpan or  search on metacpan

lib/Data/Shark/DIO.pm  view on Meta::CPAN

    } else {
      $stmt .= '  my ($args) = @_;' . "\n" if $dioh->{'cd_type'} eq 'SQL::Abstract';
    }

    # initial audit section
    $audit =~ /[ADB]/ && do {
      $stmt .= "\n" . '  my $ca_id = ' . $ns . '::D_DIO::dio_audit_insert({ca_id => 0,ca_cd_id => ' . $dioh->{'cd_id'} . ',ca_ip => Apache->request->connection->remote_ip,user => $args->{\'user\'}});' . "\n\n";
    };

    # add inkeys for audit if requested
    $audit =~ /[DB]/ && $in_keys && do {
      foreach my $k (keys %{ $in_keys }) {
        $stmt .= '  ' . $ns . '::D_DIO::dio_audit_inkey({ci_ca_id => $ca_id, ci_pos => ' . $k . ', ci_tag => \'' . $in_keys->{$k}{'name'} . '\', ci_value => $args{\'' . $in_keys->{$k}{'name'} . '\'}});' . "\n\n";
      }
    };

    # profile section
    $profile && do {
      $stmt .= '  $' . $p_tag . ' = $' . $p_tag . ' || new Cache::FileCache( {\'namespace\' => \'' . $ns . '_dio_profile\'});' . "\n";
      my $cf = '';
      $cf = '*' if $dioh->{'cd_cache'} eq 'F';
      $stmt .= '  my $pkey = \'' . $diotag . '\';' . "\n";
      if ($in_keys) {
        foreach my $k (@{ $in_keys }{ sort {$a <=> $b} keys %{ $in_keys } }) {
          $stmt .= '  $pkey .= \', \' . $args->{\'' . $k->{'name'} . '\'};' . "\n" if $k->{'name'};
        } 
      }
      $stmt .= '  my $pdata = $' . $p_tag . '->get(\'' . $dions . ',' . $diotag . $cf . '\');' . "\n";
      $stmt .= '  my $t = time();' . "\n";
      $stmt .= '  push @{ $pdata->{\'args\'}{$t} }, $pkey;' . "\n";
      $pstmt = '  push @{ $pdata->{\'time\'}{$t} }, time();' . "\n";
      $pstmt .= '  $' . $p_tag . '->set(\'' . $dions . ',' . $diotag . $cf . '\',$pdata);' . "\n";  
    };

    # cache exp section
    if ($exps) {
      $stmt .= '  my $c;' . "\n";
      # expire dependent keys
      foreach my $k (keys %{ $exps }) {
#        if (ref($dio_list->{$diotag}{'cache_exp'}{$k}) eq 'REF') {
#
#        } else {
          $stmt .= '  $c = new Cache::FileCache({\'namespace\' => \'' . $ns . '_' . $exps->{$k}{'namespace'} . '.' . $k .'\'});' . "\n";
          $stmt .= '  $c->clear() if $c;' . "\n";
#        }
      }
    }
    # cache section
    if ($dioh->{'cd_cache'} eq 'F') {
      # clear existing cache on startup
      my $tc = new Cache::FileCache({'namespace' => $ns . '_' . $dions . '.' . $diotag});
      $tc->clear() if !$debug;
      # setup cache
      $stmt .= '  $' . $c_tag . ' = $' . $c_tag . ' || new Cache::FileCache( {\'namespace\' => \'' . $ns . '_' . $dions . '.' . $diotag . '\'});' . "\n";
      $stmt .= '  my $hkey = \'' . $diotag . '\';' . "\n";
      if ($in_keys) {
        foreach my $k (@{ $in_keys }{ sort {$a <=> $b} keys %{ $in_keys } }) {
          $stmt .= '  $hkey .= $args->{\'' . $k->{'name'} . '\'};' . "\n" if $k->{'name'};
        } 
      }
      $stmt .= '  my $cdata = $' . $c_tag . '->get($hkey);' . "\n";
      $stmt .= 'if ($cdata) { ' . $pstmt . '}' . "\n" if $profile;
      $stmt .= '  return $cdata if $cdata;' . "\n";
    }
    $stmt .= '  my $dbi = ' . $config->{'dbi_func'} . ';' . "\n"; 
    $stmt .= '  my $sth;' . "\n\n";

    # process input
    for ($dioh->{'cd_type'}) {
      /^DBI$/ && do {
        if ($in_keys) {
          $dioh->{'cd_stmt'} =~ s/'/\\'/g;
          $stmt .= '  my $sql = q{' . $dioh->{'cd_stmt'} . '};' . "\n";
          # check for tag based in keys
          my $have_tags = 0;
          foreach my $k (@{ $in_keys }{ keys %{ $in_keys } }) {
            if ($k->{'opt'} eq 'tag_based') {
              unless ($have_tags) {
                $stmt .= '  my %tag_hash;' . "\n";
                $have_tags = 1;
              }
              $k->{'default'} =~ s/[\r\n]/ /g;
              $stmt .= '  if (exists $args->{\'' . $k->{'name'} . '\'} && $args->{\'' . $k->{'name'} . '\'} ne \'\') {' . "\n";
              $stmt .= '    $sql =~ s/:' . $k->{'name'} . '/' . $k->{'default'} . '/;' . "\n"; 
              # check for placeholders
              if ($k->{'default'} =~ /:placeholders/) {
                $stmt .= '    if (ref $args->{\'' . $k->{'name'} . '\'} eq \'ARRAY\') {' . "\n";
                $stmt .= '      $tag_hash{' . $k->{'name'} . '} = $args->{\'' . $k->{'name'} . '\'};' . "\n";
                $stmt .= '    } else {' . "\n";
                $stmt .= '      $tag_hash{' . $k->{'name'} . '} = [$args->{\'' . $k->{'name'} . '\'}];' . "\n";
                $stmt .= '    }' . "\n";
                $stmt .= '    my $placeholders = join(\', \', map { \'?\' } @{$tag_hash{' . $k->{'name'} . '}});' . "\n";
                $stmt .= '    $sql =~ s/' . $k->{'name'} . ':placeholders/$placeholders/;' . "\n"; 
              } else {
                if (index($k->{'default'}, '?') >= 0) {
                  $stmt .= '    if (ref $args->{\'' . $k->{'name'} . '\'} eq \'ARRAY\') {' . "\n";
                  $stmt .= '      $tag_hash{' . $k->{'name'} . '} = $args->{\'' . $k->{'name'} . '\'};' . "\n";
                  $stmt .= '    } else {' . "\n";
                  $stmt .= '      $tag_hash{' . $k->{'name'} . '} = [$args->{\'' . $k->{'name'} . '\'}];' . "\n";
                  $stmt .= '    }' . "\n";
                } else {
                  $k->{'no_bind'} = 1;
                }
              }
              $stmt .= '  } else {' . "\n";
              $stmt .= '    $sql =~ s/:' . $k->{'name'} . '//;' . "\n"; 
              $stmt .= '  }' . "\n";
            }
          }
          
          my $extra = "";
          # check for limit or offset
          foreach my $k (@{ $in_keys }{ keys %{ $in_keys } }) {
            for ($k->{'name'}) {
              /^limit$/ && do { $extra .= ' limit \' . $args->{\'limit\'} . \''; last; };
              /^mysql_limit$/ && do { $extra .= ' limit \' . $args->{\'mysql_limit\'} . \''; last; };
              /^offset$/ && do { $extra .= ' offset \' . $args->{\'offset\'} . \''; last; };
            }
          }
          $stmt .= '  $sth = $dbi->db_prep($sql' . ($extra ? ' . q{' . $extra . '}' : '') . ');' . "\n";
          if ($have_tags) {
            $stmt .= '  my @binds;' . "\n";
            foreach my $k (@{ $in_keys }{ sort {$a <=> $b} keys %{ $in_keys } }) {



( run in 0.871 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )