823 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			823 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include "StdAfx.h"
 | |
| 
 | |
| #include "sqlfile.h"
 | |
| #include "server.h"
 | |
| #include "tracing.h"
 | |
| 
 | |
| #include "errno.h"
 | |
| #include "iserrors.h"
 | |
| 
 | |
| BOOL TSqlFile::IsOpen() const 
 | |
| { 
 | |
| 	return m_nKey > 0; 
 | |
| }
 | |
| 
 | |
| int TSqlFile::TestOpen() const
 | |
| {
 | |
| 	int err = IsOpen() ? NOERR : _isnotopen;
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| CdbTableDef TSqlFile::GetTableDef() const
 | |
| {
 | |
| 	TPrassiServer& s = GetServer();
 | |
| 	return s.GetTableDef(m_nFirm, m_nLogicNumber); 
 | |
| }
 | |
| 
 | |
| CdbRecordset& TSqlFile::GetSnapshot()
 | |
| {
 | |
| 	TPrassiServer& s = GetServer();
 | |
| 	if (m_dwSnapHandle == 0)
 | |
| 	{
 | |
| 		char sKey[4]; itoa(m_nKey, sKey, 10);
 | |
| 		const char* sWhere;
 | |
| 		if (m_strWhere.IsEmpty())
 | |
| 			sWhere = NULL;
 | |
| 		else
 | |
| 			sWhere = m_strWhere;
 | |
| 		m_dwSnapHandle = s.OpenSnapshot(m_nFirm, m_nLogicNumber, 
 | |
| 			                            sWhere, sKey);
 | |
| 		m_nItems = -1;
 | |
| 	}
 | |
| 	return s.GetSnapshot(m_dwSnapHandle); 
 | |
| }
 | |
| 
 | |
| BOOL TSqlFile::Requery()
 | |
| {
 | |
| 	BOOL bOk = IsOpen();
 | |
| 	if (bOk && m_dwSnapHandle)
 | |
| 	{
 | |
| 		TPrassiServer& s = GetServer();
 | |
| 		BOOL bUpdated = s.UpdateSnapshot(m_dwSnapHandle, m_nFirm, m_nLogicNumber);
 | |
| 		if (bUpdated)
 | |
| 			m_nItems = -1;
 | |
| 	}
 | |
| 	return bOk;
 | |
| }
 | |
| 
 | |
| CdbRecordset& TSqlFile::GetDynaset() const
 | |
| {
 | |
| 	TPrassiServer& s = GetServer();
 | |
| 	return s.GetDynaset(m_nFirm, m_nLogicNumber); 
 | |
| }
 | |
| 
 | |
| int TSqlFile::Open()
 | |
| {
 | |
| 	int err = NOERR;
 | |
| 	if (!IsOpen())
 | |
| 	{
 | |
| 		if (m_bExists)
 | |
| 		{
 | |
| 			m_nKey = 1;
 | |
| 			m_nStatus = _isbof;
 | |
| 		}
 | |
| 		else
 | |
| 			err = ENOENT;
 | |
| 	}
 | |
| 	else
 | |
| 		err = _isalropen;
 | |
| 
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| void TSqlFile::CloseSnapshot()
 | |
| {
 | |
| 	if (m_dwSnapHandle)
 | |
| 	{
 | |
| 		TPrassiServer& s = GetServer();
 | |
| 		s.CloseSnapshot(m_dwSnapHandle);
 | |
| 		m_dwSnapHandle = 0;
 | |
| 		m_nStatus = _isbof;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| int TSqlFile::Close()
 | |
| {
 | |
| 	int err = TestOpen();
 | |
| 	if (err == NOERR)
 | |
| 	{
 | |
| 		UnlockAll();
 | |
| 		CloseSnapshot();
 | |
| 		m_nKey      = 0;
 | |
| 		m_nStatus   = _isnotopen;
 | |
| 	}
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| BOOL TSqlFile::SetFirm(int nFirm)
 | |
| {
 | |
| 	BOOL bOk = TRUE;
 | |
| 	if (m_nFirm != nFirm)
 | |
| 	{
 | |
| 		TPrassiServer& s = GetServer();
 | |
| 		bOk = s.OpenTableDef(nFirm, m_nLogicNumber);
 | |
| 		if (bOk)
 | |
| 		{
 | |
| 			CloseSnapshot();
 | |
| 			s.CloseTableDef(m_nFirm, m_nLogicNumber);
 | |
| 			m_nFirm = nFirm;
 | |
| 		}
 | |
| 	}
 | |
| 	return bOk;
 | |
| }
 | |
| 
 | |
| int TSqlFile::First(int nLock)
 | |
| {
 | |
| 	if (Requery())
 | |
| 	{
 | |
| 		CdbRecordset& dbSnapshot = GetSnapshot();
 | |
| 		try
 | |
| 		{
 | |
| 			dbSnapshot.MoveFirst();
 | |
| 			m_nStatus = NOERR;
 | |
| 		}
 | |
| 		catch(...)
 | |
| 		{
 | |
| 			CloseSnapshot();
 | |
| 			m_nStatus   = _iseof;
 | |
| 			m_nItems = 0;
 | |
| 		}
 | |
| 
 | |
| 		if (m_nStatus == NOERR && nLock)
 | |
| 			m_nStatus = HandleLock(dbSnapshot, nLock);
 | |
| 	}
 | |
| 	return m_nStatus;
 | |
| }
 | |
| 
 | |
| const char* TSqlFile::VariantToString(const COleVariant& oleVariant) const
 | |
| {
 | |
| 	static char strBuffer[32];
 | |
| 
 | |
| 	switch(oleVariant.vt)
 | |
| 	{
 | |
| 	case VT_NULL:
 | |
| 		return "";
 | |
| 	case VT_INT:
 | |
| 	case VT_I1:
 | |
| 	case VT_I2:
 | |
| 	case VT_I4:  
 | |
| 	case VT_I8:
 | |
| 		sprintf(strBuffer, "%d", m_oleVariant.lVal);
 | |
| 		return strBuffer;
 | |
| 	case VT_UINT:
 | |
| 	case VT_UI1:
 | |
| 	case VT_UI2:
 | |
| 	case VT_UI4:
 | |
| 	case VT_UI8:
 | |
| 		sprintf(strBuffer, "%u", m_oleVariant.lVal);
 | |
| 		return strBuffer;
 | |
| 	case VT_R4:
 | |
| 	case VT_R8:
 | |
| 		sprintf(strBuffer, "%lg", m_oleVariant.dblVal);
 | |
| 		return strBuffer;
 | |
| 	case VT_BSTR:
 | |
| 		return (const char*)m_oleVariant.pbVal;
 | |
| 	default:
 | |
| 		break;
 | |
| 	}
 | |
| 	return NULL;
 | |
| }
 | |
| 
 | |
| const char* TSqlFile::GetField(CdbRecordset& dbRecordset, 
 | |
| 							   const char* strName)
 | |
| {
 | |
| 	const char* val;
 | |
| 	try
 | |
| 	{
 | |
| 		m_oleVariant = dbRecordset.GetField(strName);
 | |
| 		val = VariantToString(m_oleVariant);
 | |
| 	}
 | |
| 	catch(...)
 | |
| 	{
 | |
| 		val = NULL;
 | |
| 	}
 | |
| 	return val;
 | |
| }
 | |
| 
 | |
| const char* TSqlFile::GetField(const char* strName)
 | |
| {
 | |
| 	const char* val = NULL;
 | |
| 	if (IsOpen())
 | |
| 	{
 | |
| 		CdbRecordset& dbSnapshot = GetSnapshot();
 | |
| 		val = GetField(dbSnapshot, strName);
 | |
|     }
 | |
| 	return val;
 | |
| }
 | |
| 
 | |
| CString TSqlFile::GetFieldInfo(int pos) const
 | |
| {
 | |
| 	CString strInfo;
 | |
| 	try 
 | |
| 	{
 | |
| 		CdbTableDef dbTable = GetTableDef();
 | |
| 		if (pos >= 0 && pos < dbTable.Fields.GetCount())
 | |
| 		{
 | |
| 			char buffer[32];
 | |
| 
 | |
| 			CdbField dbField = dbTable[pos];
 | |
| 			strInfo = dbField.GetName();
 | |
| 			
 | |
| 			TFieldtypes tType;
 | |
| 			switch (dbField.GetType())
 | |
| 			{
 | |
| 			case dbBoolean  : tType = _boolfld; break;
 | |
| 			case dbByte     : tType = _charfld; break;
 | |
| 			case dbInteger  : tType = _intfld;  break;
 | |
| 			case dbLong     : tType = _longfld; break;
 | |
| 			case dbCurrency :
 | |
| 			case dbSingle   :
 | |
| 			case dbDouble   : tType = _realfld; break;
 | |
| 			case dbDate     : tType = _datefld; break;
 | |
| 			case dbText     : tType = _alfafld; break;
 | |
| 			case dbMemo     : tType = _memofld; break;
 | |
| 			default         : tType = _nullfld; break;
 | |
| 			}
 | |
| 			strInfo += ",";
 | |
| 			strInfo += '0' + tType;
 | |
| 
 | |
| 			itoa(dbField.GetSize(), buffer, 10);
 | |
| 			strInfo += ",";
 | |
| 			strInfo += buffer;
 | |
| 
 | |
| 			strInfo += ",0";  // decimali
 | |
| 		}
 | |
| 		
 | |
| 	}
 | |
| 	catch(...)
 | |
| 	{
 | |
| 		strInfo = "";
 | |
| 	}
 | |
| 	return strInfo;
 | |
| }
 | |
| 
 | |
| int TSqlFile::GetKey() const
 | |
| {
 | |
| 	return m_nKey;
 | |
| }
 | |
| 
 | |
| CString TSqlFile::GetKeyExpr(int key) const
 | |
| {
 | |
| 	CString strExpr;
 | |
| 	CdbTableDef dbTable = GetTableDef(); 
 | |
| 	if (key > 0 && key <= dbTable.Indexes.GetCount())
 | |
| 	{
 | |
| 		CdbIndex dbIndex = dbTable.Indexes[key-1];
 | |
| 		CdbFields& idxFields = dbIndex.Fields;
 | |
| 		for (int f = 0; f < idxFields.GetCount(); f++)
 | |
| 		{
 | |
| 			if (f) strExpr += "+";
 | |
| 			strExpr += idxFields[f].GetName();
 | |
| 		}
 | |
| 	}
 | |
| 	return strExpr;
 | |
| }
 | |
| 
 | |
| int TSqlFile::GetRecordCount()
 | |
| {
 | |
| 	int items = -1;
 | |
| 	if (IsOpen())
 | |
| 	{
 | |
| 		CdbTableDef dbTable = GetTableDef(); 
 | |
| 		items = dbTable.GetRecordCount();
 | |
| 	}
 | |
| 	return items;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Last(int nLock)
 | |
| {
 | |
| 	if (Requery())
 | |
| 	{
 | |
| 		CdbRecordset& dbSnapshot = GetSnapshot();
 | |
| 		try
 | |
| 		{
 | |
| 			dbSnapshot.MoveLast();
 | |
| 			m_nStatus = NOERR;
 | |
| 			m_nItems = dbSnapshot.GetAbsolutePosition()+1;
 | |
| 		}
 | |
| 		catch(...)
 | |
| 		{
 | |
| 			m_nStatus = _isbof;
 | |
| 			m_nItems = 0;
 | |
| 		}
 | |
| 		if (m_nStatus == NOERR && nLock)
 | |
| 			m_nStatus = HandleLock(dbSnapshot, nLock);
 | |
| 	}
 | |
| 	return m_nStatus;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Move(long pos, int nLock)
 | |
| {
 | |
| 	if (TestOpen() == NOERR)
 | |
| 	{
 | |
| 		if (pos == 0)
 | |
| 		{
 | |
| 			Requery();
 | |
| 			m_nStatus = _isbof;
 | |
| 		}
 | |
| 
 | |
| 		CdbRecordset& dbSnapshot = GetSnapshot();
 | |
| 		try
 | |
| 		{
 | |
| 			if (m_nStatus == NOERR)
 | |
| 			{
 | |
| 				long cur = dbSnapshot.GetAbsolutePosition();
 | |
| 			    dbSnapshot.Move(pos-cur);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 			    dbSnapshot.MoveFirst();
 | |
| 				if (pos > 0)
 | |
| 					dbSnapshot.Move(pos);
 | |
| 			}
 | |
| 			m_nStatus = dbSnapshot.GetEOF() ? _iseof : NOERR;
 | |
| 
 | |
| 			if (m_nStatus == NOERR && nLock)
 | |
| 				m_nStatus = HandleLock(dbSnapshot, nLock);
 | |
| 		}
 | |
| 		catch(...)
 | |
| 		{
 | |
| 			m_nStatus = pos >= 0 ? _iseof : _isbof;
 | |
| 		}
 | |
| 	}
 | |
| 	return m_nStatus;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Next(int nLock)
 | |
| {
 | |
| 	if (IsOpen())
 | |
| 	{
 | |
| 		CdbRecordset& dbSnapshot = GetSnapshot();
 | |
| 		try
 | |
| 		{
 | |
| 			dbSnapshot.MoveNext();
 | |
| 			if (dbSnapshot.GetEOF())
 | |
| 				m_nStatus = _iseof;
 | |
| 			else
 | |
| 				m_nStatus = NOERR;
 | |
| 
 | |
| 			if (m_nStatus == NOERR && nLock)
 | |
| 				m_nStatus = HandleLock(dbSnapshot, nLock);
 | |
| 		}
 | |
| 		catch(...)
 | |
| 		{
 | |
| 			m_nStatus = _iseof;
 | |
| 		}
 | |
| 	}
 | |
| 	return m_nStatus;
 | |
| }
 | |
| 
 | |
| long TSqlFile::GetPosition()
 | |
| {
 | |
| 	long pos = -1;
 | |
| 	if (m_nStatus == NOERR )
 | |
| 		pos = GetSnapshot().GetAbsolutePosition();
 | |
| 	return pos;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Prev(int nLock)
 | |
| {
 | |
| 	if (IsOpen())
 | |
| 	{
 | |
| 		CdbRecordset& dbSnapshot = GetSnapshot();
 | |
| 		try
 | |
| 		{
 | |
| 			dbSnapshot.MovePrevious();
 | |
| 			if (dbSnapshot.GetBOF())
 | |
| 				m_nStatus = _isbof;
 | |
| 			else
 | |
| 				m_nStatus = NOERR;
 | |
| 
 | |
| 			if (m_nStatus == NOERR && nLock)
 | |
| 				m_nStatus = HandleLock(dbSnapshot, nLock);
 | |
| 		}
 | |
| 		catch(...)
 | |
| 		{
 | |
| 			m_nStatus = _isbof;
 | |
| 		}
 | |
| 	}
 | |
| 	return m_nStatus;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Skip(long pos, int nLock)
 | |
| {
 | |
| 	if (IsOpen())
 | |
| 	{
 | |
| 		CdbRecordset& dbSnapshot = GetSnapshot();
 | |
| 		try
 | |
| 		{
 | |
| 			dbSnapshot.Move(pos);
 | |
| 			if (pos >= 0)
 | |
| 				m_nStatus = dbSnapshot.GetEOF() ? _iseof : NOERR;
 | |
| 			else
 | |
| 				m_nStatus = dbSnapshot.GetBOF() ? _isbof : NOERR;
 | |
| 			if (m_nStatus == NOERR && nLock)
 | |
| 				m_nStatus = HandleLock(dbSnapshot, nLock);
 | |
| 		}
 | |
| 		catch(...)
 | |
| 		{
 | |
| 			m_nStatus = pos >= 0 ? _iseof : _isbof;
 | |
| 		}
 | |
| 	}
 | |
| 	return m_nStatus;
 | |
| }
 | |
| 
 | |
| CString TSqlFile::BuildKey(CdbRecordset& dbRecordset, int nKey)
 | |
| {
 | |
| 	CdbTableDef dbTable = GetTableDef(); 
 | |
| 	CdbIndex dbIndex = dbTable.Indexes[nKey-1];
 | |
| 	CdbFields& idxFields = dbIndex.Fields;
 | |
| 	CString sKey, sName, sValue, sFormatted;
 | |
| 	
 | |
| 	for (int f = 0; f < idxFields.GetCount(); f++)
 | |
| 	{
 | |
| 		sName = idxFields[f].GetName();
 | |
| 		sValue = GetField(dbRecordset, sName);
 | |
| 
 | |
| 		const int nSize = dbRecordset[sName].GetSize();
 | |
| 		if (sValue.GetLength() < nSize)
 | |
| 		{
 | |
| 			SHORT int nType = dbRecordset[sName].GetType();
 | |
| 			if (nType == dbText)
 | |
| 				sFormatted.Format("%-*s", nSize, (const char*)sValue);
 | |
| 			else
 | |
| 				sFormatted.Format("%*s", nSize, (const char*)sValue);
 | |
| 			sKey += sFormatted;
 | |
| 		}
 | |
| 		else
 | |
| 			sKey += sValue;
 | |
| 	}
 | |
| 	return sKey;
 | |
| }
 | |
| 
 | |
| CString TSqlFile::BuildKey(const TSqlRecord& sqlRecord, int nKey)
 | |
| {
 | |
| 	CdbTableDef dbTable = GetTableDef(); 
 | |
| 	CdbIndex dbIndex = dbTable.Indexes[nKey-1];
 | |
| 	CdbFields& idxFields = dbIndex.Fields;
 | |
| 	CString sKey, sName, sValue, sFormatted;
 | |
| 	
 | |
| 	for (int f = 0; f < idxFields.GetCount(); f++)
 | |
| 	{
 | |
| 		SHORT index = idxFields[f].GetOrdinalPosition();
 | |
| 		sValue = sqlRecord.Get(index);
 | |
| 
 | |
| 		const int nSize = dbTable[index].GetSize();
 | |
| 		if (sValue.GetLength() < nSize)
 | |
| 		{
 | |
| 			SHORT int nType = dbTable[index].GetType();
 | |
| 			if (nType == dbText)
 | |
| 				sFormatted.Format("%-*s", nSize, (const char*)sValue);
 | |
| 			else
 | |
| 				sFormatted.Format("%*s", nSize, (const char*)sValue);
 | |
| 			sKey += sFormatted;
 | |
| 		}
 | |
| 		else
 | |
| 			sKey += sValue;
 | |
| 	}
 | |
| 	return sKey;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Read(CdbRecordset& dbSet, const char* sKey, int flags)
 | |
| {
 | |
| 	int err = NOERR;
 | |
| 
 | |
| 	if (m_nItems < 0)
 | |
| 	{
 | |
| 		try
 | |
| 		{
 | |
| 			dbSet.MoveLast();
 | |
| 			m_nItems = dbSet.GetAbsolutePosition()+1;
 | |
| 		}
 | |
| 		catch(...)
 | |
| 		{
 | |
| 			m_nItems = 0;
 | |
| 			return _isemptyfile;
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	const int nLast = m_nItems-1;
 | |
| 	int min = 0;
 | |
| 	int max = nLast;
 | |
|     int cur = dbSet.GetAbsolutePosition(); 
 | |
| 	
 | |
| 	CString sCurkey;
 | |
| 	int nCompare = +1;
 | |
| 
 | |
| 	while (min <= max)
 | |
| 	{
 | |
| 		const int next = (min+max)/2;
 | |
| 		try
 | |
| 		{
 | |
| 			dbSet.Move(next-cur);
 | |
| 			cur = next;
 | |
| 		}
 | |
| 		catch(...)
 | |
| 		{
 | |
| 			cur = nLast;
 | |
| 			break;
 | |
| 		}
 | |
| 		
 | |
| 		sCurkey = BuildKey(dbSet, m_nKey);
 | |
| 		nCompare = strcmp(sCurkey, sKey);
 | |
| 		if (nCompare == 0)
 | |
| 			break;
 | |
| 		if (nCompare < 0)
 | |
| 			min = cur+1;
 | |
| 		else
 | |
| 			max = cur-1;
 | |
| 	}
 | |
| 
 | |
| 	switch (flags & 0xFF)
 | |
| 	{
 | |
| 	case _isgteq:
 | |
| 		while (nCompare < 0 && cur < nLast)
 | |
| 		{
 | |
| 			dbSet.MoveNext(); cur++;
 | |
| 			sCurkey = BuildKey(dbSet, m_nKey);
 | |
| 			nCompare = strcmp(sCurkey, sKey);
 | |
| 		}
 | |
| 		err = nCompare >= 0 ? NOERR : _iseof;
 | |
| 		break;
 | |
| 	case _isgreat:
 | |
| 		while (nCompare <= 0 && cur < nLast)
 | |
| 		{
 | |
| 			dbSet.MoveNext(); cur++;
 | |
| 			sCurkey = BuildKey(dbSet, m_nKey);
 | |
| 			nCompare = strcmp(sCurkey, sKey);
 | |
| 		}
 | |
| 		err = nCompare > 0 ? NOERR : _iseof;
 | |
| 		break;
 | |
| 	default:
 | |
| 		err = nCompare == 0 ? NOERR : _iskeynotfound;
 | |
| 		break;
 | |
| 	}
 | |
| 
 | |
| 	if (err == NOERR)
 | |
| 		err = HandleLock(dbSet, flags);
 | |
| 
 | |
|     return err;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Read(const char* sKey, int flags)
 | |
| {
 | |
| 	if (IsOpen())
 | |
| 		m_nStatus = Read(GetSnapshot(), sKey, flags);
 | |
|     return m_nStatus;
 | |
| }
 | |
| 
 | |
| int TSqlFile::SetField(int index, const char* value)
 | |
| {
 | |
| 	return m_sqlRecord.Set((SHORT)index, value);
 | |
| }
 | |
| 
 | |
| int TSqlFile::SetField(const char* name, const char* value)
 | |
| {
 | |
| 	int err;
 | |
| 	
 | |
| 	try
 | |
| 	{
 | |
| 		CdbTableDef dbTable = GetTableDef();
 | |
| 		SHORT nIndex = dbTable[name].GetOrdinalPosition();
 | |
| 		err = m_sqlRecord.Set(nIndex, value);
 | |
| 	}
 | |
| 	catch(...)
 | |
| 	{
 | |
| 		err = _iskeyerr;
 | |
| 	}
 | |
| 
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| int TSqlFile::SetKey(int nKey)
 | |
| {
 | |
| 	int err = TestOpen();
 | |
| 	if (err == NOERR)
 | |
| 	{
 | |
| 		if (nKey != m_nKey)
 | |
| 		{
 | |
| 			CdbTableDef dbTable = GetTableDef(); 
 | |
| 			if (nKey > 0 && nKey <= dbTable.Indexes.GetCount())
 | |
| 			{
 | |
| 				m_nKey = nKey;
 | |
| 				CloseSnapshot();
 | |
| 			}
 | |
| 			else
 | |
| 				err = _iskeyrangeerr;
 | |
| 		}
 | |
| 	}
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Remove(const char* sKey)
 | |
| {
 | |
| 	CdbRecordset& dbDynaset = GetDynaset();
 | |
| 	int err = Read(dbDynaset, sKey, _isequal | _testandlock);
 | |
| 	if (err == NOERR)
 | |
| 	{
 | |
| 		Unlock(sKey);
 | |
| 		dbDynaset.Delete();
 | |
| 	}
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Rewrite(const char* sKey)
 | |
| {
 | |
| 	CdbRecordset& dbDynaset = GetDynaset();
 | |
| 	int err = Read(dbDynaset, sKey, _isequal | _testandlock);
 | |
| 	if (err == NOERR)
 | |
| 	{
 | |
| 		m_sqlRecord.SetRecord(dbDynaset);
 | |
| 		Unlock(sKey);
 | |
| 	}
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Write()
 | |
| {
 | |
| 	CdbRecordset& dbDynaset = GetDynaset();
 | |
| 	int err = NOERR;
 | |
| 	try
 | |
| 	{
 | |
| 	    dbDynaset.AddNew();
 | |
| 	    m_sqlRecord.SetRecord(dbDynaset);
 | |
| 		dbDynaset.Update();
 | |
| 	}
 | |
| 	catch(...)
 | |
| 	{
 | |
| 		err = _isreinsert;
 | |
| 	}
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Lock(CdbRecordset& dbSnapshot)
 | |
| {
 | |
| 	CString strKey;
 | |
| 	strKey = BuildKey(dbSnapshot, 1);
 | |
| 	TPrassiServer& s = GetServer();
 | |
| 	int err = s.Lock(m_nFirm, m_nLogicNumber, 
 | |
| 		             strKey, m_dwConnection);
 | |
| 	if (err == NOERR)
 | |
| 		m_Locks.SetAt(strKey, NULL);
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Unlock(LPCSTR sKey)
 | |
| {
 | |
| 	void* dummy;
 | |
| 	if (m_Locks.Lookup(sKey, dummy))
 | |
| 	{
 | |
| 		TPrassiServer& s = GetServer();
 | |
| 		s.Unlock(m_nFirm, m_nLogicNumber, 
 | |
| 			     sKey, m_dwConnection);
 | |
| 		m_Locks.RemoveKey(sKey);
 | |
| 	}
 | |
| 	return NOERR;
 | |
| }
 | |
| 
 | |
| int TSqlFile::Unlock(CdbRecordset& dynaset)
 | |
| {
 | |
| 	CString strKey;
 | |
| 	strKey = BuildKey(dynaset, 1);
 | |
| 	return Unlock(strKey);
 | |
| }
 | |
| 
 | |
| void TSqlFile::UnlockAll()
 | |
| {
 | |
| 	CString strKey;
 | |
| 	void* dummy;
 | |
| 	for (POSITION pos = m_Locks.GetStartPosition(); pos; )
 | |
| 	{
 | |
| 		m_Locks.GetNextAssoc(pos, strKey, dummy);
 | |
| 		Unlock(strKey);
 | |
| 	}
 | |
| 
 | |
| 	if (m_bExclusiveLock)
 | |
| 		ExclusiveUnlock();
 | |
| }
 | |
| 
 | |
| int TSqlFile::ClearFields()
 | |
| {
 | |
| 	int err = TestOpen();
 | |
| 	if (err == NOERR)
 | |
| 		m_sqlRecord.Clear();
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| int TSqlFile::HandleLock(CdbRecordset& dbRecordset, int nLock)
 | |
| {
 | |
| 	int err = NOERR;
 | |
| 	if ((nLock & _lock) || (nLock & _testandlock))
 | |
| 		err = Lock(dbRecordset);
 | |
| 	else
 | |
| 	{
 | |
| 		if (nLock & _unlock)
 | |
| 			err = Unlock(dbRecordset);
 | |
| 	}
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| int TSqlFile::ExclusiveLock()
 | |
| {
 | |
| 	TPrassiServer& s = GetServer();
 | |
| 	int err = s.ExclusiveLock(m_nFirm, m_nLogicNumber, m_dwConnection);
 | |
| 	if (err == NOERR)
 | |
| 		m_bExclusiveLock = TRUE;
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| int TSqlFile::ExclusiveUnlock()
 | |
| {
 | |
| 	TPrassiServer& s = GetServer();
 | |
| 	int err = s.ExclusiveUnlock(m_nFirm, m_nLogicNumber, m_dwConnection);
 | |
| 	if (err == NOERR)
 | |
| 		m_bExclusiveLock = FALSE;
 | |
| 	return err;
 | |
| }
 | |
| 
 | |
| TSqlFile::TSqlFile(int nFirm, int nLogicNumber, 
 | |
| 				   LPCSTR sWhere, DWORD dwConnection)
 | |
| 		: m_nLogicNumber(nLogicNumber),
 | |
| 		  m_nFirm(nFirm),
 | |
| 		  m_strWhere(sWhere),
 | |
| 		  m_dwConnection(dwConnection),
 | |
| 		  m_nKey(0), m_dwSnapHandle(0),
 | |
| 		  m_nStatus(_isnotopen),
 | |
| 		  m_nItems(-1)
 | |
| { 
 | |
| 	TPrassiServer& s = GetServer();
 | |
| 	m_bExists = s.OpenTableDef(nFirm, nLogicNumber);
 | |
| }
 | |
| 
 | |
| TSqlFile::~TSqlFile()
 | |
| { 
 | |
| 	if (m_bExists)
 | |
| 	{
 | |
| 		Close();
 | |
| 		TPrassiServer& s = GetServer();
 | |
| 		s.CloseTableDef(m_nFirm, m_nLogicNumber);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TSqlRecord
 | |
| 
 | |
| void TSqlRecord::Clear()
 | |
| {
 | |
| 	m_Fields.RemoveAll();
 | |
| }
 | |
| 
 | |
| int TSqlRecord::Set(SHORT nIndex, const char* val, DWORD dwSize)
 | |
| {
 | |
| 	CString& strValue = m_Fields[nIndex];
 | |
| 	if (dwSize)
 | |
| 	{
 | |
| 		LPTSTR buffer = strValue.GetBufferSetLength(dwSize);
 | |
| 		memcpy(buffer, val, dwSize);
 | |
| 		strValue.ReleaseBuffer();
 | |
| 	}
 | |
| 	else
 | |
| 		strValue = val;
 | |
| 	
 | |
| 	return NOERR;
 | |
| }
 | |
| 
 | |
| CString TSqlRecord::Get(SHORT nIndex) const
 | |
| {
 | |
| 	CString strValue;
 | |
| 	m_Fields.Lookup(nIndex, strValue);
 | |
| 	return strValue;
 | |
| }
 | |
| 
 | |
| void TSqlRecord::SetRecord(CdbRecordset& dbRecordset)
 | |
| {
 | |
| 	CdbFields& dbFields = dbRecordset.Fields;
 | |
| 	for (SHORT nIndex = dbFields.GetCount()-1; nIndex >= 0; nIndex--)
 | |
| 	{
 | |
| 		CString strValue;
 | |
| 		if (m_Fields.Lookup(nIndex, strValue))
 | |
| 		{
 | |
| 			if (dbFields[nIndex].GetType() == dbLongBinary)
 | |
| 			{
 | |
| 				// TODO: Come si scrive un campo binario?
 | |
| 				ASSERT(0);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				COleVariant oleVariant;
 | |
| 				dbRecordset.SetField(nIndex, &oleVariant);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| TSqlRecord::TSqlRecord()
 | |
| {
 | |
| }
 | |
| 
 | |
| TSqlRecord::~TSqlRecord()
 | |
| {
 | |
| 	Clear();
 | |
| }
 |