int insert_pcontact(struct udomain* _d, str* _contact, struct pcontact_info* _ci, struct pcontact** _c) { if (mem_insert_pcontact(_d, _contact, _ci, _c)){ LM_ERR("inserting pcontact failed\n"); goto error; } if (exists_ulcb_type(PCSCF_CONTACT_INSERT)) { run_ul_create_callbacks(*_c); } return 0; error: return -1; }
/*! * \brief Load all records from a udomain * * Load all records from a udomain, useful to populate the * memory cache on startup. * \param _c database connection * \param _d loaded domain * \return 0 on success, -1 on failure */ int preload_udomain(db1_con_t* _c, udomain_t* _d) { pcontact_info_t *ci; db_row_t *row; db_key_t columns[18]; db1_res_t* res = NULL; str aor, contact; int i, n; pcontact_t* c; LM_DBG("pre-loading domain from DB\n"); columns[0] = &domain_col; columns[1] = &aor_col; columns[2] = &contact_col; columns[3] = &received_col; columns[4] = &rx_session_id_col; columns[5] = ®_state_col; columns[6] = &expires_col; columns[7] = &socket_col; columns[8] = &service_routes_col; columns[9] = &public_ids_col; columns[10] = &path_col; if (ul_dbf.use_table(_c, _d->name) < 0) { LM_ERR("sql use_table failed\n"); return -1; } #ifdef EXTRA_DEBUG LM_NOTICE("load start time [%d]\n", (int)time(NULL)); #endif if (DB_CAPABILITY(ul_dbf, DB_CAP_FETCH)) { if (ul_dbf.query(_c, 0, 0, 0, columns, 0, 11, 0, 0) < 0) { LM_ERR("db_query (1) failed\n"); return -1; } if(ul_dbf.fetch_result(_c, &res, ul_fetch_rows)<0) { LM_ERR("fetching rows failed\n"); return -1; } } else { if (ul_dbf.query(_c, 0, 0, 0, columns, 0, 11, 0, &res) < 0) { LM_ERR("db_query failed\n"); return -1; } } if (RES_ROW_N(res) == 0) { LM_DBG("table is empty\n"); ul_dbf.free_result(_c, res); return 0; } LM_DBG("%d rows returned in preload\n", RES_ROW_N(res)); n = 0; do { LM_DBG("loading records - cycle [%d]\n", ++n); for(i = 0; i < RES_ROW_N(res); i++) { row = RES_ROWS(res) + i; aor.s = (char*) VAL_STRING(ROW_VALUES(row) + 1); if (VAL_NULL(ROW_VALUES(row) + 1) || aor.s == 0 || aor.s[0] == 0) { LM_CRIT("empty aor record in table %s...skipping\n", _d->name->s); continue; } aor.len = strlen(aor.s); ci = dbrow2info( ROW_VALUES(row)+1, &contact); if (ci==0) { LM_ERR("usrloc record for %.*s in table %s\n", aor.len, aor.s, _d->name->s); continue; } lock_udomain(_d, &aor); if ( (mem_insert_pcontact(_d, &aor, ci, &c)) != 0) { LM_ERR("inserting contact failed\n"); unlock_udomain(_d, &aor); goto error1; } unlock_udomain(_d, &aor); } if (DB_CAPABILITY(ul_dbf, DB_CAP_FETCH)) { if(ul_dbf.fetch_result(_c, &res, ul_fetch_rows)<0) { LM_ERR("fetching rows (1) failed\n"); ul_dbf.free_result(_c, res); return -1; } } else { break; } } while(RES_ROW_N(res)>0); ul_dbf.free_result(_c, res); #ifdef EXTRA_DEBUG LM_NOTICE("load end time [%d]\n", (int)time(NULL)); #endif return 0; error1: free_pcontact(c); ul_dbf.free_result(_c, res); return -1; }