[svn:DBD-Pg] r11584 - in DBD-Pg/trunk: . lib/Bundle/DBD

[email protected]
Newsgroups perl.dbd.pg.changes
Message-ID <[email protected]>
Author: turnstep
Date: Wed Jul 23 22:32:31 2008
New Revision: 11584

Modified:
   DBD-Pg/trunk/Changes
   DBD-Pg/trunk/META.yml
   DBD-Pg/trunk/Makefile.PL
   DBD-Pg/trunk/Pg.pm
   DBD-Pg/trunk/README
   DBD-Pg/trunk/dbdimp.c
   DBD-Pg/trunk/dbdimp.h
   DBD-Pg/trunk/lib/Bundle/DBD/Pg.pm

Log:
Do the Newz() and Safefree() calls only once per statement handle by 
moving the structs out to the statement handle, which saves having 
to continually allocate and free space for them with multiple executes 
against the same statement handle.
Bump version up to 2.8.8


Modified: DBD-Pg/trunk/Changes
==============================================================================
--- DBD-Pg/trunk/Changes	(original)
+++ DBD-Pg/trunk/Changes	Wed Jul 23 22:32:31 2008
@@ -1,5 +1,10 @@
 ('GSM' is Greg Sabino Mullane, [email protected])
 
+2.8.8
+
+	- Move PQexec structures to statement handle, to prevent 
+		excessive malloc and free within execute function. [GSM]
+
 2.8.7 Released July 24, 2008 (subversion r11582)
 
 	- Modify test scripts to work better on FreeBSD boxes.

Modified: DBD-Pg/trunk/META.yml
==============================================================================
--- DBD-Pg/trunk/META.yml	(original)
+++ DBD-Pg/trunk/META.yml	Wed Jul 23 22:32:31 2008
@@ -1,6 +1,6 @@
 --- #YAML:1.0
 name                        : DBD-Pg
-version                     : 2.8.7
+version                     : 2.8.8
 abstract                    : DBI PostgreSQL interface
 author:              
   - Greg Sabino Mullane <[email protected]>
@@ -38,10 +38,10 @@
 provides:
   DBD::Pg:
     file                    : Pg.pm
-    version                 : 2.8.7
+    version                 : 2.8.8
   Bundle::DBD::Pg:
     file                    : lib/Bundle/DBD/Pg.pm
-    version                 : 2.8.7
+    version                 : 2.8.8
 
 keywords:
   - Postgres

Modified: DBD-Pg/trunk/Makefile.PL
==============================================================================
--- DBD-Pg/trunk/Makefile.PL	(original)
+++ DBD-Pg/trunk/Makefile.PL	Wed Jul 23 22:32:31 2008
@@ -7,7 +7,7 @@
 use 5.006001;
 
 ## No version.pm for this one, as the prereqs are not loaded yet.
-my $VERSION = '2.8.7';
+my $VERSION = '2.8.8';
 
 my $lib;
 BEGIN {

Modified: DBD-Pg/trunk/Pg.pm
==============================================================================
--- DBD-Pg/trunk/Pg.pm	(original)
+++ DBD-Pg/trunk/Pg.pm	Wed Jul 23 22:32:31 2008
@@ -17,7 +17,7 @@
 {
 	package DBD::Pg;
 
-	use version; our $VERSION = qv('2.8.7');
+	use version; our $VERSION = qv('2.8.8');
 
 	use DBI ();
 	use DynaLoader ();
@@ -1696,7 +1696,7 @@
 
 =head1 VERSION
 
-This documents version 2.8.7 of the DBD::Pg module
+This documents version 2.8.8 of the DBD::Pg module
 
 =head1 DESCRIPTION
 

Modified: DBD-Pg/trunk/README
==============================================================================
--- DBD-Pg/trunk/README	(original)
+++ DBD-Pg/trunk/README	Wed Jul 23 22:32:31 2008
@@ -6,7 +6,7 @@
 DESCRIPTION:
 ------------
 
-This is version 2.8.7 of DBD::Pg.  The web site for this interface, and 
+This is version 2.8.8 of DBD::Pg.  The web site for this interface, and 
 the latest version, can be found at:
 
 	http://search.cpan.org/dist/DBD-Pg/

Modified: DBD-Pg/trunk/dbdimp.c
==============================================================================
--- DBD-Pg/trunk/dbdimp.c	(original)
+++ DBD-Pg/trunk/dbdimp.c	Wed Jul 23 22:32:31 2008
@@ -1365,6 +1365,10 @@
 	imp_sth->type_info        = NULL;
 	imp_sth->seg              = NULL;
 	imp_sth->ph               = NULL;
+	imp_sth->PQvals           = NULL;
+	imp_sth->PQlens           = NULL;
+	imp_sth->PQfmts           = NULL;
+	imp_sth->PQoids           = NULL;
 	imp_sth->prepared_by_us   = DBDPG_FALSE; /* Set to 1 when actually done preparing */
 	imp_sth->onetime          = DBDPG_FALSE; /* Allow internal shortcut */
 	imp_sth->direct           = DBDPG_FALSE;
@@ -1958,7 +1962,6 @@
 	int          status = -1;
 	seg_t *      currseg;
 	bool         oldprepare = DBDPG_TRUE;
-	Oid *        paramTypes = NULL;
 	ph_t *       currph;
 
 	if (TSTART) TRC(DBILOGFP, "%sBegin pg_st_prepare_statement\n", THEADER);
@@ -2053,17 +2056,18 @@
 		int params = 0;
 		if (imp_sth->numbound!=0) {
 			params = imp_sth->numphs;
-			Newz(0, paramTypes, imp_sth->numphs, Oid);
+			if (NULL == imp_sth->PQoids) {
+				Newz(0, imp_sth->PQoids, imp_sth->numphs, Oid);
+			}
 			for (x=0,currph=imp_sth->ph; NULL != currph; currph=currph->nextph) {
-				paramTypes[x++] = (currph->defaultval) ? 0 : (Oid)currph->bind_type->type_id;
+				imp_sth->PQoids[x++] = (currph->defaultval) ? 0 : (Oid)currph->bind_type->type_id;
 			}
 		}
 		if (TSQL)
 			TRC(DBILOGFP, "PREPARE %s AS %s;\n\n", imp_sth->prepare_name, statement);
 
 		TRACE_PQPREPARE;
-		result = PQprepare(imp_dbh->conn, imp_sth->prepare_name, statement, params, paramTypes);
-		Safefree(paramTypes);
+		result = PQprepare(imp_dbh->conn, imp_sth->prepare_name, statement, params, imp_sth->PQoids);
 		if (result) {
 			TRACE_PQRESULTSTATUS;
 			status = PQresultStatus(result);
@@ -2732,10 +2736,6 @@
 	ph_t *        currph;
 	int           status = -1;
 	STRLEN        execsize, x;
-	const char ** paramValues = NULL;
-	int *         paramLengths = NULL;
-	int *         paramFormats = NULL;
-	Oid *         paramTypes = NULL;
 	seg_t *       currseg;
 	char *        statement = NULL;
 	int           num_fields;
@@ -2847,24 +2847,28 @@
 	}
 	else { /* We are using a server that can handle PQexecParams/PQexecPrepared */
 		/* Put all values into an array to pass to PQexecPrepared */
-		Newz(0, paramValues, imp_sth->numphs, const char *); /* freed below */
+		if (NULL == imp_sth->PQvals) {
+			Newz(0, imp_sth->PQvals, imp_sth->numphs, const char *); /* freed in dbd_st_destroy */
+		}
 		for (x=0,currph=imp_sth->ph; NULL != currph; currph=currph->nextph) {
-			paramValues[x++] = currph->value;
+			imp_sth->PQvals[x++] = currph->value;
 		}
 
 		/* Binary or regular? */
 
 		if (imp_sth->has_binary) {
-			Newz(0, paramLengths, imp_sth->numphs, int); /* freed below */
-			Newz(0, paramFormats, imp_sth->numphs, int); /* freed below */
+			if (NULL == imp_sth->PQlens) {
+				Newz(0, imp_sth->PQlens, imp_sth->numphs, int); /* freed in dbd_st_destroy */
+				Newz(0, imp_sth->PQfmts, imp_sth->numphs, int); /* freed below */
+			}
 			for (x=0,currph=imp_sth->ph; NULL != currph; currph=currph->nextph,x++) {
 				if (PG_BYTEA==currph->bind_type->type_id) {
-					paramLengths[x] = (int)currph->valuelen;
-					paramFormats[x] = 1;
+					imp_sth->PQlens[x] = (int)currph->valuelen;
+					imp_sth->PQfmts[x] = 1;
 				}
 				else {
-					paramLengths[x] = 0;
-					paramFormats[x] = 0;
+					imp_sth->PQlens[x] = 0;
+					imp_sth->PQfmts[x] = 0;
 				}
 			}
 		}
@@ -2908,9 +2912,6 @@
 				if (TRACE5) TRC(DBILOGFP, "%sRe-preparing statement\n", THEADER);
 			}
 			if (pg_st_prepare_statement(aTHX_ sth, imp_sth)!=0) {
-				Safefree(paramValues);
-				Safefree(paramLengths);
-				Safefree(paramFormats);
 				if (TEND) TRC(DBILOGFP, "%sEnd dbd_st_execute (error)\n", THEADER);
 				return -2;
 			}
@@ -2924,10 +2925,10 @@
 			for (x=0,currph=imp_sth->ph; NULL != currph; currph=currph->nextph,x++) {
 				TRC(DBILOGFP, "%sPQexecPrepared item #%d\n", THEADER, x);
 				TRC(DBILOGFP, "%s-> Value: (%s)\n",
-					THEADER, (paramFormats && paramFormats[x]==1) ? "(binary, not shown)" 
-									: paramValues[x]);
-				TRC(DBILOGFP, "%s-> Length: (%d)\n", THEADER, paramLengths ? paramLengths[x] : 0);
-				TRC(DBILOGFP, "%s-> Format: (%d)\n", THEADER, paramFormats ? paramFormats[x] : 0);
+					THEADER, (imp_sth->PQfmts && imp_sth->PQfmts[x]==1) ? "(binary, not shown)" 
+									: imp_sth->PQvals[x]);
+				TRC(DBILOGFP, "%s-> Length: (%d)\n", THEADER, imp_sth->PQlens ? imp_sth->PQlens[x] : 0);
+				TRC(DBILOGFP, "%s-> Format: (%d)\n", THEADER, imp_sth->PQfmts ? imp_sth->PQfmts[x] : 0);
 			}
 		}
 		
@@ -2936,7 +2937,7 @@
 		if (TSQL) {
 			TRC(DBILOGFP, "EXECUTE %s (\n", imp_sth->prepare_name);
 			for (x=0,currph=imp_sth->ph; NULL != currph; currph=currph->nextph,x++) {
-				TRC(DBILOGFP, "$%d: %s\n", x+1, paramValues[x]);
+				TRC(DBILOGFP, "$%d: %s\n", x+1, imp_sth->PQvals[x]);
 			}
 			TRC(DBILOGFP, ");\n\n");
 		}
@@ -2944,12 +2945,12 @@
 		if (imp_sth->async_flag & PG_ASYNC) {
 			TRACE_PQSENDQUERYPREPARED;
 			ret = PQsendQueryPrepared
-				(imp_dbh->conn, imp_sth->prepare_name, imp_sth->numphs, paramValues, paramLengths, paramFormats, 0);
+				(imp_dbh->conn, imp_sth->prepare_name, imp_sth->numphs, imp_sth->PQvals, imp_sth->PQlens, imp_sth->PQfmts, 0);
 		}
 		else {
 			TRACE_PQEXECPREPARED;
 			imp_sth->result = PQexecPrepared
-				(imp_dbh->conn, imp_sth->prepare_name, imp_sth->numphs, paramValues, paramLengths, paramFormats, 0);
+				(imp_dbh->conn, imp_sth->prepare_name, imp_sth->numphs, imp_sth->PQvals, imp_sth->PQlens, imp_sth->PQfmts, 0);
 		}
 	} /* end new-style prepare */
 	else {
@@ -2992,26 +2993,28 @@
 			}
 			statement[execsize] = '\0';
 			
-			/* Populate paramTypes */
-			Newz(0, paramTypes, imp_sth->numphs, Oid);
+			/* Populate PQoids */
+			if (NULL == imp_sth->PQoids) {
+				Newz(0, imp_sth->PQoids, imp_sth->numphs, Oid);
+			}
 			for (x=0,currph=imp_sth->ph; NULL != currph; currph=currph->nextph) {
-				paramTypes[x++] = (currph->defaultval) ? 0 : (Oid)currph->bind_type->type_id;
+				imp_sth->PQoids[x++] = (currph->defaultval) ? 0 : (Oid)currph->bind_type->type_id;
 			}
 		
 			if (TRACE7) {
 				for (x=0,currph=imp_sth->ph; NULL != currph; currph=currph->nextph,x++) {
 					TRC(DBILOGFP, "%sPQexecParams item #%d\n", THEADER, x);
-					TRC(DBILOGFP, "%s-> Type: (%d)\n", THEADER, paramTypes[x]);
-					TRC(DBILOGFP, "%s-> Value: (%s)\n", THEADER, paramValues[x]);
-					TRC(DBILOGFP, "%s-> Length: (%d)\n", THEADER, paramLengths ? paramLengths[x] : 0);
-					TRC(DBILOGFP, "%s-> Format: (%d)\n", THEADER, paramFormats ? paramFormats[x] : 0);
+					TRC(DBILOGFP, "%s-> Type: (%d)\n", THEADER, imp_sth->PQoids[x]);
+					TRC(DBILOGFP, "%s-> Value: (%s)\n", THEADER, imp_sth->PQvals[x]);
+					TRC(DBILOGFP, "%s-> Length: (%d)\n", THEADER, imp_sth->PQlens ? imp_sth->PQlens[x] : 0);
+					TRC(DBILOGFP, "%s-> Format: (%d)\n", THEADER, imp_sth->PQfmts ? imp_sth->PQfmts[x] : 0);
 				}
 			}
 
 			if (TSQL) {
 				TRC(DBILOGFP, "EXECUTE %s (\n", statement);
 				for (x=0,currph=imp_sth->ph; NULL != currph; currph=currph->nextph,x++) {
-					TRC(DBILOGFP, "$%d: %s\n", x+1, paramValues[x]);
+					TRC(DBILOGFP, "$%d: %s\n", x+1, imp_sth->PQvals[x]);
 				}
 				TRC(DBILOGFP, ");\n\n");
 			}
@@ -3020,14 +3023,13 @@
 			if (imp_sth->async_flag & PG_ASYNC) {
 				TRACE_PQSENDQUERYPARAMS;
 				ret = PQsendQueryParams
-					(imp_dbh->conn, statement, imp_sth->numphs, paramTypes, paramValues, paramLengths, paramFormats, 0);
+					(imp_dbh->conn, statement, imp_sth->numphs, imp_sth->PQoids, imp_sth->PQvals, imp_sth->PQlens, imp_sth->PQfmts, 0);
 			}
 			else {
 				TRACE_PQEXECPARAMS;
 				imp_sth->result = PQexecParams
-					(imp_dbh->conn, statement, imp_sth->numphs, paramTypes, paramValues, paramLengths, paramFormats, 0);
+					(imp_dbh->conn, statement, imp_sth->numphs, imp_sth->PQoids, imp_sth->PQvals, imp_sth->PQlens, imp_sth->PQfmts, 0);
 			}
-			Safefree(paramTypes);
 		}
 		
 		/* PQexec */
@@ -3074,10 +3076,6 @@
 
 	/* Some form of PQexec/PQsendQuery has been run at this point */
 
-	Safefree(paramValues);
-	Safefree(paramLengths);
-	Safefree(paramFormats);			
-
 	/* If running asynchronously, we don't stick around for the result */
 	if (imp_sth->async_flag & PG_ASYNC) {
 		if (TRACEWARN) TRC(DBILOGFP, "%sEarly return for async query", THEADER);
@@ -3519,6 +3517,10 @@
 	Safefree(imp_sth->prepare_name);
 	Safefree(imp_sth->type_info);
 	Safefree(imp_sth->firstword);
+	Safefree(imp_sth->PQvals);
+	Safefree(imp_sth->PQlens);
+	Safefree(imp_sth->PQfmts);
+	Safefree(imp_sth->PQoids);
 
 	if (imp_sth->result) {
 		TRACE_PQCLEAR;

Modified: DBD-Pg/trunk/dbdimp.h
==============================================================================
--- DBD-Pg/trunk/dbdimp.h	(original)
+++ DBD-Pg/trunk/dbdimp.h	Wed Jul 23 22:32:31 2008
@@ -70,7 +70,7 @@
 
 /* Define sth implementor data structure */
 struct imp_sth_st {
-	dbih_stc_t com;         /* MUST be first element in structure */
+	dbih_stc_t com;          /* MUST be first element in structure */
 
 	int    server_prepare;   /* inherited from dbh. 3 states: 0=no 1=yes 2=smart */
 	int    placeholder_type; /* which style is being used 1=? 2=$1 3=:foo */
@@ -84,6 +84,10 @@
 
 	STRLEN totalsize;        /* total string length of the statement (with no placeholders)*/
 
+	const char ** PQvals;    /* List of values to pass to PQ* */
+	int         * PQlens;    /* List of lengths to pass to PQ* */
+	int         * PQfmts;    /* List of formats to pass to PQ* */
+	Oid         * PQoids;    /* List of types to pass to PQ* */
 	char   *prepare_name;    /* name of the prepared query; NULL if not prepared */
 	char   *firstword;       /* first word of the statement */
 

Modified: DBD-Pg/trunk/lib/Bundle/DBD/Pg.pm
==============================================================================
--- DBD-Pg/trunk/lib/Bundle/DBD/Pg.pm	(original)
+++ DBD-Pg/trunk/lib/Bundle/DBD/Pg.pm	Wed Jul 23 22:32:31 2008
@@ -4,7 +4,7 @@
 use strict;
 use warnings;
 
-$VERSION = '2.8.7';
+$VERSION = '2.8.8';
 
 1;
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.