static int db_load_domain(domain_t** d, unsigned long flags, str* domain) { int ret; int_str name, val; domain_t* p; str name_s = STR_STATIC_INIT(AVP_DID); if (flags & AVP_TRACK_FROM) { p = &dom_buf[0]; } else { p = &dom_buf[1]; } free_old_domain(p); ret = db_get_did(&p->did, domain); if (ret != 1) return ret; if (load_domain_attrs) { if (db_load_domain_attrs(p) < 0) return -1; } /* Create an attribute containing did of the domain */ name.s = name_s; val.s = p->did; if (add_avp_list(&p->attrs, AVP_CLASS_DOMAIN | AVP_NAME_STR | AVP_VAL_STR, name, val) < 0) return -1; *d = p; return 0; }
/* * Load attributes from domain_attrs table */ int db_load_domain_attrs(domain_t* d) { int_str name, v; str avp_val; db_res_t* res; db_rec_t* rec; unsigned short flags; load_attrs_cmd->match[0].v.lstr = d->did; if (db_exec(&res, load_attrs_cmd) < 0) { ERR("Error while querying database\n"); return -1; } rec = db_first(res); while(rec) { if (rec->fld[0].flags & DB_NULL || rec->fld[1].flags & DB_NULL || rec->fld[3].flags & DB_NULL) { ERR("Skipping row containing NULL entries\n"); goto skip; } if ((rec->fld[3].v.int4 & SRDB_LOAD_SER) == 0) goto skip; /* Get AVP name */ name.s = rec->fld[0].v.lstr; /* Test for NULL value */ if (rec->fld[2].flags & DB_NULL) { avp_val.s = 0; avp_val.len = 0; } else { avp_val = rec->fld[2].v.lstr; } flags = AVP_CLASS_DOMAIN | AVP_NAME_STR; if (rec->fld[1].v.int4 == AVP_VAL_STR) { /* String AVP */ v.s = avp_val; flags |= AVP_VAL_STR; } else { /* Integer AVP */ str2int(&avp_val, (unsigned*)&v.n); } if (add_avp_list(&d->attrs, flags, name, v) < 0) { ERR("Error while adding domain attribute %.*s to domain %.*s, " "skipping\n", name.s.len, ZSW(name.s.s), d->did.len, ZSW(d->did.s)); } skip: rec = db_next(res); } db_res_free(res); return 0; }
/* * Create a new domain structure which will initialy have * one domain name */ static domain_t* new_domain(str* did, str* domain, unsigned int flags) { domain_t* d; int_str name, val; str name_s = STR_STATIC_INIT(AVP_DID); d = (domain_t*)shm_malloc(sizeof(domain_t)); if (!d) goto error; memset(d, 0, sizeof(domain_t)); d->did.s = shm_malloc(did->len); if (!d->did.s) goto error; memcpy(d->did.s, did->s, did->len); d->did.len = did->len; d->domain = (str*)shm_malloc(sizeof(str)); if (!d->domain) goto error; d->domain[0].s = shm_malloc(domain->len); if (!d->domain[0].s) goto error; memcpy(d->domain[0].s, domain->s, domain->len); d->domain[0].len = domain->len; strlower(d->domain); d->flags = (unsigned int*)shm_malloc(sizeof(unsigned int)); if (!d->flags) goto error; d->flags[0] = flags; d->n = 1; /* Create an attribute containing did of the domain */ name.s = name_s; val.s = *did; if (add_avp_list(&d->attrs, AVP_CLASS_DOMAIN | AVP_NAME_STR | AVP_VAL_STR, name, val) < 0) goto error; return d; error: ERR("Unable to create new domain structure\n"); free_domain(d); return 0; }