On Fri, 10 Oct 2008 16:19:20 +0100, Martin Evans <[EMAIL PROTECTED]> wrote:
> Hi, > > The DBI specification for ParamTypes taken from the DBI pod says the > following for ParamTypes: > > Returns a reference to a hash containing the type information currently > bound to placeholders. The keys of the hash are the ’names’ of the > placeholders: either integers starting at 1, or, for drivers that > support named placeholders, the actual parameter name string. The hash > values are hashrefs of type information in the same form as that > provided to the various bind_param() methods (See "bind_param" for the > format and values), plus anything else that was passed as the third > argument to bind_param(). Returns undef if not supported by the driver. > > I'm not sure why the values of the keys are hash references unless because if only the numeric values were supported, it would have been a list, not a hash, but when placeholder names come in sight, a list would not do $sth = $dbh->prepare ("select * from xx where xs between ? and ? or xc = ?"); $sth->execute (4, 7, "0"); ParamValues => { 1 => 4, 2 => 7, 3 => "0" }, ParamTypes => { 1 => 5, 2 => 5, 3 => 1 }, If param names are supported, that might look like ParamValues => { foo => 4, bar => 7, baz => "0" }, ParamTypes => { foo => 5, bar => 5, baz => 1 }, > multiple values are to be stored. If multiple values per key are stored > what are they typically? I can only find one DBD which implements > ParamTypes (DBD::Pg) and unless I am mistaken it sets the values of the I implemented it in DBD::Unify as of 0.75 in a bigger patch to implement as much as possible of the DBI defenition: *** Release 0.75 - Tue 23 Sep 2008 <[EMAIL PROTECTED]> - Three-level dbd_verbose and documentation - $ENV{DBD_TRACE} sets $dbh->{dbd_verbose} on/before connect - New tests for $h->trace (...) and $h->{dbd_verbose} - Added type_info_all (), get_info (), and parse_trace_flag () - Note that identifiers are now quoted - Override quote_identifier () (UNIFY has no CATALOGS) - Accept 2-arg and 3-arg ->do () - Accept %attr to ->prepare () - Raised all verbose levels by 1. 1 and 2 are now DBI only - Removed 05-reauth.t - NULLABLE now always 2, as it doesn't work - Implemented CursorName sth attribute - Implemented ParamValues sth attribute - Implemented ParamTypes sth attribute - Implemented RowsInCache sth attribute (always 0) - Tested with Unify 6.3AB on HP-UX 10.20 with perl 5.8.8 - Tested with Unify 8.2BC on HP-UX 11.00 with perl 5.8.8 - Tested with Unify 8.3I on HP-UX 11.23 with perl 5.10.0 - Tested with Unify 8.3K on AIX 5.2.0.0 with perl 5.8.8 Tests will fail on older perls, as the test cases use scalarIO > keys to a scalar value - the type of the parameter. in dbd_st_FETCH_aatrib () if (kl == 10 && strEQ (key, "ParamTypes")) { HV *hv = newHV (); retsv = newRV (sv_2mortal ((SV *)hv)); while (--p >= 0) { char key[8]; sprintf (key, "%d", p + 1); hv_store (hv, key, strlen (key), newSViv (imp_sth->prm[p].ftp), 0); } } > Reason I'm asking is it is on my to do list for DBD::ODBC. The test case in t/20-uni-basic.t now looks like ok ($sth = $dbh->prepare ("select * from xx where xs between ? and ? or xc = ?"), "sel prepare"); ok ($sth->execute (4, 7, "0"), "execute"); ok (1, "-- Check the internals"); { my %attr = ( # $sth attributes as documented in DBI-1.607 NAME => [qw( xs xl xc xf xr xa xh xT xd xe )], NAME_lc => [qw( xs xl xc xf xr xa xh xt xd xe )], NAME_uc => [qw( XS XL XC XF XR XA XH XT XD XE )], NAME_hash => {qw( xs 0 xl 1 xc 2 xf 3 xr 4 xa 5 xh 6 xT 7 xd 8 xe 9 )}, NAME_lc_hash => {qw( xs 0 xl 1 xc 2 xf 3 xr 4 xa 5 xh 6 xt 7 xd 8 xe 9 )}, NAME_uc_hash => {qw( XS 0 XL 1 XC 2 XF 3 XR 4 XA 5 XH 6 XT 7 XD 8 XE 9 )}, uni_types => [ 5, 2, 1, 8, 7, -4, -6, -7, -3, -11], TYPE => [ 5, 2, 1, 8, 7, 6, 7, 10, 9, 11], PRECISION => [ 4, 9, 5, 64, 32, 9, 15, 0, 0, 0], SCALE => [ 0, 0, 0, 0, 0, 2, 2, 0, 0, 0], # NULLABLE => [ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1], # Does not work in Unify (yet) NULLABLE => [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], CursorName => "c_sql_00_000001", NUM_OF_FIELDS => 10, NUM_OF_PARAMS => 3, Database => $dbh, ParamValues => { 1 => 4, 2 => 7, 3 => "0" }, ParamTypes => { 1 => 5, 2 => 5, 3 => 1 }, ParamArrays => undef, # NYI RowsInCache => 0, ); foreach my $attr (sort keys %attr) { #printf STDERR "\n%-20s %s\n", $attr, "@{$sth->{$attr}}"; my $av = exists $sth->{$attr} ? $sth->{$attr} : undef; is_deeply ($av, $attr{$attr}, "attr $attr"); } } -- H.Merijn Brand Amsterdam Perl Mongers http://amsterdam.pm.org/ using & porting perl 5.6.2, 5.8.x, 5.10.x, 5.11.x on HP-UX 10.20, 11.00, 11.11, 11.23, and 11.31, SuSE 10.1, 10.2, and 10.3, AIX 5.2, and Cygwin. http://mirrors.develooper.com/hpux/ http://www.test-smoke.org/ http://qa.perl.org http://www.goldmark.org/jeff/stupid-disclaimers/