chiark / gitweb /
Fix up nislands; use BEGIN
[ypp-sc-tools.web-live.git] / yarrg / rsvalue.c
1 /**/
2
3 #include "rscommon.h"
4
5 DEBUG_DEFINE_DEBUGF(value);
6
7 typedef struct {
8   int commodid, src_price, src_qty, dst_price, dst_qty;
9 } Trade;
10
11 #define TRADES_PER_BLOCK 10
12
13 typedef struct TradesBlock{
14   struct TradesBlock *next;
15   Trade t[TRADES_PER_BLOCK];
16 } TradesBlock;
17
18 typedef struct {
19   int ntrades;
20   TradesBlock *trades;
21 } IslandPair;
22
23 int nislands;
24 IslandPair ***ipairs; /* ipairs[sislandid][dislandid] */
25
26 static IslandPair *ipair_get(int si, int di) {
27   IslandPair *ip, **ipa;
28
29   assert(si < nislands);
30   assert(di < nislands);
31
32   if (!(ipa= ipairs[si])) {
33     ipa= ipairs[si]= mcalloc(sizeof(*ipa) * nislands);
34   }
35   if ((ip= ipa[di]))
36     return ip;
37   
38   ipa[di]= ip= mmalloc(sizeof(*ip));
39   ip->ntrades= 0;
40   ip->trades= 0;
41   int inblock= TRADES_PER_BLOCK;
42   TradesBlock *block= 0;
43
44   SQL_MUST( sqlite3_bind_int(ss_ipair, 1, si) );
45   SQL_MUST( sqlite3_bind_int(ss_ipair, 2, di) );
46
47   while (SQL_STEP(ss_ipair)) {
48     if (inblock == TRADES_PER_BLOCK) {
49       block= mmalloc(sizeof(*block));
50       block->next= ip->trades;
51       ip->trades= block;
52       inblock= 0;
53     }
54     int *irp, i;
55     for (i=0, irp=&block->t[inblock].commodid; i<5; i++, irp++)
56       *irp= sqlite3_column_int(ss_ipair, i);
57     ip->ntrades++;
58     inblock++;
59   }
60   if (inblock < TRADES_PER_BLOCK)
61     block->t[inblock].commodid= -1;
62
63   sqlite3_reset(ss_ipair);
64   
65   return ip;
66 }
67
68 void value_route(int nislands, const int *islands) {
69   int s,d;
70   
71   for (s=0; s<nislands; s++) {
72     for (d=s; d<nislands; d++) {
73       ipair_get(islands[s], islands[d]);
74     }
75   }
76
77   //char *tail;
78   //struct sqlite_vm *sth;
79   //r= sqlite_compile(db, stmt, &tail, &sth, 
80 }
81
82 void setup_value(void) {
83   sqlite3_stmt *sst;
84
85   SQL_MUST( sqlite3_prepare(db, "SELECT max(islandid) FROM islands",
86                             -1,&sst,0) );
87   assert( SQL_STEP(sst) );
88   nislands= sqlite3_column_int(sst,0);
89   nislands++;
90   sqlite3_finalize(sst);
91   debugf("VALUE nislands=%d\n",nislands);
92
93   SQL_MUST( sqlite3_prepare(db,
94      "SELECT\n"
95      " sell.commodid            commodid,\n"
96      " sell.price               src_price,\n"
97      " sum(sell.qty)            src_qty,\n"
98      " buy.price                dst_price,\n"
99      " sum(buy.qty)             dst_qty\n"
100      " FROM sell JOIN buy\n"
101      "   ON sell.commodid = buy.commodid\n"
102      "  AND buy.price > sell.price\n"
103      " WHERE sell.islandid=?\n"
104      "   AND buy.islandid=?\n"
105      " GROUP BY sell.commodid, sell.price, buy.price",
106                             -1, &ss_ipair, 0) );
107
108   ipairs= mcalloc(sizeof(*ipairs) * nislands);
109 }