chiark / gitweb /
WIP routetrade now can find trades for islandpair but FIXME need to get max islandid
authorIan Jackson <ian@liberator.(none)>
Mon, 28 Sep 2009 18:16:07 +0000 (19:16 +0100)
committerIan Jackson <ian@liberator.(none)>
Mon, 28 Sep 2009 18:16:07 +0000 (19:16 +0100)
yarrg/Makefile
yarrg/common.c
yarrg/common.h
yarrg/rscommon.h
yarrg/rsmain.c
yarrg/rssetup.c [new file with mode: 0644]
yarrg/rsvalue.c
yarrg/x.gdb

index 695f85c..9019bd2 100644 (file)
@@ -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
index fb25341..3dc387e 100644 (file)
@@ -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;
index fdae435..0856274 100644 (file)
@@ -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);
index 6fd394e..5c4b3c8 100644 (file)
@@ -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*/
index 2ed1e0e..85f271b 100644 (file)
@@ -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 (file)
index 0000000..6538677
--- /dev/null
@@ -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);
+    }
+  }
+}
index f399e3f..b176935 100644 (file)
@@ -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<nislands; s++) {
     for (d=s; d<nislands; d++) {
-      ipair_gettrades(islands[s], islands[d]);
+      ipair_get(islands[s], islands[d]);
     }
   }
 
@@ -47,3 +78,22 @@ void value_route(int nislands, const int *islands) {
   //struct sqlite_vm *sth;
   //r= sqlite_compile(db, stmt, &tail, &sth, 
 }
+
+void setup_value(void) {
+  SQL_MUST( sqlite3_prepare(db,
+     "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=?\n"
+     "   AND buy.islandid=?\n"
+     " GROUP BY sell.commodid, sell.price, buy.price",
+                           -1, &ss_ipair, 0) );
+
+  ipairs= mcalloc(sizeof(*ipairs) * nislands);
+}
index 5d4e663..3e4083f 100644 (file)
@@ -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