
/*
 * DBConnection.cpp
 * Part of SQLMeta, a language to use sql-queries in html pages.
 *
 * Copyright (C) 2001  Daan Vreeken
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 */

#include "sqlmeta.h"


#define NeedReconnect		0
#define ChangedUser		1
#define ChangedDB		2




DBConnection::DBConnection(MetaParser *MyParent, DBInfo *MyInfo)
{
	Parent=MyParent;

	Info=MyInfo;
	Connected=0;
	RowNr=0;
}



int DBConnection::TryConnect(void)
{
	if (Info->Host==NULL)
	{
		Parent->Error(ErrSQLConnect,"No hostname specified");
		return 0;
	}
	if (Info->User==NULL)
	{
		Parent->Error(ErrSQLConnect,"No username specified");
		return 0;
	}
	if (Info->Password==NULL)
	{
		Parent->Error(ErrSQLConnect,"No password specified");
		return 0;
	}
	if (Info->DB==NULL)
	{
		Parent->Error(ErrSQLConnect,"No database specified");
		return 0;
	}

	Connection=(MYSQL *)malloc(sizeof(MYSQL));
	if (Connection==NULL)
	{
		Parent->Error(ErrMalloc,"DBConnection::TryConnect");
		return 0;
	}

	mysql_init(Connection);

	if (!mysql_real_connect(Connection,Info->Host,Info->User,Info->Password,Info->DB,0,NULL,0))
	{
		ShowError(ErrSQLConnect);
		return 0;
	}

	Connected=1;
	return 1;
}



int DBConnection::Query(char *Query)
{
	if (Connection==NULL)
	{
		ShowError(ErrSQLConnectFirst);
		return 0;
	}

	if (mysql_query(Connection,Query))
	{
		ShowError(ErrSQLQuery);
		return 0;
	}
	return 1;
}



int DBConnection::GetResult(void)
{
	if (Connection==NULL)
	{
		ShowError(ErrSQLConnectFirst);
		return 0;
	}

	Result=mysql_use_result(Connection);
	if (Result==NULL)
	{
		ShowError(ErrSQLNoResult);
		return 0;
	}

	Fields=mysql_num_fields(Result);
	FieldName=mysql_fetch_fields(Result);

	return 1;
}



int DBConnection::NextRow(void)
{
	Row=mysql_fetch_row(Result);
	RowNr++;

	return (Row!=NULL);
}



void DBConnection::FreeResult(void)
{
	mysql_free_result(Result);
	Result=NULL;
}



void DBConnection::ShowError(char *Err)
{
	Parent->Error(Err,mysql_error(Connection));
}




DBConnection::~DBConnection(void)
{
	if (Connected)
	{
		if (Result)
			FreeResult();

		mysql_close(Connection);
		free(Connection);
	}
}



