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

static void show_mysql_error(MYSQL *mysql)
{
  printf("Error(%d) [%s] \"%s\"", mysql_errno(mysql),
          mysql_sqlstate(mysql),
          mysql_error(mysql));
  exit(-1);
}

static void show_stmt_error(MYSQL_STMT *stmt)
{
  printf("Error(%d) [%s] \"%s\"", mysql_stmt_errno(stmt),
          mysql_stmt_sqlstate(stmt),
          mysql_stmt_error(stmt));
  exit(-1);
}

int main(int argc, char *argv[])
{
  MYSQL *mysql;
  MYSQL_STMT *stmt;
  MYSQL_BIND ibind[1];
  MYSQL_BIND obind[1];
  int iid, err;
  unsigned char otiny;
  unsigned long olength;
  my_bool oerr, onull;


  mysql= mysql_init(NULL);

  /* connect to MariaDB server */
  if (!mysql_real_connect(mysql, "localhost", "infnet", "rts9492",
                          "infnet", 0, 0, 0))
    show_mysql_error(mysql);


  stmt= mysql_stmt_init(mysql);
  if (mysql_stmt_prepare(stmt, "SELECT tiny FROM tinytab WHERE id = ?", -1))
    show_stmt_error(stmt);

  memset(ibind, 0, sizeof(MYSQL_BIND) * 1);
  memset(obind, 0, sizeof(MYSQL_BIND) * 1);

  ibind[0].is_null = 0;
  ibind[0].length  = 0;
  ibind[0].buffer_type = MYSQL_TYPE_LONG ;
  ibind[0].buffer = & iid ;

  obind[0].is_null = &onull;
  obind[0].length  = &olength;
  obind[0].error  = &oerr;
  obind[0].buffer_type = MYSQL_TYPE_TINY;
  obind[0].buffer = & otiny ;
  obind[0].buffer_length = sizeof(otiny);
  /* bind parameter */
  mysql_stmt_bind_param(stmt, ibind);

  /* execute */
  if (argc != 2) {
    fprintf(stderr, "usage: %s id\n", argv[0]);
    exit(1);
  }
  iid = strtol(argv[1], 0, 0);
  if (mysql_stmt_execute(stmt))
    show_stmt_error(stmt);
  mysql_stmt_bind_result(stmt, obind);
  if ((err = mysql_stmt_fetch(stmt))) {
    if ( err == MYSQL_NO_DATA)
      fprintf(stderr, "id %d: no data  -->  ", iid);
    else if ( err == MYSQL_DATA_TRUNCATED)
      fprintf(stderr, "id %d: data truncated  -->  ", iid);
    else if (err)
      show_stmt_error(stmt);
  }
  mysql_stmt_free_result(stmt);
  fprintf( stderr, "id %d: tiny %d\n", iid, otiny);
  /* execute */
#if 0
  iid = 2;
  if (mysql_stmt_execute(stmt))
    show_stmt_error(stmt);
  mysql_stmt_bind_result(stmt, obind);
  if (mysql_stmt_fetch(stmt)) {
    if ( err == MYSQL_NO_DATA)
      fprintf(stderr, "id %d: no data  -->  ", iid);
    else if ( err == MYSQL_DATA_TRUNCATED)
      fprintf(stderr, "id %d: data truncated  -->  ", iid);
    else if (err)
      show_stmt_error(stmt);
  }
  mysql_stmt_free_result(stmt);
  fprintf( stderr, "id %d: tiny %d\n", iid, otiny);
#endif

  mysql_stmt_close(stmt);
  mysql_close(mysql);
}
