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*/
--- /dev/null
+
+#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);
+ }
+ }
+}
#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) {
for (s=0; s<nislands; s++) {
for (d=s; d<nislands; d++) {
- ipair_gettrades(islands[s], islands[d]);
+ ipair_get(islands[s], islands[d]);
}
}
//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);
+}