dbt_table_p dbt_db_get_table(dbt_cache_p _dc, const str *_s) { dbt_table_p _tbc = NULL; int hash; int hashidx; if(!_dbt_cachetbl || !_dc || !_s || !_s->s || _s->len<=0) return NULL; hash = core_hash(&_dc->name, _s, DBT_CACHETBL_SIZE); hashidx = hash % DBT_CACHETBL_SIZE; lock_get(&_dbt_cachetbl[hashidx].sem); _tbc = _dbt_cachetbl[hashidx].dtp; while(_tbc) { if(_tbc->hash==hash && _tbc->dbname.len == _dc->name.len && _tbc->name.len == _s->len && !strncasecmp(_tbc->dbname.s, _dc->name.s, _dc->name.len) && !strncasecmp(_tbc->name.s, _s->s, _s->len)) { /* found - if cache mode or no-change, return */ if(db_mode==0 || dbt_check_mtime(_s, &(_dc->name), &(_tbc->mt))!=1) { LM_DBG("cache or mtime succeeded for [%.*s]\n", _tbc->name.len, _tbc->name.s); return _tbc; } break; } _tbc = _tbc->next; } /* new table */ if(_tbc) /* free old one */ { dbt_db_del_table(_dc, _s, 0); } _tbc = dbt_load_file(_s, &(_dc->name)); if(!_tbc) { lock_release(&_dbt_cachetbl[hashidx].sem); return NULL; } _tbc->hash = hash; _tbc->next = _dbt_cachetbl[hashidx].dtp; if(_dbt_cachetbl[hashidx].dtp) _dbt_cachetbl[hashidx].dtp->prev = _tbc; _dbt_cachetbl[hashidx].dtp = _tbc; /* table is locked */ return _tbc; }
tbl_cache_p dbt_db_get_table(dbt_cache_p _dc, str *_s) { // dbt_db_p _dbp = NULL; tbl_cache_p _tbc = NULL; dbt_table_p _dtp = NULL; if(!_dc || !_s || !_s->s || _s->len<=0) return NULL; lock_get(&_dc->sem); if(!_dc->dbp) { lock_release(&_dc->sem); return NULL; } _tbc = _dc->dbp->tables; while(_tbc) { if(_tbc->dtp) { lock_get(&_tbc->sem); if(_tbc->dtp->name.len == _s->len && !strncasecmp(_tbc->dtp->name.s, _s->s, _s->len )) { lock_release(&_tbc->sem); lock_release(&_dc->sem); return _tbc; } lock_release(&_tbc->sem); } _tbc = _tbc->next; } // new table _tbc = tbl_cache_new(); if(!_tbc) { lock_release(&_dc->sem); return NULL; } _dtp = dbt_load_file(_s, &(_dc->dbp->name)); #ifdef DBT_EXTRA_DEBUG DBG("DTB:dbt_db_get_table: ---------------\n"); dbt_print_table(_dtp, NULL); #endif if(!_dtp) { lock_release(&_dc->sem); return NULL; } _tbc->dtp = _dtp; if(_dc->dbp->tables) (_dc->dbp->tables)->prev = _tbc; _tbc->next = _dc->dbp->tables; _dc->dbp->tables = _tbc; lock_release(&_dc->sem); return _tbc; }