diff --git a/dlls/nvault/IVault.h b/dlls/nvault/IVault.h index ec9a5640..dfeef886 100755 --- a/dlls/nvault/IVault.h +++ b/dlls/nvault/IVault.h @@ -15,6 +15,7 @@ public: virtual void Clear() =0; virtual void Remove(const char *key) =0; virtual size_t Items() =0; + virtual void Touch(const char *key, time_t stamp) =0; }; class IVaultMngr diff --git a/dlls/nvault/NVault.cpp b/dlls/nvault/NVault.cpp index ec61be47..f31c90c7 100755 --- a/dlls/nvault/NVault.cpp +++ b/dlls/nvault/NVault.cpp @@ -8,6 +8,12 @@ #define _snprintf snprintf #endif +/** + * :TODO: This beast calls strcpy()/new() way too much by creating new strings on the stack. + * That's easily remedied and it should be fixed? + * ---bail + */ + template <> int HashFunction(const String & k) { @@ -284,6 +290,18 @@ size_t NVault::Prune(time_t start, time_t end) return m_Hash.Prune(start, end); } +void NVault::Touch(const char *key, time_t stamp) +{ + String sKey(key); + + if (!m_Hash.Exists(sKey)) + { + SetValue(key, "", time(NULL)); + } + + m_Hash.Touch(key, stamp); +} + bool NVault::GetValue(const char *key, time_t &stamp, char buffer[], size_t len) { String sKey(key); diff --git a/dlls/nvault/NVault.h b/dlls/nvault/NVault.h index 89e6b7fe..9b18da33 100755 --- a/dlls/nvault/NVault.h +++ b/dlls/nvault/NVault.h @@ -41,6 +41,7 @@ public: const char *GetValue(const char *key); void SetValue(const char *key, const char *val); void SetValue(const char *key, const char *val, time_t stamp); + void Touch(const char *key, time_t stamp); size_t Prune(time_t start, time_t end); void Clear(); void Remove(const char *key); diff --git a/dlls/nvault/amxxapi.cpp b/dlls/nvault/amxxapi.cpp index 619028d3..7146af10 100755 --- a/dlls/nvault/amxxapi.cpp +++ b/dlls/nvault/amxxapi.cpp @@ -58,6 +58,28 @@ static cell nvault_open(AMX *amx, cell *params) return id; } +static cell nvault_touch(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); + int len; + char *key = MF_GetAmxString(amx, params[2], 0, &len); + + if (params[3] == -1) + { + pVault->Touch(key, time(NULL)); + } else { + pVault->Touch(key, static_cast(params[3])); + } + + return 1; +} + static cell nvault_get(AMX *amx, cell *params) { unsigned int id = params[1]; @@ -239,5 +261,6 @@ AMX_NATIVE_INFO nVault_natives[] = { {"nvault_close", nvault_close}, {"nvault_prune", nvault_prune}, {"nvault_remove", nvault_remove}, + {"nvault_touch", nvault_touch}, {NULL, NULL}, }; diff --git a/dlls/nvault/sh_tinyhash.h b/dlls/nvault/sh_tinyhash.h index b9d9b1a6..b29cc39e 100755 --- a/dlls/nvault/sh_tinyhash.h +++ b/dlls/nvault/sh_tinyhash.h @@ -109,6 +109,11 @@ public: stamp = pNode->stamp; return pNode->val; } + void Touch(const K & k, time_t stamp) + { + THashNode *pNode = _FindOrInsert(k); + pNode->stamp = stamp; + } V & Retrieve(const K & k) { time_t stamp; diff --git a/plugins/include/nvault.inc b/plugins/include/nvault.inc index fbe2f07b..ba6523ef 100755 --- a/plugins/include/nvault.inc +++ b/plugins/include/nvault.inc @@ -19,32 +19,43 @@ #pragma library nvault #endif -//Opens a vault by name (such as "myvault") -//Returns a vault id, INVALID_HANDLE otherwise (-1) +/* All timestamps are in UNIX epoch form. */ + +/* Opens a vault by name (such as "myvault") + * Returns a vault id, INVALID_HANDLE otherwise (-1) + */ native nvault_open(const name[]); -//Gets a vault value by returning an int -// setting a byref float -// or setting a string + maxlength +/* Gets a vault value by returning an int + * setting a byref float or setting a string + maxlength + */ native nvault_get(vault, const key[], ...); -//Looks up a vault value for full information -//Returns 0 if the entry is not found +/* Looks up a vault value for full information + * Returns 0 if the entry is not found + */ native nvault_lookup(vault, const key[], value[], maxlen, ×tamp) -//Sets a vault value (with current timestamp) +/* Sets a vault value (with current timestamp) */ native nvault_set(vault, const key[], const value[]); -//Sets a permanent vault value (no timestamp) +/* Sets a permanent vault value (no timestamp) */ native nvault_pset(vault, const key[], const value[]); -//Prunes the vault for entries that are within the given timestamps. -//This will not erase values set with pset +/* Prunes the vault for entries that are within the given timestamps. + * This will not erase values set with pset + */ native nvault_prune(vault, start, end); -//Closes a vault +/* Closes a vault */ native nvault_close(vault); -//Removes a key from the vault +/* Removes a key from the vault */ native nvault_remove(vault, const key[]); +/* "Touches" a key to update its timestamp value. + * If stamp is -1 (default), it will use the current time. + * Like the unix command "touch," it will create an empty key + * if the value does not exist. + */ +native nvault_touch(vault, const key[], timestamp=-1);