remvar.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. // remvar.h :
  2. //
  3. #if !defined(AGD_REMVAR_H__B91C5ED5_B980_4B06_9CEA_886DB0518B29__INCLUDED_)
  4. #define AGD_REMVAR_H__B91C5ED5_B980_4B06_9CEA_886DB0518B29__INCLUDED_
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <string>
  9. #include <pthread.h>
  10. #include <typeinfo>
  11. #include <vector>
  12. #include <map>
  13. #include <gfa/gfaipc.h>
  14. #ifdef SITARA_BUILD
  15. #include <json/json.h>
  16. #else // SITARA_BUILD
  17. #include <jsoncpp/json/json.h>
  18. #endif // SITARA_BUILD
  19. #ifndef _LIBBUILD
  20. #include <gfa/svc/common/logfile.h>
  21. #include <gfa/svc/common/debug.h>
  22. #include <gfa/svc/remanent/remlogger.h>
  23. #else // _LIBBUILD
  24. #include "common/logfile.h"
  25. #include "common/debug.h"
  26. #include "remlogger.h"
  27. #endif // _LIBBUILD
  28. /////////////////////////////////////////////////////////////////////////////
  29. #define _XML_SPACES_PER_TAB 4
  30. #define _JSON_SPACES_PER_TAB 4
  31. #define _TRACK_TYPES_AT_LOAD 0
  32. #define _TRACK_REM_WRITES 0
  33. #define _IMPLEMENT_XML 0
  34. /////////////////////////////////////////////////////////////////////////////
  35. typedef union _CHECK_UPDATE_SHM_RETVAL
  36. {
  37. struct
  38. {
  39. unsigned int nChecked;
  40. unsigned int nUpdated;
  41. };
  42. unsigned long long nRetval;
  43. }CHECK_UPDATE_SHM_RETVAL, *LPCHECK_UPDATE_SHM_RETVAL;
  44. typedef const CHECK_UPDATE_SHM_RETVAL *LPCCHECK_UPDATE_SHM_RETVAL;
  45. /////////////////////////////////////////////////////////////////////////////
  46. // remvar.h - Declarations:
  47. class CRemVarTable;
  48. class CRemanent
  49. {
  50. public:
  51. virtual void CreateMembersTable(CRemVarTable &vt) = 0;
  52. virtual bool SaveJSON(FILE *f, int nIndent, bool bValueOnly, bool bWriteComma) = 0;
  53. virtual bool SetJSONValue(const Json::Value &jv, bool fLock){
  54. UNUSED(jv);
  55. UNUSED(fLock);
  56. return false;}
  57. virtual bool SetDoubleValue(double val, bool fLock){
  58. UNUSED(val);
  59. UNUSED(fLock);
  60. return false;}
  61. virtual unsigned long long CheckUpdateShm(bool fLock) = 0;
  62. virtual void InitPath(CRemanent *pParent, const char *pszMemberName) = 0;
  63. virtual const char* GetPath(void) const = 0;
  64. virtual unsigned long long GetUpdateCount(void) const = 0;
  65. virtual void Log(time_t ts, CRemLogger &rlogger) = 0;
  66. };
  67. /////////////////////////////////////////////////////////////////////////////
  68. class CRemVarTable
  69. {
  70. public:
  71. typedef bool (*_PFNCMP)(const char*, const char*);
  72. public:
  73. CRemVarTable(void);
  74. virtual ~CRemVarTable(void);
  75. void AddVar(CRemanent *pv);
  76. CRemanent* Find(const char *key) const;
  77. unsigned long LoadJSONValues(const Json::Value &jv);
  78. bool GetMaxUpdateVariables(std::vector<const CRemanent*> &vars, size_t nMaxVars);
  79. private:
  80. void ParseJsonMember(const Json::Value &rMem, std::string &sname, unsigned long &parsed);
  81. void ParseJsonScalar(const Json::Value &rScl, std::string &sname, unsigned long &parsed);
  82. void ParseJsonArray(const Json::Value &rArr, std::string &sname, unsigned long &parsed);
  83. void ParseJsonObject(const Json::Value &rObj, std::string &sname, unsigned long &parsed);
  84. private:
  85. std::map<const char*, CRemanent*, _PFNCMP> m_map;
  86. };
  87. /////////////////////////////////////////////////////////////////////////////
  88. class CDbPersist
  89. {
  90. public:
  91. typedef bool (*_PFNCMP)(const std::string&, const std::string&);
  92. typedef std::map<std::string, std::string, _PFNCMP> CFieldMap;
  93. typedef std::vector<CFieldMap> CTagsMap;
  94. public:
  95. CDbPersist(const char *pszDatabaseName, const char *pszTagsTableName, const char *pszLogsTableName, const char *pszDbUser, const char *pszDbPass);
  96. virtual ~CDbPersist(void);
  97. int RestoreValues(const CRemVarTable &map, CLogfile &rlf);
  98. const CTagsMap &GetTagsMap(void) const {
  99. return m_tags;}
  100. private:
  101. bool Init(CMySqlDB &db);
  102. private:
  103. std::string m_sDatabaseName;
  104. std::string m_sTagsTableName;
  105. std::string m_sLogsTableName;
  106. std::string m_sUser;
  107. std::string m_sPass;
  108. CTagsMap m_tags;
  109. std::string m_lastError;
  110. };
  111. /////////////////////////////////////////////////////////////////////////////
  112. class CRemVariable : public CRemanent
  113. {
  114. public:
  115. enum VT
  116. {
  117. VT_Invalid,
  118. VT_bool,
  119. VT_I1,
  120. VT_UI1,
  121. VT_I2,
  122. VT_UI2,
  123. VT_I4,
  124. VT_UI4,
  125. VT_I8,
  126. VT_UI8,
  127. VT_float,
  128. VT_double,
  129. VT_string
  130. };
  131. typedef union
  132. {
  133. void *pVoid;
  134. bool *pBool;
  135. signed char *pI1;
  136. unsigned char *pUI1;
  137. signed short *pI2;
  138. unsigned short *pUI2;
  139. signed int *pI4;
  140. unsigned int *pUI4;
  141. signed long long *pI8;
  142. unsigned long long *pUI8;
  143. float *pFloat;
  144. double *pDouble;
  145. }V_Ptr;
  146. typedef union
  147. {
  148. bool boolVal;
  149. signed char I1Val;
  150. unsigned char UI1Val;
  151. signed short I2Val;
  152. unsigned short UI2Val;
  153. signed int I4Val;
  154. unsigned int UI4Val;
  155. signed long long I8Val;
  156. unsigned long long UI8Val;
  157. float FloatVal;
  158. double DoubleVal;
  159. }V_Val;
  160. public:
  161. CRemVariable(void *pData, const std::type_info &rti, HSHM hShm, bool bIsDbPersitent, const char *pszName, int nIndex, CRemanent *pParent);
  162. virtual ~CRemVariable(void);
  163. virtual void CreateMembersTable(CRemVarTable &vt);
  164. virtual bool SaveJSON(FILE *f, int nIndent, bool bValueOnly, bool bWriteComma);
  165. virtual bool SetJSONValue(const Json::Value &jv, bool fLock);
  166. virtual bool SetDoubleValue(double val, bool fLock);
  167. virtual unsigned long long CheckUpdateShm(bool fLock);
  168. virtual void InitPath(CRemanent*pParent, const char *pszMemberName);
  169. virtual const char* GetPath(void) const {
  170. return m_pszPath;}
  171. virtual unsigned long long GetUpdateCount(void) const {
  172. return m_nUpdates;}
  173. virtual void Log(time_t ts, CRemLogger &rlogger);
  174. private:
  175. void Lock(void);
  176. void Unlock(void);
  177. private:
  178. std::string m_name;
  179. std::string m_path;
  180. const char *m_pszPath;
  181. int m_nIndex;
  182. enum VT m_vt;
  183. volatile V_Ptr m_data;
  184. V_Val m_cache;
  185. HSHM m_hShm;
  186. CRemanent *m_pParent;
  187. unsigned long long m_nUpdates;
  188. double m_fLogValue;
  189. bool m_bMustLog;
  190. bool m_bIsDbPersitent;
  191. size_t m_nCbVarpath;
  192. };
  193. /////////////////////////////////////////////////////////////////////////////
  194. class CRemStringVariable : public CRemanent
  195. {
  196. public:
  197. typedef enum
  198. {
  199. VT_Invalid, // 0
  200. VT_Latin1, // 1
  201. VT_UTF_8, // 2
  202. VT_UTF_16, // 3
  203. VT_UTF_32, // 4
  204. VT_Unicode, // 5
  205. VT_Last
  206. }VT;
  207. typedef union
  208. {
  209. void *pVoid;
  210. char *pszMbs;
  211. char16_t *pszWc16;
  212. char32_t *pszWc32;
  213. wchar_t *pszWcs;
  214. }V_Ptr;
  215. public:
  216. CRemStringVariable(void *pData, size_t nCChData, VT vt, const std::type_info &rti, HSHM hShm, bool bIsDbPersitent, const char *pszName, int nIndex, CRemanent *pParent);
  217. virtual ~CRemStringVariable(void);
  218. virtual void CreateMembersTable(CRemVarTable &vt);
  219. virtual bool SaveJSON(FILE *f, int nIndent, bool bValueOnly, bool bWriteComma);
  220. virtual bool SetJSONValue(const Json::Value &jv, bool fLock);
  221. virtual unsigned long long CheckUpdateShm(bool fLock);
  222. virtual void InitPath(CRemanent*pParent, const char *pszMemberName);
  223. virtual const char* GetPath(void) const {
  224. return m_pszPath;}
  225. virtual unsigned long long GetUpdateCount(void) const {
  226. return m_nUpdates;}
  227. virtual void Log(time_t ts, CRemLogger &rlogger);
  228. private:
  229. bool shmChanged(bool fLock);
  230. void Lock(void);
  231. void Unlock(void);
  232. void zeroTerm(volatile V_Ptr &rp, size_t at);
  233. private:
  234. std::string m_name;
  235. std::string m_path;
  236. const char *m_pszPath;
  237. int m_nIndex;
  238. VT m_vt;
  239. volatile V_Ptr m_data;
  240. V_Ptr m_cache;
  241. size_t m_nCbBuffer;
  242. size_t m_nCbString;
  243. HSHM m_hShm;
  244. CRemanent *m_pParent;
  245. unsigned long long m_nUpdates;
  246. bool m_bMustLog;
  247. bool m_bIsDbPersitent;
  248. size_t m_nCbVarpath;
  249. char m_szLog[_RL_MAX_STRVAL_LENGTH];
  250. size_t m_nCbLog;
  251. };
  252. /////////////////////////////////////////////////////////////////////////////
  253. class CRemBitVariable : public CRemanent
  254. {
  255. public:
  256. enum VT
  257. {
  258. VT_Invalid,
  259. VT_bool,
  260. VT_I1,
  261. VT_UI1,
  262. VT_I2,
  263. VT_UI2,
  264. VT_I4,
  265. VT_UI4,
  266. VT_I8,
  267. VT_UI8,
  268. VT_float,
  269. VT_double,
  270. VT_string
  271. };
  272. public:
  273. CRemBitVariable(void *pData, size_t nOffset, int nBitNr, HSHM hShm, bool bIsDbPersitent, const char *pszName, CRemanent *pParent);
  274. virtual ~CRemBitVariable(void);
  275. virtual void CreateMembersTable(CRemVarTable &vt);
  276. virtual bool SaveJSON(FILE *f, int nIndent, bool bValueOnly, bool bWriteComma);
  277. virtual bool SetJSONValue(const Json::Value &jv, bool fLock);
  278. virtual bool SetDoubleValue(double val, bool fLock);
  279. virtual unsigned long long CheckUpdateShm(bool fLock);
  280. virtual void InitPath(CRemanent*pParent, const char *pszMemberName);
  281. virtual const char* GetPath(void) const {
  282. return m_pszPath;}
  283. virtual unsigned long long GetUpdateCount(void) const {
  284. return m_nUpdates;}
  285. virtual void Log(time_t ts, CRemLogger &rlogger);
  286. private:
  287. void Lock(void);
  288. void Unlock(void);
  289. private:
  290. std::string m_name;
  291. std::string m_path;
  292. const char *m_pszPath;
  293. uint8_t *m_pShmByte;
  294. uint8_t m_mask;
  295. bool m_cacheVal;
  296. HSHM m_hShm;
  297. CRemanent *m_pParent;
  298. unsigned long long m_nUpdates;
  299. double m_fLogValue;
  300. bool m_bMustLog;
  301. bool m_bIsDbPersitent;
  302. size_t m_nCbVarpath;
  303. };
  304. /////////////////////////////////////////////////////////////////////////////
  305. #endif // !defined(AGD_REMVAR_H__B91C5ED5_B980_4B06_9CEA_886DB0518B29__INCLUDED_)