I'm in the process of moving some of my stuff over from one Linux box to a newer box. During this transition, one of the scripts I use regularly does something like this (greatly simplified for posting purposes):

#! /usr/bin/perl -w use strict; use DBI; use FindBin; my $new_total = 10; open my $fh, '>', $FindBin::Bin . '/data'; print $fh ("DATE,NUMBER\n2005-05-16,2\n2005-05-17,4\n"); close $fh; my $dbh = DBI->connect('dbi:CSV:f_dir=' . $FindBin::Bin . ";csv_eol=\n +") or warn "Can't connect to DBI"; my $total = $dbh->selectall_arrayref('select sum(number) from data')-> +[0][0]; if ($total||0 != $new_total) { require Time::localtime; my $lt = Time::localtime::localtime(time(); my $date = sprintf("%04d-%02d-%02d", $lt->year + 1900, $lt->mon + +1, $lt->mday); my $count = $dbh->selectall_arrayref('select count(*) from data wh +ere date = ?', {}, $date)->[0][0]; my $cur = $dbh->selectall_arrayref('select number from data where +date = ?', {}, $date); $cur = $cur->[0] while $cur and ref $cur; my $gained = $new_total - ($total||0); if ($count) { $cur += $gained; print "Updating today ($date) to be Number = $cur\n"; $dbh->do('update data set number = ? where date = ?', {}, $cur +, $date); } else { $cur = $gained; print "Inserting into today to be Number = $cur\n"; $dbh->do('insert into data (date,number) values(?,?)', {}, $da +te,$cur); } }
In this example code, lines 9 through 11 create a sample CSV data file - if your local time when you try this is not in the sample data, add it. The problem only exists in the update scenario, not the insert scenario, and I want to make as self-contained of an example as possible. The rest of the code is pretty much the same as what I'm using, but obviously doesn't work. I expect the file 'data' to look like this afterwards:
DATE,NUMBER 2005-05-16,2 2005-05-17,8
However, it actually looks like this:
DATE,NUMBER 2005-05-16,2 2005-05-17,2005-05-17
I'm using:
$ perl -MDBD::CSV -e 'print "perl\t$]\n"; print $_,"\t",${$_."::VERSIO +N"},$/ foreach @ARGV' DBD::CSV SQL::Statement SQL::Parser Text::CSV_X +S SQL::Statement::Util perl 5.008005 DBD::CSV 0.22 SQL::Statement 1.14 SQL::Parser 1.13 Text::CSV_XS 0.23 SQL::Statement::Util -1, set by base.pm
On another machine, the same command returns:
perl 5.008006 DBD::CSV 0.21 SQL::Statement 1.09 SQL::Parser 1.09 Text::CSV_XS 0.23 SQL::Statement::Util
and the update works fine. I suspect a problem in DBD::CSV, SQL::Statement, or SQL::Parser, but I'm not sure how to figure it out for sure. I suppose my workaround is to either find a way to uninstall these and install the older versions (which is kind of a pain), or to delete/reinsert rather than use update. Or maybe to get rid of the ?'s and put my number right in the string - which isn't that bad in my case, but if I'm really encountering a bug, I wouldn't want tossing ?'s out of one's repertoire to be the standard response...

If anyone has any other considerations, I'd be open to them. Otherwise, I'll submit this to the current maintainer of DBD::CSV (who will probably forward it on somewhere else, but that's as far as I understand this situation at the moment). Thanks!


In reply to DBD::CSV, SQL::Statement, and UPDATE table statement by Tanktalus

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.