DataBase.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. #include <stdio.h> /*標準輸入輸出定義*/
  2. #include <stdlib.h> /*標準函數庫定義*/
  3. #include <string.h>
  4. #include <stdint.h>
  5. #include "../Config.h"
  6. #include "../Log/log.h"
  7. #include "../Define/define.h"
  8. #include "../ShareMemory/shmMem.h"
  9. //------------------------------------------------------------------------------
  10. #define DB_FILE "/Storage/ChargeLog/localCgargingRecord.db"
  11. //------------------------------------------------------------------------------
  12. static sqlite3 *localDb;
  13. //------------------------------------------------------------------------------
  14. //===============================================
  15. // SQLite3 related routine
  16. //===============================================
  17. int DB_Open(void)
  18. {
  19. int result = PASS;
  20. char *errMsg = NULL;
  21. char *createRecordSql = "CREATE TABLE IF NOT EXISTS charging_record("
  22. "idx integer primary key AUTOINCREMENT, "
  23. "reservationId text, "
  24. "transactionId text, "
  25. "startMethod text, "
  26. "userId text, "
  27. "dateTimeStart text, "
  28. "dateTimeStop text,"
  29. "socStart text, "
  30. "socStop text, "
  31. "chargeEnergy text, "
  32. "stopReason text"
  33. ");";
  34. /*char *createCfgSql = "CREATE TABLE IF NOT EXISTS `config` ( "
  35. "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
  36. "`IsAvailable` TEXT NOT NULL, "
  37. "`connector` INTEGER NOT NULL, "
  38. "`val` TEXT NOT NULL, unique(IsAvailable,connector) on conflict replace);";
  39. */
  40. //DS60-120 add
  41. char *createCfgSql = "CREATE TABLE IF NOT EXISTS `config` ( "
  42. "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
  43. "`item` TEXT NOT NULL, "
  44. "`connector` INTEGER NOT NULL, "
  45. "`val` TEXT NOT NULL, unique(item,connector) on conflict replace);";
  46. char *createrecordSql = "CREATE TABLE IF NOT EXISTS `event_record` ( "
  47. "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
  48. "`occurDatetime` TEXT NOT NULL, "
  49. "`statusCode` TEXT NOT NULL, unique(occurDatetime,statusCode) on conflict replace);";
  50. char *createrebootSql = "CREATE TABLE IF NOT EXISTS `reboot_record` ( "
  51. "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
  52. "`rebootDatetime` TEXT NOT NULL, unique(rebootDatetime) on conflict replace);";
  53. if (sqlite3_open(DB_FILE, &localDb)) {
  54. result = FAIL;
  55. log_info( "Can't open database: %s\r\n", sqlite3_errmsg(localDb));
  56. sqlite3_close(localDb);
  57. } else {
  58. log_info( "Local charging record database open successfully.\r\n");
  59. if (sqlite3_exec(localDb, createRecordSql, 0, 0, &errMsg) != SQLITE_OK) {
  60. result = FAIL;
  61. log_info( "Create local charging record table error message: %s\n", errMsg);
  62. } else {
  63. log_info( "Opened local charging record table successfully\n");
  64. }
  65. if (sqlite3_exec(localDb, createCfgSql, 0, 0, &errMsg) != SQLITE_OK) {
  66. result = FAIL;
  67. log_info( "Create local config table error message: %s\n", errMsg);
  68. } else {
  69. log_info( "Opened local config table successfully\n");
  70. }
  71. //DS60-120
  72. if (sqlite3_exec(localDb, createrecordSql, 0, 0, &errMsg) != SQLITE_OK) {
  73. result = FAIL;
  74. log_info( "Create local record table error message: %s\n", errMsg);
  75. } else {
  76. log_info( "Opened local record table successfully\n");
  77. }
  78. if (sqlite3_exec(localDb, createrebootSql, 0, 0, &errMsg) != SQLITE_OK) {
  79. result = FAIL;
  80. log_info( "Create reboot record table error message: %s\n", errMsg);
  81. } else {
  82. log_info( "Opened reboot record table successfully\n");
  83. }
  84. //-----
  85. sqlite3_close(localDb);
  86. }
  87. return result;
  88. }
  89. int DB_Insert_Record(int gunIndex)
  90. {
  91. int result = PASS;
  92. char *errMsg = NULL;
  93. char insertSql[1024];
  94. struct ChargingInfoData *pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
  95. struct OCPP16Data *ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
  96. sprintf(insertSql, "insert into charging_record(reservationId, transactionId, startMethod, userId, dateTimeStart, dateTimeStop, socStart, socStop, chargeEnergy, stopReason) "
  97. "values('%d', '%d', '%d', '%s', '%s', '%s', '%d', '%d', '%f', '%s');",
  98. pDcChargingInfo->ReservationId, //DS60-120 add
  99. ShmOCPP16Data->StartTransaction[gunIndex].ResponseTransactionId,
  100. pDcChargingInfo->StartMethod,
  101. pDcChargingInfo->StartUserId,
  102. pDcChargingInfo->StartDateTime,
  103. pDcChargingInfo->StopDateTime,
  104. pDcChargingInfo->EvBatteryStartSoc,
  105. pDcChargingInfo->EvBatterySoc,
  106. pDcChargingInfo->PresentChargedEnergy,
  107. ShmOCPP16Data->StopTransaction[gunIndex].StopReason);
  108. //if (sqlite3_open("/Storage/ChargeLog/localCgargingRecord.db", &db)) {
  109. if (sqlite3_open(DB_FILE, &localDb)) { //DS60-120 add
  110. result = FAIL;
  111. log_info( "Can't open database: %s\r\n", sqlite3_errmsg(localDb));
  112. sqlite3_close(localDb);
  113. } else {
  114. log_info( "Local charging record database open successfully.\r\n");
  115. if (sqlite3_exec(localDb, insertSql, 0, 0, &errMsg) != SQLITE_OK) {
  116. result = FAIL;
  117. log_info( "Insert local charging record error message: %s\n", errMsg);
  118. } else {
  119. log_info( "Insert local charging record successfully\n");
  120. }
  121. //DS60-120 add
  122. sprintf(insertSql, "delete from charging_record where idx < (select idx from charging_record order by idx desc limit 1)-2000;");
  123. if (sqlite3_exec(localDb, insertSql, 0, 0, &errMsg) != SQLITE_OK) {
  124. result = FAIL;
  125. log_info( "delete local charging error message: %s\n", errMsg);
  126. } else {
  127. log_info( "delete local charging record successfully\n");
  128. }
  129. sqlite3_close(localDb);
  130. }
  131. return result;
  132. }
  133. int DB_Update_Operactive(uint8_t gunIndex, uint8_t IsAvailable)
  134. {
  135. uint8_t result = false;
  136. char *errMsg = NULL;
  137. char sqlStr[1024];
  138. srand(time(NULL));
  139. if (sqlite3_open(DB_FILE, &localDb)) {
  140. result = FAIL;
  141. log_info( "Can't open database: %s\r\n", sqlite3_errmsg(localDb));
  142. sqlite3_close(localDb);
  143. } else {
  144. log_info( "Local charging record database open successfully (%d).\r\n", IsAvailable);
  145. //sprintf(sqlStr, "insert or replace into config (IsAvailable, connector, val) values('IsAvailable', %d, %d);", gunIndex, IsAvailable);
  146. sprintf(sqlStr,
  147. "insert or replace into config (item, connector, val) values('IsAvailable', %d, %d);",
  148. gunIndex,
  149. IsAvailable); //DS60-120 add
  150. log_info("sqlStr= %s\r\n", sqlStr);
  151. if (sqlite3_exec(localDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  152. result = FAIL;
  153. log_info( "update config error message: %s\n", errMsg);
  154. } else {
  155. log_info("update connector-%d config item isOperactive to %d\r\n", gunIndex, IsAvailable);
  156. }
  157. sqlite3_close(localDb);
  158. }
  159. return result;
  160. }
  161. int DB_Get_Operactive(uint8_t gunIndex)
  162. {
  163. uint8_t result = true;
  164. char *errMsg = NULL;
  165. char sqlStr[1024];
  166. char **rs;
  167. int rows, cols;
  168. //sprintf(sqlStr, "select * from config where IsAvailable='IsAvailable' and connector=%d;", gunIndex);
  169. sprintf(sqlStr, "select * from config where item='IsAvailable' and connector=%d;", gunIndex); //DS60-120 add
  170. //DEBUG_INFO("sqlStr= %s\r\n", sqlStr);
  171. if (sqlite3_open(DB_FILE, &localDb)) {
  172. result = FAIL;
  173. log_info( "Can't open database: %s\r\n", sqlite3_errmsg(localDb));
  174. sqlite3_close(localDb);
  175. } else {
  176. log_info( "Local config query database open successfully.\r\n");
  177. sqlite3_get_table(localDb, sqlStr, &rs, &rows, &cols, &errMsg);
  178. if (rows > 0) {
  179. for (int idxRow = 1; idxRow <= rows; idxRow++) {
  180. if (strcmp(rs[(idxRow * cols) + 3], "0") == 0) {
  181. result = false;
  182. }
  183. log_info("Query connector-%d isOperactive: %s\r\n", gunIndex, rs[(idxRow * cols) + 3]);
  184. }
  185. } else {
  186. log_info("Query connector-%d fail, set default value to operactive.\r\n", gunIndex);
  187. }
  188. sqlite3_free_table(rs);
  189. sqlite3_close(localDb);
  190. }
  191. return result;
  192. }
  193. int DB_Reboot_Record(void)
  194. {
  195. int result = PASS;
  196. char *errMsg = NULL;
  197. char insertSql[256];
  198. sprintf(insertSql, "insert into reboot_record(rebootDatetime) values(CURRENT_TIMESTAMP);");
  199. if (sqlite3_open(DB_FILE, &localDb)) {
  200. result = FAIL;
  201. log_info( "Can't open database: %s\n", sqlite3_errmsg(localDb));
  202. sqlite3_close(localDb);
  203. } else {
  204. log_info( "Local charging record database open successfully.\n");
  205. if (sqlite3_exec(localDb, insertSql, 0, 0, &errMsg) != SQLITE_OK) {
  206. result = FAIL;
  207. log_info( "Insert reboot record error message: %s\n", errMsg);
  208. } else {
  209. log_info( "Insert reboot record successfully\n");
  210. }
  211. sprintf(insertSql, "delete from reboot_record where idx < (select idx from charging_record order by idx desc limit 1)-2000;");
  212. if (sqlite3_exec(localDb, insertSql, 0, 0, &errMsg) != SQLITE_OK) {
  213. result = FAIL;
  214. log_info( "delete reboot record error message: %s\n", errMsg);
  215. } else {
  216. log_info( "delete reboot record successfully\n");
  217. }
  218. sqlite3_close(localDb);
  219. }
  220. return result;
  221. }
  222. //------------------------------------------------------------------------------
  223. //for Module_EventLog
  224. //------------------------------------------------------------------------------
  225. int CreateEventRecord(void)
  226. {
  227. int result = PASS;
  228. char *errMsg = NULL;
  229. char *createRecordSql = "CREATE TABLE IF NOT EXISTS event_record("
  230. "idx integer primary key AUTOINCREMENT, "
  231. "occurDatetime text NOT NULL, "
  232. "statusCode text NOT NULL"
  233. ");";
  234. if (sqlite3_open(DB_FILE, &localDb)) {
  235. result = FAIL;
  236. log_error( "Can't open database: %s\n", sqlite3_errmsg(localDb));
  237. sqlite3_close(localDb);
  238. } else {
  239. log_info( "Local event record database open successfully.\n");
  240. if (sqlite3_exec(localDb, createRecordSql, 0, 0, &errMsg) != SQLITE_OK) {
  241. result = FAIL;
  242. log_error( "Create local event record table error message: %s\n", errMsg);
  243. } else {
  244. log_info( "Opened local event record table successfully\n");
  245. }
  246. sqlite3_close(localDb);
  247. }
  248. return result;
  249. }
  250. int InsertEventRecord(uint8_t *statusCode)
  251. {
  252. int result = PASS;
  253. char *errMsg = NULL;
  254. char sqlStr[1024] = {0};
  255. sprintf(sqlStr, "insert into event_record(occurDatetime, statusCode) values(CURRENT_TIMESTAMP, '%s');", statusCode);
  256. if (sqlite3_open(DB_FILE, &localDb)) {
  257. result = FAIL;
  258. log_info( "Can't open database: %s\n", sqlite3_errmsg(localDb));
  259. sqlite3_close(localDb);
  260. } else {
  261. log_info( "Local event record database open successfully.\n");
  262. if (sqlite3_exec(localDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  263. result = FAIL;
  264. log_info( "Insert local event record error message: %s\n", errMsg);
  265. } else {
  266. log_info( "Insert local event record successfully\n");
  267. }
  268. sprintf(sqlStr, "delete from event_record where idx < (select idx from event_record order by idx desc limit 1)-2000;");
  269. if (sqlite3_exec(localDb, sqlStr, 0, 0, &errMsg) != SQLITE_OK) {
  270. result = FAIL;
  271. log_info( "delete local event_record error message: %s\n", errMsg);
  272. } else {
  273. log_info( "delete local event record successfully\n");
  274. }
  275. sqlite3_close(localDb);
  276. }
  277. return result;
  278. }