--- include/private/apr_dbd_internal.h 2008-05-21 08:32:02.000000000 -0400 +++ include/private/apr_dbd_internal.h 2012-08-07 18:36:49.000000000 -0400 @@ -203,9 +203,11 @@ * @param types - pointer to an array with types of parameters * @param statement - statement to prepare. May point to null on entry. + * @param offsets - where in the string shall the parameters be inserted * @return 0 for success or error code */ int (*prepare)(apr_pool_t *pool, apr_dbd_t *handle, const char *query, const char *label, int nargs, int nvals, - apr_dbd_type_e *types, apr_dbd_prepared_t **statement); + apr_dbd_type_e *types, apr_dbd_prepared_t **statement, + int *offsets); /** pvquery: query using a prepared statement + args --- dbd/apr_dbd.c 2009-06-10 19:54:42.000000000 -0400 +++ dbd/apr_dbd.c 2012-08-07 19:38:01.000000000 -0400 @@ -372,7 +372,7 @@ apr_dbd_prepared_t **statement) { size_t qlen; - int i, nargs = 0, nvals = 0; + int i, nargs = 0, nvals = 0, *offsets; char *p, *pq; const char *q; apr_dbd_type_e *t; @@ -397,6 +397,7 @@ nargs * (strlen(driver->pformat) + sizeof(nargs) * 3 + 2) + 1; pq = apr_palloc(pool, qlen); t = apr_pcalloc(pool, sizeof(*t) * nargs); + offsets = apr_palloc(pool, sizeof(*offsets) * nargs); for (p = pq, q = query, i = 0; *q; q++) { if (q[0] == '%') { @@ -460,8 +461,10 @@ break; } + offsets[i++] = p - pq; /* insert database specific parameter reference */ - p += apr_snprintf(p, qlen - (p - pq), driver->pformat, ++i); + if (driver->pformat[0]) + p += apr_snprintf(p, qlen - (p - pq), driver->pformat, i); } else if (q[1] == '%') { /* reduce %% to % */ *p++ = *q++; } else { @@ -473,7 +476,7 @@ } *p = '\0'; - return driver->prepare(pool,handle,pq,label,nargs,nvals,t,statement); + return driver->prepare(pool,handle,pq,label,nargs,nvals,t,statement,offsets); } APU_DECLARE(int) apr_dbd_pquery(const apr_dbd_driver_t *driver,