#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> 

int main(int argc, char* argv[]) {
  sqlite3 *sqlDBconn;
  sqlite3_stmt *sqlDBprepared ;
  int sqlRC ;
  int sqlNumCols ;
  int sqlRowNum ;
  int sqlColNum ;
  const char *sqlDBname = "/home/brock/343/notes/social.sqlite3" ;
  const char *sqlDBquery = 
    "SELECT A.name, B.name "
    "FROM Highschooler A, Highschooler B, Friend F "
    "WHERE A.ID = F.ID1 AND B.ID = F.ID2 AND A.name < B.name ;" ;

  if((sqlRC=sqlite3_open(sqlDBname, &sqlDBconn)) != SQLITE_OK) {
    fprintf(stderr, "Failure opening %s: %s\n",
	    sqlDBname, sqlite3_errmsg(sqlDBconn)) ;
    exit(0);
  } else {
    fprintf(stdout, "Opened database in %s\n", sqlDBname) ;
  }

  if((sqlRC=sqlite3_prepare_v2(
               sqlDBconn,
               sqlDBquery,
	       -1,    // Forget the "small performance advantage"
	       &sqlDBprepared,
	       (const char **)NULL)) != SQLITE_OK) {
    fprintf(stderr, "Failure preparing %s: %s\n",
	    sqlDBquery, sqlite3_errmsg(sqlDBconn)) ;
    exit(0);
  } else {
    fprintf(stdout, "Prepared %s\n", sqlDBquery) ;
  }
  
  sqlNumCols = sqlite3_column_count(sqlDBprepared) ;
  fprintf(stdout, "Columns returned: %d\n", sqlNumCols) ;
  for (sqlColNum=0; sqlColNum<sqlNumCols; ++sqlColNum) {
    fprintf(stdout, "  Column %2d: %s\n", 
	    sqlColNum, sqlite3_column_name(sqlDBprepared, sqlColNum)) ;
  }
  sqlRowNum = 0 ;
  while ((sqlRC=sqlite3_step(sqlDBprepared)) == SQLITE_ROW) {
    for (sqlColNum=0; sqlColNum<sqlNumCols; ++sqlColNum) {
      int sqlColType ;
      fprintf(stdout, "[%2d,%2d]: ", sqlRowNum, sqlColNum) ;
      sqlColType = sqlite3_column_type(sqlDBprepared, sqlColNum) ;
      if (sqlColType == SQLITE_INTEGER) {
	fprintf(stdout, "%9d\n",
		sqlite3_column_int(sqlDBprepared, sqlColNum));
      } else if (sqlColType == SQLITE_FLOAT) {
	fprintf(stdout, "%9.5d\n",
		sqlite3_column_double(sqlDBprepared, sqlColNum));
      } else if (sqlColType == SQLITE_TEXT) {
	fprintf(stdout, "%s\n",
		sqlite3_column_text(sqlDBprepared, sqlColNum));
      } else if (sqlColType == SQLITE_BLOB) {
	fprintf(stdout, "BLOB\n") ;
      } else if (sqlColType == SQLITE_NULL) {
	fprintf(stdout, "NULL\n") ;
      } else {
	fprintf(stdout, "!!!!\n") ;
      }
    }
    sqlRowNum++ ;
  }

  if (sqlite3_finalize(sqlDBprepared) != SQLITE_OK) {
    fprintf(stderr, "Finalize failure: %s\n", sqlite3_errmsg(sqlDBconn)) ;
  }

}
