Patch level : 12.0 no-patch
Files correlati : Commento : Nuovo progetto che wrappa SQLAPI git-svn-id: svn://10.65.10.50/branches/R_10_00@24151 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									4db94043cb
								
							
						
					
					
						commit
						d0bc61416a
					
				
							
								
								
									
										554
									
								
								src/xvtdb/xvtdb.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										554
									
								
								src/xvtdb/xvtdb.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,554 @@
 | 
			
		||||
#include "xvtdb.h"
 | 
			
		||||
#include <sqlapi.h>
 | 
			
		||||
 | 
			
		||||
#define _CON(a) ((SAConnection *)a)
 | 
			
		||||
#define _RCS(a) ((SACommand *)a)
 | 
			
		||||
#define _ERR(a) ((SAException *)a)
 | 
			
		||||
 | 
			
		||||
// Funzione per la connessione, utilizzando un DBMS devo controllare sempre
 | 
			
		||||
int xvt_create_connection(P_CONN_VOID con, const char* db, const char* user, const char* pass, TT_driver tipoDb)
 | 
			
		||||
{
 | 
			
		||||
	if(con != NULL)
 | 
			
		||||
	{
 | 
			
		||||
		// Se è già connesso lo scollego
 | 
			
		||||
		if(_CON(con)->isConnected())
 | 
			
		||||
			_CON(con)->Disconnect();
 | 
			
		||||
 | 
			
		||||
		SAString dbAddress = db;
 | 
			
		||||
		SAString usr = user;
 | 
			
		||||
		SAString psw = pass;
 | 
			
		||||
		SAClient_t dbDriver = (SAClient_t)tipoDb;
 | 
			
		||||
		if (dbAddress.IsEmpty() || usr.IsEmpty())
 | 
			
		||||
		{
 | 
			
		||||
			return NOT_INITIALIZED;
 | 
			
		||||
		}
 | 
			
		||||
		try
 | 
			
		||||
		{
 | 
			
		||||
			// Mi collego
 | 
			
		||||
			_CON(con)->Connect(dbAddress, usr, psw, dbDriver);
 | 
			
		||||
			// Imposto che non si possono vedere i record non committati
 | 
			
		||||
			_CON(con)->setIsolationLevel(SA_ReadCommitted);
 | 
			
		||||
		}
 | 
			
		||||
		catch (SAException &x)
 | 
			
		||||
		{
 | 
			
		||||
			return x.ErrNativeCode();
 | 
			
		||||
		}
 | 
			
		||||
		return NOERR;
 | 
			
		||||
	}
 | 
			
		||||
	return NOT_INITIALIZED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 * TXvt_recordset																																*
 | 
			
		||||
 * Classe per esecuzioni di query temporanee (wrapper semplice per SACommand)	*
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
 | 
			
		||||
TXvt_recordset::TXvt_recordset()
 | 
			
		||||
{
 | 
			
		||||
	_con = new SAConnection;
 | 
			
		||||
	_recset = new SACommand;
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		_RCS(_recset)->setConnection(_CON(_con));
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TXvt_recordset::TXvt_recordset(const char* db, const char* user, const char* pass, TT_driver tipoDb, const char * query, const bool ex, const bool freezed)
 | 
			
		||||
{
 | 
			
		||||
	_con = new SAConnection;
 | 
			
		||||
	if(xvt_create_connection(_con, db, user, pass, tipoDb) == NOERR)
 | 
			
		||||
	{
 | 
			
		||||
		try
 | 
			
		||||
		{
 | 
			
		||||
			_recset = new SACommand;
 | 
			
		||||
			_RCS(_recset)->setConnection(_CON(_con));
 | 
			
		||||
			// if (query[0] != '\0')
 | 
			
		||||
			if (query && *query)
 | 
			
		||||
			{
 | 
			
		||||
				set(query);
 | 
			
		||||
				if (ex)
 | 
			
		||||
				{
 | 
			
		||||
					exec();
 | 
			
		||||
					// Terribile da vedere, ma ho fatto una funzione apposta e la voglio usare per Diana!
 | 
			
		||||
					if(freezed)
 | 
			
		||||
						freeze();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		catch (SAException &x)
 | 
			
		||||
		{
 | 
			
		||||
			_codeError =		x.ErrNativeCode();
 | 
			
		||||
			_stringError =	x.ErrMessage();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TXvt_recordset::TXvt_recordset(P_CONN_VOID c, const char * query, bool ex)
 | 
			
		||||
{
 | 
			
		||||
	_toDisconnect = true;
 | 
			
		||||
	//_con = c;
 | 
			
		||||
	memcpy(_con, c, sizeof(c));
 | 
			
		||||
	if (!_CON(_con)->isConnected())
 | 
			
		||||
		bool tolla = true;
 | 
			
		||||
	_recno = -1;
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		_recset = new SACommand;
 | 
			
		||||
		_RCS(_recset)->setConnection(_CON(_con));
 | 
			
		||||
		// if (query[0] != '\0')
 | 
			
		||||
		if (query && *query)
 | 
			
		||||
		{
 | 
			
		||||
			set(query);
 | 
			
		||||
			if (ex)
 | 
			
		||||
			{
 | 
			
		||||
				exec();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TXvt_recordset::~TXvt_recordset()
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		if(_toDisconnect && _CON(_con)->isConnected())
 | 
			
		||||
			_CON(_con)->Disconnect();
 | 
			
		||||
		if(_con != NULL)
 | 
			
		||||
			delete _con;
 | 
			
		||||
		if(_recset != NULL)
 | 
			
		||||
			delete _recset;
 | 
			
		||||
	}
 | 
			
		||||
	catch(...){}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* PRIVATE FUNCTIONS **************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
const bool TXvt_recordset::checkPermission()
 | 
			
		||||
{
 | 
			
		||||
	bool err = isFreezed();
 | 
			
		||||
	if(err)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		ERROR_FREEZED;
 | 
			
		||||
		_stringError =	"Il recordset è bloccato";
 | 
			
		||||
	}
 | 
			
		||||
	return !err; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* PUBLIC FUNCTIONS **************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**************************************************************************************************
 | 
			
		||||
 * Gestione Connection																																						*
 | 
			
		||||
 **************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
int TXvt_recordset::connect(const char* db, const char* user, const char* pass, TT_driver tipoDb)
 | 
			
		||||
{
 | 
			
		||||
	return xvt_create_connection(_con, db, user, pass, tipoDb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TXvt_recordset::disconnect()
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		_CON(_con)->Disconnect();
 | 
			
		||||
	}
 | 
			
		||||
	catch(SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TXvt_recordset::commit(bool autoRoll)
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		_CON(_con)->Commit();
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		if (autoRoll)
 | 
			
		||||
		{
 | 
			
		||||
			rollback();
 | 
			
		||||
		}
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TXvt_recordset::rollback()
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		_CON(_con)->Rollback();
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TXvt_recordset::setClient(TT_driver client) 
 | 
			
		||||
{ 
 | 
			
		||||
	_CON(_con)->setClient((SAClient_t) client); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TXvt_recordset::setConOption(const char* opt) 
 | 
			
		||||
{ 
 | 
			
		||||
	_CON(_con)->setOption(opt); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TXvt_recordset::setAutocommit(bool ac)
 | 
			
		||||
{
 | 
			
		||||
	_CON(_con)->setAutoCommit(ac ? SA_AutoCommitOn : SA_AutoCommitOff);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TXvt_recordset::setVisibility(isoLvl vis)
 | 
			
		||||
{
 | 
			
		||||
	/* La libreria attuale supporta diversi tipi di visibilità, per mantenere una compatibilità massima
 | 
			
		||||
	 * (evitando inutili seghe mentali) consiglio di usare i primi due, di default la classe imposta "Read committed"
 | 
			
		||||
	 * Tipi di isolazione:
 | 
			
		||||
	 *	0 -> Read uncommitted.
 | 
			
		||||
	 *	1 -> Read committed.
 | 
			
		||||
	 *	2 -> Repeatable read.
 | 
			
		||||
	 *	3 -> Serializable.
 | 
			
		||||
	 */
 | 
			
		||||
	_CON(_con)->setIsolationLevel((SAIsolationLevel_t)vis);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TXvt_recordset::isConnect() 
 | 
			
		||||
{ 
 | 
			
		||||
	return _CON(_con)->isConnected(); 
 | 
			
		||||
}
 | 
			
		||||
bool TXvt_recordset::isAlive() 
 | 
			
		||||
{ 
 | 
			
		||||
	return _CON(_con)->isAlive(); 
 | 
			
		||||
}
 | 
			
		||||
int  TXvt_recordset::getVisibility() 
 | 
			
		||||
{ 
 | 
			
		||||
	return (isoLvl)_CON(_con)->IsolationLevel(); 
 | 
			
		||||
}
 | 
			
		||||
bool TXvt_recordset::getAutocommit() 
 | 
			
		||||
{ 
 | 
			
		||||
	return _CON(_con)->AutoCommit() == SA_AutoCommitOn; 
 | 
			
		||||
}
 | 
			
		||||
const char* TXvt_recordset::getOption(const char* opt) 
 | 
			
		||||
{
 | 
			
		||||
	return _CON(_con)->Option(opt); 
 | 
			
		||||
}
 | 
			
		||||
long TXvt_recordset::getClientV() 
 | 
			
		||||
{ 
 | 
			
		||||
	return _CON(_con)->ClientVersion(); 
 | 
			
		||||
}
 | 
			
		||||
const char* TXvt_recordset::getServerV() 
 | 
			
		||||
{ 
 | 
			
		||||
	return _CON(_con)->ServerVersionString(); 
 | 
			
		||||
}
 | 
			
		||||
long TXvt_recordset::getServerVN() 
 | 
			
		||||
{ 
 | 
			
		||||
	return _CON(_con)->ServerVersion(); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**************************************************************************************************
 | 
			
		||||
 * Gestione Recordset																																							*
 | 
			
		||||
 **************************************************************************************************/
 | 
			
		||||
bool TXvt_recordset::set(const char* query)
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		_RCS(_recset)->setCommandText(query);
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TXvt_recordset::exec(bool autoF)
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		_RCS(_recset)->Execute();
 | 
			
		||||
		_recno = -1;
 | 
			
		||||
		if (autoF)
 | 
			
		||||
		{
 | 
			
		||||
			next();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TXvt_recordset::next()
 | 
			
		||||
{
 | 
			
		||||
	bool fetched = false;
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		if(_RCS(_recset)->FetchNext())
 | 
			
		||||
		{
 | 
			
		||||
			fetched = true;
 | 
			
		||||
			_recno++;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
	}
 | 
			
		||||
	return fetched;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TXvt_recordset::prev()
 | 
			
		||||
{
 | 
			
		||||
	bool fetched = false;
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		if (_RCS(_recset)->FetchPrior())
 | 
			
		||||
		{
 | 
			
		||||
			fetched = true;
 | 
			
		||||
			_recno--;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
	}
 | 
			
		||||
	return fetched;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TXvt_recordset::first()
 | 
			
		||||
{
 | 
			
		||||
	bool fetched = false;
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		if (_RCS(_recset)->FetchFirst())
 | 
			
		||||
		{
 | 
			
		||||
			fetched = true;
 | 
			
		||||
			_recno = 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
	}
 | 
			
		||||
	return fetched;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TXvt_recordset::last()
 | 
			
		||||
{
 | 
			
		||||
	/* La vita sarebbe molto bella se potessi chiamare la funzione FetchLast(), 
 | 
			
		||||
	// siccome non so la posizione del record eseguo ciclicamente Next
 | 
			
		||||
	// _RCS(_recset)->FetchLast();
 | 
			
		||||
	while (Next())
 | 
			
		||||
	{
 | 
			
		||||
		_recno++;
 | 
			
		||||
	}
 | 
			
		||||
	*/
 | 
			
		||||
	bool fetched = false;
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		if (_RCS(_recset)->FetchLast())
 | 
			
		||||
		{
 | 
			
		||||
			fetched = true;
 | 
			
		||||
			_recno = 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
	}
 | 
			
		||||
	return fetched;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TXvt_recordset::go(int newPos)
 | 
			
		||||
{
 | 
			
		||||
	// Controllo che la nuova posizione non sia fuori dal limite inferiore (Non so quanto è grande il recordset)
 | 
			
		||||
	bool result = newPos >= 0 ? true : false;
 | 
			
		||||
	
 | 
			
		||||
	// Se la posizione è minore mi sposto indietro
 | 
			
		||||
	while (newPos < _recno && result)
 | 
			
		||||
	{
 | 
			
		||||
		result = prev();
 | 
			
		||||
	}
 | 
			
		||||
	// Se la posizione è maggiore mi sposto in avanti
 | 
			
		||||
	while (newPos > _recno && result)
 | 
			
		||||
	{
 | 
			
		||||
		result = next();
 | 
			
		||||
	}
 | 
			
		||||
	/*
 | 
			
		||||
	// Controllo finale per prevenire errori
 | 
			
		||||
	if (newPos == _recno)
 | 
			
		||||
		return true;
 | 
			
		||||
	else
 | 
			
		||||
		return false;
 | 
			
		||||
	*/
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int TXvt_recordset::get_int(const char* field)
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		return static_cast<int>(_RCS(_recset)->Field(field).asLong());
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
		
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
short TXvt_recordset::get_short(const char* field)
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		return _RCS(_recset)->Field(field).asShort();
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
		
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long TXvt_recordset::get_long(const char* field)
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		return _RCS(_recset)->Field(field).asLong();
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
		
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
double TXvt_recordset::get_double(const char* field)
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		return _RCS(_recset)->Field(field).asDouble();
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TXvt_recordset::get_bool(const char* field)
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		return _RCS(_recset)->Field(field).asBool();
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
/*
 | 
			
		||||
real TXvt_recordset::GetReal(const char * field)
 | 
			
		||||
{
 | 
			
		||||
	return Get(field);
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
const char* TXvt_recordset::getDate(const char * field)
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		SADateTime app = _RCS(_recset)->Field(field).asDateTime();
 | 
			
		||||
		char date[10];
 | 
			
		||||
		sprintf_s(date, (size_t)10, "%d-%d-%d", app.GetDay(), app.GetMonth(), app.GetYear());
 | 
			
		||||
		return date;
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char* TXvt_recordset::get(const char* field)
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		return static_cast<const char *>(_RCS(_recset)->Field(field).asString());
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
		return "";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char TXvt_recordset::get_char(const char* field) 
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		return _RCS(_recset)->Field(field).asString()[0];
 | 
			
		||||
	}
 | 
			
		||||
	catch (SAException &x)
 | 
			
		||||
	{
 | 
			
		||||
		_codeError =		x.ErrNativeCode();
 | 
			
		||||
		_stringError =	x.ErrMessage();
 | 
			
		||||
		return '\0';
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long TXvt_recordset::getCodeError(bool erase)
 | 
			
		||||
{
 | 
			
		||||
	long app = _codeError; 
 | 
			
		||||
	if (erase)
 | 
			
		||||
		_codeError = NOERR;
 | 
			
		||||
	return app;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char* TXvt_recordset::getStringError(bool erase)
 | 
			
		||||
{
 | 
			
		||||
	const char* app = _stringError.c_str();
 | 
			
		||||
	if (erase)
 | 
			
		||||
		_stringError.erase();
 | 
			
		||||
	return app;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										198
									
								
								src/xvtdb/xvtdb.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								src/xvtdb/xvtdb.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,198 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#ifndef NOERR
 | 
			
		||||
#define NOERR 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define NOT_INITIALIZED -86552
 | 
			
		||||
#define ERROR_FREEZED		-883
 | 
			
		||||
 | 
			
		||||
enum TT_driver 
 | 
			
		||||
{
 | 
			
		||||
	//! DBMS client is not specified
 | 
			
		||||
	TSDB_undefined,
 | 
			
		||||
	//! ODBC
 | 
			
		||||
	TSDB_ODBC,
 | 
			
		||||
	//! Oracle
 | 
			
		||||
	TSDB_Oracle,
 | 
			
		||||
	//! Microsoft SQL Server
 | 
			
		||||
	TSDB_MSSQL,
 | 
			
		||||
	//! InterBase or Firebird
 | 
			
		||||
	TSDB_InterBase,
 | 
			
		||||
	//! SQLBase
 | 
			
		||||
	TSDB_SQLBase,
 | 
			
		||||
	//! IBM DB2
 | 
			
		||||
	TSDB_DB2,
 | 
			
		||||
	//! Informix
 | 
			
		||||
	TSDB_Informix,
 | 
			
		||||
	//! Sybase ASE 
 | 
			
		||||
	TSDB_Sybase,
 | 
			
		||||
	//! MySQL
 | 
			
		||||
	TSDB_MySQL,
 | 
			
		||||
	//! PostgreSQL
 | 
			
		||||
	TSDB_PostgreSQL,
 | 
			
		||||
	//! SQLite
 | 
			
		||||
	TSDB_SQLite,
 | 
			
		||||
	//! SQL Anywere
 | 
			
		||||
	TSDB_SQLAnywhere
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum isoLvl { unknown = -1, uncommitted, committed, rr, serializable };
 | 
			
		||||
 | 
			
		||||
#define P_CONN_VOID void *
 | 
			
		||||
#define P_COMM_VOID void *
 | 
			
		||||
 | 
			
		||||
/* Esempio parametri da passare con MSSQL:
 | 
			
		||||
 * db = SERVER@DATABASE (NBKDELLI7TOLLAR\MSSQLSERVER14@project_vahlalla)
 | 
			
		||||
 */
 | 
			
		||||
int xvt_create_connection(P_CONN_VOID con, const char* db, const char* user, const char* pass, TT_driver tipoDb);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 * TXvt_recordset : DataBase redcordset																				*
 | 
			
		||||
 * Wrapper base di SACommand e SAConnection, classe per l'esecuzione di query	*
 | 
			
		||||
 * permette una connessione a vari DB	tramite molteplici drivers							*
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
class TXvt_recordset
 | 
			
		||||
{
 | 
			
		||||
protected:
 | 
			
		||||
	/**< Recordset																								*/
 | 
			
		||||
	P_COMM_VOID				_recset;
 | 
			
		||||
	/**< Oggetto della connessione																*/
 | 
			
		||||
	P_COMM_VOID				_con;
 | 
			
		||||
	/**< Ultima stringa con codice di errore ricevuto							*/
 | 
			
		||||
	std::string				_stringError;
 | 
			
		||||
	/**< Ultimo codice di errore ricevuto													*/
 | 
			
		||||
	long							_codeError;
 | 
			
		||||
	/**< Numero record corrente																		*/
 | 
			
		||||
	long							_recno;
 | 
			
		||||
	/**< Indica se va disconnessa la classe durante la chiusura		*/
 | 
			
		||||
	bool							_toDisconnect;
 | 
			
		||||
	/**< Indica se l'oggetto è bloccato, in tal caso non si possono fare set/exec	*/
 | 
			
		||||
	bool							_freezed;
 | 
			
		||||
	/**< Indica se il cursore è caricato													*/
 | 
			
		||||
	bool							_loaded;
 | 
			
		||||
 | 
			
		||||
	const bool checkPermission();
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	/**< Costruttore, crea un oggetto vuoto, PERICOLOSO!! Ricordarsi di inizializzarlo opportunamente con il metodo connect() e set() */
 | 
			
		||||
	TXvt_recordset();
 | 
			
		||||
	/**< Costruttore, crea un oggetto dai parametri di connessione passati */
 | 
			
		||||
	TXvt_recordset(const char* db, const char* user, const char* pass, TT_driver tipoDb, const char * query = "", const bool ex = false, const bool freezed = false);
 | 
			
		||||
	/**< Costruttore, accetta in ingresso una connessione, volendo è anche possibile impostare una query ed eseguirla. Attenzione! Non risponde se la query ha avuto un esito positivo o negativo! */
 | 
			
		||||
	TXvt_recordset(P_CONN_VOID c, const char * query = "", bool ex = false);
 | 
			
		||||
	/**< Distruttore */
 | 
			
		||||
	virtual ~TXvt_recordset();
 | 
			
		||||
 | 
			
		||||
	/**************************************************************************************************
 | 
			
		||||
	 * Gestione Connection																																						*
 | 
			
		||||
	 **************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
	// Funzioni fondamentali
 | 
			
		||||
 | 
			
		||||
	/**< Eseguo la connessione */
 | 
			
		||||
	int connect(const char* db, const char* user, const char* pass, TT_driver tipoDb);
 | 
			
		||||
	/* Mi scollego */
 | 
			
		||||
	void disconnect();
 | 
			
		||||
	/**< Esegue la commit, di default in caso di errore viene chiamato il metodo rollback() */
 | 
			
		||||
	bool commit(bool autoRoll = true);
 | 
			
		||||
	/**< Esegue il rollback all'ultimo commit */
 | 
			
		||||
	bool rollback();
 | 
			
		||||
 | 
			
		||||
	// Setters
 | 
			
		||||
 | 
			
		||||
	/**< Imposto il tipo di client che utilizzo */
 | 
			
		||||
	void setClient(TT_driver client);
 | 
			
		||||
	// Imposto una opzione generica dellla connessione
 | 
			
		||||
	void setConOption(const char* opt);
 | 
			
		||||
	/**< Abilito/Disabilito l'autocommit, (disabilitato di default) */
 | 
			
		||||
	void setAutocommit(bool ac);
 | 
			
		||||
	/** Imposta la visibilità delle transazioni (vedi Funzione) */
 | 
			
		||||
	void setVisibility(isoLvl vis = committed);
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	// Getters
 | 
			
		||||
	/** Ritorna se la conessione è connessa */
 | 
			
		||||
	bool isConnect();
 | 
			
		||||
	/**< Ritorna se la connessione è attiva */
 | 
			
		||||
	bool isAlive();
 | 
			
		||||
	/** Ritorna la visibilità impostata */
 | 
			
		||||
	int  getVisibility();
 | 
			
		||||
	/**< Ritorna se è attivo l'autocommit, true -> attivo, false -> disattivo o sconosciuto */
 | 
			
		||||
	bool getAutocommit();
 | 
			
		||||
	/**< Ritorna il valore dell'opzione specificata */
 | 
			
		||||
	const char* getOption(const char* opt);
 | 
			
		||||
	/**< Ritorno la versione del Client che sto utilizzando */
 | 
			
		||||
	long getClientV();
 | 
			
		||||
	/**< Ritorno la versione del Server che sto utilizzando */
 | 
			
		||||
	const char* getServerV();
 | 
			
		||||
	/**< Ritorno la versione del Server che sto utilizzando in formato numerico */
 | 
			
		||||
	long getServerVN();
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	/**************************************************************************************************
 | 
			
		||||
	 * Gestione Recordset																																							*
 | 
			
		||||
	 **************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
	// Conguration
 | 
			
		||||
	/**< Imposta la query ricevuta come (const char *) nel recordset */
 | 
			
		||||
	bool set(const char* query);
 | 
			
		||||
	/**< Imposta la query ricevuta come (string) nel recordset */
 | 
			
		||||
	bool set(std::string query)															{ return set(query.c_str()); }
 | 
			
		||||
	/**< Esegue la query impostata nel recordset, se viene passato autoF == true esegue anche un comando Next() */
 | 
			
		||||
	bool exec(bool autoF = true);
 | 
			
		||||
	/**< Unisce le funzioni Set e Exec, riceve la query come (const char *) */
 | 
			
		||||
	bool setExec(const char* query, bool autoF = true)	{ set(query); return exec(autoF); }
 | 
			
		||||
	/**< Unisce le funzioni Set e Exec, riceve la query come (string) */
 | 
			
		||||
	bool setExec(std::string query, bool autoF = true)				{ set(query); return exec(autoF); }
 | 
			
		||||
	/**< Si sposta avanti di un record, in caso di esito negativo valorizza _stringError e _codeError */
 | 
			
		||||
	bool next();
 | 
			
		||||
	/**< Si sposta indietro di un record, in caso di esito negativo valorizza _stringError e _codeError */
 | 
			
		||||
	bool prev();
 | 
			
		||||
	/**< Si sposta avanti di un record, in caso di esito negativo valorizza _stringError e _codeError */
 | 
			
		||||
	bool first();
 | 
			
		||||
	/**< Si sposta al primo record, in caso di esito negativo valorizza _stringError e _codeError */
 | 
			
		||||
	bool last();
 | 
			
		||||
	/**< Si sposta alla posizione n, in caso di esito negativo valorizza _stringError e _codeError */
 | 
			
		||||
	bool go(int newPos);
 | 
			
		||||
 | 
			
		||||
	// Getters
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) in formato (int) */
 | 
			
		||||
	int						get_int(const char* field);
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) in formato (short) */
 | 
			
		||||
	short					get_short(const char* field);
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) in formato (long) */
 | 
			
		||||
	long					get_long(const char* field);
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) in formato (double) */
 | 
			
		||||
	double				get_double(const char* field);
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) in formato (bool) */
 | 
			
		||||
	bool					get_bool(const char* field);
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) in formato (const char *)->(DD-MM-YYYY) */
 | 
			
		||||
	const char*		getDate(const char* field);
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) passato come (const char *) in formato (const char *) */
 | 
			
		||||
	const char*		get(const char* field);
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) passato come (string) in formato (const char *) */
 | 
			
		||||
	const char*		get(std::string field)					{ return  get(field.c_str()); }
 | 
			
		||||
	/**< Ritorna il valore nel campo (field) in formato (char) */
 | 
			
		||||
	char					get_char(const char* field);
 | 
			
		||||
	/**< Ritorna la posizione attuale */
 | 
			
		||||
	long					pos() const { return _recno; }
 | 
			
		||||
	
 | 
			
		||||
	// Error Handling
 | 
			
		||||
	/**< Ritorno l'ultimo codice errore segnalato in formato /int) */
 | 
			
		||||
	long					getCodeError(bool erase = true);
 | 
			
		||||
	/**< Ritorno l'ultima stringa di errore segnalato in formato (const char *) */
 | 
			
		||||
	const char*		getStringError(bool erase = true);
 | 
			
		||||
	//char *				getCharPointer(const char * field)	{ return const_cast<char*>(static_cast<const char*>(recset.Field(field).asString())); }
 | 
			
		||||
 | 
			
		||||
	// Utilities
 | 
			
		||||
	/**< Controlla se il cursore è bloccato */
 | 
			
		||||
	const bool isFreezed() const { return _freezed; }
 | 
			
		||||
	/**< Congela il cursore */
 | 
			
		||||
	void freeze()		{ _freezed = true; }
 | 
			
		||||
	/**< Scongela il cursore */
 | 
			
		||||
	void defrost()	{ _freezed = false; }
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user