Branch: Tag:

1999-05-16

1999-05-16 16:05:53 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Fixed a few more bugs in the search algorithm.
It seems to work as intended now!

Rev: server/etc/modules/Roxen.pmod:1.8

1:   /* -  * $Id: Roxen.pmod,v 1.7 1999/05/16 15:36:46 grubba Exp $ +  * $Id: Roxen.pmod,v 1.8 1999/05/16 16:05:53 grubba Exp $    *    * Various helper functions.    *
249:       while (i) {    i /= 4; -  acc_scale <<= 1; +  acc_scale *= 2;    }    } -  index_acc = allocate(sizeof(index)/acc_scale); +  index_acc = allocate((sizeof(index) + acc_scale -1)/acc_scale);       QD_WRITE(sprintf("QuotaDB()::init_index_acc(): "    "sizeof(index):%d, sizeof(index_acc):%d acc_scale:%d\n",
261:       void rebuild_index()    { -  // FIXME: Actually make an index file. +     array(string) new_keys = sort(indices(new_entries_cache));       int prev;    array(int) new_index = ({});       foreach(new_keys, string key) { -  +  QD_WRITE(sprintf("QuotaDB::rebuild_index(): key:%O lo:0 hi:%d\n", +  key, sizeof(index_acc))); +     int lo;    int hi = sizeof(index_acc);    if (hi) {
278:       int probe = (lo + hi)/2;    +  QD_WRITE(sprintf("QuotaDB::rebuild_index(): acc: " +  "key:%O lo:%d probe:%d hi:%d\n", +  key, lo, probe, hi)); +     if (!index_acc[probe]) {    object e = read_entry(index[probe * acc_scale]);   
300:    // Skip to the next key...    continue;    } +  if (hi) {    hi *= acc_scale;    lo = hi - acc_scale;    -  +  if (hi > sizeof(index)) { +  hi = sizeof(index); +  } +     do {    // Same loop invariants as above.       int probe = (lo + hi)/2; -  +  +  QD_WRITE(sprintf("QuotaDB::rebuild_index(): " +  "key:%O lo:%d probe:%d hi:%d\n", +  key, lo, probe, hi)); +     object e = read_entry(index[probe]);    if (e->name < key) {    lo = probe + 1;
324:    // Skip to the next key...    continue;    } +  }    new_index += index[prev..hi-1] + ({ new_entries_cache[key] });    prev = hi;    } else {
331:    }    }    +  // Add the trailing elements... +  new_index += index[prev..]; +  +  QD_WRITE("Index rebuilt.\n"); +     LOCK();       object index_file = open(base + ".index.new", 1);
411:       hi *= acc_scale;    lo = hi - acc_scale; +  +  if (hi > sizeof(index)) { +  hi = sizeof(index); +  } +     do {    // Same loop invariant as above.