From: Ian Jackson Date: Mon, 28 Sep 2009 18:16:07 +0000 (+0100) Subject: WIP routetrade now can find trades for islandpair but FIXME need to get max islandid X-Git-Tag: 5.0^2~98 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.main.git;a=commitdiff_plain;h=322e26f969dfb65629833be5bd75ba71a15b8634;ds=sidebyside WIP routetrade now can find trades for islandpair but FIXME need to get max islandid --- diff --git a/yarrg/Makefile b/yarrg/Makefile index 695f85c..9019bd2 100644 --- a/yarrg/Makefile +++ b/yarrg/Makefile @@ -38,14 +38,14 @@ all: default routesearch CONVERT_OBJS= convert.o ocr.o pages.o structure.o rgbimage.o resolve.o COMMON_OBJS= common.o -ROUTESEARCH_OBJS= rsvalue.o rsmain.o +ROUTESEARCH_OBJS= rsvalue.o rsmain.o rssetup.o yarrg: $(CONVERT_OBJS) $(COMMON_OBJS) -lnetpbm -lXtst -lX11 -lpcre -lm $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS) $(CONVERT_OBJS): common.h ocr.h convert.h structure.h -routesearch: $(ROUTESEARCH_OBJS) $(COMMON_OBJS) +routesearch: $(ROUTESEARCH_OBJS) $(COMMON_OBJS) -lsqlite3 $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS) $(ROUTESEARCH_OBJS): common.h rscommon.h diff --git a/yarrg/common.c b/yarrg/common.c index fb25341..3dc387e 100644 --- a/yarrg/common.c +++ b/yarrg/common.c @@ -33,6 +33,13 @@ void *mmalloc(size_t sz) { sysassert( r= malloc(sz) ); return r; } +void *mcalloc(size_t sz) { + void *r; + if (!sz) return 0; + sysassert( r= malloc(sz) ); + memset(r, 0, sz); + return r; +} void *mrealloc(void *p, size_t sz) { assert(sz); void *r; diff --git a/yarrg/common.h b/yarrg/common.h index fdae435..0856274 100644 --- a/yarrg/common.h +++ b/yarrg/common.h @@ -137,6 +137,7 @@ void waitpid_check_exitstatus(pid_t pid, const char *what, int sigpipeok); void *mmalloc(size_t sz); +void *mcalloc(size_t sz); void *mrealloc(void *p, size_t sz); char *masprintf(const char *fmt, ...) FMT(1,2); diff --git a/yarrg/rscommon.h b/yarrg/rscommon.h index 6fd394e..5c4b3c8 100644 --- a/yarrg/rscommon.h +++ b/yarrg/rscommon.h @@ -7,10 +7,29 @@ DF(sql) +#define SQL_MUST( call ) ({ \ + /* `call' is an expression returning result, using const char *sqe; \ + * chk1 and chk2 are blocks using sqe and int sqr; */ \ + const char *sql_must_call_string= #call; \ + int sqr; \ + if (DEBUGP(sql)) fprintf(stderr,"SQL %s", sql_must_call_string); \ + sqr= (call); \ + if (DEBUGP(sql)) fprintf(stderr," = %d\n", sqr); \ + if (sqr) fatal("SQL call failed code %d: %s: %s", \ + sqr, sqlite3_errmsg(db), sql_must_call_string); \ + }) + +#define SQL_STEP(ssh) (sql_step_wrap((ssh), #ssh, __FILE__, __LINE__)) +int sql_step_wrap(sqlite3_stmt *ssh, const char *ssh_string, + const char *file, int line); + #include "common.h" -extern struct sqlite *db; +extern sqlite3 *db; +extern sqlite3_stmt *ss_ipair; +void setup(void); void value_route(int nislands, const int *islands); +void setup_value(void); #endif /*RSCOMMON_H*/ diff --git a/yarrg/rsmain.c b/yarrg/rsmain.c index 2ed1e0e..85f271b 100644 --- a/yarrg/rsmain.c +++ b/yarrg/rsmain.c @@ -8,6 +8,7 @@ int main(int argc, const char **argv) { int ia[argc], ni=0; debug_flags= ~0UL; + setup(); const char *arg; while ((arg= *++argv)) { diff --git a/yarrg/rssetup.c b/yarrg/rssetup.c new file mode 100644 index 0000000..6538677 --- /dev/null +++ b/yarrg/rssetup.c @@ -0,0 +1,25 @@ + +#include "rscommon.h" + +sqlite3 *db; +sqlite3_stmt *ss_ipair; + +void setup(void) { + SQL_MUST( sqlite3_open("OCEAN-Midnight.db", &db) ); + setup_value(); +} + +int sql_step_wrap(sqlite3_stmt *ssh, const char *ssh_string, + const char *file, int line) { + for (;;) { + int sqr; + sqr= sqlite3_step((ssh)); + switch (sqr) { + case SQLITE_DONE: return 0; + case SQLITE_ROW: return 1; + case SQLITE_BUSY: sysassert(! usleep(5000) ); break; + default: fatal("SQL step failed at %s:%d: code %d: %s: %s", + file, line, sqr, sqlite3_errmsg(db), ssh_string); + } + } +} diff --git a/yarrg/rsvalue.c b/yarrg/rsvalue.c index f399e3f..b176935 100644 --- a/yarrg/rsvalue.c +++ b/yarrg/rsvalue.c @@ -2,36 +2,67 @@ #include "rscommon.h" -DEBUG_DEFINE_SOME_DEBUGF(sql,sql_dprintf); +//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; - Trade *trades; + TradesBlock *trades; } IslandPair; -static void ipair_gettrades(int si, int di) { - char *stmt= masprintf - ("SELECT\n" - " sell.commodid commodid,\n" - " sell.price src_price,\n" - " sum(sell.qty) src_qty,\n" - " buy.price dst_price,\n" - " sum(buy.qty) dst_qty\n" - " FROM sell JOIN buy\n" - " ON sell.commodid = buy.commodid\n" - " AND buy.price > sell.price\n" - " WHERE sell.islandid=%d\n" - " AND buy.islandid=%d\n" - " GROUP BY sell.commodid, sell.price, buy.price\n", - si, di); +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; - sql_dprintf("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; + + SQL_MUST( sqlite3_bind_int(ss_ipair, 1, si) ); + SQL_MUST( sqlite3_bind_int(ss_ipair, 2, di) ); - free(stmt); + 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) { @@ -39,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); +} diff --git a/yarrg/x.gdb b/yarrg/x.gdb index 5d4e663..3e4083f 100644 --- a/yarrg/x.gdb +++ b/yarrg/x.gdb @@ -1,5 +1,5 @@ file routesearch -set args 1 2 3 -#break structure.c:596 if here!=aa_background -#break mustfail2 +set args 34 36 +break value_route run +finish