[DB-SIG] ping method for connection objects

Chris Cogdon chris@cogdon.org
Tue, 8 Oct 2002 13:57:40 -0700


On Tuesday, Oct 8, 2002, at 13:45 US/Pacific, M.-A. Lemburg wrote:

> Michael C. Neel wrote:
>> Just a request for the spec, is that a ping method be added to the
>> connection object to test if the db handle is still valid, not unlike
>> perl's DBI interface.  Ideally a reconnect method would be handy as
>> well.
>
> I'm not sure whether such a feature is available on a broad
> enough basis, e.g. ODBC only recently added such a feature
> to the spec and it's not available in all drivers.
>
> Maybe we just need a portable way to test the connection,
> e.g. a dummy SQL statement ?
>
> try:
>      connection.cursor().execute('select x from nonexistingtable')
> except OperationalError:
>      # reconnect
>      pass
> except ProgrammingError:
>      # alive
>      pass
>
>> Otherwise, I find the spec very complete!
>
> Same here :-)

Well, isn't the the entire purpose of the DBI?

Ie, should we not create a method that either uses the database's 
particular 'are you there', method, or emulates it using something like 
the above construct. ??

For example:

in the specification:

connection.ping()    will  test the database connection and return an 
exception if the connection is broken


in an implementation who's backend database has a ping method:

def ping ( self ):
	if not self._db.ping ()
		raise OperationalError


in an implementation who's backend database does not have a ping method:

def ping ( self ):
	try:
	     connection.cursor().execute('select x from nonexistingtable')
	except OperationalError:
	     # reconnect
	     pass
	except ProgrammingError:
	     # alive
	     pass

Or something like this.

ie, the whole idea of a DBABI is to remove the reliance on the 
particular implementation for the DB. If a particular method starts to 
become widely available over a set of databases, this method should be 
added to the next rev of the API, and API writers instructed to call 
the method, or emulate it. To help the API writers, it would be easy 
enough to write a 'base class' that the API can inherit from to supply 
common emulations for these special methods, so all the API writer 
needs to do is replace the method if a more-efficient method is 
available for that particular DB, or if the particular emulation 
doesn't work for that DB.
		

This is the same argument for ensuring that python operators work the 
same way over all implementations, rather than saying "the XYZ 
operator's behavior is dependant on the underlying C module".


-- 
    ("`-/")_.-'"``-._        Ch'marr, a.k.a.
     . . `; -._    )-;-,_`)  Chris Cogdon <chmarr@furry.org.au>
    (v_,)'  _  )`-.\  ``-'
   _.- _..-_/ / ((.'       FC1.3: 
FFH3cmA+>++C++D++H++M++P++R++T+++WZ++Sm++
((,.-'   ((,/   fL               RLCT acl+++d++e+f+++h++i++++jp-sm++