chiark / gitweb /
Notice if $expected_total_profit parsing failed; don't break if it is an integer
[ypp-sc-tools.db-live.git] / yarrg / rssql.c
index 463ef8b..23b3bd0 100644 (file)
@@ -4,7 +4,10 @@
 sqlite3 *db;
 sqlite3_stmt *ss_ipair;
 
+int islandtablesz;
+
 DEBUG_DEFINE_DEBUGF(sql);
+DEBUG_DEFINE_SOME_DEBUGF(sql,debug2f);
 
 static int busy_handler(void *u, int previous) {
   debugf("[[DB BUSY %d]]",previous);
@@ -12,17 +15,18 @@ static int busy_handler(void *u, int previous) {
   return 1;
 }
 
-void setup(void) {
+void setup_sql(const char *database) {
   sqlite3_stmt *sst;
   
-  SQL_MUST( sqlite3_open("OCEAN-Midnight.db", &db) );
+  SQL_MUST( sqlite3_open(database, &db) );
   SQL_MUST( sqlite3_busy_handler(db, busy_handler, 0) );
 
   sst= sql_prepare("BEGIN","(begin)");
   assert( !SQL_STEP(sst) );
   sqlite3_finalize(sst);
 
-  setup_value();
+  islandtablesz= 1 + sql_single_int("SELECT max(islandid) FROM islands");
+  debugf("SQL islandtablesz=%d\n",islandtablesz);
 }
 
 int sql_single_int(const char *stmt) {
@@ -41,7 +45,7 @@ void sql_fatal(const char *stmt_what, int sqr, const char *act_what) {
 
 void sql_bind(sqlite3_stmt *ss, int index, int value,
              const char *ss_what, const char *val_what) {
-  debugf("SQL BIND %s #%d = %d = %s\n", ss_what, index, value, val_what);
+  debug2f("SQL BIND %s #%d = %d = %s\n", ss_what, index, value, val_what);
   int sqr= sqlite3_bind_int(ss, index, value);
   if (sqr) sql_fatal(ss_what, sqr,
                     masprintf("bind #%d (%s)", index, val_what));
@@ -54,17 +58,37 @@ sqlite3_stmt *sql_prepare(const char *stmt, const char *what) {
   return ssr;
 }
 
-int sql_step_wrap(sqlite3_stmt *ssh, const char *ssh_string,
-                 const char *file, int line) {
+int sql_step_distinct(sqlite3_stmt *ssh, const char *ssh_string,
+                     const char *file, int line,
+                     int *cols, int ncols, int nkeycols) {
+  for (;;) {
+    if (!sql_step(ssh, ssh_string, file, line)) return 0;
+
+    int i;
+    for (i=0; i<ncols; i++) {
+      int v= sqlite3_column_int(ssh, i);
+      if (v == cols[i]) continue;
+      
+      assert(i<nkeycols);
+      cols[i++]= v;
+      for ( ; i<ncols; i++)
+       cols[i]= sqlite3_column_int(ssh, i);
+      return 1;
+    }
+  }
+}
+
+int sql_step(sqlite3_stmt *ssh, const char *ssh_string,
+            const char *file, int line) {
   for (;;) {
     int sqr;
     sqr= sqlite3_step((ssh));
     switch (sqr) {
     case SQLITE_DONE:
-      debugf("SQL %s DONE\n",ssh_string);
+      debug2f("SQL %s DONE\n",ssh_string);
       return 0;
     case SQLITE_ROW:
-      if (DEBUGP(sql)) {
+      if (DEBUGP(sql2)) {
        int i;
        fprintf(debug,"SQL %s R",ssh_string);
        for (i=0; i<sqlite3_column_count(ssh); i++) {