From 9f4279438bec8d0b52c8afc513142cc9d21ad8b8 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 18 Apr 2022 09:44:01 +0000 Subject: lei_mail_sync: explicit bind for old SQL_VARCHAR compat This avoids repeated work for incremental "lei import" runs when users upgrade from 1.7 to current public-inbox.git (and eventually 1.8). We need the explicit bind_param for fallback calls because previous bind_param calls are "sticky" for a given statement handle. The DBI(3pm) manpage states: The data type is 'sticky' in that bind values passed to execute() are bound with the data type specified by earlier bind_param() calls, if any. Portable applications should not rely on being able to change the data type after the first "bind_param" call. --- lib/PublicInbox/LeiMailSync.pm | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/PublicInbox/LeiMailSync.pm b/lib/PublicInbox/LeiMailSync.pm index 85480599..665206a8 100644 --- a/lib/PublicInbox/LeiMailSync.pm +++ b/lib/PublicInbox/LeiMailSync.pm @@ -106,12 +106,15 @@ sub get_fid ($$$) { $sth->execute; my ($fid) = $sth->fetchrow_array; if (defined $fid) { # for downgrade+upgrade (1.8 -> 1.7 -> 1.8) - $dbh->do('DELETE FROM folders WHERE loc = ? AND fid != ?', - undef, $folder, $fid) if defined($dbh); + my $del = $dbh->prepare_cached(<<''); +DELETE FROM folders WHERE loc = ? AND fid != ? + + $del->execute($folder, $fid); } else { - $sth->execute($folder); # fixup old stuff + $sth->bind_param(1, $folder, SQL_VARCHAR); + $sth->execute; # fixup old stuff ($fid) = $sth->fetchrow_array; - update_fid($dbh, $fid, $folder) if defined($fid) && $dbh; + update_fid($dbh, $fid, $folder) if defined($fid); } $fid; } @@ -350,7 +353,8 @@ sub locations_for { } # deal with 1.7.0 DBs :< - $sth->execute($oidbin); + $sth->bind_param(1, $oidbin, SQL_VARCHAR); + $sth->execute; while (my ($fid, $uid) = $sth->fetchrow_array) { next if $seen{"$uid.$fid"}; push @{$fid2id{$fid}}, $uid; @@ -366,7 +370,8 @@ sub locations_for { } # deal with 1.7.0 DBs :< - $sth->execute($oidbin); + $sth->bind_param(1, $oidbin, SQL_VARCHAR); + $sth->execute; while (my ($fid, $name) = $sth->fetchrow_array) { next if $seen{"$fid.$name"}; push @{$fid2id{$fid}}, $name; @@ -646,7 +651,9 @@ EOM $sth->bind_param(2, $nm, SQL_BLOB); $sth->execute; my @bin = map { $_->[0] } @{$sth->fetchall_arrayref}; - $sth->execute($fid, $nm); + $sth->bind_param(1, $fid); + $sth->bind_param(2, $nm, SQL_VARCHAR); + $sth->execute; my @old = map { $_->[0] } @{$sth->fetchall_arrayref}; my %uniq; # for public-inbox <= 1.7.0 grep { !$uniq{$_}++ } (@bin, @old); -- cgit v1.2.3-24-ge0c7