X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=yarrg%2Frsvalue.c;h=b17693561552f879bed56cb76704dffe96f1fa60;hb=322e26f969dfb65629833be5bd75ba71a15b8634;hp=a4e70f62a929240ecb5f20d7f38a770c227bed05;hpb=b8cca9eaa66c5f8911d45523bade38fa0a6d17e1;p=ypp-sc-tools.main.git diff --git a/yarrg/rsvalue.c b/yarrg/rsvalue.c index a4e70f6..b176935 100644 --- a/yarrg/rsvalue.c +++ b/yarrg/rsvalue.c @@ -2,28 +2,67 @@ #include "rscommon.h" -static void ipair_gettrades(int si, int di) { - char *stmt= masprintf - ("SELECT\n" - " sell.price src_price,\n" - " sum(sell.qty) src_qty,\n" - " buy.price dst_price,\n" - " sum(buy.qty) dst_qty,\n" - " commods.commodid commodid,\n" - " commods.unitmass unitmass,\n" - " commods.unitvolume unitvolume\n" - " FROM commods\n" - " JOIN sell ON commods.commodid = sell.commodid\n" - " JOIN buy ON commods.commodid = buy.commodid\n" - " WHERE buy.price > sell.price\n" - " AND sell.islandid=%d\n" - " AND buy.islandid=%d\n" - " GROUP BY commods.commodid, sell.price, buy.price\n", - si, di); +//DEBUG_DEFINE_SOME_DEBUGF(sql,sql_dprintf); + +typedef struct { + int commodid, src_price, src_qty, dst_price, dst_qty; +} Trade; + +#define TRADES_PER_BLOCK 10 + +typedef struct TradesBlock{ + struct TradesBlock *next; + Trade t[TRADES_PER_BLOCK]; +} TradesBlock; + +typedef struct { + int ntrades; + TradesBlock *trades; +} IslandPair; + +int nislands=100; +IslandPair ***ipairs; /* ipairs[sislandid][dislandid] */ + +static IslandPair *ipair_get(int si, int di) { + IslandPair *ip, **ipa; + + assert(si < nislands); + assert(di < nislands); + + if (!(ipa= ipairs[si])) { + ipa= ipairs[si]= mcalloc(sizeof(*ipa) * nislands); + } + if ((ip= ipa[di])) + return ip; - printf("SQL\n[\n%s\n]\n", stmt); + ipa[di]= ip= mmalloc(sizeof(*ip)); + ip->ntrades= 0; + ip->trades= 0; + int inblock= TRADES_PER_BLOCK; + TradesBlock *block= 0; - free(stmt); + SQL_MUST( sqlite3_bind_int(ss_ipair, 1, si) ); + SQL_MUST( sqlite3_bind_int(ss_ipair, 2, di) ); + + while (SQL_STEP(ss_ipair)) { + if (inblock == TRADES_PER_BLOCK) { + block= mmalloc(sizeof(*block)); + block->next= ip->trades; + ip->trades= block; + inblock= 0; + } + int *irp, i; + for (i=0, irp=&block->t[inblock].commodid; i<5; i++, irp++) + *irp= sqlite3_column_int(ss_ipair, i); + ip->ntrades++; + inblock++; + } + if (inblock < TRADES_PER_BLOCK) + block->t[inblock].commodid= -1; + + sqlite3_reset(ss_ipair); + + return ip; } void value_route(int nislands, const int *islands) { @@ -31,7 +70,7 @@ void value_route(int nislands, const int *islands) { for (s=0; s sell.price\n" + " WHERE sell.islandid=?\n" + " AND buy.islandid=?\n" + " GROUP BY sell.commodid, sell.price, buy.price", + -1, &ss_ipair, 0) ); + + ipairs= mcalloc(sizeof(*ipairs) * nislands); +}