5 //DEBUG_DEFINE_SOME_DEBUGF(sql,sql_dprintf);
8 int commodid, src_price, src_qty, dst_price, dst_qty;
11 #define TRADES_PER_BLOCK 10
13 typedef struct TradesBlock{
14 struct TradesBlock *next;
15 Trade t[TRADES_PER_BLOCK];
24 IslandPair ***ipairs; /* ipairs[sislandid][dislandid] */
26 static IslandPair *ipair_get(int si, int di) {
27 IslandPair *ip, **ipa;
29 assert(si < nislands);
30 assert(di < nislands);
32 if (!(ipa= ipairs[si])) {
33 ipa= ipairs[si]= mcalloc(sizeof(*ipa) * nislands);
38 ipa[di]= ip= mmalloc(sizeof(*ip));
41 int inblock= TRADES_PER_BLOCK;
42 TradesBlock *block= 0;
44 SQL_MUST( sqlite3_bind_int(ss_ipair, 1, si) );
45 SQL_MUST( sqlite3_bind_int(ss_ipair, 2, di) );
47 while (SQL_STEP(ss_ipair)) {
48 if (inblock == TRADES_PER_BLOCK) {
49 block= mmalloc(sizeof(*block));
50 block->next= ip->trades;
55 for (i=0, irp=&block->t[inblock].commodid; i<5; i++, irp++)
56 *irp= sqlite3_column_int(ss_ipair, i);
60 if (inblock < TRADES_PER_BLOCK)
61 block->t[inblock].commodid= -1;
63 sqlite3_reset(ss_ipair);
68 void value_route(int nislands, const int *islands) {
71 for (s=0; s<nislands; s++) {
72 for (d=s; d<nislands; d++) {
73 ipair_get(islands[s], islands[d]);
78 //struct sqlite_vm *sth;
79 //r= sqlite_compile(db, stmt, &tail, &sth,
82 void setup_value(void) {
83 SQL_MUST( sqlite3_prepare(db,
85 " sell.commodid commodid,\n"
86 " sell.price src_price,\n"
87 " sum(sell.qty) src_qty,\n"
88 " buy.price dst_price,\n"
89 " sum(buy.qty) dst_qty\n"
90 " FROM sell JOIN buy\n"
91 " ON sell.commodid = buy.commodid\n"
92 " AND buy.price > sell.price\n"
93 " WHERE sell.islandid=?\n"
94 " AND buy.islandid=?\n"
95 " GROUP BY sell.commodid, sell.price, buy.price",
98 ipairs= mcalloc(sizeof(*ipairs) * nislands);