* Fix NIX-23: quadratic complexity in maintaining the referers

mapping.  The referer table is replaced by a referrer table (note
  spelling fix) that stores each referrer separately.  That is,
  instead of having

    referer[P] = {Q_1, Q_2, Q_3, ...}

  we store

    referer[(P, Q_1)] = ""
    referer[(P, Q_2)] = ""
    referer[(P, Q_3)] = ""
    ...

  To find the referrers of P, we enumerate over the keys with a value
  lexicographically greater than P.  This requires the referrer table
  to be stored as a B-Tree rather than a hash table.

  (The tuples (P, Q) are stored as P + null-byte + Q.)

  Old Nix databases are upgraded automatically to the new schema.
This commit is contained in:
Eelco Dolstra 2005-12-12 18:24:42 +00:00
parent 18bbcb1214
commit 8463f27d8c
4 changed files with 107 additions and 40 deletions

View file

@ -64,7 +64,7 @@ public:
void open(const string & path);
void close();
TableId openTable(const string & table);
TableId openTable(const string & table, bool sorted = false);
bool queryString(const Transaction & txn, TableId table,
const string & key, string & data);
@ -83,7 +83,7 @@ public:
const string & key);
void enumTable(const Transaction & txn, TableId table,
Strings & keys);
Strings & keys, const string & keyPrefix = "");
};