| 1516 | return value; |
| 1517 | } |
| 1518 | static char *lookup_map_dbd(request_rec *r, char *key, const char *label) |
| 1519 | { |
| 1520 | apr_status_t rv; |
| 1521 | apr_dbd_prepared_t *stmt; |
| 1522 | const char *errmsg; |
| 1523 | apr_dbd_results_t *res = NULL; |
| 1524 | apr_dbd_row_t *row = NULL; |
| 1525 | char *ret = NULL; |
| 1526 | int n = 0; |
| 1527 | ap_dbd_t *db = dbd_acquire(r); |
| 1528 | |
| 1529 | if (db == NULL) { |
| 1530 | ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02963) |
| 1531 | "rewritemap: No db handle available! " |
| 1532 | "Check your database access"); |
| 1533 | return NULL; |
| 1534 | } |
| 1535 | |
| 1536 | stmt = apr_hash_get(db->prepared, label, APR_HASH_KEY_STRING); |
| 1537 | |
| 1538 | rv = apr_dbd_pvselect(db->driver, r->pool, db->handle, &res, |
| 1539 | stmt, 0, key, NULL); |
| 1540 | if (rv != 0) { |
| 1541 | errmsg = apr_dbd_error(db->driver, db->handle, rv); |
| 1542 | ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(00657) |
| 1543 | "rewritemap: error %s querying for %s", errmsg, key); |
| 1544 | return NULL; |
| 1545 | } |
| 1546 | while ((rv = apr_dbd_get_row(db->driver, r->pool, res, &row, -1)) == 0) { |
| 1547 | ++n; |
| 1548 | if (ret == NULL) { |
| 1549 | ret = apr_pstrdup(r->pool, |
| 1550 | apr_dbd_get_entry(db->driver, row, 0)); |
| 1551 | } |
| 1552 | else { |
| 1553 | /* randomise crudely amongst multiple results */ |
| 1554 | if ((double)rand() < (double)RAND_MAX/(double)n) { |
| 1555 | ret = apr_pstrdup(r->pool, |
| 1556 | apr_dbd_get_entry(db->driver, row, 0)); |
| 1557 | } |
| 1558 | } |
| 1559 | } |
| 1560 | if (rv != -1) { |
| 1561 | errmsg = apr_dbd_error(db->driver, db->handle, rv); |
| 1562 | ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(00658) |
| 1563 | "rewritemap: error %s looking up %s", errmsg, key); |
| 1564 | } |
| 1565 | switch (n) { |
| 1566 | case 0: |
| 1567 | return NULL; |
| 1568 | case 1: |
| 1569 | return ret; |
| 1570 | default: |
| 1571 | /* what's a fair rewritelog level for this? */ |
| 1572 | rewritelog(r, 3, NULL, "Multiple values found for %s", key); |
| 1573 | return ret; |
| 1574 | } |
| 1575 | } |