// remvar.h : // #if !defined(AGD_REMVAR_H__B91C5ED5_B980_4B06_9CEA_886DB0518B29__INCLUDED_) #define AGD_REMVAR_H__B91C5ED5_B980_4B06_9CEA_886DB0518B29__INCLUDED_ #include #include #include #include #include #include #include #include #include #ifdef SITARA_BUILD #include #else // SITARA_BUILD #include #endif // SITARA_BUILD #ifndef _LIBBUILD #include #include #include #else // _LIBBUILD #include "common/logfile.h" #include "common/debug.h" #include "remlogger.h" #endif // _LIBBUILD ///////////////////////////////////////////////////////////////////////////// #define _XML_SPACES_PER_TAB 4 #define _JSON_SPACES_PER_TAB 4 #define _TRACK_TYPES_AT_LOAD 0 #define _TRACK_REM_WRITES 0 #define _IMPLEMENT_XML 0 ///////////////////////////////////////////////////////////////////////////// typedef union _CHECK_UPDATE_SHM_RETVAL { struct { unsigned int nChecked; unsigned int nUpdated; }; unsigned long long nRetval; }CHECK_UPDATE_SHM_RETVAL, *LPCHECK_UPDATE_SHM_RETVAL; typedef const CHECK_UPDATE_SHM_RETVAL *LPCCHECK_UPDATE_SHM_RETVAL; ///////////////////////////////////////////////////////////////////////////// // remvar.h - Declarations: class CRemVarTable; class CRemanent { public: virtual void CreateMembersTable(CRemVarTable &vt) = 0; virtual bool SaveJSON(FILE *f, int nIndent, bool bValueOnly, bool bWriteComma) = 0; virtual bool SetJSONValue(const Json::Value &jv, bool fLock){ UNUSED(jv); UNUSED(fLock); return false;} virtual bool SetDoubleValue(double val, bool fLock){ UNUSED(val); UNUSED(fLock); return false;} virtual unsigned long long CheckUpdateShm(bool fLock) = 0; virtual void InitPath(CRemanent *pParent, const char *pszMemberName) = 0; virtual const char* GetPath(void) const = 0; virtual unsigned long long GetUpdateCount(void) const = 0; virtual void Log(time_t ts, CRemLogger &rlogger) = 0; }; ///////////////////////////////////////////////////////////////////////////// class CRemVarTable { public: typedef bool (*_PFNCMP)(const char*, const char*); public: CRemVarTable(void); virtual ~CRemVarTable(void); void AddVar(CRemanent *pv); CRemanent* Find(const char *key) const; unsigned long LoadJSONValues(const Json::Value &jv); bool GetMaxUpdateVariables(std::vector &vars, size_t nMaxVars); private: void ParseJsonMember(const Json::Value &rMem, std::string &sname, unsigned long &parsed); void ParseJsonScalar(const Json::Value &rScl, std::string &sname, unsigned long &parsed); void ParseJsonArray(const Json::Value &rArr, std::string &sname, unsigned long &parsed); void ParseJsonObject(const Json::Value &rObj, std::string &sname, unsigned long &parsed); private: std::map m_map; }; ///////////////////////////////////////////////////////////////////////////// class CDbPersist { public: typedef bool (*_PFNCMP)(const std::string&, const std::string&); typedef std::map CFieldMap; typedef std::vector CTagsMap; public: CDbPersist(const char *pszDatabaseName, const char *pszTagsTableName, const char *pszLogsTableName, const char *pszDbUser, const char *pszDbPass); virtual ~CDbPersist(void); int RestoreValues(const CRemVarTable &map, CLogfile &rlf); const CTagsMap &GetTagsMap(void) const { return m_tags;} private: bool Init(CMySqlDB &db); private: std::string m_sDatabaseName; std::string m_sTagsTableName; std::string m_sLogsTableName; std::string m_sUser; std::string m_sPass; CTagsMap m_tags; std::string m_lastError; }; ///////////////////////////////////////////////////////////////////////////// class CRemVariable : public CRemanent { public: enum VT { VT_Invalid, VT_bool, VT_I1, VT_UI1, VT_I2, VT_UI2, VT_I4, VT_UI4, VT_I8, VT_UI8, VT_float, VT_double, VT_string }; typedef union { void *pVoid; bool *pBool; signed char *pI1; unsigned char *pUI1; signed short *pI2; unsigned short *pUI2; signed int *pI4; unsigned int *pUI4; signed long long *pI8; unsigned long long *pUI8; float *pFloat; double *pDouble; }V_Ptr; typedef union { bool boolVal; signed char I1Val; unsigned char UI1Val; signed short I2Val; unsigned short UI2Val; signed int I4Val; unsigned int UI4Val; signed long long I8Val; unsigned long long UI8Val; float FloatVal; double DoubleVal; }V_Val; public: CRemVariable(void *pData, const std::type_info &rti, HSHM hShm, bool bIsDbPersitent, const char *pszName, int nIndex, CRemanent *pParent); virtual ~CRemVariable(void); virtual void CreateMembersTable(CRemVarTable &vt); virtual bool SaveJSON(FILE *f, int nIndent, bool bValueOnly, bool bWriteComma); virtual bool SetJSONValue(const Json::Value &jv, bool fLock); virtual bool SetDoubleValue(double val, bool fLock); virtual unsigned long long CheckUpdateShm(bool fLock); virtual void InitPath(CRemanent*pParent, const char *pszMemberName); virtual const char* GetPath(void) const { return m_pszPath;} virtual unsigned long long GetUpdateCount(void) const { return m_nUpdates;} virtual void Log(time_t ts, CRemLogger &rlogger); private: void Lock(void); void Unlock(void); private: std::string m_name; std::string m_path; const char *m_pszPath; int m_nIndex; enum VT m_vt; volatile V_Ptr m_data; V_Val m_cache; HSHM m_hShm; CRemanent *m_pParent; unsigned long long m_nUpdates; double m_fLogValue; bool m_bMustLog; bool m_bIsDbPersitent; size_t m_nCbVarpath; }; ///////////////////////////////////////////////////////////////////////////// class CRemStringVariable : public CRemanent { public: typedef enum { VT_Invalid, // 0 VT_Latin1, // 1 VT_UTF_8, // 2 VT_UTF_16, // 3 VT_UTF_32, // 4 VT_Unicode, // 5 VT_Last }VT; typedef union { void *pVoid; char *pszMbs; char16_t *pszWc16; char32_t *pszWc32; wchar_t *pszWcs; }V_Ptr; public: CRemStringVariable(void *pData, size_t nCChData, VT vt, const std::type_info &rti, HSHM hShm, bool bIsDbPersitent, const char *pszName, int nIndex, CRemanent *pParent); virtual ~CRemStringVariable(void); virtual void CreateMembersTable(CRemVarTable &vt); virtual bool SaveJSON(FILE *f, int nIndent, bool bValueOnly, bool bWriteComma); virtual bool SetJSONValue(const Json::Value &jv, bool fLock); virtual unsigned long long CheckUpdateShm(bool fLock); virtual void InitPath(CRemanent*pParent, const char *pszMemberName); virtual const char* GetPath(void) const { return m_pszPath;} virtual unsigned long long GetUpdateCount(void) const { return m_nUpdates;} virtual void Log(time_t ts, CRemLogger &rlogger); private: bool shmChanged(bool fLock); void Lock(void); void Unlock(void); void zeroTerm(volatile V_Ptr &rp, size_t at); private: std::string m_name; std::string m_path; const char *m_pszPath; int m_nIndex; VT m_vt; volatile V_Ptr m_data; V_Ptr m_cache; size_t m_nCbBuffer; size_t m_nCbString; HSHM m_hShm; CRemanent *m_pParent; unsigned long long m_nUpdates; bool m_bMustLog; bool m_bIsDbPersitent; size_t m_nCbVarpath; char m_szLog[_RL_MAX_STRVAL_LENGTH]; size_t m_nCbLog; }; ///////////////////////////////////////////////////////////////////////////// class CRemBitVariable : public CRemanent { public: enum VT { VT_Invalid, VT_bool, VT_I1, VT_UI1, VT_I2, VT_UI2, VT_I4, VT_UI4, VT_I8, VT_UI8, VT_float, VT_double, VT_string }; public: CRemBitVariable(void *pData, size_t nOffset, int nBitNr, HSHM hShm, bool bIsDbPersitent, const char *pszName, CRemanent *pParent); virtual ~CRemBitVariable(void); virtual void CreateMembersTable(CRemVarTable &vt); virtual bool SaveJSON(FILE *f, int nIndent, bool bValueOnly, bool bWriteComma); virtual bool SetJSONValue(const Json::Value &jv, bool fLock); virtual bool SetDoubleValue(double val, bool fLock); virtual unsigned long long CheckUpdateShm(bool fLock); virtual void InitPath(CRemanent*pParent, const char *pszMemberName); virtual const char* GetPath(void) const { return m_pszPath;} virtual unsigned long long GetUpdateCount(void) const { return m_nUpdates;} virtual void Log(time_t ts, CRemLogger &rlogger); private: void Lock(void); void Unlock(void); private: std::string m_name; std::string m_path; const char *m_pszPath; uint8_t *m_pShmByte; uint8_t m_mask; bool m_cacheVal; HSHM m_hShm; CRemanent *m_pParent; unsigned long long m_nUpdates; double m_fLogValue; bool m_bMustLog; bool m_bIsDbPersitent; size_t m_nCbVarpath; }; ///////////////////////////////////////////////////////////////////////////// #endif // !defined(AGD_REMVAR_H__B91C5ED5_B980_4B06_9CEA_886DB0518B29__INCLUDED_)