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) */
| 1642 | * 3 - does not match reload version (old value) |
| 1643 | */ |
| 1644 | static 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); |
no test coverage detected