Re: AnyData patches

2012-09-04 Thread H.Merijn Brand
On Wed, 05 Sep 2012 11:04:23 +1000, Sven Dowideit
 wrote:

> yup :)
> 
> http://github.com/SvenDowideit/AnyData

tl;dr; -- shall I take this off-list?

A random number of remarks …

I have a *lot* of modules - for testing - installed, but still run into
new ones, and neither is mentioned when running Makefile.PL

t/01distributtion.t .. skipped: Test::Distribution not installed
t/01pod_snippets.t ... Can't locate Test/Pod/Snippets.pm

And Test::Pod::Snippets depends on a lot of unneeded stuff like
Object::InsideOut and Module::Locate, two I also had not installed.

If you really want to depend on those just locally, disable these tests
in the distribution if the module cannot be loaded. Even after having
the modules installed, I get

t/01distributtion.t .. skipped: Test::Distribution not installed
t/01pod_snippets.t ... skipped: Need to do more work fixing pod code snippets

so I guess it is better to just drop that test and use Test::Pod and
Test::Pod::Coverage instead:

t/00_pod.t
--
#!/usr/bin/perl

use strict;
use warnings;

use Test::More;

eval "use Test::Pod 1.00";
plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
all_pod_files_ok ();
--

t/01_pod.t
--
#!/usr/bin/perl

use strict;
use warnings;

use Test::More;

eval "use Test::Pod::Coverage tests => 1";
plan skip_all => "Test::Pod::Coverage required for testing POD Coverage" if $@;
pod_coverage_ok ("AnyData", "AnyData is covered");
--

I miss an examples folder. Docs are fine, but examples are great

Makefile.PL requires 5.004. I'd say that by now it is safe to require
at least 5.6.2, but when also using DBI, require 5.8.1. Additional, you
can then add:

* use_warnings
Add 'use warnings' to all modules. (This will require perl > 5.6)


MYMETA.json/yml should include the git repo under resources

Spell-checking - after filtering known words. I can give you the tools
on IRC

DBD-AnyData-git 529 > pod-spell-check --aspell --ispell
ok 1 - AnyData.pm
ok 2 - AnyData/Format/Base.pm
ok 3 - AnyData/Format/CSV.pm
ok 4 - AnyData/Format/FileSys.pm
ok 5 - AnyData/Format/Fixed.pm
ok 6 - AnyData/Format/HTMLtable.pm
ok 7 - AnyData/Format/Ini.pm
ok 8 - AnyData/Format/Mp3.pm
ok 9 - AnyData/Format/Paragraph.pm
ok 10 - AnyData/Format/Passwd.pm
ok 11 - AnyData/Format/Pipe.pm
ok 12 - AnyData/Format/Tab.pm
ok 13 - AnyData/Format/Text.pm
ok 14 - AnyData/Format/Weblog.pm
ok 15 - AnyData/Format/XML.pm
ok 16 - AnyData/Storage/File.pm
ok 17 - AnyData/Storage/FileSys.pm
ok 18 - AnyData/Storage/PassThru.pm
ok 19 - AnyData/Storage/RAM.pm
ok 20 - AnyData/Storage/TiedHash.pm
ok 21 - sandbox/genMETA.pm
1..21
ok 1 - CommonMistakes
not ok 1 - AnyData.pm
#   Failed test 'AnyData.pm'
#   at /pro/bin/pod-spell-check line 96.
#  got: ''additonal' => (additional additionally atonal ordinal)
# 'adTie' => (ad Tie ad-Tie Addie Artie audit date adieu edit added ate 
artier EDT attire auntie eddied adze ante anti tattie admit Eddie Addie's 
Artie's)
# 'containng' => (containing contain contains container contained counting 
contagion continuing canting condoning containers continua continue container's)
# 'DTD' => (DDT TDD STD TD DD DOD DAD DID DUD DMD DTP DVD ETD LTD IT'D)
# 'insdie' => (inside ins die ins-die insider onside indie insides inset 
Indies indies indite incite Inst inst India inside's)
# 'itslef' => (itself outsell oneself Edsel Adolf outsells dissolve)
# 'Malcom' => (Malcolm Talcum LCM Mailbomb Maalox Malacca Holcomb Welcome 
Mulct Melanoma Slocum Amalgam Locum Glaucoma Magma)
# 'mltiple' => (multiple multiply multiplier multiples multiplied 
multiplies multiple's)
# 'possiblity' => (possibility possibly possibility's possible)
# 'sqaure' => (square squarer squire scare secure squared squares Sucre 
sure square's)
# 'unpdated' => (undated updated)
# 've' => (vie V v veg vet Be Ce be E e vex VA VI Va vi we VD VF VG VJ VP 
VT Vt vb vs DE Fe GE Ge He IE Le ME Me NE Ne OE PE Re SE Se Te Xe he me re ye 
Ave Eve ave eve V's I've)'
# expected: ''
ok 2 - AnyData/Format/Base.pm
ok 3 - AnyData/Format/CSV.pm
ok 4 - AnyData/Format/FileSys.pm
not ok 5 - AnyData/Format/Fixed.pm
#   Failed test 'AnyData/Format/Fixed.pm'
#   at /pro/bin/pod-spell-check line 96.
#  got: ''formating' => (for mating for-mating formatting formation 
forming formulating formalin formative foaming firming fomenting formatting's 
floating fating format mating reformatting farming farting footing fording 
formfitting)'
# expected: ''
not ok 6 - AnyData/Format/HTMLtable.pm
#   Failed test 'AnyData/Format/HTMLtable.pm'
#   at /pro/bin/pod-spell-check line 96.
#  got: ''Sisk' => (Disk Sis Sask Sick Fisk Risk Silk Sink Sis's)'
# expected: ''
not ok 7 - AnyData/Format/Ini.pm
#   Failed test 'AnyData/Format/Ini.pm'
#   at /pro/bin/

Re: AnyData patches

2012-09-04 Thread Sven Dowideit

yup :)

http://github.com/SvenDowideit/AnyData

Sven


On 04/09/12 21:05, H.Merijn Brand wrote:

On Sun, 02 Sep 2012 08:56:04 +1000, Sven Dowideit  
wrote:

Heya

I used git send-emails to post some patches to rehs...@cpan.org and
this list, but I suspect they haven't made it due to my server setup

before I send them again, I thought I'd test, and ask if anyone has
received them :)

Does all of this has some git repo we could clone so we can run some
(more) tests on it?





Re: More problems with bound parameters in DBD::ODBC

2012-09-04 Thread Tim Bunce
On Tue, Sep 04, 2012 at 11:28:17AM +0100, Martin J. Evans wrote:
> This issue cropped up because runrig posted a "DBI bind_param_inout trick" 
> node (http://perlmonks.org/?node_id=989136) on perl monks which when I ran 
> through DBD::ODBC did not work. The code is basically:
> 
> my @cols = qw(foo bar);
> my $sql = < SELECT :foo, :bar
> SQL
> 
> my $sth = $dbh->prepare($sql);
> my %hsh;
> for (@cols) {
>   $sth->bind_param_inout( "$_" => \$hsh{$_}, 0 );
> }
> $hsh{foo} = 'abc';
> $hsh{bar} = 123;
> $sth->execute();
> while (my @arr = $sth->fetchrow_array) {
>   print "@arr\n";
> }
> $hsh{bar} = 456;
> $sth->execute();
> while (my @arr = $sth->fetchrow_array) {
>   print "@arr\n";
> }
> 
> which should output:
> abc 123
> abc 456
> 
> but actually outputs:
> Use of uninitialized value $arr[0] in join or string at /tmp/x.pl line 33.
>  123
> Use of uninitialized value $arr[0] in join or string at /tmp/x.pl line 39.
>  456
> 
> The problem is that DBD::ODBC binds the parameter initially when 
> bind_param_inout is called then when execute is called it needs to determine 
> if the parameters need to be rebound (if something significant has changed). 
> It uses the following test:
> 
> if (SvTYPE(phs->sv) != phs->sv_type /* has the type changed? */
> || (SvOK(phs->sv) && !SvPOK(phs->sv)) /* is there still a string? */
> || (SvPVX(phs->sv) != phs->sv_buf) /* has the string buffer moved? */
>) {
>   /* rebind the parameter */
>  }
> 
> I have some issues with this (in addition to it not working):
> 
> 1. DBD::ODBC always calls SvUPGRADE(phs->sv, SVt_PVNV) on output parameters 
> so the type is unlikely to change.

Anything can happn to the sv between the bind_param_inout and the execute.

> 2. DBD::ODBC always calls SvGROW on output parameters to grow them to
> 28 chrs (some magic about 28 I don't know) to avoid mutation in most
> cases. As a result, if you change the test code so the first param is
> bigger than 28 chrs it works.

I vaguely recall some magic about the value, but not the specifics.

> 3. I don't understand what the (SvOK(phs->sv) && !SvPOK(phs->sv)) is
> for. I know what those macros do but not why that test is present. Any
> ideas? It is in other DBDs too.

That's saying "rebind if the sv is defined but doesn't have a string".
I think the "not defined" case is (or should be) handled elsewhere, so
the test is mainly to check that the sv still contains a string.
(Before then testing SvPVX()).

> 4. I'm unsure how to make this work although if I simply add a test to
> say has SvOK(phs->sv) changed since binding it makes this example
> work. Anyone any ideas if this is sufficient?

Something along those lines should be fine. Looking at DBD::Oracle,
in which I probably first wrote that code (perhaps around 1996 :-)
I see a few lines higher up:

/* is the value a null? */
phs->indp = (SvOK(sv)) ? 0 : -1;

so I presume that oracle 'indicator parameter' handles the 'is currently
null' case, so the if() statement only has to deal with the not-null case.
Oracle's need for rebinding probably differs in subtle ways from ODBC's.

This particular situation is transitioning from an undef to defined.
And this particular kind of undef has SvTYPE == 0, in case that's relevant.

Hope that helps.

Tim.


Re: AnyData patches

2012-09-04 Thread H.Merijn Brand
On Sun, 02 Sep 2012 08:56:04 +1000, Sven Dowideit  
wrote:
> Heya
> 
> I used git send-emails to post some patches to rehs...@cpan.org and
> this list, but I suspect they haven't made it due to my server setup
> 
> before I send them again, I thought I'd test, and ask if anyone has
> received them :)

Does all of this has some git repo we could clone so we can run some
(more) tests on it?

-- 
H.Merijn Brand  http://tux.nl   Perl Monger  http://amsterdam.pm.org/
using perl5.00307 .. 5.14   porting perl5 on HP-UX, AIX, and openSUSE
http://mirrors.develooper.com/hpux/http://www.test-smoke.org/
http://qa.perl.org   http://www.goldmark.org/jeff/stupid-disclaimers/


More problems with bound parameters in DBD::ODBC

2012-09-04 Thread Martin J. Evans

This issue cropped up because runrig posted a "DBI bind_param_inout trick" node 
(http://perlmonks.org/?node_id=989136) on perl monks which when I ran through DBD::ODBC 
did not work. The code is basically:

my $dbh = DBI->connect;
my @cols = qw(foo bar);
my $sql = bind_param_inout( "$_" => \$hsh{$_}, 0 );
}

# Set constants...
$hsh{foo} = 'abc';

# Set changing values
$hsh{bar} = 123;

$sth->execute();
while (my @arr = $sth->fetchrow_array) {
  print "@arr\n";
}

$hsh{bar} = 456;
$sth->execute();
while (my @arr = $sth->fetchrow_array) {
  print "@arr\n";
}
$dbh->disconnect();

which should output:

abc 123
abc 456

but actually outputs:

Use of uninitialized value $arr[0] in join or string at /tmp/x.pl line 33.
 123
Use of uninitialized value $arr[0] in join or string at /tmp/x.pl line 39.
 456

The problem is that DBD::ODBC binds the parameter initially when 
bind_param_inout is called then when execute is called it needs to determine if 
the parameters need to be rebound (if something significant has changed). It 
uses the following test:

if (SvTYPE(phs->sv) != phs->sv_type /* has the type changed? */
|| (SvOK(phs->sv) && !SvPOK(phs->sv)) /* is there still a string? */
|| (SvPVX(phs->sv) != phs->sv_buf) /* has the string buffer moved? */
   ) {
  /* rebind the parameter */
 }

I have some issues with this (in addition to it not working):

1. DBD::ODBC always calls SvUPGRADE(phs->sv, SVt_PVNV) on output parameters so 
the type is unlikely to change.

2. DBD::ODBC always calls SvGROW on output parameters to grow them to 28 chrs 
(some magic about 28 I don't know) to avoid mutation in most cases. As a 
result, if you change the test code so the first param is bigger than 28 chrs 
it works.

3. I don't understand what the (SvOK(phs->sv) && !SvPOK(phs->sv)) is for. I 
know what those macros do but not why that test is present. Any ideas? It is in other DBDs 
too.

4. I'm unsure how to make this work although if I simply add a test to say has 
SvOK(phs->sv) changed since binding it makes this example work. Anyone any 
ideas if this is sufficient?

Thanks.

Martin
--
Martin J. Evans
Easysoft Limited
http://www.easysoft.com