mirror of
https://git.FreeBSD.org/ports.git
synced 2024-12-01 01:17:02 +00:00
c215e4f94b
- Backport bugfixes from vendor CVS Submitted by: Jeff Burchell <toxic@doobie.com>
319 lines
10 KiB
C++
319 lines
10 KiB
C++
--- cache.cc 2004-05-29 16:00:05.000000000 -0700
|
|
+++ cache.cc 2005-09-22 22:37:43.000000000 -0700
|
|
@@ -133,37 +133,63 @@
|
|
c_nntp_server_article *sa;
|
|
#ifndef NDEBUG
|
|
if (debug>=DEBUG_MIN){
|
|
- t_nntp_server_articles::iterator sai=articles.find(h->serverid);
|
|
- if (sai!=articles.end()){
|
|
- sa=(*sai).second;
|
|
- printf("adding server_article we already have %lu %lu %lu %lu(%lu %lu %lu %lu)\n",h->serverid,h->articlenum,h->bytes,h->lines,sa->serverid,sa->articlenum,sa->bytes,sa->lines);
|
|
- // return;//could be useful, lets add it.
|
|
+ t_nntp_server_articles::iterator sai=articles.begin();
|
|
+ for (;sai!=articles.end();++sai){
|
|
+ if ((*sai)->serverid == h->serverid)
|
|
+ {
|
|
+ sa=(*sai);
|
|
+ printf("adding server_article we already have %lu %lu %lu %lu(%lu %lu %lu %lu)\n",h->serverid,h->articlenum,h->bytes,h->lines,sa->serverid,sa->articlenum,sa->bytes,sa->lines);
|
|
+ // return;//could be useful, lets add it.
|
|
+ }
|
|
}
|
|
}
|
|
if (h->date!=date)
|
|
printf("adding server_article with different date, date=%li h->date=%li mid=%s\n",date,h->date,h->messageid.c_str());
|
|
#endif
|
|
sa=new c_nntp_server_article(h->serverid,h->group,h->articlenum,h->bytes,h->lines);
|
|
- articles.insert(t_nntp_server_articles::value_type(h->serverid,sa));
|
|
+ articles.push_back(sa);
|
|
}
|
|
|
|
c_nntp_part::~c_nntp_part(){
|
|
t_nntp_server_articles::iterator i;
|
|
for(i = articles.begin();i!=articles.end();++i){
|
|
- assert((*i).second);
|
|
- delete (*i).second;
|
|
+ assert(*i);
|
|
+ delete (*i);
|
|
+ }
|
|
+}
|
|
+
|
|
+c_nntp_file_parts::iterator c_nntp_file_parts::lower_bound(int partnum)
|
|
+{
|
|
+ iterator first = begin();
|
|
+ ptrdiff_t len = distance(begin(), end());
|
|
+ ptrdiff_t half;
|
|
+ iterator middle;
|
|
+
|
|
+ while (len > 0) {
|
|
+ half = len >> 1;
|
|
+ middle = first;
|
|
+ advance(middle, half);
|
|
+
|
|
+ if ((*middle)->partnum < partnum) {
|
|
+ first = middle;
|
|
+ ++first;
|
|
+ len = len - half - 1;
|
|
+ }
|
|
+ else
|
|
+ len = half;
|
|
}
|
|
+ return first;
|
|
}
|
|
|
|
+
|
|
void c_nntp_file::addpart(c_nntp_part *p){
|
|
assert(p);
|
|
//assert((req==-1 && p->partnum<=0) || (p->partnum<=req));//#### req==-1 hack for old version that set non-multipart messages partnum to 0 instead of -1
|
|
// parts[p->partnum]=p;
|
|
#ifndef NDEBUG
|
|
- t_nntp_file_parts::iterator nfpi=parts.find(p->partnum);
|
|
- assert(nfpi==parts.end());
|
|
+ assert(!parts.haspart(p->partnum));
|
|
#endif
|
|
- parts.insert(t_nntp_file_parts::value_type(p->partnum,p));
|
|
+ parts.addpart(p);
|
|
if (count_partnum(p->partnum, req)) have++;
|
|
// bytes+=p->apxbytes;lines+=p->apxlines;
|
|
}
|
|
@@ -175,43 +201,41 @@
|
|
void c_nntp_file::mergefile(c_nntp_file::ptr &f){
|
|
if (f->update>update)
|
|
update=f->update;
|
|
- t_nntp_file_parts::iterator fpi=f->parts.begin();
|
|
+ c_nntp_file_parts::iterator fpi=f->parts.begin();
|
|
while (fpi!=f->parts.end()){
|
|
- const c_nntp_part *p = fpi->second;
|
|
- t_nntp_file_parts::iterator nfpi=parts.find(p->partnum);
|
|
- if (nfpi==parts.end()) {
|
|
+ const c_nntp_part *p = (*fpi);
|
|
+ c_nntp_part* mp = parts.part(p->partnum);
|
|
+ if (mp == NULL) {
|
|
addpart(new c_nntp_part(p->partnum, p->date, p->messageid));
|
|
- nfpi=parts.find(p->partnum);
|
|
+ mp=parts.part(p->partnum);
|
|
}else{
|
|
- if (nfpi->second->messageid!=p->messageid){
|
|
- PDEBUG(DEBUG_MED,"%s was gonna merge, but already have this part(sub=%s part=%i omid=%s)?\n",p->messageid.c_str(),f->subject.c_str(),p->partnum,nfpi->second->messageid.c_str());
|
|
+ if (mp->messageid!=p->messageid){
|
|
+ PDEBUG(DEBUG_MED,"%s was gonna merge, but already have this part(sub=%s part=%i omid=%s)?\n",p->messageid.c_str(),f->subject.c_str(),p->partnum,mp->messageid.c_str());
|
|
++fpi;
|
|
continue;
|
|
}
|
|
}
|
|
for (t_nntp_server_articles::const_iterator fsai=p->articles.begin(); fsai!=p->articles.end(); ++fsai){
|
|
|
|
- c_nntp_server_article *nsa = new c_nntp_server_article(*fsai->second);
|
|
- nfpi->second->articles.insert(t_nntp_server_articles::value_type(nsa->serverid,nsa));
|
|
+ c_nntp_server_article *nsa = new c_nntp_server_article(**fsai);
|
|
+ mp->articles.push_back(nsa);
|
|
}
|
|
- t_nntp_file_parts::iterator del_pi = fpi;
|
|
- ++fpi;
|
|
- delete del_pi->second;
|
|
- f->parts.erase(del_pi);
|
|
+ delete (*fpi);
|
|
+ fpi = f->parts.erase(fpi);
|
|
}
|
|
}
|
|
|
|
//fill a mapping of how many parts of the file each server has
|
|
void c_nntp_file::get_server_have_map(t_server_have_map &have_map) const{
|
|
- t_nntp_file_parts::const_iterator pi(parts.begin());
|
|
+ c_nntp_file_parts::const_iterator pi(parts.begin());
|
|
for (;pi!=parts.end();++pi){
|
|
- t_nntp_server_articles::const_iterator nsai(pi->second->articles.begin());
|
|
+ t_nntp_server_articles::const_iterator nsai((*pi)->articles.begin());
|
|
ulong serverid;
|
|
- int partnum=pi->second->partnum;
|
|
+ int partnum=(*pi)->partnum;
|
|
set<ulong> servers_already_found;
|
|
|
|
- for (;nsai!=pi->second->articles.end();++nsai) {
|
|
- serverid=nsai->first;
|
|
+ for (;nsai!=(*pi)->articles.end();++nsai) {
|
|
+ serverid=(*nsai)->serverid;
|
|
//don't increment count twice if a server has multiple server_articles for a single part
|
|
if (servers_already_found.insert(serverid).second){
|
|
t_server_have_map::iterator hmi(have_map.insert(t_server_have_map::value_type(serverid, 0)).first);
|
|
@@ -230,10 +254,10 @@
|
|
}
|
|
|
|
c_nntp_file::~c_nntp_file(){
|
|
- t_nntp_file_parts::iterator i;
|
|
+ c_nntp_file_parts::iterator i;
|
|
for(i = parts.begin();i!=parts.end();++i){
|
|
- assert((*i).second);
|
|
- delete (*i).second;
|
|
+ assert(*i);
|
|
+ delete (*i);
|
|
}
|
|
}
|
|
|
|
@@ -323,9 +347,8 @@
|
|
for (i=irange.first;i!=irange.second;++i){
|
|
f=(*i).second;
|
|
assert(!f.isnull());
|
|
- t_nntp_file_parts::iterator op;
|
|
- if ((op=f->parts.find(h->partnum))!=f->parts.end()){
|
|
- c_nntp_part *matchpart=(*op).second;
|
|
+ c_nntp_part* matchpart = f->parts.part(h->partnum);
|
|
+ if (matchpart != NULL) {
|
|
if (matchpart->messageid==h->messageid){
|
|
matchpart->addserverarticle(h);
|
|
return 0;
|
|
@@ -357,23 +380,22 @@
|
|
void c_nntp_cache::getxrange(c_nntp_server_info *servinfo, c_nrange *range) const {
|
|
t_nntp_files::const_iterator i;
|
|
c_nntp_file::ptr nf;
|
|
- t_nntp_file_parts::const_iterator pi;
|
|
+ c_nntp_file_parts::const_iterator pi;
|
|
c_nntp_part *np;
|
|
pair<t_nntp_server_articles::const_iterator,t_nntp_server_articles::const_iterator> sarange;
|
|
- c_nntp_server_article *sa;
|
|
for(i = files.begin();i!=files.end();++i){
|
|
nf=(*i).second;
|
|
assert(!nf.isnull());
|
|
assert(!nf->parts.empty());
|
|
for(pi = nf->parts.begin();pi!=nf->parts.end();++pi){
|
|
- np=(*pi).second;
|
|
+ np=(*pi);
|
|
assert(np);
|
|
- sarange=np->articles.equal_range(servinfo->serverid);
|
|
- while (sarange.first!=sarange.second){
|
|
- sa=(*sarange.first).second;
|
|
- assert(sa);
|
|
- range->remove(sa->articlenum);
|
|
- ++sarange.first;
|
|
+ t_nntp_server_articles::const_iterator sai = np->articles.begin();
|
|
+ for (; sai != np->articles.end(); ++sai){
|
|
+ if ((*sai)->serverid == servinfo->serverid)
|
|
+ {
|
|
+ range->remove((*sai)->articlenum);
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
@@ -390,9 +412,8 @@
|
|
ulong count=0,countp=0,countf=0;
|
|
t_nntp_files::iterator i,in;
|
|
c_nntp_file::ptr nf;
|
|
- t_nntp_file_parts::iterator pi,pic;
|
|
+ c_nntp_file_parts::iterator pi;
|
|
c_nntp_part *np;
|
|
- pair<t_nntp_server_articles::iterator,t_nntp_server_articles::iterator> sarange;
|
|
t_nntp_server_articles::iterator sai;
|
|
c_nntp_server_article *sa;
|
|
c_mid_info rel_midinfo("");
|
|
@@ -408,32 +429,31 @@
|
|
nf=(*i).second;
|
|
assert(!nf.isnull());
|
|
assert(!nf->parts.empty());
|
|
- for(pi = nf->parts.begin();pi!=nf->parts.end();){
|
|
- pic=pi;
|
|
- ++pi;
|
|
- np=(*pic).second;
|
|
+ for(pi = nf->parts.end();pi!=nf->parts.begin();){
|
|
+ --pi;
|
|
+ np=(*pi);
|
|
assert(np);
|
|
- sarange=np->articles.equal_range(servinfo->serverid);
|
|
- while (sarange.first!=sarange.second){
|
|
- sai=sarange.first;
|
|
- ++sarange.first;
|
|
- sa=(*sai).second;
|
|
+ for (sai = np->articles.end(); sai != np->articles.begin();) {
|
|
+ --sai;
|
|
+ sa=*sai;
|
|
assert(sa);
|
|
- if (flushrange.check(sa->articlenum)){
|
|
+ if ((sa->serverid == servinfo->serverid) && flushrange.check(sa->articlenum)){
|
|
delete sa;
|
|
- np->articles.erase(sai);
|
|
- if (np->articles.empty()){
|
|
- if (count_partnum(np->partnum,nf->req)) nf->have--;
|
|
- midinfo->set_delete(np->messageid);
|
|
- delete np;
|
|
- np=NULL;
|
|
- nf->parts.erase(pic);
|
|
- countp++;
|
|
- }
|
|
+ sai = np->articles.erase(sai);
|
|
count++;
|
|
}
|
|
}
|
|
- if (np && midinfo->check(np->messageid)) rel_midinfo.insert(np->messageid);
|
|
+ if (np->articles.empty()){
|
|
+ if (count_partnum(np->partnum,nf->req)) nf->have--;
|
|
+ midinfo->set_delete(np->messageid);
|
|
+ delete np;
|
|
+ pi = nf->parts.erase(pi);
|
|
+ countp++;
|
|
+ }
|
|
+ else if (midinfo->check(np->messageid))
|
|
+ {
|
|
+ rel_midinfo.insert(np->messageid);
|
|
+ }
|
|
}
|
|
if (nf->parts.empty()){
|
|
// nf->dec_rcount();
|
|
@@ -453,12 +473,13 @@
|
|
assert(!nf.isnull());
|
|
assert(!nf->parts.empty());
|
|
for(pi = nf->parts.begin();pi!=nf->parts.end();++pi){
|
|
- np=(*pi).second;
|
|
+ np=(*pi);
|
|
assert(np);
|
|
- sai=np->articles.find(servinfo->serverid);
|
|
- if (sai!=np->articles.end()){
|
|
- sa=(*sai).second;
|
|
- assert(!flushrange.check(sa->articlenum));
|
|
+ for (sai=np->articles.begin(); sai != np->articles.end(); ++sai){
|
|
+ sa=*sai;
|
|
+ if (sa->serverid == servinfo->serverid){
|
|
+ assert(!flushrange.check(sa->articlenum));
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
@@ -604,7 +625,7 @@
|
|
if (nconfig.hasserver(serverid)) {
|
|
sa=new c_nntp_server_article(serverid,group,atoul(t[1]),atoul(t[2]),atoul(t[3]));
|
|
//np->addserverarticle(sa);
|
|
- np->articles.insert(t_nntp_server_articles::value_type(sa->serverid,sa));
|
|
+ np->articles.push_back(sa);
|
|
counta++;
|
|
}else
|
|
countdeada++;
|
|
@@ -617,7 +638,7 @@
|
|
else if (mode==PART_MODE && nf){//new part mode
|
|
if (np && np->articles.empty()) {
|
|
midinfo->set_delete(np->messageid);
|
|
- nf->parts.erase(np->partnum);
|
|
+ nf->parts.removepart(np->partnum);
|
|
delete np;
|
|
np=NULL;
|
|
count--;
|
|
@@ -734,7 +755,7 @@
|
|
if (quiet<2){printf("saving cache: %lu parts, %lu files..",totalnum,(ulong)files.size());fflush(stdout);}
|
|
c_nntp_file::ptr nf;
|
|
t_references::iterator ri;
|
|
- t_nntp_file_parts::iterator pi;
|
|
+ c_nntp_file_parts::iterator pi;
|
|
t_nntp_server_articles::iterator sai;
|
|
c_nntp_server_article *sa;
|
|
c_nntp_part *np;
|
|
@@ -758,11 +779,11 @@
|
|
}
|
|
f->putf(".\n");//end REFERENCES_MODE
|
|
for(pi = nf->parts.begin();pi!=nf->parts.end();++pi){
|
|
- np=(*pi).second;
|
|
+ np=(*pi);
|
|
assert(np);
|
|
f->putf("%i\t%lu\t%s\n",np->partnum,np->date,np->messageid.c_str());//PART_MODE
|
|
for (sai = np->articles.begin(); sai != np->articles.end(); ++sai){
|
|
- sa=(*sai).second;
|
|
+ sa=(*sai);
|
|
assert(sa);
|
|
f->putf("%lu\t%lu\t%lu\t%lu\n",sa->serverid,sa->articlenum,sa->bytes,sa->lines);//SERVER_ARTICLE_MODE
|
|
counta++;
|