dbpersist.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include <vector>
  2. #include "strutil.h"
  3. #include "mysqlwrap.h"
  4. #include "remvar.h"
  5. #include "debug.h"
  6. /////////////////////////////////////////////////////////////////////////////
  7. #define LOGS_FIELDNAME_VALUE "value"
  8. #define TAGS_FIELDNAME_TAGID "tagid"
  9. #define TAGS_FIELDNAME_PATH "path"
  10. /////////////////////////////////////////////////////////////////////////////
  11. CDbPersist::CDbPersist(const char *pszDatabaseName, const char *pszTagsTableName, const char *pszLogsTableName, const char *pszDbUser, const char *pszDbPass) :
  12. m_sDatabaseName(pszDatabaseName), m_sTagsTableName(pszTagsTableName), m_sLogsTableName(pszLogsTableName), m_sUser(pszDbUser), m_sPass(pszDbPass)
  13. {
  14. }
  15. CDbPersist::~CDbPersist(void)
  16. {
  17. }
  18. /////////////////////////////////////////////////////////////////////////////
  19. bool CDbPersist::Init(CMySqlDB &db)
  20. {
  21. if(!db.Options(MYSQL_SET_CHARSET_NAME, "utf8"))
  22. {
  23. m_lastError = db.LastError();
  24. return false;
  25. }
  26. if(!db.Options(MYSQL_INIT_COMMAND, "SET NAMES utf8"))
  27. {
  28. m_lastError = db.LastError();
  29. return false;
  30. }
  31. if(!db.Connect("localhost", m_sUser.c_str(), m_sPass.c_str(), NULL))
  32. {
  33. m_lastError = db.LastError();
  34. return false;
  35. }
  36. if(db.SelectDB(m_sDatabaseName.c_str()))
  37. {
  38. m_lastError = db.LastError();
  39. return false;
  40. }
  41. std::string sql = formatString("SELECT * FROM `%s` WHERE `logType` IN ('ICR', 'IUR', 'VCR', 'VUR');", m_sTagsTableName.c_str());
  42. CMySqlResult res = db.Query(sql.c_str());
  43. if(!res.error())
  44. {
  45. CMySqlRow row;
  46. while(res.FetchRow(row))
  47. {
  48. CFieldMap fields([](const std::string &s1, const std::string &s2)
  49. {
  50. return s1.compare(s2) < 0;
  51. });
  52. for(const auto &field : row)
  53. {
  54. fields[field.first] = field.second.StrVal();
  55. }
  56. m_tags.push_back(fields);
  57. }
  58. return true;
  59. }
  60. else
  61. {
  62. m_lastError = db.LastError();
  63. }
  64. return false;
  65. }
  66. /////////////////////////////////////////////////////////////////////////////
  67. int CDbPersist::RestoreValues(const CRemVarTable &map, CLogfile &rlf)
  68. {
  69. int nRet = 0;
  70. CMySqlDB db;
  71. if(!Init(db))
  72. {
  73. TRACE("Failed to initialize Datalogger Database: %s!\nNo Database-persistant values restored!\n", m_lastError.c_str());
  74. rlf.Error("Failed to initialize Datalogger Database: %s! No Database-persistant values restored!\n", m_lastError.c_str());
  75. return -1;
  76. }
  77. for(auto &fields : m_tags)
  78. {
  79. std::string tagID = fields[TAGS_FIELDNAME_TAGID];
  80. std::string path = fields[TAGS_FIELDNAME_PATH];
  81. CRemanent *pVar = map.Find(path.c_str());
  82. if(pVar)
  83. {
  84. std::string sql = formatString("SELECT `%s` FROM `%s` WHERE `%s` = %s AND `value` IS NOT NULL ORDER BY `tslog` DESC LIMIT 1;", LOGS_FIELDNAME_VALUE, m_sLogsTableName.c_str(), TAGS_FIELDNAME_TAGID, tagID.c_str());
  85. CMySqlResult res = db.Query(sql.c_str());
  86. if(!res.error())
  87. {
  88. CMySqlRow row;
  89. if(res.FetchRow(row))
  90. {
  91. const CMySqlVar &var = row[LOGS_FIELDNAME_VALUE];
  92. if(var.IsValid() && var.IsReal())
  93. {
  94. // TRACE("Restoring value %s (%s) from Database: %.2f!\n", tagID.c_str(), path.c_str(), (double)var);
  95. if(pVar->SetDoubleValue(var, true))
  96. ++nRet;
  97. else
  98. {
  99. }
  100. }
  101. else
  102. {
  103. m_lastError = db.LastError();
  104. TRACE("Unable to retrieve value %s (%s) from Database: %s!\n", tagID.c_str(), path.c_str(), m_lastError.c_str());
  105. rlf.Warning("Unable to retrieve value %s (%s) from Database: %s!\n", tagID.c_str(), path.c_str(), m_lastError.c_str());
  106. }
  107. }
  108. }
  109. else
  110. {
  111. m_lastError = db.LastError();
  112. TRACE("Error retrieving value %s (%s) from Database: %s!\n", tagID.c_str(), path.c_str(), m_lastError.c_str());
  113. rlf.Error("Error retrieving value %s (%s) from Database: %s!\n", tagID.c_str(), path.c_str(), m_lastError.c_str());
  114. }
  115. }
  116. else
  117. {
  118. TRACE("Unable to find %s (%s) in VarTable!\n", tagID.c_str(), path.c_str());
  119. rlf.Warning("Unable to find %s (%s) in VarTable!\n", tagID.c_str(), path.c_str());
  120. }
  121. }
  122. return nRet;
  123. }