Committed hopefully final version
This commit is contained in:
@ -1,5 +1,13 @@
|
||||
#include <stdlib.h>
|
||||
#include "amxxapi.h"
|
||||
#include "NVault.h"
|
||||
#include "CQueue.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#define MKDIR(p) mkdir(p)
|
||||
#else
|
||||
#define MKDIR(p) mkdir(p, 0755)
|
||||
#endif
|
||||
|
||||
#ifdef __linux__
|
||||
#include <unistd.h>
|
||||
@ -7,29 +15,37 @@
|
||||
#include <direct.h>
|
||||
#endif
|
||||
|
||||
CVector<Vault *> Vaults;
|
||||
CVector<NVault *> g_Vaults;
|
||||
CQueue<int> g_OldVaults;
|
||||
|
||||
VaultMngr g_VaultMngr;
|
||||
|
||||
static cell nvault_open(AMX *amx, cell *params)
|
||||
{
|
||||
int len, id=-1;
|
||||
char *name = MF_GetAmxString(amx, params[1], 0, &len);
|
||||
char *file = MF_BuildPathname("%s/nvault/%s", LOCALINFO("amxx_datadir"), name);
|
||||
for (size_t i=0; i<Vaults.size(); i++)
|
||||
char path[255], file[255];
|
||||
MF_BuildPathnameR(path, sizeof(path)-1, "%s/vault", LOCALINFO("amxx_datadir"));
|
||||
sprintf(file, "%s/%s.vault", path, file);
|
||||
for (size_t i=0; i<g_Vaults.size(); i++)
|
||||
{
|
||||
if (!Vaults.at(i))
|
||||
if (strcmp(g_Vaults.at(i)->GetFilename(), file) == 0)
|
||||
{
|
||||
id = i;
|
||||
} else if (strcmp(Vaults.at(i)->GetFileName(), file) == 0) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
Vault *v = new Vault(file);
|
||||
NVault *v = new NVault(file);
|
||||
if (!g_OldVaults.empty())
|
||||
{
|
||||
id = g_OldVaults.front();
|
||||
g_OldVaults.pop();
|
||||
}
|
||||
if (id != -1)
|
||||
{
|
||||
Vaults[id] = v;
|
||||
g_Vaults[id] = v;
|
||||
} else {
|
||||
Vaults.push_back(v);
|
||||
id = (int)Vaults.size()-1;
|
||||
g_Vaults.push_back(v);
|
||||
id = (int)g_Vaults.size()-1;
|
||||
}
|
||||
|
||||
return id;
|
||||
@ -38,15 +54,16 @@ static cell nvault_open(AMX *amx, cell *params)
|
||||
static cell nvault_get(AMX *amx, cell *params)
|
||||
{
|
||||
unsigned int id = params[1];
|
||||
if (id > Vaults.size() || !Vaults.at(id))
|
||||
if (id >= g_Vaults.size() || !g_Vaults.at(id))
|
||||
{
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid vault id: %d\n", id);
|
||||
return 0;
|
||||
}
|
||||
NVault *pVault = g_Vaults.at(id);
|
||||
unsigned int numParams = (*params)/sizeof(cell);
|
||||
int len;
|
||||
char *key = MF_GetAmxString(amx, params[2], 0, &len);
|
||||
const char *val = Vaults.at(id)->Find(key)->val.c_str();
|
||||
const char *val = pVault->GetValue(key);
|
||||
switch (numParams)
|
||||
{
|
||||
case 2:
|
||||
@ -72,61 +89,45 @@ static cell nvault_get(AMX *amx, cell *params)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static cell nvault_timeget(AMX *amx, cell *params)
|
||||
static cell nvault_lookup(AMX *amx, cell *params)
|
||||
{
|
||||
unsigned int id = params[1];
|
||||
if (id > Vaults.size() || !Vaults.at(id))
|
||||
if (id >= g_Vaults.size() || !g_Vaults.at(id))
|
||||
{
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid vault id: %d\n", id);
|
||||
return 0;
|
||||
}
|
||||
unsigned int numParams = (*params)/sizeof(cell);
|
||||
NVault *pVault = g_Vaults.at(id);
|
||||
int len;
|
||||
HashTable::htNode *node;
|
||||
char *key = MF_GetAmxString(amx, params[2], 0, &len);
|
||||
node = Vaults.at(id)->Find(key);
|
||||
const char *val = node->val.c_str();
|
||||
cell *t_addr = MF_GetAmxAddr(amx, params[3]);
|
||||
*t_addr = (cell)(node->stamp);
|
||||
switch (numParams)
|
||||
time_t stamp;
|
||||
char *key = MF_GetAmxString(amx, params[1], 0, &len);
|
||||
char *buffer = new char[params[3]+1];
|
||||
if (!pVault->GetValue(key, stamp, buffer, params[3]))
|
||||
{
|
||||
case 3:
|
||||
{
|
||||
return atoi(val);
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
cell *fAddr = MF_GetAmxAddr(amx, params[4]);
|
||||
*fAddr = amx_ftoc((REAL)atof(val));
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
len = *(MF_GetAmxAddr(amx, params[5]));
|
||||
return MF_SetAmxString(amx, params[4], val, len);
|
||||
break;
|
||||
}
|
||||
delete [] buffer;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
MF_SetAmxString(amx, params[2], buffer, params[3]);
|
||||
cell *addr = MF_GetAmxAddr(amx, params[4]);
|
||||
addr[0] = (cell)stamp;
|
||||
delete [] buffer;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell nvault_set(AMX *amx, cell *params)
|
||||
{
|
||||
unsigned int id = params[1];
|
||||
if (id > Vaults.size() || !Vaults.at(id))
|
||||
if (id >= g_Vaults.size() || !g_Vaults.at(id))
|
||||
{
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid vault id: %d\n", id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
NVault *pVault = g_Vaults.at(id);
|
||||
int len;
|
||||
char *key = MF_GetAmxString(amx, params[2], 0, &len);
|
||||
char *val = MF_FormatAmxString(amx, params, 3, &len);
|
||||
|
||||
Vaults.at(id)->Store(key, val);
|
||||
pVault->SetValue(key, val);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -134,27 +135,57 @@ static cell nvault_set(AMX *amx, cell *params)
|
||||
static cell nvault_pset(AMX *amx, cell *params)
|
||||
{
|
||||
unsigned int id = params[1];
|
||||
if (id > Vaults.size() || !Vaults.at(id))
|
||||
if (id >= g_Vaults.size() || !g_Vaults.at(id))
|
||||
{
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid vault id: %d\n", id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
NVault *pVault = g_Vaults.at(id);
|
||||
int len;
|
||||
char *key = MF_GetAmxString(amx, params[2], 0, &len);
|
||||
char *val = MF_FormatAmxString(amx, params, 3, &len);
|
||||
|
||||
Vaults.at(id)->Store(key, val, false);
|
||||
pVault->SetValue(key, val, 0);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell nvault_close(AMX *amx, cell *params)
|
||||
{
|
||||
unsigned int id = params[1];
|
||||
if (id >= g_Vaults.size() || !g_Vaults.at(id))
|
||||
{
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid vault id: %d\n", id);
|
||||
return 0;
|
||||
}
|
||||
NVault *pVault = g_Vaults.at(id);
|
||||
pVault->Close();
|
||||
delete pVault;
|
||||
g_Vaults[id] = NULL;
|
||||
g_OldVaults.push(id);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
IVaultMngr *GetVaultMngr()
|
||||
{
|
||||
return static_cast<IVaultMngr *>(&g_VaultMngr);
|
||||
}
|
||||
|
||||
void OnAmxxAttach()
|
||||
{
|
||||
//create the dir if it doesn't exist
|
||||
#ifdef __linux__
|
||||
mkdir(MF_BuildPathname("%s/nvault", LOCALINFO("amxx_datadir")), 0700);
|
||||
#else
|
||||
mkdir(MF_BuildPathname("%s/nvault", LOCALINFO("amxx_datadir")));
|
||||
#endif
|
||||
MKDIR(MF_BuildPathname("%s/vault", LOCALINFO("amxx_datadir")));
|
||||
MF_AddNatives(nVault_natives);
|
||||
MF_RegisterFunction(GetVaultMngr, "GetVaultMngr");
|
||||
}
|
||||
|
||||
AMX_NATIVE_INFO nVault_natives[] = {
|
||||
{"nvault_open", nvault_open},
|
||||
{"nvault_get", nvault_get},
|
||||
{"nvault_lookup", nvault_lookup},
|
||||
{"nvault_set", nvault_set},
|
||||
{"nvault_pset", nvault_pset},
|
||||
{"nvault_close", nvault_close},
|
||||
{NULL, NULL},
|
||||
};
|
Reference in New Issue
Block a user