MCPcopy Create free account
hub / github.com/apache/httpd / lookup_map_dbd

Function lookup_map_dbd

modules/mappers/mod_rewrite.c:1518–1575  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1516 return value;
1517}
1518static 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}

Callers 1

lookup_mapFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected