DBD::Pg Implementation for cancel()?

[email protected] ("Eric Simon")
Newsgroups perl.dbi.users,perl.dbd.pg
Message-ID <B6688AE83EF44F01B7F00F045573A1F5@Masterchief>
Doh!  It is attached now.

-- 
Eric Simon
The IQ Group, Inc.


-----Original Message-----
From: Eric Simon [mailto:[email protected]] 
Sent: Monday, October 18, 2010 10:52 PM
To: 'Greg Sabino Mullane'; '[email protected]'; '[email protected]'
Subject: DBD::Pg Implementation for cancel()?

Hi Greg/all,

I've implemented cancel() for DBD::Pg and it works just like the one for
DBD::Oracle.  I've attached a patch in case you'd like to roll it in to your
next version.

-- 
Eric Simon
The IQ Group, Inc.


-----Original Message-----
From: Greg Sabino Mullane [mailto:[email protected]] 
Sent: Thursday, August 05, 2010 4:24 PM
To: [email protected]
Subject: RE: DBD::Pg Implementation for cancel()?


-----BEGIN PGP SIGNED MESSAGE-----
Hash: RIPEMD160

From: "Eric Simon" <[email protected]>
To: <[email protected]>
Subject: RE: DBD::Pg Implementation for cancel()?
Date: 6:19 PM on Wednesday, August 04, 2010
X-Maillaunder-Av-Scan: YES:40743a065537e4cb1b81cbd0584176e7
X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on
incoming.maillaunder.com
X-Spam-Level: 
X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_HI,
RDNS_NONE,SPF_PASS,TW_PG autolearn=ham version=3.2.5
X-Spam-PDF-Info: pdf=_PDFCOUNT_, pdfimg=_PDFIMGCOUNT_, ver=_PDFVERSION_,
name=_PDFNAME_
X-Mailer: Microsoft Office Outlook 11
X-Mimeole: Produced By Microsoft MimeOLE V6.1.7600.16543
X-Old-Spam-Status: No, score=-2.5 required=3.3
tests=ALL_TRUSTED,AWL,BAYES_00, DNS_FROM_RFC_BOGUSMX autolearn=no
version=3.2.5

...
> confusing.  I meant to say that we wouldn't need to use pg_async if
> if $sth->cancel() was implemented.  To be more specific, we are doing
> something very close to what the DBI docs show in their "Signal Handling
> and Canceling Operations" section.  Here is our abridged code that works
> on DBD::Oracle:
...

Ah, okay, now it makes sense with the alarm. I will look into if that 
will work with DBD::Pg but it may be a while, I'm very backed up at 
the moment. (Here's your chance, all you quiet potential dbdpg hackers 
on this list! :)

> I'll see what I can do about narrowing down the destabilizing affect 
> that pg_async had in our test suite, although narrowing that down will 
> take quite some time (because I don't want to just shove a ton of code at
you).

Yeah, small reproducible test cases are worth the wait. Send what you can, 
when you can. Better still, open a bug at rt.cpan.org if you think it's 
a problem on our end. Thanks.

- -- 
Greg Sabino Mullane [email protected]
End Point Corporation http://www.endpoint.com/
PGP Key: 0x14964AC8 201008051721
http://biglumber.com/x/web?pk=2529DF6AB8F79407E94445B4BC9B906714964AC8
-----BEGIN PGP SIGNATURE-----

iEYEAREDAAYFAkxbK8cACgkQvJuQZxSWSsjhlQCeMc0RJMarcQRIEcdGJl1fjEyJ
9vkAoJ0Jm1xL55qJoegi3hFM75o/4Cnd
=O9aR
-----END PGP SIGNATURE-----
dbd-pg-patch-for-cancel.patch (application/octet-stream, 2.2 KB)
Index: dbdimp.c
===================================================================
--- dbdimp.c	(revision 14500)
+++ dbdimp.c	(working copy)
@@ -4909,7 +4909,40 @@
 } /* end of handle_old_async */
 
 
+/* ================================================================== */
+/* Attempt to cancel a synchronous query
+   Returns true if the cancel succeeded, and false if it did not */
+int dbd_st_cancel(SV *sth, imp_sth_t *imp_sth)
+{
+	dTHX;
+	D_imp_dbh_from_sth;
+	PGcancel *cancel;
+	char errbuf[256];
 
+	if (TSTART) TRC(DBILOGFP, "%sBegin dbd_st_cancel\n", THEADER);
+
+	/* Get the cancel structure */
+	TRACE_PQGETCANCEL;
+	cancel = PQgetCancel(imp_dbh->conn);
+
+	/* This almost always works. If not, free our structure and complain loudly */
+	TRACE_PQGETCANCEL;
+	if (!PQcancel(cancel, errbuf, sizeof(errbuf))) {
+		TRACE_PQFREECANCEL;
+		PQfreeCancel(cancel);
+		if (TRACEWARN) TRC(DBILOGFP, "%sPQcancel failed: %s\n", THEADER, errbuf);
+		pg_error(aTHX_ sth, PGRES_FATAL_ERROR, "PQcancel failed");
+		if (TEND) TRC(DBILOGFP, "%sEnd dbd_st_cancel (error: cancel failed)\n", THEADER);
+		return DBDPG_FALSE;
+	}
+	TRACE_PQFREECANCEL;
+	PQfreeCancel(cancel);
+
+	if (TEND) TRC(DBILOGFP, "%sEnd dbd_st_cancel\n", THEADER);
+	return DBDPG_TRUE;
+
+} /* end of dbd_st_cancel */
+
 /*
 Some information to keep you sane:
 typedef enum
Index: dbdimp.h
===================================================================
--- dbdimp.h	(revision 14500)
+++ dbdimp.h	(working copy)
@@ -166,9 +166,12 @@
 #define dbd_st_rows pg_st_rows
 int dbd_st_rows (SV * sth, imp_sth_t * imp_sth);
 
-#define dbd_st_finish  pg_st_finidh
+#define dbd_st_finish  pg_st_finish
 int dbd_st_finish (SV * sth, imp_sth_t * imp_sth);
 
+#define dbd_st_cancel pg_st_cancel
+int dbd_st_cancel (SV * sth, imp_sth_t * imp_sth);
+
 #define dbd_st_destroy  pg_st_destroy
 void dbd_st_destroy (SV * sth, imp_sth_t * imp_sth);
 
Index: Pg.xs
===================================================================
--- Pg.xs	(revision 14500)
+++ Pg.xs	(working copy)
@@ -796,6 +796,13 @@
 	D_imp_sth(sth);
 	ST(0) = pg_db_cancel_sth(sth, imp_sth) ? &PL_sv_yes : &PL_sv_no;
 
+void
+cancel(sth)
+	SV *sth
+	CODE:
+	D_imp_sth(sth);
+	ST(0) = dbd_st_cancel(sth, imp_sth) ? &PL_sv_yes : &PL_sv_no;
+
 #if PGLIBVERSION >= 80000
 
 void
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.