Fixed bug am42307 (nvault_open did not return -1 on failure)
This commit is contained in:
		@@ -20,6 +20,9 @@ public:
 | 
			
		||||
class IVaultMngr
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	/**
 | 
			
		||||
	 * Note: Will return NULL if the vault failed to create.
 | 
			
		||||
	 */
 | 
			
		||||
	virtual IVault *OpenVault(const char *name) =0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,9 @@ int Journal::Replay(VaultMap *pMap)
 | 
			
		||||
{
 | 
			
		||||
	m_fp = fopen(m_File.c_str(), "rb");
 | 
			
		||||
	if (!m_fp)
 | 
			
		||||
	{
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	BinaryReader br(m_fp);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,18 @@ NVault::NVault(const char *file)
 | 
			
		||||
	m_File.assign(file);
 | 
			
		||||
	m_Journal = NULL;
 | 
			
		||||
	m_Open = false;
 | 
			
		||||
 | 
			
		||||
	FILE *fp = fopen(m_File.c_str(), "rb");
 | 
			
		||||
	if (!fp)
 | 
			
		||||
	{
 | 
			
		||||
		fp = fopen(m_File.c_str(), "wb");
 | 
			
		||||
		if (!fp)
 | 
			
		||||
		{
 | 
			
		||||
			throw Vault_NoFile;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fclose(fp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
NVault::~NVault()
 | 
			
		||||
@@ -44,7 +56,9 @@ VaultError NVault::_ReadFromFile()
 | 
			
		||||
	FILE *fp = fopen(m_File.c_str(), "rb");
 | 
			
		||||
 | 
			
		||||
	if (!fp)
 | 
			
		||||
	{
 | 
			
		||||
		return Vault_NoFile;
 | 
			
		||||
	}
 | 
			
		||||
	//this is a little more optimized than the other version in the journal <_<
 | 
			
		||||
	//I could optimize this more by embedding the position in the hash table but...
 | 
			
		||||
	// the hash function can be changed.  this could be fixed by storing a string and its
 | 
			
		||||
@@ -123,7 +137,9 @@ bool NVault::_SaveToFile()
 | 
			
		||||
	FILE *fp = fopen(m_File.c_str(), "wb");
 | 
			
		||||
 | 
			
		||||
	if (!fp)
 | 
			
		||||
	{
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	BinaryWriter bw(fp);
 | 
			
		||||
 | 
			
		||||
@@ -195,7 +211,11 @@ bool NVault::Open()
 | 
			
		||||
 | 
			
		||||
	m_Journal->Replay(&m_Hash);
 | 
			
		||||
	m_Journal->Erase();
 | 
			
		||||
	m_Journal->Begin();
 | 
			
		||||
	if (!m_Journal->Begin())
 | 
			
		||||
	{
 | 
			
		||||
		delete m_Journal;
 | 
			
		||||
		m_Journal = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	m_Open = true;
 | 
			
		||||
 | 
			
		||||
@@ -285,8 +305,14 @@ bool NVault::GetValue(const char *key, time_t &stamp, char buffer[], size_t len)
 | 
			
		||||
 | 
			
		||||
IVault *VaultMngr::OpenVault(const char *file)
 | 
			
		||||
{
 | 
			
		||||
	NVault *pVault = new NVault(file);
 | 
			
		||||
	
 | 
			
		||||
	NVault *pVault;
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		pVault = new NVault(file);
 | 
			
		||||
	} catch (...) {
 | 
			
		||||
		pVault = NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return static_cast<IVault *>(pVault);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -36,8 +36,8 @@ static cell nvault_open(AMX *amx, cell *params)
 | 
			
		||||
		if (strcmp(g_Vaults.at(i)->GetFilename(), file) == 0) 
 | 
			
		||||
			return i;
 | 
			
		||||
	}
 | 
			
		||||
	NVault *v = new NVault(file);
 | 
			
		||||
	if (!v->Open())
 | 
			
		||||
	NVault *v = (NVault *)g_VaultMngr.OpenVault(file);
 | 
			
		||||
	if (v == NULL || !v->Open())
 | 
			
		||||
	{
 | 
			
		||||
		delete v;
 | 
			
		||||
		return -1;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								plugins/testsuite/nvault_test.sma
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								plugins/testsuite/nvault_test.sma
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
#include <amxmodx>
 | 
			
		||||
#include <nvault>
 | 
			
		||||
 | 
			
		||||
public plugin_init()
 | 
			
		||||
{
 | 
			
		||||
	register_plugin("nVault Test", "1.0", "BAILOPAN")
 | 
			
		||||
	
 | 
			
		||||
	register_srvcmd("test_nvault", "Command_TestNvault")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public Command_TestNvault()
 | 
			
		||||
{
 | 
			
		||||
	new v = nvault_open("://:/1/R!?#@41345$%:$")
 | 
			
		||||
	server_print("Vault value: %d (expected: %d)", v, -1)
 | 
			
		||||
	
 | 
			
		||||
	if (v != -1)
 | 
			
		||||
	{
 | 
			
		||||
		nvault_close(v)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user