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

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

  if (argc<2) {
    fprintf(stderr, "No friend provided\n") ;
    exit(1) ;
  }
  friend = argv[1] ;
  fprintf(stdout, "Friends of %s\n", friend) ;

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

  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);
  }
  
  if ((sqlRC=sqlite3_bind_text(sqlDBprepared,
               1,
	       friend,
	       strlen(friend),
			       (void(*)(void*))NULL)) != SQLITE_OK) {
    fprintf(stderr, "Failure binding %s: %s\n",
	    friend, sqlite3_errmsg(sqlDBconn)) ;
    exit(0);
  }

  while ((sqlRC=sqlite3_step(sqlDBprepared)) == SQLITE_ROW) {
    const char *theirfriend ;
    theirfriend = sqlite3_column_text(sqlDBprepared, 0) ;
    fprintf(stdout, "   %s\n", theirfriend) ;
  }

  sqlite3_finalize(sqlDBprepared) ;
}
