int db_free(database_p _dbp) { tbl_cache_p _tbc = NULL, _tbc0=NULL; if(!_dbp) return -1; _tbc = _dbp->tables; while(_tbc) { _tbc0 = _tbc->next; tbl_cache_free(_tbc); _tbc = _tbc0; } if(_dbp->dbenv) _dbp->dbenv->close(_dbp->dbenv, 0); if(_dbp->name.s) pkg_free(_dbp->name.s); pkg_free(_dbp); return 0; }
int dbt_db_del_table(dbt_cache_p _dc, str *_s) { tbl_cache_p _tbc = NULL; if(!_dc || !_s || !_s->s || _s->len<=0) return -1; lock_get(&_dc->sem); if(!_dc->dbp) { lock_release(&_dc->sem); return -1; } _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)) { if(_tbc->prev) (_tbc->prev)->next = _tbc->next; else _dc->dbp->tables = _tbc->next; if(_tbc->next) (_tbc->next)->prev = _tbc->prev; break; } lock_release(&_tbc->sem); } _tbc = _tbc->next; } lock_release(&_dc->sem); tbl_cache_free(_tbc); return 0; }
int dbt_db_free(dbt_db_p _dbp) { tbl_cache_p _tbc = NULL, _tbc0=NULL; if(!_dbp) return -1; _tbc = _dbp->tables; while(_tbc) { _tbc0 = _tbc; tbl_cache_free(_tbc0); _tbc = _tbc->next; } if(_dbp->name.s) shm_free(_dbp->name.s); shm_free(_dbp); return 0; }