Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: SQLite handling of errors through common function

by mje (Curate)
on Nov 06, 2013 at 17:16 UTC ( [id://1061448]=note: print w/replies, xml ) Need Help??


in reply to SQLite handling of errors through common function

The first thing I'd point out is that if your connect worked but an error occurred later the arguments to the HandleError sub are 1. error string 2. the db handle being used when the fail occurred and 3. the first value returned by the failing method. Your HandleError sub seems to assume it is going to get a message/error string and a database name which it is ONLY going to get IF you call it like on line 23 of your example and not IF DBI calls it.

The second thing to point out is that if you have not connected then there is no connection handle passed to HandleError so the 2nd argument will be a DBI::dr, instead. e.g.,

perl -MDBI -le 'use Data::Dumper; sub he {print Dumper(\@_);};my $h = +DBI->connect("dbi:ODBC:does_not_exist", undef, undef, {HandleError => + \&he});' $VAR1 = [ 'DBI connect(\'does_not_exist\',\'\',...) failed: [unixODBC] +[Driver Manager]Data source name not found, and no default driver spe +cified (SQL-IM002)', bless( {}, 'DBI::dr' ), undef ];

Lastly, you are calling your own handle_error if connect fails so at that point you already know the connect failed. Your lines 18 to 23 will end in handle_error being called twice if connect fails.

Replies are listed 'Best First'.
Re^2: SQLite handling of errors through common function
by techman2006 (Beadle) on Nov 07, 2013 at 08:27 UTC

    One more quick thing is there a way to know DBI handler is valid. Say I do a connect call and it went fine. Now at some place in my code I need to perform the operation but before that I want to validate that #dbh is valid. Can we do that?

    Also can we have a way to create an schema which comprises of tables like we do in say MySQL etc. I mean to say we have a schema called master which contains tables like tbl1, tbl2 etc.

      I presume you really mean is the DBI handle I obtained from connect still actively connected to my database. If that is the case see the DBI ping method. As for the second part of your post I've no idea what you are asking. Of course you can create tables in a database.

        Thanks I want to mean the DBI handle which is obtained after connect call.

        For the second point let me try to explain further with an example. Say we want to create an database called EmpRec which will comprises of a set tables e.g. EmpAdd, EmpSal etc. Now when we try to connect first we need to connect to EmpRec database. Below are the set of queries which is fired in MySql

        mysql> CREATE DATABASE EmpRec;

        mysql> USE EmpRec Database changed

        So is something like above is supported in SQLite and if yes how we can do that

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1061448]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others perusing the Monastery: (5)
As of 2025-06-18 11:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.