chiark / gitweb /
Fix up nislands; use BEGIN
authorIan Jackson <ian@liberator.(none)>
Tue, 29 Sep 2009 17:16:32 +0000 (18:16 +0100)
committerIan Jackson <ian@liberator.(none)>
Tue, 29 Sep 2009 17:26:27 +0000 (18:26 +0100)
yarrg/rscommon.h
yarrg/rssetup.c
yarrg/rsvalue.c

index 5c4b3c8..8bfe3e1 100644 (file)
@@ -4,7 +4,8 @@
 #include <sqlite3.h>
 
 #define DEBUG_FLAG_LIST                                \
-   DF(sql)
+   DF(sql)                                     \
+   DF(value)
 
 
 #define SQL_MUST( call ) ({                                     \
index 6538677..e169dd5 100644 (file)
@@ -4,8 +4,22 @@
 sqlite3 *db;
 sqlite3_stmt *ss_ipair;
 
+static int busy_handler(void *u, int previous) {
+  if (DEBUGP(sql)) fprintf(stderr,"[[DB BUSY %d]]",previous);
+  sysassert(! usleep(5000) );
+  return 1;
+}
+
 void setup(void) {
+  sqlite3_stmt *sst;
+  
   SQL_MUST( sqlite3_open("OCEAN-Midnight.db", &db) );
+  SQL_MUST( sqlite3_busy_handler(db, busy_handler, 0) );
+
+  SQL_MUST( sqlite3_prepare(db, "BEGIN", -1, &sst, 0) );
+  assert( !SQL_STEP(sst) );
+  sqlite3_finalize(sst);
+
   setup_value();
 }
 
@@ -15,9 +29,21 @@ int sql_step_wrap(sqlite3_stmt *ssh, const char *ssh_string,
     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;
+    case SQLITE_DONE:
+      if (DEBUGP(sql))
+       fprintf(stderr,"SQL %s DONE\n",ssh_string);
+      return 0;
+    case SQLITE_ROW:
+      if (DEBUGP(sql)) {
+       int i;
+       fprintf(stderr,"SQL %s R",ssh_string);
+       for (i=0; i<sqlite3_column_count(ssh); i++) {
+         fputc('\t',stderr);
+         fputs((char*)sqlite3_column_text(ssh,i),stderr);
+       }
+       fputs("\n",stderr);
+      }
+      return 1;
     default: fatal("SQL step failed at %s:%d: code %d: %s: %s",
                   file, line, sqr, sqlite3_errmsg(db), ssh_string);
     }
index b176935..8bdddae 100644 (file)
@@ -2,7 +2,7 @@
 
 #include "rscommon.h"
 
-//DEBUG_DEFINE_SOME_DEBUGF(sql,sql_dprintf);
+DEBUG_DEFINE_DEBUGF(value);
 
 typedef struct {
   int commodid, src_price, src_qty, dst_price, dst_qty;
@@ -20,7 +20,7 @@ typedef struct {
   TradesBlock *trades;
 } IslandPair;
 
-int nislands=100;
+int nislands;
 IslandPair ***ipairs; /* ipairs[sislandid][dislandid] */
 
 static IslandPair *ipair_get(int si, int di) {
@@ -80,6 +80,16 @@ void value_route(int nislands, const int *islands) {
 }
 
 void setup_value(void) {
+  sqlite3_stmt *sst;
+
+  SQL_MUST( sqlite3_prepare(db, "SELECT max(islandid) FROM islands",
+                           -1,&sst,0) );
+  assert( SQL_STEP(sst) );
+  nislands= sqlite3_column_int(sst,0);
+  nislands++;
+  sqlite3_finalize(sst);
+  debugf("VALUE nislands=%d\n",nislands);
+
   SQL_MUST( sqlite3_prepare(db,
      "SELECT\n"
      " sell.commodid           commodid,\n"