View | Details | Raw Unified | Return to bug 53689
Collapse All | Expand All

(-)include/private/apr_dbd_internal.h (-1 / +3 lines)
Lines 203-211 Link Here
203
     *  @param types - pointer to an array with types of parameters
203
     *  @param types - pointer to an array with types of parameters
204
     *  @param statement - statement to prepare.  May point to null on entry.
204
     *  @param statement - statement to prepare.  May point to null on entry.
205
     *  @param offsets - where in the string shall the parameters be inserted
205
     *  @return 0 for success or error code
206
     *  @return 0 for success or error code
206
     */
207
     */
207
    int (*prepare)(apr_pool_t *pool, apr_dbd_t *handle, const char *query,
208
    int (*prepare)(apr_pool_t *pool, apr_dbd_t *handle, const char *query,
208
                   const char *label, int nargs, int nvals,
209
                   const char *label, int nargs, int nvals,
209
                   apr_dbd_type_e *types, apr_dbd_prepared_t **statement);
210
                   apr_dbd_type_e *types, apr_dbd_prepared_t **statement,
211
                   int *offsets);
210
212
211
    /** pvquery: query using a prepared statement + args
213
    /** pvquery: query using a prepared statement + args
(-)dbd/apr_dbd.c (-3 / +6 lines)
Lines 372-378 Link Here
372
                                 apr_dbd_prepared_t **statement)
372
                                 apr_dbd_prepared_t **statement)
373
{
373
{
374
    size_t qlen;
374
    size_t qlen;
375
    int i, nargs = 0, nvals = 0;
375
    int i, nargs = 0, nvals = 0, *offsets;
376
    char *p, *pq;
376
    char *p, *pq;
377
    const char *q;
377
    const char *q;
378
    apr_dbd_type_e *t;
378
    apr_dbd_type_e *t;
Lines 397-402 Link Here
397
           nargs * (strlen(driver->pformat) + sizeof(nargs) * 3 + 2) + 1;
397
           nargs * (strlen(driver->pformat) + sizeof(nargs) * 3 + 2) + 1;
398
    pq = apr_palloc(pool, qlen);
398
    pq = apr_palloc(pool, qlen);
399
    t = apr_pcalloc(pool, sizeof(*t) * nargs);
399
    t = apr_pcalloc(pool, sizeof(*t) * nargs);
400
    offsets = apr_palloc(pool, sizeof(*offsets) * nargs);
400
401
401
    for (p = pq, q = query, i = 0; *q; q++) {
402
    for (p = pq, q = query, i = 0; *q; q++) {
402
        if (q[0] == '%') {
403
        if (q[0] == '%') {
Lines 460-467 Link Here
460
                    break;
461
                    break;
461
                }
462
                }
462
463
464
		offsets[i++] = p - pq;
463
                /* insert database specific parameter reference */
465
                /* insert database specific parameter reference */
464
                p += apr_snprintf(p, qlen - (p - pq), driver->pformat, ++i);
466
		if (driver->pformat[0])
467
		    p += apr_snprintf(p, qlen - (p - pq), driver->pformat, i);
465
            } else if (q[1] == '%') { /* reduce %% to % */
468
            } else if (q[1] == '%') { /* reduce %% to % */
466
                *p++ = *q++;
469
                *p++ = *q++;
467
            } else {
470
            } else {
Lines 473-479 Link Here
473
    }
476
    }
474
    *p = '\0';
477
    *p = '\0';
475
478
476
    return driver->prepare(pool,handle,pq,label,nargs,nvals,t,statement);
479
    return driver->prepare(pool,handle,pq,label,nargs,nvals,t,statement,offsets);
477
}
480
}
478
481
479
APU_DECLARE(int) apr_dbd_pquery(const apr_dbd_driver_t *driver,
482
APU_DECLARE(int) apr_dbd_pquery(const apr_dbd_driver_t *driver,

Return to bug 53689