dw_fluffos_v2/
dw_fluffos_v2/fluffos-2.9-ds2.05/
dw_fluffos_v2/fluffos-2.9-ds2.05/ChangeLog.old/
dw_fluffos_v2/fluffos-2.9-ds2.05/Win32/
dw_fluffos_v2/fluffos-2.9-ds2.05/compat/
dw_fluffos_v2/fluffos-2.9-ds2.05/compat/simuls/
dw_fluffos_v2/fluffos-2.9-ds2.05/include/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/clone/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/command/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/data/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/etc/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/include/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/inherit/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/inherit/master/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/log/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/single/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/single/tests/compiler/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/single/tests/efuns/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/single/tests/operators/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/u/
dw_fluffos_v2/fluffos-2.9-ds2.05/tmp/
dw_fluffos_v2/fluffos-2.9-ds2.05/windows/
dw_fluffos_v2/lib/
dw_fluffos_v2/lib/binaries/cmds/
dw_fluffos_v2/lib/binaries/cmds/creator/
dw_fluffos_v2/lib/binaries/cmds/living/
dw_fluffos_v2/lib/binaries/cmds/player/
dw_fluffos_v2/lib/binaries/d/admin/obj/
dw_fluffos_v2/lib/binaries/d/liaison/
dw_fluffos_v2/lib/binaries/global/virtual/
dw_fluffos_v2/lib/binaries/global/virtual/setup_compiler/
dw_fluffos_v2/lib/binaries/obj/handlers/autodoc/
dw_fluffos_v2/lib/binaries/obj/handlers/terrain_things/
dw_fluffos_v2/lib/binaries/obj/misc/
dw_fluffos_v2/lib/binaries/obj/misc/buckets/
dw_fluffos_v2/lib/binaries/obj/monster/
dw_fluffos_v2/lib/binaries/obj/reactions/
dw_fluffos_v2/lib/binaries/obj/reagents/
dw_fluffos_v2/lib/binaries/secure/cmds/creator/
dw_fluffos_v2/lib/binaries/secure/master/
dw_fluffos_v2/lib/binaries/std/
dw_fluffos_v2/lib/binaries/std/dom/
dw_fluffos_v2/lib/binaries/std/effects/object/
dw_fluffos_v2/lib/binaries/std/guilds/
dw_fluffos_v2/lib/binaries/std/languages/
dw_fluffos_v2/lib/binaries/std/races/
dw_fluffos_v2/lib/binaries/std/room/
dw_fluffos_v2/lib/binaries/std/room/basic/
dw_fluffos_v2/lib/binaries/std/shops/
dw_fluffos_v2/lib/binaries/std/shops/inherit/
dw_fluffos_v2/lib/binaries/www/
dw_fluffos_v2/lib/cmds/guild-race/
dw_fluffos_v2/lib/cmds/guild-race/crafts/
dw_fluffos_v2/lib/cmds/guild-race/other/
dw_fluffos_v2/lib/cmds/playtester/
dw_fluffos_v2/lib/cmds/playtester/senior/
dw_fluffos_v2/lib/d/admin/
dw_fluffos_v2/lib/d/admin/log/
dw_fluffos_v2/lib/d/admin/mapper/31-10-01/mapmaker/event/
dw_fluffos_v2/lib/d/admin/meetings/
dw_fluffos_v2/lib/d/admin/obj/
dw_fluffos_v2/lib/d/admin/room/we_care/
dw_fluffos_v2/lib/d/admin/save/
dw_fluffos_v2/lib/d/dist/
dw_fluffos_v2/lib/d/dist/mtf/
dw_fluffos_v2/lib/d/dist/pumpkin/
dw_fluffos_v2/lib/d/dist/pumpkin/chars/
dw_fluffos_v2/lib/d/dist/pumpkin/desert/
dw_fluffos_v2/lib/d/dist/pumpkin/gumboot/
dw_fluffos_v2/lib/d/dist/pumpkin/hospital/
dw_fluffos_v2/lib/d/dist/pumpkin/inherit/
dw_fluffos_v2/lib/d/dist/pumpkin/map/
dw_fluffos_v2/lib/d/dist/pumpkin/plain/
dw_fluffos_v2/lib/d/dist/pumpkin/pumpkin/
dw_fluffos_v2/lib/d/dist/pumpkin/save/
dw_fluffos_v2/lib/d/dist/pumpkin/squash/
dw_fluffos_v2/lib/d/dist/pumpkin/terrain/
dw_fluffos_v2/lib/d/dist/pumpkin/woods/
dw_fluffos_v2/lib/d/dist/start/
dw_fluffos_v2/lib/d/learning/TinyTown/buildings/
dw_fluffos_v2/lib/d/learning/TinyTown/map/
dw_fluffos_v2/lib/d/learning/TinyTown/roads/
dw_fluffos_v2/lib/d/learning/add_command/
dw_fluffos_v2/lib/d/learning/arms_and_weps/
dw_fluffos_v2/lib/d/learning/chars/
dw_fluffos_v2/lib/d/learning/cutnpaste/
dw_fluffos_v2/lib/d/learning/examples/npcs/
dw_fluffos_v2/lib/d/learning/examples/player_houses/npcs/
dw_fluffos_v2/lib/d/learning/examples/terrain_map/basic/
dw_fluffos_v2/lib/d/learning/functions/
dw_fluffos_v2/lib/d/learning/handlers/
dw_fluffos_v2/lib/d/learning/help_topics/npcs/
dw_fluffos_v2/lib/d/learning/help_topics/objects/
dw_fluffos_v2/lib/d/learning/help_topics/rcs_demo/
dw_fluffos_v2/lib/d/learning/help_topics/rooms/
dw_fluffos_v2/lib/d/learning/help_topics/rooms/crowd/
dw_fluffos_v2/lib/d/learning/help_topics/rooms/situations/
dw_fluffos_v2/lib/d/learning/items/
dw_fluffos_v2/lib/d/learning/save/
dw_fluffos_v2/lib/d/liaison/
dw_fluffos_v2/lib/d/liaison/NEWBIE/doc/
dw_fluffos_v2/lib/d/liaison/NEWBIE/save/oldlog/
dw_fluffos_v2/lib/db/
dw_fluffos_v2/lib/doc/
dw_fluffos_v2/lib/doc/creator/
dw_fluffos_v2/lib/doc/creator/autodoc/include/reaction/
dw_fluffos_v2/lib/doc/creator/autodoc/include/ritual_system/
dw_fluffos_v2/lib/doc/creator/autodoc/include/talker/
dw_fluffos_v2/lib/doc/creator/autodoc/include/terrain_map/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/baggage/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/clock/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/clothing/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/cont_save/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/corpse/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/money/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/monster/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/scabbard/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/service_provider/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/state_changer/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/wand/
dw_fluffos_v2/lib/doc/creator/autodoc/std/book_dir/
dw_fluffos_v2/lib/doc/creator/autodoc/std/key/
dw_fluffos_v2/lib/doc/creator/autodoc/std/learning/
dw_fluffos_v2/lib/doc/creator/autodoc/std/map/
dw_fluffos_v2/lib/doc/creator/autodoc/std/race/
dw_fluffos_v2/lib/doc/creator/autodoc/std/weapon_logic/
dw_fluffos_v2/lib/doc/creator/files/
dw_fluffos_v2/lib/doc/creator/policy/
dw_fluffos_v2/lib/doc/creator/room/
dw_fluffos_v2/lib/doc/effects/
dw_fluffos_v2/lib/doc/ideas/
dw_fluffos_v2/lib/doc/known_command/
dw_fluffos_v2/lib/doc/lpc/basic_manual/
dw_fluffos_v2/lib/doc/lpc/intermediate/
dw_fluffos_v2/lib/doc/new/add_command/
dw_fluffos_v2/lib/doc/new/handlers/
dw_fluffos_v2/lib/doc/new/living/
dw_fluffos_v2/lib/doc/new/living/race/
dw_fluffos_v2/lib/doc/new/living/spells/
dw_fluffos_v2/lib/doc/new/player/
dw_fluffos_v2/lib/doc/new/room/guild/
dw_fluffos_v2/lib/doc/new/room/outside/
dw_fluffos_v2/lib/doc/new/room/storeroom/
dw_fluffos_v2/lib/doc/object/
dw_fluffos_v2/lib/doc/playtesters/
dw_fluffos_v2/lib/doc/policy/
dw_fluffos_v2/lib/doc/weapons/
dw_fluffos_v2/lib/global/handlers/
dw_fluffos_v2/lib/global/virtual/setup_compiler/
dw_fluffos_v2/lib/include/
dw_fluffos_v2/lib/include/cmds/
dw_fluffos_v2/lib/include/effects/
dw_fluffos_v2/lib/include/npc/
dw_fluffos_v2/lib/include/shops/
dw_fluffos_v2/lib/net/daemon/chars/
dw_fluffos_v2/lib/net/inherit/
dw_fluffos_v2/lib/net/intermud3/
dw_fluffos_v2/lib/net/intermud3/services/
dw_fluffos_v2/lib/net/obj/
dw_fluffos_v2/lib/net/save/
dw_fluffos_v2/lib/net/smnmp/
dw_fluffos_v2/lib/net/snmp/
dw_fluffos_v2/lib/obj/amulets/
dw_fluffos_v2/lib/obj/b_day/
dw_fluffos_v2/lib/obj/examples/
dw_fluffos_v2/lib/obj/food/alcohol/
dw_fluffos_v2/lib/obj/food/chocolates/
dw_fluffos_v2/lib/obj/food/fruits/
dw_fluffos_v2/lib/obj/food/meat/
dw_fluffos_v2/lib/obj/food/nuts/
dw_fluffos_v2/lib/obj/food/seafood/
dw_fluffos_v2/lib/obj/food/vegetables/
dw_fluffos_v2/lib/obj/fungi/
dw_fluffos_v2/lib/obj/furnitures/artwork/
dw_fluffos_v2/lib/obj/furnitures/bathroom/
dw_fluffos_v2/lib/obj/furnitures/beds/
dw_fluffos_v2/lib/obj/furnitures/cabinets/
dw_fluffos_v2/lib/obj/furnitures/chairs/
dw_fluffos_v2/lib/obj/furnitures/chests/
dw_fluffos_v2/lib/obj/furnitures/clocks/
dw_fluffos_v2/lib/obj/furnitures/crockery/
dw_fluffos_v2/lib/obj/furnitures/cupboards/
dw_fluffos_v2/lib/obj/furnitures/cushions/
dw_fluffos_v2/lib/obj/furnitures/fake_plants/
dw_fluffos_v2/lib/obj/furnitures/lamps/
dw_fluffos_v2/lib/obj/furnitures/mirrors/
dw_fluffos_v2/lib/obj/furnitures/outdoor/
dw_fluffos_v2/lib/obj/furnitures/safes/
dw_fluffos_v2/lib/obj/furnitures/shelves/
dw_fluffos_v2/lib/obj/furnitures/sideboards/
dw_fluffos_v2/lib/obj/furnitures/sofas/
dw_fluffos_v2/lib/obj/furnitures/stoves/
dw_fluffos_v2/lib/obj/furnitures/tables/
dw_fluffos_v2/lib/obj/furnitures/wardrobes/
dw_fluffos_v2/lib/obj/handlers/
dw_fluffos_v2/lib/obj/handlers/autodoc/
dw_fluffos_v2/lib/obj/jewellery/anklets/
dw_fluffos_v2/lib/obj/jewellery/bracelets/
dw_fluffos_v2/lib/obj/jewellery/earrings/
dw_fluffos_v2/lib/obj/jewellery/misc/
dw_fluffos_v2/lib/obj/jewellery/necklaces/
dw_fluffos_v2/lib/obj/jewellery/rings/
dw_fluffos_v2/lib/obj/media/
dw_fluffos_v2/lib/obj/misc/buckets/
dw_fluffos_v2/lib/obj/misc/jars/
dw_fluffos_v2/lib/obj/misc/papers/
dw_fluffos_v2/lib/obj/misc/player_shop/
dw_fluffos_v2/lib/obj/misc/shops/
dw_fluffos_v2/lib/obj/misc/traps/
dw_fluffos_v2/lib/obj/monster/
dw_fluffos_v2/lib/obj/monster/godmother/
dw_fluffos_v2/lib/obj/monster/transport/
dw_fluffos_v2/lib/obj/plants/inherit/
dw_fluffos_v2/lib/obj/potions/
dw_fluffos_v2/lib/open/boards/
dw_fluffos_v2/lib/save/autodoc/
dw_fluffos_v2/lib/save/bank_accounts/
dw_fluffos_v2/lib/save/boards/frog/
dw_fluffos_v2/lib/save/books/bed_catalog/
dw_fluffos_v2/lib/save/creators/
dw_fluffos_v2/lib/save/mail/
dw_fluffos_v2/lib/save/mail/p/
dw_fluffos_v2/lib/save/soul/data/
dw_fluffos_v2/lib/save/tasks/
dw_fluffos_v2/lib/save/vaults/
dw_fluffos_v2/lib/secure/cmds/lord/
dw_fluffos_v2/lib/secure/config/
dw_fluffos_v2/lib/secure/items/
dw_fluffos_v2/lib/secure/player/
dw_fluffos_v2/lib/soul/
dw_fluffos_v2/lib/soul/i/
dw_fluffos_v2/lib/soul/j/
dw_fluffos_v2/lib/soul/k/
dw_fluffos_v2/lib/soul/o/
dw_fluffos_v2/lib/soul/q/
dw_fluffos_v2/lib/soul/to_approve/
dw_fluffos_v2/lib/soul/u/
dw_fluffos_v2/lib/soul/v/
dw_fluffos_v2/lib/soul/wish_list/
dw_fluffos_v2/lib/soul/y/
dw_fluffos_v2/lib/soul/z/
dw_fluffos_v2/lib/std/creator/
dw_fluffos_v2/lib/std/effects/
dw_fluffos_v2/lib/std/effects/attached/
dw_fluffos_v2/lib/std/effects/external/
dw_fluffos_v2/lib/std/effects/fighting/
dw_fluffos_v2/lib/std/effects/other/
dw_fluffos_v2/lib/std/environ/
dw_fluffos_v2/lib/std/guilds/
dw_fluffos_v2/lib/std/hospital/
dw_fluffos_v2/lib/std/house/
dw_fluffos_v2/lib/std/house/onebedhouse/
dw_fluffos_v2/lib/std/house/onebedhut/
dw_fluffos_v2/lib/std/house/tworoomflat/
dw_fluffos_v2/lib/std/languages/
dw_fluffos_v2/lib/std/liquids/
dw_fluffos_v2/lib/std/nationality/
dw_fluffos_v2/lib/std/nationality/accents/
dw_fluffos_v2/lib/std/nationality/accents/national/
dw_fluffos_v2/lib/std/nationality/accents/regional/
dw_fluffos_v2/lib/std/npc/goals/
dw_fluffos_v2/lib/std/npc/goals/basic/
dw_fluffos_v2/lib/std/npc/goals/misc/
dw_fluffos_v2/lib/std/npc/inherit/
dw_fluffos_v2/lib/std/npc/plans/
dw_fluffos_v2/lib/std/npc/plans/basic/
dw_fluffos_v2/lib/std/outsides/
dw_fluffos_v2/lib/std/races/shadows/
dw_fluffos_v2/lib/std/room/basic/topography/
dw_fluffos_v2/lib/std/room/controller/
dw_fluffos_v2/lib/std/room/controller/topography/
dw_fluffos_v2/lib/std/room/furniture/games/
dw_fluffos_v2/lib/std/room/furniture/inherit/
dw_fluffos_v2/lib/std/room/inherit/carriage/
dw_fluffos_v2/lib/std/room/inherit/topography/
dw_fluffos_v2/lib/std/room/punishments/
dw_fluffos_v2/lib/std/room/topography/area/
dw_fluffos_v2/lib/std/room/topography/iroom/
dw_fluffos_v2/lib/std/room/topography/milestone/
dw_fluffos_v2/lib/std/shadows/
dw_fluffos_v2/lib/std/shadows/attached/
dw_fluffos_v2/lib/std/shadows/curses/
dw_fluffos_v2/lib/std/shadows/disease/
dw_fluffos_v2/lib/std/shadows/fighting/
dw_fluffos_v2/lib/std/shadows/room/
dw_fluffos_v2/lib/std/shops/controllers/
dw_fluffos_v2/lib/std/shops/objs/
dw_fluffos_v2/lib/std/shops/player_shop/
dw_fluffos_v2/lib/std/shops/player_shop/office_code/
dw_fluffos_v2/lib/std/socket/
dw_fluffos_v2/lib/www/
dw_fluffos_v2/lib/www/external/autodoc/
dw_fluffos_v2/lib/www/external/java/telnet/Documentation/
dw_fluffos_v2/lib/www/external/java/telnet/Documentation/images/
dw_fluffos_v2/lib/www/external/java/telnet/examples/
dw_fluffos_v2/lib/www/external/java/telnet/tools/
dw_fluffos_v2/lib/www/pics/
dw_fluffos_v2/lib/www/secure/creator/
dw_fluffos_v2/lib/www/secure/editors/
dw_fluffos_v2/lib/www/secure/survey_results/
dw_fluffos_v2/win32/
#include <db.h>
#include <config.h>

inherit "/w/taffyd/html_library";

#include <http.h>

#define MAKE_SQL_REQUEST( cmd, fp ) DB_HANDLER->make_sql_request( \
 "errors", CONFIG_DB_ERRORS_USER, "", (cmd), (fp) )

#define TYPO "Type = 'TYPO'" /*is a typo*/
#define BUG "Type = 'BUG'" /*is a bug*/
#define IDEA "Type = 'IDEA'" /*is an idea*/
#define FIXED "Status = 'FIXED'" /*is fixed*/
#define OPEN "Status = 'OPEN'" /*open bug*/
#define DENIED "Status = 'DENIED'" /*denied report*/
#define FIXER "Fixer is not NULL" /*has a fixer*/
#define FORWARDER_QUERY "Forwarder is not NULL"

#define RESULT_KEY "A"

int _doing_queries;
string _error_cache; 
function *_finished_funcs; 

mixed *_queries = ({ 
    ({ 
        ({ "Bug Fixers", "Fixer", "errors",  ({ FIXER, BUG, FIXED }) }),
        ({ "Bugs Fixed", "Reporter", "errors",  ({ FIXER, BUG, FIXED }) }),
        ({ "Open Bugs", "Reporter", "errors",  ({ OPEN, BUG }) }),
        ({ "Bugs Reported", "Reporter", "errors",  ({ BUG }) }),
    }),

    ({ 
        ({ "Typo Fixers", "Fixer", "errors",  ({ FIXER, TYPO, FIXED }) }),
        ({ "Typo Fixed", "Reporter", "errors",  ({ FIXER, TYPO, FIXED }) }),
        ({ "Open Typos", "Reporter", "errors",  ({ OPEN, TYPO }) }),
        ({ "Typos Reported", "Reporter", "errors",  ({ TYPO }) }),
    }),

    ({ 
        ({ "Idea \"Fixers\"", "Fixer", "errors",  ({ FIXER, IDEA, FIXED }) }),
        ({ "Ideas \"Fixed\"", "Reporter", "errors",  ({ FIXER, IDEA, FIXED }) }),
        ({ "Open Ideas ", "Reporter", "errors",  ({ OPEN, IDEA }) }),
        ({ "Ideas Reported", "Reporter", "errors",  ({ IDEA }) }),
    }),

    ({ 
        ({ "Total Fixers", "Fixer", "errors",  ({ FIXER, FIXED }) }),
        ({ "Total Fixed", "Reporter", "errors",  ({ FIXER, FIXED }) }),
        ({ "Open Reports", "Reporter", "errors",  ({ OPEN }) }),
        ({ "Reported", "Reporter", "errors",  ({ }) }),
    }),

    ({ 
        ({ "Denied Reports By Player", "Reporter", "errors",  ({ DENIED }) }),
        ({ "Denied Reports By Creator", "Fixer", "errors",  ({ DENIED }) }),
        ({ "Report Forwarders", "Forwarder", "forwards",  ({ FORWARDER_QUERY }) }),
        ({ "Commenter", "Commenter", "comments",  ({ }) }),
    }),
});

mixed *_finished_queries; 

void build_tables(int row, int column);
void build_error_stats();

void create() {
    html_library::create(); 
    
    set_title( "Bug Fixing Statistics" ); 
    build_error_stats();
} /* create() */ 

void build_error_stats() {
    int i, j; 
    int size; 

    _error_cache = 0; 
    _finished_queries = allocate( sizeof( _queries ) ); 
    _doing_queries = 0; 
    _finished_funcs = ({ }); 

    for ( i = 0; i < sizeof( _queries ); i++ ) {
        size = sizeof( _queries[ i ] );
        _doing_queries += size; 
        _finished_queries[ i ] = allocate( size ); 

        for ( j = 0; j < size; j++ ) {
            call_out( (: build_tables :), i, i, j); 
        }
    }
} /* build_error_stats() */ 

string make_table( string header, mixed *data ) {
    return "<table cellpadding=\"5\" cellspacing=\"0\" width=\"100%\">\n" 
        "<tr><th>" + header + "</th><th>Number</th></tr>\n" +
        implode( map( data, (: "<tr><td>" + $1[0] + "</td><td>" + 
            $1[1]  + "</td></tr>" :) ), "\n" ) + 
        "</table>\n";
} /* make_table() */ 

string build_full_sql_query(string who, string table, string select){
    return sprintf("SELECT %s, COUNT(*) AS " + RESULT_KEY + " FROM %s %s "
        "GROUP BY %s ORDER BY " + RESULT_KEY + " DESC LIMIT 10", who, table, 
        select, who);
} /* make_query() */ 

mixed build_sql_query(string who, string table, string *select) {
    string query;

    if ( sizeof(select) ) { 
        query = sprintf("WHERE %s", implode(select, " AND "));
    }
    else {
        query = "";
    }

    return build_full_sql_query(who, table, query);
} /* build_sql_query() */ 

string build_final_tables() {
    string txt;
    int i, j;

    txt = "";

    for ( i = 0; i < sizeof( _finished_queries ); i++ ) {
        txt += "<table cellpadding=\"5\" cellspacing=\"0\" width=\"100%\">\n"
            "<tr>";
        for ( j = 0; j < sizeof( _finished_queries[ i ] ); j++ ) {
            txt += "<td>" + _finished_queries[i][j] + "</td>";
        }

        txt += "</tr>"
            "</table>\n<hr>";
    }

    txt += "\n<div style=\"text-align: center;font-size: 10pt;\">\n"
        "<em>Statistics are generated once a reboot.</em>\n"
        "</div>\n";

    return construct_html_document(txt); 
} /* build_final_tables() */

void check_finished() {
    if ( !_doing_queries ) {
        _error_cache = build_final_tables(); 
        
        foreach( function func in _finished_funcs ) { 
            if ( functionp(func) ) { 
                evaluate( func, _error_cache ); 
            }
        }

        _finished_funcs = ({ }); 
    }
} /* check_finished() */ 

void finished_sql_query(int status, mixed *data, string key, string title, int row, int column) {

    mixed *results; 

    if ( status != DB_SUCCESS ) {
        _doing_queries--;
        check_finished(); 
        return;
    }

/* 0: ({
  ([ 
    "A" : 1905,
    "Reporter" : "hagi",
  ]),
  ([ 
    "A" : 837,
    "Reporter" : "lanfear",
  ]),
*/ 
    results = ({ });

    foreach( mapping result in data ) { 
        results += ({ ({ result[ key ], result[ RESULT_KEY ] }) });
    }
    
    _finished_queries[ row ][ column ] = make_table( title, results ); 

    _doing_queries--;

    // tell_creator( "taffyd", "%s, %d\n", _finished_queries[ row ][ column ], _doing_queries ); 
    
    check_finished(); 
} /* finished_sql_query() */

void build_tables(int row, int column) {
    mixed *bits; 
    string query;
    bits = _queries[ row ][ column ]; 
    
    query = build_sql_query( bits[1], bits[2], bits[3] );

    MAKE_SQL_REQUEST(query, (: finished_sql_query($1, $2, $(bits)[1], $(bits)[0], $(row), $(column)) :)); 

    tell_creator( "taffyd", "%s\n", query );
} /* build_tables() */ 

mixed www_delayed( function func, string str, mapping args, class http_request req ) {
    if ( _doing_queries ) {
        _finished_funcs += ({ func }); 
        return 1; 
    }
    
    return 0; 
} /* www_delayed() */ 

string www_request(string, mapping args, class http_request req) {
    if ( _error_cache ) {
        return _error_cache;
    }

    return construct_html_document( "No error statistics are available "
        "at the moment.\n");
} /* www_request() */

#ifdef OLD_CODE_JESUS_CHRIST_MY_EYES
  sixth = cont {
  rows = do_query("select Reporter, EntryDate, Directory, Filename, Status "
                  "from errors where Status != 'FIXED' and Status != "
                  "'DENIED' and Type = 'BUG' order by EntryDate",
              fix(({"select Reporter", "EntryDate", "Directory", "Filename",
                      "Status"}), {

  ret += make_table(rows, "Oldest bugs", "reporter", "date", "directory",
                    "filename", "status");
  
  ret += "<br clear=left>";
  /* 
  rows = db_exec(db, "select Reporter, EntryDate, Directory, Filename, Status "
                 "from errors where Status != 'FIXED' and Status != "
                 "'DENIED' and Type = 'IDEA' order by EntryDate");

  ret += make_table(rows, "Oldest ideas", "reporter", "date", "directory",
                    "filename", "status");

  ret += "<br clear=left>";

  
  rows = db_exec(db, "select Reporter, EntryDate, Directory, Filename, Status "
                 "from errors where Status != 'FIXED' and Status != "
                 "'DENIED' and Type = 'TYPO' order by EntryDate");
  
  ret += make_table(rows, "Oldest typos", "reporter", "date", "directory",
                    "filename", "status");

  ret += "<br clear=left>";
    
  rows = db_exec(db, "select Filename, count(*) as bing from errors where "
                 OPEN " and " BUG " group by filename order by bing desc");
  ret += make_table(rows, "Files with most bug reports", "file", "reports");
    
  rows = db_exec(db, "select Filename, count(*) as bing from errors where "
                 OPEN " and " IDEA " group by filename order by bing desc");
  ret += make_table(rows, "Files with most idea reports", "file", "reports");
  */
#endif