573 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			573 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include "StdAfx.h"
 | |
| 
 | |
| #include "connect.h"
 | |
| #include "server.h"
 | |
| #include "sqlfile.h"
 | |
| 
 | |
| long TPrassiConnection::OpenFile(int nLogicNum, LPCSTR sWhere)
 | |
| {
 | |
| 	TSqlFile* pSqlFile;
 | |
| 	long nHandle = nLogicNum*1000;
 | |
| 	for ( ; m_sqlFiles.Lookup(nHandle, pSqlFile); nHandle++);
 | |
| 
 | |
| 	pSqlFile = new TSqlFile(m_nFirm, nLogicNum, sWhere, Id());
 | |
| 	
 | |
| 	if (pSqlFile->Open() == 0)
 | |
| 		m_sqlFiles.SetAt(nHandle, pSqlFile);
 | |
| 	else
 | |
| 	{
 | |
| 		delete pSqlFile;
 | |
| 		nHandle = 0;
 | |
| 	}
 | |
| 
 | |
| 	return nHandle;
 | |
| }
 | |
| 
 | |
| TSqlFile* TPrassiConnection::GetFile(long nHandle)
 | |
| {
 | |
| 	TSqlFile* pSqlFile = NULL;
 | |
| 	m_sqlFiles.Lookup(nHandle, pSqlFile);
 | |
| 	if (pSqlFile == NULL && nHandle < 1000)
 | |
| 	{
 | |
| 		int nLogicNum = nHandle;
 | |
| 		pSqlFile = new TSqlFile(m_nFirm, nLogicNum, NULL, Id());
 | |
| 		if (pSqlFile->Exists())
 | |
| 			m_sqlFiles.SetAt(nLogicNum, pSqlFile);
 | |
| 		else
 | |
| 		{
 | |
| 			delete pSqlFile;
 | |
| 			pSqlFile = NULL;
 | |
| 		}
 | |
| 	}
 | |
| 	return pSqlFile;
 | |
| }
 | |
| 
 | |
| BOOL TPrassiConnection::CloseFile(long nHandle)
 | |
| {
 | |
| 	TSqlFile* pSqlFile = GetFile(nHandle);
 | |
| 	if (pSqlFile)
 | |
| 	{
 | |
| 		delete pSqlFile;
 | |
| 		m_sqlFiles.RemoveKey(nHandle);
 | |
| 	}
 | |
| 
 | |
| 	return pSqlFile != NULL;
 | |
| }
 | |
| 
 | |
| BOOL TPrassiConnection::SetFirm(int nFirm)
 | |
| {
 | |
| 	BOOL bOk = m_nFirm == nFirm;
 | |
| 	if (!bOk)
 | |
| 	{
 | |
| 		TPrassiServer& s = GetServer();
 | |
| 		bOk = s.TestFirm(nFirm);
 | |
| 		if (bOk)
 | |
| 		{
 | |
| 			long nHandle;
 | |
| 			TSqlFile* pSqlFile;
 | |
| 			for (POSITION pos = m_sqlFiles.GetStartPosition(); pos; )
 | |
| 			{
 | |
| 				m_sqlFiles.GetNextAssoc(pos, nHandle, pSqlFile);
 | |
| 				pSqlFile->SetFirm(nFirm); 	
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	return bOk;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // Jolly2File
 | |
| 
 | |
| static TSqlFile* Jolly2File(TConnection& conn, void *pJolly)
 | |
| {
 | |
| 	TSqlFile* pFile = NULL;
 | |
| 	const CStringArray& argv = *(CStringArray*)pJolly;
 | |
| 	if (argv.GetSize() > 1)
 | |
| 	{
 | |
| 		TPrassiConnection& c = (TPrassiConnection&)conn;
 | |
| 		const long n = atol(argv[1]);
 | |
| 		pFile = c.GetFile(n);
 | |
| 	}
 | |
| 	return pFile;
 | |
| }
 | |
| 
 | |
| static TSqlFile* Jolly2FileInt(TConnection& conn, void *pJolly, int& num)
 | |
| {
 | |
| 	TSqlFile* pFile = NULL;
 | |
| 	const CStringArray& argv = *(CStringArray*)pJolly;
 | |
| 	if (argv.GetSize() > 2)
 | |
| 	{
 | |
| 		pFile = Jolly2File(conn, pJolly);
 | |
| 		num = atoi(argv[2]);
 | |
| 	}
 | |
| 	return pFile;
 | |
| }
 | |
| 
 | |
| static TSqlFile* Jolly2FileIntInt(TConnection& conn, void *pJolly, int& num, int& flag)
 | |
| {
 | |
| 	TSqlFile* pFile = NULL;
 | |
| 	const CStringArray& argv = *(CStringArray*)pJolly;
 | |
| 	if (argv.GetSize() > 3)
 | |
| 	{
 | |
| 		pFile = Jolly2File(conn, pJolly);
 | |
| 		num = atoi(argv[2]);
 | |
| 		flag = atoi(argv[3]);
 | |
| 	}
 | |
| 	return pFile;
 | |
| }
 | |
| 
 | |
| 
 | |
| static TSqlFile* Jolly2FileString(TConnection& conn, void *pJolly, CString& str)
 | |
| {
 | |
| 	TSqlFile* pFile = NULL;
 | |
| 	const CStringArray& argv = *(CStringArray*)pJolly;
 | |
| 	if (argv.GetSize() > 2)
 | |
| 	{
 | |
| 		pFile = Jolly2File(conn, pJolly);
 | |
| 		str = argv[2];
 | |
| 	}
 | |
| 	return pFile;
 | |
| }
 | |
| 
 | |
| static TSqlFile* Jolly2FileStringInt(TConnection& conn, void *pJolly, CString& str, int& num)
 | |
| {
 | |
| 	TSqlFile* pFile = NULL;
 | |
| 	const CStringArray& argv = *(CStringArray*)pJolly;
 | |
| 	if (argv.GetSize() > 3)
 | |
| 	{
 | |
| 		pFile = Jolly2File(conn, pJolly);
 | |
| 		str = argv[2];
 | |
| 		num = atoi(argv[3]); 
 | |
| 	}
 | |
| 	return pFile;
 | |
| }
 | |
| 
 | |
| static TSqlFile* Jolly2FileStringString(TConnection& conn, void *pJolly, CString& str, CString& val)
 | |
| {
 | |
| 	TSqlFile* pFile = NULL;
 | |
| 	const CStringArray& argv = *(CStringArray*)pJolly;
 | |
| 	if (argv.GetSize() > 3)
 | |
| 	{
 | |
| 		pFile = Jolly2File(conn, pJolly);
 | |
| 		str = argv[2];
 | |
| 		val = argv[3]; 
 | |
| 	}
 | |
| 	return pFile;
 | |
| }
 | |
| 
 | |
| static int Jolly2Int(void *pJolly)
 | |
| {
 | |
| 	const CStringArray& argv = *(CStringArray*)pJolly;
 | |
| 	int n = 0;
 | |
| 	if (argv.GetSize() > 1)
 | |
| 		n = atoi(argv[1]);
 | |
| 	return n;
 | |
| }
 | |
| 
 | |
| static CString Jolly2String(void *pJolly)
 | |
| {
 | |
| 	const CStringArray& argv = *(CStringArray*)pJolly;
 | |
| 	CString str;
 | |
| 	if (argv.GetSize() > 1)
 | |
| 		str = argv[1];
 | |
| 	return str;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileClearFields(int nHandle)
 | |
| 
 | |
| BOOL f_FileClearFields(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	TSqlFile* pFile = Jolly2File(conn, pJolly);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->ClearFields());
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileClose(int nHandle)
 | |
| 
 | |
| BOOL f_FileClose(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	const CStringArray& argv = *(CStringArray*)pJolly;
 | |
| 	if (argv.GetSize() > 1)
 | |
| 	{
 | |
| 		TPrassiConnection& c = (TPrassiConnection&)conn;
 | |
| 		long nHandle = atol(argv[1]);
 | |
| 		TSqlFile* pFile = c.GetFile(nHandle);
 | |
| 		if (pFile)
 | |
| 		{
 | |
| 			int err = pFile->Close();
 | |
| 			if (err == 0)
 | |
| 				c.CloseFile(nHandle);
 | |
|  			return conn.ReturnInteger(err);
 | |
| 		}
 | |
| 	}
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileFirst(int nHandle)
 | |
| 
 | |
| int f_FileFirst(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	int nLocks;
 | |
| 	TSqlFile* pFile = Jolly2FileInt(conn, pJolly, nLocks);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->First(nLocks));
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileGetField(int nHandle, CString strName)
 | |
| 
 | |
| BOOL f_FileGetField(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	CString strName;
 | |
| 	TSqlFile* pFile = Jolly2FileString(conn, pJolly, strName);
 | |
| 	if (pFile)
 | |
| 	{
 | |
| 		const char* str = pFile->GetField(strName);
 | |
| 		if (str)
 | |
| 			return conn.ReturnString(str);
 | |
| 	}
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // CString FileGetFieldInfo(int nLogicNum, int nIndex)
 | |
| 
 | |
| BOOL f_FileGetFieldInfo(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	int nIndex;
 | |
| 	TSqlFile* pFile = Jolly2FileInt(conn, pJolly, nIndex);
 | |
| 	if (pFile)
 | |
| 	{
 | |
| 		CString strInfo = pFile->GetFieldInfo(nIndex);
 | |
| 		return conn.ReturnString(strInfo);
 | |
| 	}
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileGetItems(long nHandle)
 | |
| 
 | |
| BOOL f_FileGetItems(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	TSqlFile* pFile = Jolly2File(conn, pJolly);
 | |
| 	if (pFile)
 | |
| 	{
 | |
|  		int items = pFile->GetRecordCount();
 | |
| 		if (items >= 0)
 | |
| 			return conn.ReturnInteger(items);
 | |
| 	}
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileGetKey(int nHandle)
 | |
| 
 | |
| BOOL f_FileGetKey(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	TSqlFile* pFile = Jolly2File(conn, pJolly);
 | |
| 	if (pFile)
 | |
| 	{
 | |
| 		int key = pFile->GetKey();
 | |
| 		if (key > 0)
 | |
| 			return conn.ReturnInteger(key);
 | |
| 	}
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // CString FileGetKeyExpr(int nLogicNum)
 | |
| 
 | |
| BOOL f_FileGetKeyExpr(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	int key;
 | |
| 	TSqlFile* pFile = Jolly2FileInt(conn, pJolly, key);
 | |
| 	if (pFile)
 | |
| 		return conn.ReturnString(pFile->GetKeyExpr(key));
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileGetPosition(int nHandle)
 | |
| 
 | |
| BOOL f_FileGetPosition(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	TSqlFile* pFile = Jolly2File(conn, pJolly);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->GetPosition());
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileLast(int nHandle, int nLock)
 | |
| 
 | |
| BOOL f_FileLast(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	int nLocks;
 | |
| 	TSqlFile* pFile = Jolly2FileInt(conn, pJolly, nLocks);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->Last(nLocks));
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileLock(int nHandle)
 | |
| 
 | |
| BOOL f_FileLock(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	TSqlFile* pFile = Jolly2File(conn, pJolly);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->ExclusiveLock());
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileMove(int nHandle, int pos)
 | |
| 
 | |
| BOOL f_FileMove(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	int nPos, nLocks;
 | |
| 	TSqlFile* pFile = Jolly2FileIntInt(conn, pJolly, nPos, nLocks);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->Move(nPos, nLocks));
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileNext(int nHandle)
 | |
| 
 | |
| BOOL f_FileNext(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	int nLocks;
 | |
| 	TSqlFile* pFile = Jolly2FileInt(conn, pJolly, nLocks);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->Next(nLocks));
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileOpen(int nLogicNum)
 | |
| 
 | |
| BOOL f_FileOpen(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	const CStringArray& argv = *(CStringArray*)pJolly;
 | |
| 	if (argv.GetSize() > 1)
 | |
| 	{
 | |
| 		TPrassiConnection& c = (TPrassiConnection&)conn;
 | |
| 		int nLogicNum = atoi(argv[1]);
 | |
| 		LPCSTR sWhere = NULL;
 | |
| 		if (argv.GetSize() > 2)
 | |
| 			sWhere = argv[2];
 | |
| 		long nHandle = c.OpenFile(nLogicNum, sWhere);
 | |
| 		if (nHandle)
 | |
| 			return c.ReturnInteger(nHandle);
 | |
| 	}
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileOpenTable(const char* str)
 | |
| 
 | |
| BOOL f_FileOpenTable(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	const CStringArray& argv = *(CStringArray*)pJolly;
 | |
| 	if (argv.GetSize() > 1)
 | |
| 	{
 | |
| 		TPrassiConnection& c = (TPrassiConnection&)conn;
 | |
| 		const char* tab = argv[1];
 | |
| 		int nLogicNum = 5;
 | |
| 		if (!isalnum(*tab))
 | |
| 		{
 | |
| 			nLogicNum--;
 | |
| 			tab++;
 | |
| 		}
 | |
| 		CString strWhere;
 | |
| 		strWhere.Format("COD='%s'", tab);
 | |
| 		if (argv.GetSize() > 2)
 | |
| 		{
 | |
| 			strWhere += " AND ";
 | |
| 			strWhere += argv[2];
 | |
| 		}
 | |
| 		long nHandle = c.OpenFile(nLogicNum, strWhere);
 | |
| 		if (nHandle)
 | |
| 			return c.ReturnInteger(nHandle);
 | |
| 	}
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FilePrev(int nHandle)
 | |
| 
 | |
| BOOL f_FilePrev(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	int nLocks;
 | |
| 	TSqlFile* pFile = Jolly2FileInt(conn, pJolly, nLocks);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->Prev(nLocks));
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileRead(int nHandle, CString where, int flags)
 | |
| 
 | |
| BOOL f_FileRead(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	CString fields;
 | |
| 	int flags;
 | |
| 	TSqlFile* pFile = Jolly2FileStringInt(conn, pJolly, fields, flags);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->Read(fields, flags));
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileRemove(int nHandle, CString key)
 | |
| 
 | |
| BOOL f_FileRemove(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	CString key;
 | |
| 	TSqlFile* pFile = Jolly2FileString(conn, pJolly, key);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->Remove(key));
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileRewrite(int nHandle, CString key)
 | |
| 
 | |
| BOOL f_FileRewrite(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	CString key;
 | |
| 	TSqlFile* pFile = Jolly2FileString(conn, pJolly, key);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->Rewrite(key));
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileSetField(int nHandle, int field, CString value)
 | |
| // int FileSetField(int nHandle, CString field, CString value)
 | |
| 
 | |
| BOOL f_FileSetField(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	CString strField;
 | |
| 	CString strValue;
 | |
| 	TSqlFile* pFile = Jolly2FileStringString(conn, pJolly, 
 | |
| 		                                     strField, strValue);
 | |
| 	if (pFile)
 | |
| 	{
 | |
| 		const int nIndex = atoi(strField);
 | |
| 		int err;
 | |
| 		if (nIndex > 0)
 | |
| 			err = pFile->SetField(nIndex, strValue);
 | |
| 		else
 | |
| 			err = pFile->SetField(strField, strValue);
 | |
| 		return conn.ReturnInteger(err);
 | |
| 	}
 | |
| 	return FALSE;
 | |
| }
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileSetKey(int nHandle, int key)
 | |
| 
 | |
| BOOL f_FileSetKey(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	int key;
 | |
| 	TSqlFile* pFile = Jolly2FileInt(conn, pJolly, key);
 | |
| 	if (pFile)
 | |
| 	{
 | |
| 		int nErr = pFile->SetKey(key);
 | |
| 		return conn.ReturnInteger(nErr);
 | |
| 	}
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileSkip(int nHandle, int pos)
 | |
| 
 | |
| BOOL f_FileSkip(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	int nPos, nLocks;
 | |
| 	TSqlFile* pFile = Jolly2FileIntInt(conn, pJolly, nPos, nLocks);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->Skip(nPos, nLocks));
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileUnlock(int nHandle)
 | |
| 
 | |
| BOOL f_FileUnlock(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	TSqlFile* pFile = Jolly2File(conn, pJolly);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->ExclusiveUnlock());
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FileWrite(int nHandle)
 | |
| 
 | |
| BOOL f_FileWrite(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	TSqlFile* pFile = Jolly2File(conn, pJolly);
 | |
| 	if (pFile)
 | |
|  		return conn.ReturnInteger(pFile->Write());
 | |
| 	return FALSE;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FirmGet()
 | |
| 
 | |
| BOOL f_FirmGet(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	TPrassiConnection& c = (TPrassiConnection&)conn;
 | |
| 	return c.ReturnInteger(c.GetFirm());
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FirmSet()
 | |
| 
 | |
| BOOL f_FirmSet(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	int nFirm = Jolly2Int(pJolly);
 | |
| 	TPrassiConnection& c = (TPrassiConnection&)conn;
 | |
| 	return c.ReturnBool(c.SetFirm(nFirm));
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // int FirmTest()
 | |
| 
 | |
| BOOL f_FirmTest(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	int nFirm = Jolly2Int(pJolly);
 | |
| 	TPrassiServer& s = GetServer();
 | |
| 	return conn.ReturnBool(s.TestFirm(nFirm));
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // void* FtpGetFile(CString)
 | |
| 
 | |
| BOOL f_FtpGetFile(TConnection& conn, void* pJolly)
 | |
| {
 | |
| 	CString filename;
 | |
| 	filename = Jolly2String(pJolly);
 | |
| 	FILE* f = fopen(filename, "rb");
 | |
| 	if (f != NULL)
 | |
| 	{
 | |
| 		fseek(f, 0, SEEK_END);
 | |
| 		DWORD dwSize = ftell(f); 
 | |
| 		BYTE* pData  = conn.Server().GetBuffer(dwSize);
 | |
| 		fseek(f, 0, SEEK_SET);
 | |
| 		size_t r = fread(pData, dwSize, 1, f);
 | |
| 		fclose(f);
 | |
| 	}
 | |
| 
 | |
| 	return f != NULL;
 | |
| }
 |