MCPcopy Create free account
hub / github.com/OpenSIPS/opensips / on_demand_load

Function on_demand_load

modules/sql_cacher/sql_cacher.c:1644–1847  ·  view source on GitHub ↗

return: * 0 - succes => if str column, @str_res->s must be pkg_free()'d * 1 - succes, null value in db * -1 - error * -2 - not found in sql db * 2 - error in cdb_val_decode() * 3 - does not match reload version (old value) */

Source from the content-addressed store, hash-verified

1642 * 3 - does not match reload version (old value)
1643 */
1644static int on_demand_load(pv_name_fix_t *pv_name, str *str_res, int *int_res,
1645 int rld_vers)
1646{
1647 struct queried_key *it, *tmp, *new_key;
1648 str src_key, st;
1649 str cdb_res;
1650 db_res_t *sql_res = NULL;
1651 db_val_t *values;
1652 db_type_t val_type;
1653 int i, rc;
1654 int rld_vers_retry;
1655
1656 for (i = 0; i < pv_name->c_entry->nr_columns; i++)
1657 if (!str_strcmp(pv_name->c_entry->columns[i], &pv_name->col)) {
1658 pv_name->col_nr = i;
1659 break;
1660 }
1661 if (i == pv_name->c_entry->nr_columns) {
1662 LM_WARN("Unknown column %.*s\n", pv_name->col.len, pv_name->col.s);
1663 return -1;
1664 }
1665
1666 src_key.len = pv_name->id.len + pv_name->key.len;
1667 src_key.s = shm_malloc(src_key.len);
1668 if (!src_key.s) {
1669 LM_ERR("No more shm memory\n");
1670 return -1;
1671 }
1672 memcpy(src_key.s, pv_name->id.s, pv_name->id.len);
1673 memcpy(src_key.s + pv_name->id.len, pv_name->key.s, pv_name->key.len);
1674
1675 lock_get(queries_lock);
1676
1677 for (it = *queries_in_progress; it; it = it->next) {
1678 if (str_strcmp(&it->key, &src_key))
1679 continue;
1680
1681 it->nr_waiting_procs++; /* key is in list! */
1682 lock_release(queries_lock);
1683 /* wait for the query to complete */
1684 lock_get(it->wait_sql_query);
1685 lock_get(queries_lock);
1686 shm_free(src_key.s);
1687 if (it->nr_waiting_procs == 1) {
1688 lock_release(it->wait_sql_query);
1689 lock_destroy(it->wait_sql_query);
1690 lock_dealloc(it->wait_sql_query);
1691 /* if this is the last process waiting, delete key from list */
1692 unlink_from_query_list(it);
1693 tmp = it;
1694 it = it->next;
1695 shm_free(tmp->key.s);
1696 shm_free(tmp);
1697 } else if (it->nr_waiting_procs > 1) {
1698 it->nr_waiting_procs--;
1699 lock_release(it->wait_sql_query);
1700 }
1701 lock_release(queries_lock);

Callers 1

pv_get_sql_cached_valueFunction · 0.85

Calls 14

shm_mallocFunction · 0.85
lock_getFunction · 0.85
lock_releaseFunction · 0.85
shm_freeFunction · 0.85
lock_destroyFunction · 0.85
unlink_from_query_listFunction · 0.85
cdb_fetchFunction · 0.85
optimize_cdb_decodeFunction · 0.85
cdb_val_decodeFunction · 0.85
pkg_str_dupFunction · 0.85
lock_initFunction · 0.85
load_keyFunction · 0.85

Tested by

no test coverage detected