/
ColdCore-3.0a8/
ColdCore-3.0a8/src/
new object $db: $misc;

var $db database = #[];
var $root created_on = 796268969;
var $root flags = ['methods, 'code, 'core, 'variables];
var $root inited = 1;
var $root managed = [$db];
var $root manager = $db;

protected method .clean_database() {
    var elem;
    
    // clean up a  "STR"=>$obj  style database
    for elem in (database) {
        if (!valid(elem[2]))
            database = database.del(elem[1]);
    }
};

public method .database() {
    return database;
};

public method .exact_match() {
    arg key;
    var match;
    
    // get an exact match of a key, return the value
    match = (| (type(database) == 'dictionary) ? (database[key]) : ((database.match_exact(key))[2]) |);
    if (match == ~keynf)
        throw(~matchnf, "No object by that key exists in the database.");
    return match;
};

root method .init_db() {
    database = #[];
};

public method .insert() {
    arg key, value;
    
    // insert a key/value to the database
    if ((!(sender() == this())) && (!(.trusts(caller()))))
        (> .perms(sender(), 'writer) <);
    database = database.add(key, value);
};

public method .key_changed() {
    arg old_key, new_key;
    var val;
    
    // change the value of a key.
    if ((!(sender() == this())) && (!(.trusts(caller()))))
        (> .perms(sender(), 'writer) <);
    val = (> .exact_match(old_key) <);
    .remove(old_key);
    .insert(new_key, val);
};

public method .match_begin() {
    arg key;
    var matches, entry;
    
    // First check if we're using $trie frob
    if (type(database) == 'frob) {
        matches = (| (database.match_begin(key))[2] |);
        if (matches == ~keynf)
            throw(~matchnf, "No entries in the database match that key.");
        if (matches == ~ambig)
            throw(~ambig, "More than one object matches that key.");
        return matches;
    }
    
    // use match_begin of the key, return the value
    matches = [(| .exact_match(key) |)];
    if (!(matches[1])) {
        matches = [];
        for entry in (database) {
            if (match_begin(entry[1], key))
                matches = setadd(matches, entry[2]);
        }
    }
    if (matches) {
        if ((matches.length()) == 1)
            return matches[1];
        else
            throw(~ambig, "More than one object matches that key.", matches);
    } else {
        throw(~matchnf, "No entries in the database match that key.");
    }
};

public method .remove() {
    arg key;
    
    // remove a key/value from the database
    if ((!(sender() == this())) && (!(.trusts(caller()))))
        (> .perms(sender(), 'writer) <);
    database = database.del(key);
};

protected method .set_database() {
    arg newdb;
    
    // this should not be called often, its primarily for corification
    database = newdb;
};

root method .uninit_db() {
    database = 0;
};

public method .value_changed() {
    arg key, new_value;
    
    // change the value of a key.
    if ((!(sender() == this())) && (!(.trusts(caller()))))
        (> .perms(sender(), 'writer) <);
    (> .remove(key) <);
    (> .insert(key, new_value) <);
};