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

int main(int argc, char *argv[]) {

	MYSQL *mysql;
	MYSQL_RES *res;
	MYSQL_ROW row;
	MYSQL_FIELD *fields;
	MY_CHARSET_INFO cs;
	unsigned int i, num_fields;
	unsigned long *lengths;
	const char *host;
	unsigned int port;
	const char *user;
	const char *passwd;

	if (argc != 5) {
		printf("Usage: %s host port user passwd\n", argv[0]);
		return 1;
	}

	host = argv[1];
	port = atoi(argv[2]);
	user = argv[3];
	passwd = argv[4];

	if (mysql_library_init(-1, NULL, NULL) != 0) {
		printf("mysql_library_init failed");
		return 1;
	}

	mysql = mysql_init(NULL);
	if (!mysql) {
		printf("mysql_init failed");
		return 1;
	}

	if (mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "utf8mb4") != 0) {
		printf("mysql_options MYSQL_SET_CHARSET_NAME utf8mb4 failed: %s\n", mysql_error(mysql));
		return 1;
	}

	if (!mysql_real_connect(mysql, host, user, passwd, NULL, port, NULL, CLIENT_FOUND_ROWS | CLIENT_MULTI_RESULTS | CLIENT_REMEMBER_OPTIONS)) {
		printf("mysql_real_connect failed: %s\n", mysql_error(mysql));
		return 1;
	}

	if (mysql_query(mysql, "SELECT @@character_set_client, @@character_set_results, @@character_set_connection, @@character_set_server, @@character_set_database, @@collation_connection, @@collation_database") != 0) {
		printf("mysql_query failed: %s\n", mysql_error(mysql));
		return 1;
	}

	res = mysql_store_result(mysql);
	if (!res) {
		printf("mysql_store_result failed: %s\n", mysql_error(mysql));
		return 1;
	}

	if (mysql_num_rows(res) != 1) {
		printf("mysql_num_rows returned incorrect number of rows\n");
		return 1;
	}

	row = mysql_fetch_row(res);
	if (!row) {
		printf("mysql_fetch_row failed: %s\n", mysql_error(mysql));
		return 1;
	}

	lengths = mysql_fetch_lengths(res);
	if (!lengths) {
		printf("mysql_fetch_lengths failed: %s\n", mysql_error(mysql));
		return 1;
	}

	num_fields = mysql_num_fields(res);
	fields = mysql_fetch_fields(res);

	for (i = 0; i < num_fields; ++i)
		printf("SQL %s: %s\n", fields[i].name, row[i]);

	mysql_get_character_set_info(mysql, &cs);
	printf("character set information:\n");
	printf("character set+collation number: %d\n", cs.number);
	printf("character set name: %s\n", cs.name);
	printf("collation name: %s\n", cs.csname);
	printf("comment: %s\n", cs.comment);
	printf("directory: %s\n", cs.dir);
	printf("multi byte character min. length: %d\n", cs.mbminlen);
	printf("multi byte character max. length: %d\n", cs.mbmaxlen);

	mysql_free_result(res);
	mysql_close(mysql);
	mysql_library_end();

	return 0;

}
