DataBase.c 12 KB

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