#include <stdio.h>
#include <string.h>
#include "MysqlDriver.h"
#include "MysqlDatabase.h"

#if defined WIN32
#define snprintf _snprintf
#define strncasecmp strnicmp
#endif

using namespace SourceMod;

bool MysqlDriver::IsCompatDriver(const char *namestring)
{
	return (strncasecmp(namestring, "mysql", 5) == 0);
}

const char *MysqlDriver::NameString()
{
	return "mysql";
}

IDatabase *MysqlDriver::Connect(DatabaseInfo *info, int *errcode, char *error, size_t maxlength)
{
	return _Connect(info, errcode, error, maxlength, false);
}

IDatabase *MysqlDriver::Connect2(DatabaseInfo *info, int *errcode, char *error, size_t maxlength)
{
	return _Connect(info, errcode, error, maxlength, true);
}

IDatabase *MysqlDriver::_Connect(DatabaseInfo *info, int *errcode, char *error, size_t maxlength, bool do_timeout)
{
	MYSQL *mysql = mysql_init(NULL);

	if (!mysql)
	{
		if (errcode)
			*errcode = -1;
		if (error && maxlength)
		{
			snprintf(error, maxlength, "Initialization failed");
		}
		return false;
	}

	if (do_timeout && info->max_timeout)
	{
		mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&(info->max_timeout));
	}

	if (mysql_real_connect(mysql, 
							info->host, 
							info->user, 
							info->pass, 
							info->database,
							info->port,
							NULL,
							0) == NULL)
	{
		if (errcode)
		{
			*errcode = mysql_errno(mysql);
		}
		if (error && maxlength)
		{
			snprintf(error, maxlength, "%s", mysql_error(mysql));
		}
		return false;
	}

	MysqlDatabase *pMysql = new MysqlDatabase(mysql, this);

	return static_cast<IDatabase *>(pMysql);
}